ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDZmMjU2ZTUuLjE0OTE3N2UgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw0ICsxLDMgQEAKLWJpbi8KIGJ1aWxkLwogCiAjIFZTIHByb2plY3QgYW5kIHdvcmtpbmcgZmlsZXMKZGlmZiAtLWdpdCBhLy5yZXVzZS9kZXA1IGIvLnJldXNlL2RlcDUKaW5kZXggNGI0OGM2Yy4uMDg4NDAxNCAxMDA2NDQKLS0tIGEvLnJldXNlL2RlcDUKKysrIGIvLnJldXNlL2RlcDUKQEAgLTcsMjIgKzcsMTEgQEAKIENvcHlyaWdodDogMjAxOS0yMDIxIEJpbm9taWFsIExMQwogTGljZW5zZTogQXBhY2hlLTIuMAogCi1GaWxlczogZW5jb2Rlci9hcGdfYm1wLioKLUNvcHlyaWdodDogMjAxOSBBbnRvbiBHZXJkZWxhbgotTGljZW5zZTogQXBhY2hlLTIuMAotCi1GaWxlczogZW5jb2Rlci9iYXNpc3VfYXN0Y19kZWNvbXAuKgotQ29weXJpZ2h0OiAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUxpY2Vuc2U6IEFwYWNoZS0yLjAKLQotRmlsZXM6IGVuY29kZXIvY3Bwc3BtZF9zc2UuaAotQ29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxNiBOaWNvbGFzIEd1aWxsZW1vdAotTGljZW5zZTogQXBhY2hlLTIuMAotCi1GaWxlczogZW5jb2Rlci9sb2RlcG5nLioKLUNvcHlyaWdodDogMjAwNS0yMDE5IExvZGUgVmFuZGV2ZW5uZQotTGljZW5zZTogWmxpYgotCiBGaWxlczogenN0ZC8qCiBDb3B5cmlnaHQ6IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KIExpY2Vuc2U6IEJTRAorCitGaWxlczogT3BlbkNMLyoKK0NvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDA4LTIwMjAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorTGljZW5zZTogQXBhY2hlLTIuMAorCmRpZmYgLS1naXQgYS9DTWFrZUxpc3RzLnR4dCBiL0NNYWtlTGlzdHMudHh0CmluZGV4IDc4ZGQxMTAuLjQ5MjIzM2EgMTAwNjQ0Ci0tLSBhL0NNYWtlTGlzdHMudHh0CisrKyBiL0NNYWtlTGlzdHMudHh0CkBAIC0xLDE1ICsxLDQwIEBACiBwcm9qZWN0KGJhc2lzdSkKIAogY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMCkKLW9wdGlvbihCVUlMRF9YNjQgImJ1aWxkIDY0LWJpdCIgVFJVRSkKIG9wdGlvbihTVEFUSUMgInN0YXRpYyBsaW5raW5nIiBGQUxTRSkKLW9wdGlvbihTU0UgIlNTRSA0LjEgc3VwcG9ydCIgRkFMU0UpCitvcHRpb24oU0FOICJzYW5pdGl6ZSIgRkFMU0UpCisKKyMgRm9yIE1TVkMgYnVpbGRzIGRlZmF1bHQgdG8gU1NFIGVuYWJsZWQsIGFuZCBkZXRlcm1pbmUgaWYgaXQncyBhIDY0LWJpdCAoLUEgeDY0KSB2cy4gMzItYml0ICgtQSBXaW4zMikgYnVpbGQuCitpZiAoTVNWQykKKwlvcHRpb24oU1NFICJTU0UgNC4xIHN1cHBvcnQiIFRSVUUpCisJaWYgKCBDTUFLRV9HRU5FUkFUT1JfUExBVEZPUk0gU1RSRVFVQUwgV2luMzIgKQkKKwkJc2V0KEJVSUxEX1g2NCAwKQorCWVsc2UoKQorCQlzZXQoQlVJTERfWDY0IDEpCisJZW5kaWYoKQorZWxzZSgpCisJb3B0aW9uKFNTRSAiU1NFIDQuMSBzdXBwb3J0IiBGQUxTRSkKKwlvcHRpb24oQlVJTERfWDY0ICJidWlsZCA2NC1iaXQiIFRSVUUpCitlbmRpZigpCisKIG9wdGlvbihaU1REICJaU1REIHN1cHBvcnQgZm9yIEtUWDIgdHJhbnNjb2RpbmcvZW5jb2RpbmciIFRSVUUpCitvcHRpb24oT1BFTkNMICJPcGVuQ0wgc3VwcG9ydCBpbiBlbmNvZGVyIiBGQUxTRSkKIAogbWVzc2FnZSgiSW5pdGlhbCBCVUlMRF9YNjQ9JHtCVUlMRF9YNjR9IikKIG1lc3NhZ2UoIkluaXRpYWwgQ01BS0VfQlVJTERfVFlQRT0ke0NNQUtFX0JVSUxEX1RZUEV9IikKIG1lc3NhZ2UoIkluaXRpYWwgU1NFPSR7U1NFfSIpCiBtZXNzYWdlKCJJbml0aWFsIFpTVEQ9JHtaU1REfSIpCittZXNzYWdlKCJJbml0aWFsIE9QRU5DTD0ke09QRU5DTH0iKQorbWVzc2FnZSgiSW5pdGlhbCBTQU49JHtTQU59IikKKworaWYgKE5PVCBNU1ZDKQorCSMgV2l0aCBNU1ZDIGJ1aWxkcyB3ZSB1c2UgdGhlIEtocm9ub3MgbGliL2luY2x1ZGUgZmlsZXMgaW4gdGhlIHByb2plY3QncyAiT3BlbkNMIiBkaXJlY3RvcnksIHRvIGNvbXBsZXRlbHkgYXZvaWQgcmVxdWlyaW5nIGZpZGRseSB0byBpbnN0YWxsIHZlbmRvciBTREsncy4KKwkjIE90aGVyd2lzZSB3ZSB1c2UgdGhlIHN5c3RlbSdzIChpZiBhbnkpLgorCWZpbmRfcGFja2FnZSggT3BlbkNMICkKKwltZXNzYWdlKFNUQVRVUyAiT3BlbkNMIGZvdW5kOiAke09QRU5DTF9GT1VORH0iKQorCW1lc3NhZ2UoU1RBVFVTICJPcGVuQ0wgaW5jbHVkZXM6ICR7T3BlbkNMX0lOQ0xVREVfRElSU30iKQorCW1lc3NhZ2UoU1RBVFVTICJPcGVuQ0wgbGlicmFyaWVzOiAke09wZW5DTF9MSUJSQVJJRVN9IikKK2VuZGlmKCkKIAogaWYoIE5PVCBDTUFLRV9CVUlMRF9UWVBFICkKICAgc2V0KCBDTUFLRV9CVUlMRF9UWVBFIFJlbGVhc2UgKQpAQCAtMzcsMTAgKzYyLDE1IEBACiAKIGlmIChOT1QgTVNWQykKICAgIHNldChDTUFLRV9DWFhfRkxBR1NfREVCVUcgIiR7Q01BS0VfQ1hYX0ZMQUdTX0RFQlVHfSAtZyIpCi0gICBzZXQoQ01BS0VfQ19GTEFHU19ERUJVRyAiJHtDTUFLRV9DWFhfRkxBR1NfREVCVUd9IC1nIikKLQorICAgc2V0KENNQUtFX0NfRkxBR1NfREVCVUcgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gLWciKQorICAgCiAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IikKLSAgIHNldChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IikKKyAgIHNldChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ19GTEFHU19SRUxFQVNFfSIpCisKKyAgIGlmIChTQU4pCisgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IC1mc2FuaXRpemU9YWRkcmVzcyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZnNhbml0aXplPXVuZGVmaW5lZCIpCisgICAgICBzZXQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mc2FuaXRpemU9dW5kZWZpbmVkIikKKyAgIGVuZGlmKCkKIAogICAgc2V0KENNQUtFX0NYWF9GTEFHUyAtc3RkPWMrKzExKQogICAgc2V0KEdDQ19DT01QSUxFX0ZMQUdTICItZnZpc2liaWxpdHk9aGlkZGVuIC1mUElDIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1EX0xBUkdFRklMRTY0X1NPVVJDRT0xIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLVdhbGwgLVdleHRyYSAtV25vLXVudXNlZC1sb2NhbC10eXBlZGVmcyAtV25vLXVudXNlZC12YWx1ZSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby11bnVzZWQtdmFyaWFibGUiKQpAQCAtMTAxLDE5ICsxMzEsMTcgQEAKIAllbmNvZGVyL2Jhc2lzdV9lbmMuY3BwCiAJZW5jb2Rlci9iYXNpc3VfZXRjLmNwcAogCWVuY29kZXIvYmFzaXN1X2Zyb250ZW5kLmNwcAotCWVuY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuY3BwCiAJZW5jb2Rlci9iYXNpc3VfZ3B1X3RleHR1cmUuY3BwCiAJZW5jb2Rlci9iYXNpc3VfcHZydGMxXzQuY3BwCiAJZW5jb2Rlci9iYXNpc3VfcmVzYW1wbGVyLmNwcAogCWVuY29kZXIvYmFzaXN1X3Jlc2FtcGxlX2ZpbHRlcnMuY3BwCiAJZW5jb2Rlci9iYXNpc3Vfc3NpbS5jcHAKLQllbmNvZGVyL2Jhc2lzdV9hc3RjX2RlY29tcC5jcHAKIAllbmNvZGVyL2Jhc2lzdV91YXN0Y19lbmMuY3BwCiAJZW5jb2Rlci9iYXNpc3VfYmM3ZW5jLmNwcAotCWVuY29kZXIvbG9kZXBuZy5jcHAKLQllbmNvZGVyL2FwZ19ibXAuYwogCWVuY29kZXIvanBnZC5jcHAKIAllbmNvZGVyL2Jhc2lzdV9rZXJuZWxzX3NzZS5jcHAKKwllbmNvZGVyL2Jhc2lzdV9vcGVuY2wuY3BwCisJZW5jb2Rlci9wdnBuZ3JlYWRlci5jcHAKIAl0cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmNwcAogCSkKIApAQCAtMTM4LDcgKzE2NiwzNCBAQAogZW5kaWYoKQogCiBpZiAoTk9UIE1TVkMpCi0gICB0YXJnZXRfbGlua19saWJyYXJpZXMoYmFzaXN1IG0gcHRocmVhZCkKKwkjIEZvciBOb24tV2luZG93cyBidWlsZHMsIGxldCBjbWFrZSB0cnkgYW5kIGZpbmQgdGhlIHN5c3RlbSBPcGVuQ0wgaGVhZGVycy9saWJzIGZvciB1cy4KKwlpZiAoT1BFTkNMX0ZPVU5EKQorCQlzZXQoQ01BS0VfQ19GTEFHUyAgIiR7Q01BS0VfQ19GTEFHU30gLURCQVNJU1VfU1VQUE9SVF9PUEVOQ0w9MSIpCisJCXNldChDTUFLRV9DWFhfRkxBR1MgICIke0NNQUtFX0NYWF9GTEFHU30gLURCQVNJU1VfU1VQUE9SVF9PUEVOQ0w9MSIpCQorCQkKKwkJdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoIGJhc2lzdSBQUklWQVRFICR7T3BlbkNMX0lOQ0xVREVfRElSU30gKQorCQlzZXQoQkFTSVNVX0VYVFJBX0xJQlMgJHtPcGVuQ0xfTElCUkFSSUVTfSkKKwllbmRpZigpCisKK2Vsc2UoKQorCSMgRm9yIFdpbmRvd3MgYnVpbGRzLCB3ZSB1c2Ugb3VyIGxvY2FsIGNvcGllcyBvZiB0aGUgT3BlbkNMIGltcG9ydCBsaWIgYW5kIEtocm9ub3MgaGVhZGVycy4KKwlpZiAoT1BFTkNMKQorCQlzZXQoQ01BS0VfQ19GTEFHUyAgIiR7Q01BS0VfQ19GTEFHU30gLURCQVNJU1VfU1VQUE9SVF9PUEVOQ0w9MSIpCisJCXNldChDTUFLRV9DWFhfRkxBR1MgICIke0NNQUtFX0NYWF9GTEFHU30gLURCQVNJU1VfU1VQUE9SVF9PUEVOQ0w9MSIpCQorCQkKKwkJdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoIGJhc2lzdSBQUklWQVRFICJPcGVuQ0wiICkKKworCQlpZiAoIEJVSUxEX1g2NCApCisJCQl0YXJnZXRfbGlua19saWJyYXJpZXMoIGJhc2lzdSBQUklWQVRFICJPcGVuQ0wvbGliL09wZW5DTDY0IiApCisJCWVsc2UoKQorCQkJdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCBiYXNpc3UgUFJJVkFURSAiT3BlbkNML2xpYi9PcGVuQ0wiICkKKwkJZW5kaWYoKQorCisJZW5kaWYoKQorZW5kaWYoKQkKKworaWYgKE5PVCBNU1ZDKQorICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJhc2lzdSBtIHB0aHJlYWQgJHtCQVNJU1VfRVhUUkFfTElCU30pCiBlbmRpZigpCiAKIGlmIChOT1QgRU1TQ1JJUFRFTikKZGlmZiAtLWdpdCBhL09wZW5DTC9DTC9jbC5oIGIvT3BlbkNML0NML2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxOGEwZgotLS0gL2Rldi9udWxsCisrKyBiL09wZW5DTC9DTC9jbC5oCkBAIC0wLDAgKzEsMTkyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDIwIFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX09QRU5DTF9DTF9ICisjZGVmaW5lIF9fT1BFTkNMX0NMX0gKKworI2luY2x1ZGUgPENML2NsX3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxDTC9jbF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9jbF9wbGF0Zm9ybV9pZCAqICAgIGNsX3BsYXRmb3JtX2lkOwordHlwZWRlZiBzdHJ1Y3QgX2NsX2RldmljZV9pZCAqICAgICAgY2xfZGV2aWNlX2lkOwordHlwZWRlZiBzdHJ1Y3QgX2NsX2NvbnRleHQgKiAgICAgICAgY2xfY29udGV4dDsKK3R5cGVkZWYgc3RydWN0IF9jbF9jb21tYW5kX3F1ZXVlICogIGNsX2NvbW1hbmRfcXVldWU7Cit0eXBlZGVmIHN0cnVjdCBfY2xfbWVtICogICAgICAgICAgICBjbF9tZW07Cit0eXBlZGVmIHN0cnVjdCBfY2xfcHJvZ3JhbSAqICAgICAgICBjbF9wcm9ncmFtOwordHlwZWRlZiBzdHJ1Y3QgX2NsX2tlcm5lbCAqICAgICAgICAgY2xfa2VybmVsOwordHlwZWRlZiBzdHJ1Y3QgX2NsX2V2ZW50ICogICAgICAgICAgY2xfZXZlbnQ7Cit0eXBlZGVmIHN0cnVjdCBfY2xfc2FtcGxlciAqICAgICAgICBjbF9zYW1wbGVyOworCit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfYm9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBXQVJOSU5HISAgVW5saWtlIGNsXyB0eXBlcyBpbiBjbF9wbGF0Zm9ybS5oLCBjbF9ib29sIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGJvb2wgaW4ga2VybmVscy4gKi8KK3R5cGVkZWYgY2xfdWxvbmcgICAgICAgICAgICBjbF9iaXRmaWVsZDsKK3R5cGVkZWYgY2xfdWxvbmcgICAgICAgICAgICBjbF9wcm9wZXJ0aWVzOwordHlwZWRlZiBjbF9iaXRmaWVsZCAgICAgICAgIGNsX2RldmljZV90eXBlOwordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX3BsYXRmb3JtX2luZm87Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfZGV2aWNlX2luZm87Cit0eXBlZGVmIGNsX2JpdGZpZWxkICAgICAgICAgY2xfZGV2aWNlX2ZwX2NvbmZpZzsKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9kZXZpY2VfbWVtX2NhY2hlX3R5cGU7Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfZGV2aWNlX2xvY2FsX21lbV90eXBlOwordHlwZWRlZiBjbF9iaXRmaWVsZCAgICAgICAgIGNsX2RldmljZV9leGVjX2NhcGFiaWxpdGllczsKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAordHlwZWRlZiBjbF9iaXRmaWVsZCAgICAgICAgIGNsX2RldmljZV9zdm1fY2FwYWJpbGl0aWVzOworI2VuZGlmCit0eXBlZGVmIGNsX2JpdGZpZWxkICAgICAgICAgY2xfY29tbWFuZF9xdWV1ZV9wcm9wZXJ0aWVzOworI2lmZGVmIENMX1ZFUlNJT05fMV8yCit0eXBlZGVmIGludHB0cl90ICAgICAgICAgICAgY2xfZGV2aWNlX3BhcnRpdGlvbl9wcm9wZXJ0eTsKK3R5cGVkZWYgY2xfYml0ZmllbGQgICAgICAgICBjbF9kZXZpY2VfYWZmaW5pdHlfZG9tYWluOworI2VuZGlmCisKK3R5cGVkZWYgaW50cHRyX3QgICAgICAgICAgICBjbF9jb250ZXh0X3Byb3BlcnRpZXM7Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfY29udGV4dF9pbmZvOworI2lmZGVmIENMX1ZFUlNJT05fMl8wCit0eXBlZGVmIGNsX3Byb3BlcnRpZXMgICAgICAgY2xfcXVldWVfcHJvcGVydGllczsKKyNlbmRpZgordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX2NvbW1hbmRfcXVldWVfaW5mbzsKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9jaGFubmVsX29yZGVyOwordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX2NoYW5uZWxfdHlwZTsKK3R5cGVkZWYgY2xfYml0ZmllbGQgICAgICAgICBjbF9tZW1fZmxhZ3M7CisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKK3R5cGVkZWYgY2xfYml0ZmllbGQgICAgICAgICBjbF9zdm1fbWVtX2ZsYWdzOworI2VuZGlmCit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfbWVtX29iamVjdF90eXBlOwordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX21lbV9pbmZvOworI2lmZGVmIENMX1ZFUlNJT05fMV8yCit0eXBlZGVmIGNsX2JpdGZpZWxkICAgICAgICAgY2xfbWVtX21pZ3JhdGlvbl9mbGFnczsKKyNlbmRpZgordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX2ltYWdlX2luZm87CisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9idWZmZXJfY3JlYXRlX3R5cGU7CisjZW5kaWYKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9hZGRyZXNzaW5nX21vZGU7Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfZmlsdGVyX21vZGU7Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfc2FtcGxlcl9pbmZvOwordHlwZWRlZiBjbF9iaXRmaWVsZCAgICAgICAgIGNsX21hcF9mbGFnczsKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAordHlwZWRlZiBpbnRwdHJfdCAgICAgICAgICAgIGNsX3BpcGVfcHJvcGVydGllczsKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9waXBlX2luZm87CisjZW5kaWYKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9wcm9ncmFtX2luZm87Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfcHJvZ3JhbV9idWlsZF9pbmZvOworI2lmZGVmIENMX1ZFUlNJT05fMV8yCit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfcHJvZ3JhbV9iaW5hcnlfdHlwZTsKKyNlbmRpZgordHlwZWRlZiBjbF9pbnQgICAgICAgICAgICAgIGNsX2J1aWxkX3N0YXR1czsKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9rZXJuZWxfaW5mbzsKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX2tlcm5lbF9hcmdfaW5mbzsKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9rZXJuZWxfYXJnX2FkZHJlc3NfcXVhbGlmaWVyOwordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX2tlcm5lbF9hcmdfYWNjZXNzX3F1YWxpZmllcjsKK3R5cGVkZWYgY2xfYml0ZmllbGQgICAgICAgICBjbF9rZXJuZWxfYXJnX3R5cGVfcXVhbGlmaWVyOworI2VuZGlmCit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfa2VybmVsX3dvcmtfZ3JvdXBfaW5mbzsKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMQordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX2tlcm5lbF9zdWJfZ3JvdXBfaW5mbzsKKyNlbmRpZgordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX2V2ZW50X2luZm87Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfY29tbWFuZF90eXBlOwordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX3Byb2ZpbGluZ19pbmZvOworI2lmZGVmIENMX1ZFUlNJT05fMl8wCit0eXBlZGVmIGNsX3Byb3BlcnRpZXMgICAgICAgY2xfc2FtcGxlcl9wcm9wZXJ0aWVzOwordHlwZWRlZiBjbF91aW50ICAgICAgICAgICAgIGNsX2tlcm5lbF9leGVjX2luZm87CisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzNfMAordHlwZWRlZiBjbF9iaXRmaWVsZCAgICAgICAgIGNsX2RldmljZV9hdG9taWNfY2FwYWJpbGl0aWVzOwordHlwZWRlZiBjbF9iaXRmaWVsZCAgICAgICAgIGNsX2RldmljZV9kZXZpY2VfZW5xdWV1ZV9jYXBhYmlsaXRpZXM7Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfa2hyb25vc192ZW5kb3JfaWQ7Cit0eXBlZGVmIGNsX3Byb3BlcnRpZXMgICAgICAgY2xfbWVtX3Byb3BlcnRpZXM7Cit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfdmVyc2lvbjsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfY2xfaW1hZ2VfZm9ybWF0IHsKKyAgICBjbF9jaGFubmVsX29yZGVyICAgICAgICBpbWFnZV9jaGFubmVsX29yZGVyOworICAgIGNsX2NoYW5uZWxfdHlwZSAgICAgICAgIGltYWdlX2NoYW5uZWxfZGF0YV90eXBlOworfSBjbF9pbWFnZV9mb3JtYXQ7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCit0eXBlZGVmIHN0cnVjdCBfY2xfaW1hZ2VfZGVzYyB7CisgICAgY2xfbWVtX29iamVjdF90eXBlICAgICAgaW1hZ2VfdHlwZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBpbWFnZV93aWR0aDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBpbWFnZV9oZWlnaHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgaW1hZ2VfZGVwdGg7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgaW1hZ2VfYXJyYXlfc2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBpbWFnZV9yb3dfcGl0Y2g7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgaW1hZ2Vfc2xpY2VfcGl0Y2g7CisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgbnVtX21pcF9sZXZlbHM7CisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgbnVtX3NhbXBsZXM7CisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorICAgIF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICAgLyogUHJldmVudHMgd2FybmluZ3MgYWJvdXQgYW5vbnltb3VzIHVuaW9uIGluIC1wZWRhbnRpYyBidWlsZHMgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU1REQ19fKQorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyMDEgKSAgIC8qIFByZXZlbnRzIHdhcm5pbmcgYWJvdXQgbmFtZWxlc3Mgc3RydWN0L3VuaW9uIGluIC9XNCBidWlsZHMgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX19TVERDX18pCisgICAgLyogQW5vbnltb3VzIHVuaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiAvWmEgYnVpbGRzICovCisjZWxzZQorICAgIHVuaW9uIHsKKyNlbmRpZgorI2VuZGlmCisgICAgICBjbF9tZW0gICAgICAgICAgICAgICAgICBidWZmZXI7CisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9fU1REQ19fKQorICAgIC8qIEFub255bW91cyB1bmlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gL1phIGJ1aWxkcyAqLworI2Vsc2UKKyAgICAgIGNsX21lbSAgICAgICAgICAgICAgICAgIG1lbV9vYmplY3Q7CisgICAgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU1REQ19fKQorI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorI2VuZGlmCisjZW5kaWYKK30gY2xfaW1hZ2VfZGVzYzsKKworI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMQorCit0eXBlZGVmIHN0cnVjdCBfY2xfYnVmZmVyX3JlZ2lvbiB7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgb3JpZ2luOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIHNpemU7Cit9IGNsX2J1ZmZlcl9yZWdpb247CisKKyNlbmRpZgorCisjaWZkZWYgQ0xfVkVSU0lPTl8zXzAKKworI2RlZmluZSBDTF9OQU1FX1ZFUlNJT05fTUFYX05BTUVfU0laRSA2NAorCit0eXBlZGVmIHN0cnVjdCBfY2xfbmFtZV92ZXJzaW9uIHsKKyAgICBjbF92ZXJzaW9uICAgICAgICAgICAgICB2ZXJzaW9uOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIG5hbWVbQ0xfTkFNRV9WRVJTSU9OX01BWF9OQU1FX1NJWkVdOworfSBjbF9uYW1lX3ZlcnNpb247CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFcnJvciBDb2RlcyAqLworI2RlZmluZSBDTF9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0xfREVWSUNFX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBDTF9ERVZJQ0VfTk9UX0FWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgIC0yCisjZGVmaW5lIENMX0NPTVBJTEVSX05PVF9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgLTMKKyNkZWZpbmUgQ0xfTUVNX09CSkVDVF9BTExPQ0FUSU9OX0ZBSUxVUkUgICAgICAgICAgICAtNAorI2RlZmluZSBDTF9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgICAgIC01CisjZGVmaW5lIENMX09VVF9PRl9IT1NUX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgLTYKKyNkZWZpbmUgQ0xfUFJPRklMSU5HX0lORk9fTk9UX0FWQUlMQUJMRSAgICAgICAgICAgICAtNworI2RlZmluZSBDTF9NRU1fQ09QWV9PVkVSTEFQICAgICAgICAgICAgICAgICAgICAgICAgIC04CisjZGVmaW5lIENMX0lNQUdFX0ZPUk1BVF9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgLTkKKyNkZWZpbmUgQ0xfSU1BR0VfRk9STUFUX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAtMTAKKyNkZWZpbmUgQ0xfQlVJTERfUFJPR1JBTV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAtMTEKKyNkZWZpbmUgQ0xfTUFQX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTIKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMQorI2RlZmluZSBDTF9NSVNBTElHTkVEX1NVQl9CVUZGRVJfT0ZGU0VUICAgICAgICAgICAgIC0xMworI2RlZmluZSBDTF9FWEVDX1NUQVRVU19FUlJPUl9GT1JfRVZFTlRTX0lOX1dBSVRfTElTVCAtMTQKKyNlbmRpZgorI2lmZGVmIENMX1ZFUlNJT05fMV8yCisjZGVmaW5lIENMX0NPTVBJTEVfUFJPR1JBTV9GQUlMVVJFICAgICAgICAgICAgICAgICAgLTE1CisjZGVmaW5lIENMX0xJTktFUl9OT1RfQVZBSUxBQkxFICAgICAgICAgICAgICAgICAgICAgLTE2CisjZGVmaW5lIENMX0xJTktfUFJPR1JBTV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgLTE3CisjZGVmaW5lIENMX0RFVklDRV9QQVJUSVRJT05fRkFJTEVEICAgICAgICAgICAgICAgICAgLTE4CisjZGVmaW5lIENMX0tFUk5FTF9BUkdfSU5GT19OT1RfQVZBSUxBQkxFICAgICAgICAgICAgLTE5CisjZW5kaWYKKworI2RlZmluZSBDTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMAorI2RlZmluZSBDTF9JTlZBTElEX0RFVklDRV9UWVBFICAgICAgICAgICAgICAgICAgICAgIC0zMQorI2RlZmluZSBDTF9JTlZBTElEX1BMQVRGT1JNICAgICAgICAgICAgICAgICAgICAgICAgIC0zMgorI2RlZmluZSBDTF9JTlZBTElEX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMworI2RlZmluZSBDTF9JTlZBTElEX0NPTlRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNAorI2RlZmluZSBDTF9JTlZBTElEX1FVRVVFX1BST1BFUlRJRVMgICAgICAgICAgICAgICAgIC0zNQorI2RlZmluZSBDTF9JTlZBTElEX0NPTU1BTkRfUVVFVUUgICAgICAgICAgICAgICAgICAgIC0zNgorI2RlZmluZSBDTF9JTlZBTElEX0hPU1RfUFRSICAgICAgICAgICAgICAgICAgICAgICAgIC0zNworI2RlZmluZSBDTF9JTlZBTElEX01FTV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgIC0zOAorI2RlZmluZSBDTF9JTlZBTElEX0lNQUdFX0ZPUk1BVF9ERVNDUklQVE9SICAgICAgICAgIC0zOQorI2RlZmluZSBDTF9JTlZBTElEX0lNQUdFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgIC00MAorI2RlZmluZSBDTF9JTlZBTElEX1NBTVBMRVIgICAgICAgICAgICAgICAgICAgICAgICAgIC00MQorI2RlZmluZSBDTF9JTlZBTElEX0JJTkFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MgorI2RlZmluZSBDTF9JTlZBTElEX0JVSUxEX09QVElPTlMgICAgICAgICAgICAgICAgICAgIC00MworI2RlZmluZSBDTF9JTlZBTElEX1BST0dSQU0gICAgICAgICAgICAgICAgICAgICAgICAgIC00NAorI2RlZmluZSBDTF9JTlZBTElEX1BST0dSQU1fRVhFQ1VUQUJMRSAgICAgICAgICAgICAgIC00NQorI2RlZmluZSBDTF9JTlZBTElEX0tFUk5FTF9OQU1FICAgICAgICAgICAgICAgICAgICAgIC00NgorI2RlZmluZSBDTF9JTlZBTElEX0tFUk5FTF9ERUZJTklUSU9OICAgICAgICAgICAgICAgIC00NworI2RlZmluZSBDTF9JTlZBTElEX0tFUk5FTCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00OAorI2RlZmluZSBDTF9JTlZBTElEX0FSR19JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgIC00OQorI2RlZmluZSBDTF9JTlZBTElEX0FSR19WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgIC01MAorI2RlZmluZSBDTF9JTlZBTElEX0FSR19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIC01MQorI2RlZmluZSBDTF9JTlZBTElEX0tFUk5FTF9BUkdTICAgICAgICAgICAgICAgICAgICAgIC01MgorI2RlZmluZSBDTF9JTlZBTElEX1dPUktfRElNRU5TSU9OICAgICAgICAgICAgICAgICAgIC01MworI2RlZmluZSBDTF9JTlZBTElEX1dPUktfR1JPVVBfU0laRSAgICAgICAgICAgICAgICAgIC01NAorI2RlZmluZSBDTF9JTlZBTElEX1dPUktfSVRFTV9TSVpFICAgICAgICAgICAgICAgICAgIC01NQorI2RlZmluZSBDTF9JTlZBTElEX0dMT0JBTF9PRkZTRVQgICAgICAgICAgICAgICAgICAgIC01NgorI2RlZmluZSBDTF9JTlZBTElEX0VWRU5UX1dBSVRfTElTVCAgICAgICAgICAgICAgICAgIC01NworI2RlZmluZSBDTF9JTlZBTElEX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01OAorI2RlZmluZSBDTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIC01OQorI2RlZmluZSBDTF9JTlZBTElEX0dMX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgIC02MAorI2RlZmluZSBDTF9JTlZBTElEX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgIC02MQorI2RlZmluZSBDTF9JTlZBTElEX01JUF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIC02MgorI2RlZmluZSBDTF9JTlZBTElEX0dMT0JBTF9XT1JLX1NJWkUgICAgICAgICAgICAgICAgIC02MworI2lmZGVmIENMX1ZFUlNJT05fMV8xCisjZGVmaW5lIENMX0lOVkFMSURfUFJPUEVSVFkgICAgICAgICAgICAgICAgICAgICAgICAgLTY0CisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9JTlZBTElEX0lNQUdFX0RFU0NSSVBUT1IgICAgICAgICAgICAgICAgIC02NQorI2RlZmluZSBDTF9JTlZBTElEX0NPTVBJTEVSX09QVElPTlMgICAgICAgICAgICAgICAgIC02NgorI2RlZmluZSBDTF9JTlZBTElEX0xJTktFUl9PUFRJT05TICAgICAgICAgICAgICAgICAgIC02NworI2RlZmluZSBDTF9JTlZBTElEX0RFVklDRV9QQVJUSVRJT05fQ09VTlQgICAgICAgICAgIC02OAorI2VuZGlmCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgQ0xfSU5WQUxJRF9QSVBFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAtNjkKKyNkZWZpbmUgQ0xfSU5WQUxJRF9ERVZJQ0VfUVVFVUUgICAgICAgICAgICAgICAgICAgICAtNzAKKyNlbmRpZgorI2lmZGVmIENMX1ZFUlNJT05fMl8yCisjZGVmaW5lIENMX0lOVkFMSURfU1BFQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxCisjZGVmaW5lIENMX01BWF9TSVpFX1JFU1RSSUNUSU9OX0VYQ0VFREVEICAgICAgICAgICAgLTcyCisjZW5kaWYKKworCisvKiBjbF9ib29sICovCisjZGVmaW5lIENMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9CTE9DS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX1RSVUUKKyNkZWZpbmUgQ0xfTk9OX0JMT0NLSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9GQUxTRQorI2VuZGlmCisKKy8qIGNsX3BsYXRmb3JtX2luZm8gKi8KKyNkZWZpbmUgQ0xfUExBVEZPUk1fUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAKKyNkZWZpbmUgQ0xfUExBVEZPUk1fVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKKyNkZWZpbmUgQ0xfUExBVEZPUk1fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDIKKyNkZWZpbmUgQ0xfUExBVEZPUk1fVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDMKKyNkZWZpbmUgQ0xfUExBVEZPUk1fRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgICAweDA5MDQKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMQorI2RlZmluZSBDTF9QTEFURk9STV9IT1NUX1RJTUVSX1JFU09MVVRJT04gICAgICAgICAgIDB4MDkwNQorI2VuZGlmCisjaWZkZWYgQ0xfVkVSU0lPTl8zXzAKKyNkZWZpbmUgQ0xfUExBVEZPUk1fTlVNRVJJQ19WRVJTSU9OICAgICAgICAgICAgICAgICAweDA5MDYKKyNkZWZpbmUgQ0xfUExBVEZPUk1fRVhURU5TSU9OU19XSVRIX1ZFUlNJT04gICAgICAgICAweDA5MDcKKyNlbmRpZgorCisvKiBjbF9kZXZpY2VfdHlwZSAtIGJpdGZpZWxkICovCisjZGVmaW5lIENMX0RFVklDRV9UWVBFX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ0xfREVWSUNFX1RZUEVfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBDTF9ERVZJQ0VfVFlQRV9HUFUgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIENMX0RFVklDRV9UWVBFX0FDQ0VMRVJBVE9SICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9ERVZJQ0VfVFlQRV9DVVNUT00gICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDQpCisjZW5kaWYKKyNkZWZpbmUgQ0xfREVWSUNFX1RZUEVfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisKKy8qIGNsX2RldmljZV9pbmZvICovCisjZGVmaW5lIENMX0RFVklDRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgQ0xfREVWSUNFX1ZFTkRPUl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMQorI2RlZmluZSBDTF9ERVZJQ0VfTUFYX0NPTVBVVEVfVU5JVFMgICAgICAgICAgICAgICAgICAgICAgMHgxMDAyCisjZGVmaW5lIENMX0RFVklDRV9NQVhfV09SS19JVEVNX0RJTUVOU0lPTlMgICAgICAgICAgICAgICAweDEwMDMKKyNkZWZpbmUgQ0xfREVWSUNFX01BWF9XT1JLX0dST1VQX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4MTAwNAorI2RlZmluZSBDTF9ERVZJQ0VfTUFYX1dPUktfSVRFTV9TSVpFUyAgICAgICAgICAgICAgICAgICAgMHgxMDA1CisjZGVmaW5lIENMX0RFVklDRV9QUkVGRVJSRURfVkVDVE9SX1dJRFRIX0NIQVIgICAgICAgICAgICAweDEwMDYKKyNkZWZpbmUgQ0xfREVWSUNFX1BSRUZFUlJFRF9WRUNUT1JfV0lEVEhfU0hPUlQgICAgICAgICAgIDB4MTAwNworI2RlZmluZSBDTF9ERVZJQ0VfUFJFRkVSUkVEX1ZFQ1RPUl9XSURUSF9JTlQgICAgICAgICAgICAgMHgxMDA4CisjZGVmaW5lIENMX0RFVklDRV9QUkVGRVJSRURfVkVDVE9SX1dJRFRIX0xPTkcgICAgICAgICAgICAweDEwMDkKKyNkZWZpbmUgQ0xfREVWSUNFX1BSRUZFUlJFRF9WRUNUT1JfV0lEVEhfRkxPQVQgICAgICAgICAgIDB4MTAwQQorI2RlZmluZSBDTF9ERVZJQ0VfUFJFRkVSUkVEX1ZFQ1RPUl9XSURUSF9ET1VCTEUgICAgICAgICAgMHgxMDBCCisjZGVmaW5lIENMX0RFVklDRV9NQVhfQ0xPQ0tfRlJFUVVFTkNZICAgICAgICAgICAgICAgICAgICAweDEwMEMKKyNkZWZpbmUgQ0xfREVWSUNFX0FERFJFU1NfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRAorI2RlZmluZSBDTF9ERVZJQ0VfTUFYX1JFQURfSU1BR0VfQVJHUyAgICAgICAgICAgICAgICAgICAgMHgxMDBFCisjZGVmaW5lIENMX0RFVklDRV9NQVhfV1JJVEVfSU1BR0VfQVJHUyAgICAgICAgICAgICAgICAgICAweDEwMEYKKyNkZWZpbmUgQ0xfREVWSUNFX01BWF9NRU1fQUxMT0NfU0laRSAgICAgICAgICAgICAgICAgICAgIDB4MTAxMAorI2RlZmluZSBDTF9ERVZJQ0VfSU1BR0UyRF9NQVhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMHgxMDExCisjZGVmaW5lIENMX0RFVklDRV9JTUFHRTJEX01BWF9IRUlHSFQgICAgICAgICAgICAgICAgICAgICAweDEwMTIKKyNkZWZpbmUgQ0xfREVWSUNFX0lNQUdFM0RfTUFYX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDB4MTAxMworI2RlZmluZSBDTF9ERVZJQ0VfSU1BR0UzRF9NQVhfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgMHgxMDE0CisjZGVmaW5lIENMX0RFVklDRV9JTUFHRTNEX01BWF9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAweDEwMTUKKyNkZWZpbmUgQ0xfREVWSUNFX0lNQUdFX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxNgorI2RlZmluZSBDTF9ERVZJQ0VfTUFYX1BBUkFNRVRFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgMHgxMDE3CisjZGVmaW5lIENMX0RFVklDRV9NQVhfU0FNUExFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTgKKyNkZWZpbmUgQ0xfREVWSUNFX01FTV9CQVNFX0FERFJfQUxJR04gICAgICAgICAgICAgICAgICAgIDB4MTAxOQorI2RlZmluZSBDTF9ERVZJQ0VfTUlOX0RBVEFfVFlQRV9BTElHTl9TSVpFICAgICAgICAgICAgICAgMHgxMDFBCisjZGVmaW5lIENMX0RFVklDRV9TSU5HTEVfRlBfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAweDEwMUIKKyNkZWZpbmUgQ0xfREVWSUNFX0dMT0JBTF9NRU1fQ0FDSEVfVFlQRSAgICAgICAgICAgICAgICAgIDB4MTAxQworI2RlZmluZSBDTF9ERVZJQ0VfR0xPQkFMX01FTV9DQUNIRUxJTkVfU0laRSAgICAgICAgICAgICAgMHgxMDFECisjZGVmaW5lIENMX0RFVklDRV9HTE9CQUxfTUVNX0NBQ0hFX1NJWkUgICAgICAgICAgICAgICAgICAweDEwMUUKKyNkZWZpbmUgQ0xfREVWSUNFX0dMT0JBTF9NRU1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxRgorI2RlZmluZSBDTF9ERVZJQ0VfTUFYX0NPTlNUQU5UX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgMHgxMDIwCisjZGVmaW5lIENMX0RFVklDRV9NQVhfQ09OU1RBTlRfQVJHUyAgICAgICAgICAgICAgICAgICAgICAweDEwMjEKKyNkZWZpbmUgQ0xfREVWSUNFX0xPQ0FMX01FTV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAyMgorI2RlZmluZSBDTF9ERVZJQ0VfTE9DQUxfTUVNX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDIzCisjZGVmaW5lIENMX0RFVklDRV9FUlJPUl9DT1JSRUNUSU9OX1NVUFBPUlQgICAgICAgICAgICAgICAweDEwMjQKKyNkZWZpbmUgQ0xfREVWSUNFX1BST0ZJTElOR19USU1FUl9SRVNPTFVUSU9OICAgICAgICAgICAgIDB4MTAyNQorI2RlZmluZSBDTF9ERVZJQ0VfRU5ESUFOX0xJVFRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDI2CisjZGVmaW5lIENMX0RFVklDRV9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMjcKKyNkZWZpbmUgQ0xfREVWSUNFX0NPTVBJTEVSX0FWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgIDB4MTAyOAorI2RlZmluZSBDTF9ERVZJQ0VfRVhFQ1VUSU9OX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgMHgxMDI5CisjZGVmaW5lIENMX0RFVklDRV9RVUVVRV9QUk9QRVJUSUVTICAgICAgICAgICAgICAgICAgICAgICAweDEwMkEgICAgLyogZGVwcmVjYXRlZCAqLworI2lmZGVmIENMX1ZFUlNJT05fMl8wCisjZGVmaW5lIENMX0RFVklDRV9RVUVVRV9PTl9IT1NUX1BST1BFUlRJRVMgICAgICAgICAgICAgICAweDEwMkEKKyNlbmRpZgorI2RlZmluZSBDTF9ERVZJQ0VfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDJCCisjZGVmaW5lIENMX0RFVklDRV9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMkMKKyNkZWZpbmUgQ0xfRFJJVkVSX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAyRAorI2RlZmluZSBDTF9ERVZJQ0VfUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDJFCisjZGVmaW5lIENMX0RFVklDRV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMkYKKyNkZWZpbmUgQ0xfREVWSUNFX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAzMAorI2RlZmluZSBDTF9ERVZJQ0VfUExBVEZPUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDMxCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKyNkZWZpbmUgQ0xfREVWSUNFX0RPVUJMRV9GUF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgIDB4MTAzMgorI2VuZGlmCisvKiAweDEwMzMgcmVzZXJ2ZWQgZm9yIENMX0RFVklDRV9IQUxGX0ZQX0NPTkZJRyB3aGljaCBpcyBhbHJlYWR5IGRlZmluZWQgaW4gImNsX2V4dC5oIiAqLworI2lmZGVmIENMX1ZFUlNJT05fMV8xCisjZGVmaW5lIENMX0RFVklDRV9QUkVGRVJSRURfVkVDVE9SX1dJRFRIX0hBTEYgICAgICAgICAgICAweDEwMzQKKyNkZWZpbmUgQ0xfREVWSUNFX0hPU1RfVU5JRklFRF9NRU1PUlkgICAgICAgICAgICAgICAgICAgIDB4MTAzNSAgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgQ0xfREVWSUNFX05BVElWRV9WRUNUT1JfV0lEVEhfQ0hBUiAgICAgICAgICAgICAgIDB4MTAzNgorI2RlZmluZSBDTF9ERVZJQ0VfTkFUSVZFX1ZFQ1RPUl9XSURUSF9TSE9SVCAgICAgICAgICAgICAgMHgxMDM3CisjZGVmaW5lIENMX0RFVklDRV9OQVRJVkVfVkVDVE9SX1dJRFRIX0lOVCAgICAgICAgICAgICAgICAweDEwMzgKKyNkZWZpbmUgQ0xfREVWSUNFX05BVElWRV9WRUNUT1JfV0lEVEhfTE9ORyAgICAgICAgICAgICAgIDB4MTAzOQorI2RlZmluZSBDTF9ERVZJQ0VfTkFUSVZFX1ZFQ1RPUl9XSURUSF9GTE9BVCAgICAgICAgICAgICAgMHgxMDNBCisjZGVmaW5lIENMX0RFVklDRV9OQVRJVkVfVkVDVE9SX1dJRFRIX0RPVUJMRSAgICAgICAgICAgICAweDEwM0IKKyNkZWZpbmUgQ0xfREVWSUNFX05BVElWRV9WRUNUT1JfV0lEVEhfSEFMRiAgICAgICAgICAgICAgIDB4MTAzQworI2RlZmluZSBDTF9ERVZJQ0VfT1BFTkNMX0NfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxMDNECisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9ERVZJQ0VfTElOS0VSX0FWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDNFCisjZGVmaW5lIENMX0RFVklDRV9CVUlMVF9JTl9LRVJORUxTICAgICAgICAgICAgICAgICAgICAgICAweDEwM0YKKyNkZWZpbmUgQ0xfREVWSUNFX0lNQUdFX01BWF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgIDB4MTA0MAorI2RlZmluZSBDTF9ERVZJQ0VfSU1BR0VfTUFYX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgMHgxMDQxCisjZGVmaW5lIENMX0RFVklDRV9QQVJFTlRfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwNDIKKyNkZWZpbmUgQ0xfREVWSUNFX1BBUlRJVElPTl9NQVhfU1VCX0RFVklDRVMgICAgICAgICAgICAgIDB4MTA0MworI2RlZmluZSBDTF9ERVZJQ0VfUEFSVElUSU9OX1BST1BFUlRJRVMgICAgICAgICAgICAgICAgICAgMHgxMDQ0CisjZGVmaW5lIENMX0RFVklDRV9QQVJUSVRJT05fQUZGSU5JVFlfRE9NQUlOICAgICAgICAgICAgICAweDEwNDUKKyNkZWZpbmUgQ0xfREVWSUNFX1BBUlRJVElPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA0NgorI2RlZmluZSBDTF9ERVZJQ0VfUkVGRVJFTkNFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDQ3CisjZGVmaW5lIENMX0RFVklDRV9QUkVGRVJSRURfSU5URVJPUF9VU0VSX1NZTkMgICAgICAgICAgICAweDEwNDgKKyNkZWZpbmUgQ0xfREVWSUNFX1BSSU5URl9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgIDB4MTA0OQorI2VuZGlmCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgQ0xfREVWSUNFX0lNQUdFX1BJVENIX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgIDB4MTA0QQorI2RlZmluZSBDTF9ERVZJQ0VfSU1BR0VfQkFTRV9BRERSRVNTX0FMSUdOTUVOVCAgICAgICAgICAgMHgxMDRCCisjZGVmaW5lIENMX0RFVklDRV9NQVhfUkVBRF9XUklURV9JTUFHRV9BUkdTICAgICAgICAgICAgICAweDEwNEMKKyNkZWZpbmUgQ0xfREVWSUNFX01BWF9HTE9CQUxfVkFSSUFCTEVfU0laRSAgICAgICAgICAgICAgIDB4MTA0RAorI2RlZmluZSBDTF9ERVZJQ0VfUVVFVUVfT05fREVWSUNFX1BST1BFUlRJRVMgICAgICAgICAgICAgMHgxMDRFCisjZGVmaW5lIENMX0RFVklDRV9RVUVVRV9PTl9ERVZJQ0VfUFJFRkVSUkVEX1NJWkUgICAgICAgICAweDEwNEYKKyNkZWZpbmUgQ0xfREVWSUNFX1FVRVVFX09OX0RFVklDRV9NQVhfU0laRSAgICAgICAgICAgICAgIDB4MTA1MAorI2RlZmluZSBDTF9ERVZJQ0VfTUFYX09OX0RFVklDRV9RVUVVRVMgICAgICAgICAgICAgICAgICAgMHgxMDUxCisjZGVmaW5lIENMX0RFVklDRV9NQVhfT05fREVWSUNFX0VWRU5UUyAgICAgICAgICAgICAgICAgICAweDEwNTIKKyNkZWZpbmUgQ0xfREVWSUNFX1NWTV9DQVBBQklMSVRJRVMgICAgICAgICAgICAgICAgICAgICAgIDB4MTA1MworI2RlZmluZSBDTF9ERVZJQ0VfR0xPQkFMX1ZBUklBQkxFX1BSRUZFUlJFRF9UT1RBTF9TSVpFICAgMHgxMDU0CisjZGVmaW5lIENMX0RFVklDRV9NQVhfUElQRV9BUkdTICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwNTUKKyNkZWZpbmUgQ0xfREVWSUNFX1BJUEVfTUFYX0FDVElWRV9SRVNFUlZBVElPTlMgICAgICAgICAgIDB4MTA1NgorI2RlZmluZSBDTF9ERVZJQ0VfUElQRV9NQVhfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgMHgxMDU3CisjZGVmaW5lIENMX0RFVklDRV9QUkVGRVJSRURfUExBVEZPUk1fQVRPTUlDX0FMSUdOTUVOVCAgICAweDEwNTgKKyNkZWZpbmUgQ0xfREVWSUNFX1BSRUZFUlJFRF9HTE9CQUxfQVRPTUlDX0FMSUdOTUVOVCAgICAgIDB4MTA1OQorI2RlZmluZSBDTF9ERVZJQ0VfUFJFRkVSUkVEX0xPQ0FMX0FUT01JQ19BTElHTk1FTlQgICAgICAgMHgxMDVBCisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMQorI2RlZmluZSBDTF9ERVZJQ0VfSUxfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDVCCisjZGVmaW5lIENMX0RFVklDRV9NQVhfTlVNX1NVQl9HUk9VUFMgICAgICAgICAgICAgICAgICAgICAweDEwNUMKKyNkZWZpbmUgQ0xfREVWSUNFX1NVQl9HUk9VUF9JTkRFUEVOREVOVF9GT1JXQVJEX1BST0dSRVNTIDB4MTA1RAorI2VuZGlmCisjaWZkZWYgQ0xfVkVSU0lPTl8zXzAKKyNkZWZpbmUgQ0xfREVWSUNFX05VTUVSSUNfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA1RQorI2RlZmluZSBDTF9ERVZJQ0VfRVhURU5TSU9OU19XSVRIX1ZFUlNJT04gICAgICAgICAgICAgICAgMHgxMDYwCisjZGVmaW5lIENMX0RFVklDRV9JTFNfV0lUSF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAweDEwNjEKKyNkZWZpbmUgQ0xfREVWSUNFX0JVSUxUX0lOX0tFUk5FTFNfV0lUSF9WRVJTSU9OICAgICAgICAgIDB4MTA2MgorI2RlZmluZSBDTF9ERVZJQ0VfQVRPTUlDX01FTU9SWV9DQVBBQklMSVRJRVMgICAgICAgICAgICAgMHgxMDYzCisjZGVmaW5lIENMX0RFVklDRV9BVE9NSUNfRkVOQ0VfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAweDEwNjQKKyNkZWZpbmUgQ0xfREVWSUNFX05PTl9VTklGT1JNX1dPUktfR1JPVVBfU1VQUE9SVCAgICAgICAgIDB4MTA2NQorI2RlZmluZSBDTF9ERVZJQ0VfT1BFTkNMX0NfQUxMX1ZFUlNJT05TICAgICAgICAgICAgICAgICAgMHgxMDY2CisjZGVmaW5lIENMX0RFVklDRV9QUkVGRVJSRURfV09SS19HUk9VUF9TSVpFX01VTFRJUExFICAgICAweDEwNjcKKyNkZWZpbmUgQ0xfREVWSUNFX1dPUktfR1JPVVBfQ09MTEVDVElWRV9GVU5DVElPTlNfU1VQUE9SVCAweDEwNjgKKyNkZWZpbmUgQ0xfREVWSUNFX0dFTkVSSUNfQUREUkVTU19TUEFDRV9TVVBQT1JUICAgICAgICAgIDB4MTA2OQorLyogMHgxMDZBIHRvIDB4MTA2RSAtIFJlc2VydmVkIGZvciB1cGNvbWluZyBLSFIgZXh0ZW5zaW9uICovCisjZGVmaW5lIENMX0RFVklDRV9PUEVOQ0xfQ19GRUFUVVJFUyAgICAgICAgICAgICAgICAgICAgICAweDEwNkYKKyNkZWZpbmUgQ0xfREVWSUNFX0RFVklDRV9FTlFVRVVFX0NBUEFCSUxJVElFUyAgICAgICAgICAgIDB4MTA3MAorI2RlZmluZSBDTF9ERVZJQ0VfUElQRV9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDcxCisjZGVmaW5lIENMX0RFVklDRV9MQVRFU1RfQ09ORk9STUFOQ0VfVkVSU0lPTl9QQVNTRUQgICAgICAweDEwNzIKKyNlbmRpZgorCisvKiBjbF9kZXZpY2VfZnBfY29uZmlnIC0gYml0ZmllbGQgKi8KKyNkZWZpbmUgQ0xfRlBfREVOT1JNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBDTF9GUF9JTkZfTkFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIENMX0ZQX1JPVU5EX1RPX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQ0xfRlBfUk9VTkRfVE9fWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBDTF9GUF9ST1VORF9UT19JTkYgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIENMX0ZQX0ZNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMQorI2RlZmluZSBDTF9GUF9TT0ZUX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9GUF9DT1JSRUNUTFlfUk9VTkRFRF9ESVZJREVfU1FSVCAgICAgICAgICgxIDw8IDcpCisjZW5kaWYKKworLyogY2xfZGV2aWNlX21lbV9jYWNoZV90eXBlICovCisjZGVmaW5lIENMX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX1JFQURfT05MWV9DQUNIRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIENMX1JFQURfV1JJVEVfQ0FDSEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisKKy8qIGNsX2RldmljZV9sb2NhbF9tZW1fdHlwZSAqLworI2RlZmluZSBDTF9MT0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTF9HTE9CQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorCisvKiBjbF9kZXZpY2VfZXhlY19jYXBhYmlsaXRpZXMgLSBiaXRmaWVsZCAqLworI2RlZmluZSBDTF9FWEVDX0tFUk5FTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENMX0VYRUNfTkFUSVZFX0tFUk5FTCAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKworLyogY2xfY29tbWFuZF9xdWV1ZV9wcm9wZXJ0aWVzIC0gYml0ZmllbGQgKi8KKyNkZWZpbmUgQ0xfUVVFVUVfT1VUX09GX09SREVSX0VYRUNfTU9ERV9FTkFCTEUgICAgICAoMSA8PCAwKQorI2RlZmluZSBDTF9RVUVVRV9QUk9GSUxJTkdfRU5BQkxFICAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgQ0xfUVVFVUVfT05fREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBDTF9RVUVVRV9PTl9ERVZJQ0VfREVGQVVMVCAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisjZW5kaWYKKworLyogY2xfY29udGV4dF9pbmZvICovCisjZGVmaW5lIENMX0NPTlRFWFRfUkVGRVJFTkNFX0NPVU5UICAgICAgICAgICAgICAgICAgMHgxMDgwCisjZGVmaW5lIENMX0NPTlRFWFRfREVWSUNFUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDgxCisjZGVmaW5lIENMX0NPTlRFWFRfUFJPUEVSVElFUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDgyCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKKyNkZWZpbmUgQ0xfQ09OVEVYVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgICAgICAweDEwODMKKyNlbmRpZgorCisvKiBjbF9jb250ZXh0X3Byb3BlcnRpZXMgKi8KKyNkZWZpbmUgQ0xfQ09OVEVYVF9QTEFURk9STSAgICAgICAgICAgICAgICAgICAgICAgICAweDEwODQKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9DT05URVhUX0lOVEVST1BfVVNFUl9TWU5DICAgICAgICAgICAgICAgIDB4MTA4NQorI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCisvKiBjbF9kZXZpY2VfcGFydGl0aW9uX3Byb3BlcnR5ICovCisjZGVmaW5lIENMX0RFVklDRV9QQVJUSVRJT05fRVFVQUxMWSAgICAgICAgICAgICAgICAgMHgxMDg2CisjZGVmaW5lIENMX0RFVklDRV9QQVJUSVRJT05fQllfQ09VTlRTICAgICAgICAgICAgICAgMHgxMDg3CisjZGVmaW5lIENMX0RFVklDRV9QQVJUSVRJT05fQllfQ09VTlRTX0xJU1RfRU5EICAgICAgMHgwCisjZGVmaW5lIENMX0RFVklDRV9QQVJUSVRJT05fQllfQUZGSU5JVFlfRE9NQUlOICAgICAgMHgxMDg4CisKKyNlbmRpZgorCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKworLyogY2xfZGV2aWNlX2FmZmluaXR5X2RvbWFpbiAqLworI2RlZmluZSBDTF9ERVZJQ0VfQUZGSU5JVFlfRE9NQUlOX05VTUEgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBDTF9ERVZJQ0VfQUZGSU5JVFlfRE9NQUlOX0w0X0NBQ0hFICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBDTF9ERVZJQ0VfQUZGSU5JVFlfRE9NQUlOX0wzX0NBQ0hFICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBDTF9ERVZJQ0VfQUZGSU5JVFlfRE9NQUlOX0wyX0NBQ0hFICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBDTF9ERVZJQ0VfQUZGSU5JVFlfRE9NQUlOX0wxX0NBQ0hFICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBDTF9ERVZJQ0VfQUZGSU5JVFlfRE9NQUlOX05FWFRfUEFSVElUSU9OQUJMRSAoMSA8PCA1KQorCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMl8wCisKKy8qIGNsX2RldmljZV9zdm1fY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIENMX0RFVklDRV9TVk1fQ09BUlNFX0dSQUlOX0JVRkZFUiAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ0xfREVWSUNFX1NWTV9GSU5FX0dSQUlOX0JVRkZFUiAgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBDTF9ERVZJQ0VfU1ZNX0ZJTkVfR1JBSU5fU1lTVEVNICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIENMX0RFVklDRV9TVk1fQVRPTUlDUyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKworI2VuZGlmCisKKy8qIGNsX2NvbW1hbmRfcXVldWVfaW5mbyAqLworI2RlZmluZSBDTF9RVUVVRV9DT05URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA5MAorI2RlZmluZSBDTF9RVUVVRV9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA5MQorI2RlZmluZSBDTF9RVUVVRV9SRUZFUkVOQ0VfQ09VTlQgICAgICAgICAgICAgICAgICAgIDB4MTA5MgorI2RlZmluZSBDTF9RVUVVRV9QUk9QRVJUSUVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA5MworI2lmZGVmIENMX1ZFUlNJT05fMl8wCisjZGVmaW5lIENMX1FVRVVFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDk0CisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMQorI2RlZmluZSBDTF9RVUVVRV9ERVZJQ0VfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgIDB4MTA5NQorI2VuZGlmCisjaWZkZWYgQ0xfVkVSU0lPTl8zXzAKKyNkZWZpbmUgQ0xfUVVFVUVfUFJPUEVSVElFU19BUlJBWSAgICAgICAgICAgICAgICAgICAweDEwOTgKKyNlbmRpZgorCisvKiBjbF9tZW1fZmxhZ3MgYW5kIGNsX3N2bV9tZW1fZmxhZ3MgLSBiaXRmaWVsZCAqLworI2RlZmluZSBDTF9NRU1fUkVBRF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENMX01FTV9XUklURV9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQ0xfTUVNX1JFQURfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBDTF9NRU1fVVNFX0hPU1RfUFRSICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIENMX01FTV9BTExPQ19IT1NUX1BUUiAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQ0xfTUVNX0NPUFlfSE9TVF9QVFIgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA1KQorLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpICAgICovCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKyNkZWZpbmUgQ0xfTUVNX0hPU1RfV1JJVEVfT05MWSAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA3KQorI2RlZmluZSBDTF9NRU1fSE9TVF9SRUFEX09OTFkgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIENMX01FTV9IT1NUX05PX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOSkKKyNlbmRpZgorI2lmZGVmIENMX1ZFUlNJT05fMl8wCisjZGVmaW5lIENMX01FTV9TVk1fRklORV9HUkFJTl9CVUZGRVIgICAgICAgICAgICAgICAgKDEgPDwgMTApICAgLyogdXNlZCBieSBjbF9zdm1fbWVtX2ZsYWdzIG9ubHkgKi8KKyNkZWZpbmUgQ0xfTUVNX1NWTV9BVE9NSUNTICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkgICAvKiB1c2VkIGJ5IGNsX3N2bV9tZW1fZmxhZ3Mgb25seSAqLworI2RlZmluZSBDTF9NRU1fS0VSTkVMX1JFQURfQU5EX1dSSVRFICAgICAgICAgICAgICAgICgxIDw8IDEyKQorI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCisvKiBjbF9tZW1fbWlncmF0aW9uX2ZsYWdzIC0gYml0ZmllbGQgKi8KKyNkZWZpbmUgQ0xfTUlHUkFURV9NRU1fT0JKRUNUX0hPU1QgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBDTF9NSUdSQVRFX01FTV9PQkpFQ1RfQ09OVEVOVF9VTkRFRklORUQgICAgICgxIDw8IDEpCisKKyNlbmRpZgorCisvKiBjbF9jaGFubmVsX29yZGVyICovCisjZGVmaW5lIENMX1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEIwCisjZGVmaW5lIENMX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEIxCisjZGVmaW5lIENMX1JHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEIyCisjZGVmaW5lIENMX1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEIzCisjZGVmaW5lIENMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEI0CisjZGVmaW5lIENMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEI1CisjZGVmaW5lIENMX0JHUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEI2CisjZGVmaW5lIENMX0FSR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEI3CisjZGVmaW5lIENMX0lOVEVOU0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEI4CisjZGVmaW5lIENMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEI5CisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKKyNkZWZpbmUgQ0xfUnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwQkEKKyNkZWZpbmUgQ0xfUkd4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwQkIKKyNkZWZpbmUgQ0xfUkdCeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwQkMKKyNlbmRpZgorI2lmZGVmIENMX1ZFUlNJT05fMV8yCisjZGVmaW5lIENMX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEJECisjZGVmaW5lIENMX0RFUFRIX1NURU5DSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEJFCisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorI2RlZmluZSBDTF9zUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBCRgorI2RlZmluZSBDTF9zUkdCeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBDMAorI2RlZmluZSBDTF9zUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBDMQorI2RlZmluZSBDTF9zQkdSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBDMgorI2RlZmluZSBDTF9BQkdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBDMworI2VuZGlmCisKKy8qIGNsX2NoYW5uZWxfdHlwZSAqLworI2RlZmluZSBDTF9TTk9STV9JTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEMAorI2RlZmluZSBDTF9TTk9STV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEMQorI2RlZmluZSBDTF9VTk9STV9JTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEMgorI2RlZmluZSBDTF9VTk9STV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEMworI2RlZmluZSBDTF9VTk9STV9TSE9SVF81NjUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBENAorI2RlZmluZSBDTF9VTk9STV9TSE9SVF81NTUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBENQorI2RlZmluZSBDTF9VTk9STV9JTlRfMTAxMDEwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBENgorI2RlZmluZSBDTF9TSUdORURfSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBENworI2RlZmluZSBDTF9TSUdORURfSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEOAorI2RlZmluZSBDTF9TSUdORURfSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEOQorI2RlZmluZSBDTF9VTlNJR05FRF9JTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEQQorI2RlZmluZSBDTF9VTlNJR05FRF9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEQgorI2RlZmluZSBDTF9VTlNJR05FRF9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBEQworI2RlZmluZSBDTF9IQUxGX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBERAorI2RlZmluZSBDTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBERQorI2lmZGVmIENMX1ZFUlNJT05fMV8yCisjZGVmaW5lIENMX1VOT1JNX0lOVDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMERGCisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMQorI2RlZmluZSBDTF9VTk9STV9JTlRfMTAxMDEwXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MTBFMAorI2VuZGlmCisKKy8qIGNsX21lbV9vYmplY3RfdHlwZSAqLworI2RlZmluZSBDTF9NRU1fT0JKRUNUX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBGMAorI2RlZmluZSBDTF9NRU1fT0JKRUNUX0lNQUdFMkQgICAgICAgICAgICAgICAgICAgICAgIDB4MTBGMQorI2RlZmluZSBDTF9NRU1fT0JKRUNUX0lNQUdFM0QgICAgICAgICAgICAgICAgICAgICAgIDB4MTBGMgorI2lmZGVmIENMX1ZFUlNJT05fMV8yCisjZGVmaW5lIENMX01FTV9PQkpFQ1RfSU1BR0UyRF9BUlJBWSAgICAgICAgICAgICAgICAgMHgxMEYzCisjZGVmaW5lIENMX01FTV9PQkpFQ1RfSU1BR0UxRCAgICAgICAgICAgICAgICAgICAgICAgMHgxMEY0CisjZGVmaW5lIENMX01FTV9PQkpFQ1RfSU1BR0UxRF9BUlJBWSAgICAgICAgICAgICAgICAgMHgxMEY1CisjZGVmaW5lIENMX01FTV9PQkpFQ1RfSU1BR0UxRF9CVUZGRVIgICAgICAgICAgICAgICAgMHgxMEY2CisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorI2RlZmluZSBDTF9NRU1fT0JKRUNUX1BJUEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBGNworI2VuZGlmCisKKy8qIGNsX21lbV9pbmZvICovCisjZGVmaW5lIENMX01FTV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAwCisjZGVmaW5lIENMX01FTV9GTEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIENMX01FTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAyCisjZGVmaW5lIENMX01FTV9IT1NUX1BUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAzCisjZGVmaW5lIENMX01FTV9NQVBfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTA0CisjZGVmaW5lIENMX01FTV9SRUZFUkVOQ0VfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgMHgxMTA1CisjZGVmaW5lIENMX01FTV9DT05URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTA2CisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKKyNkZWZpbmUgQ0xfTUVNX0FTU09DSUFURURfTUVNT0JKRUNUICAgICAgICAgICAgICAgICAweDExMDcKKyNkZWZpbmUgQ0xfTUVNX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDgKKyNlbmRpZgorI2lmZGVmIENMX1ZFUlNJT05fMl8wCisjZGVmaW5lIENMX01FTV9VU0VTX1NWTV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgMHgxMTA5CisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzNfMAorI2RlZmluZSBDTF9NRU1fUFJPUEVSVElFUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwQQorI2VuZGlmCisKKy8qIGNsX2ltYWdlX2luZm8gKi8KKyNkZWZpbmUgQ0xfSU1BR0VfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMTAKKyNkZWZpbmUgQ0xfSU1BR0VfRUxFTUVOVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAweDExMTEKKyNkZWZpbmUgQ0xfSU1BR0VfUk9XX1BJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMTIKKyNkZWZpbmUgQ0xfSU1BR0VfU0xJQ0VfUElUQ0ggICAgICAgICAgICAgICAgICAgICAgICAweDExMTMKKyNkZWZpbmUgQ0xfSU1BR0VfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMTQKKyNkZWZpbmUgQ0xfSU1BR0VfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMTUKKyNkZWZpbmUgQ0xfSU1BR0VfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMTYKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9JTUFHRV9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTExNworI2RlZmluZSBDTF9JTUFHRV9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTExOAorI2RlZmluZSBDTF9JTUFHRV9OVU1fTUlQX0xFVkVMUyAgICAgICAgICAgICAgICAgICAgIDB4MTExOQorI2RlZmluZSBDTF9JTUFHRV9OVU1fU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTExQQorI2VuZGlmCisKKworLyogY2xfcGlwZV9pbmZvICovCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgQ0xfUElQRV9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAweDExMjAKKyNkZWZpbmUgQ0xfUElQRV9NQVhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAweDExMjEKKyNlbmRpZgorI2lmZGVmIENMX1ZFUlNJT05fM18wCisjZGVmaW5lIENMX1BJUEVfUFJPUEVSVElFUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTIyCisjZW5kaWYKKworLyogY2xfYWRkcmVzc2luZ19tb2RlICovCisjZGVmaW5lIENMX0FERFJFU1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTMwCisjZGVmaW5lIENMX0FERFJFU1NfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgICAgMHgxMTMxCisjZGVmaW5lIENMX0FERFJFU1NfQ0xBTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTMyCisjZGVmaW5lIENMX0FERFJFU1NfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTMzCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKKyNkZWZpbmUgQ0xfQUREUkVTU19NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgICAweDExMzQKKyNlbmRpZgorCisvKiBjbF9maWx0ZXJfbW9kZSAqLworI2RlZmluZSBDTF9GSUxURVJfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE0MAorI2RlZmluZSBDTF9GSUxURVJfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE0MQorCisvKiBjbF9zYW1wbGVyX2luZm8gKi8KKyNkZWZpbmUgQ0xfU0FNUExFUl9SRUZFUkVOQ0VfQ09VTlQgICAgICAgICAgICAgICAgICAweDExNTAKKyNkZWZpbmUgQ0xfU0FNUExFUl9DT05URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAweDExNTEKKyNkZWZpbmUgQ0xfU0FNUExFUl9OT1JNQUxJWkVEX0NPT1JEUyAgICAgICAgICAgICAgICAweDExNTIKKyNkZWZpbmUgQ0xfU0FNUExFUl9BRERSRVNTSU5HX01PREUgICAgICAgICAgICAgICAgICAweDExNTMKKyNkZWZpbmUgQ0xfU0FNUExFUl9GSUxURVJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDExNTQKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorLyogVGhlc2UgZW51bWVyYW50cyBhcmUgZm9yIHRoZSBjbF9raHJfbWlwbWFwX2ltYWdlIGV4dGVuc2lvbi4KKyAgIFRoZXkgaGF2ZSBzaW5jZSBiZWVuIGFkZGVkIHRvIGNsX2V4dC5oIHdpdGggYW4gYXBwcm9wcmlhdGUKKyAgIEtIUiBzdWZmaXgsIGJ1dCBhcmUgbGVmdCBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KKyNkZWZpbmUgQ0xfU0FNUExFUl9NSVBfRklMVEVSX01PREUgICAgICAgICAgICAgICAgICAweDExNTUKKyNkZWZpbmUgQ0xfU0FNUExFUl9MT0RfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAweDExNTYKKyNkZWZpbmUgQ0xfU0FNUExFUl9MT0RfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAweDExNTcKKyNlbmRpZgorI2lmZGVmIENMX1ZFUlNJT05fM18wCisjZGVmaW5lIENMX1NBTVBMRVJfUFJPUEVSVElFUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMTU4CisjZW5kaWYKKworLyogY2xfbWFwX2ZsYWdzIC0gYml0ZmllbGQgKi8KKyNkZWZpbmUgQ0xfTUFQX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBDTF9NQVBfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKyNkZWZpbmUgQ0xfTUFQX1dSSVRFX0lOVkFMSURBVEVfUkVHSU9OICAgICAgICAgICAgICAoMSA8PCAyKQorI2VuZGlmCisKKy8qIGNsX3Byb2dyYW1faW5mbyAqLworI2RlZmluZSBDTF9QUk9HUkFNX1JFRkVSRU5DRV9DT1VOVCAgICAgICAgICAgICAgICAgIDB4MTE2MAorI2RlZmluZSBDTF9QUk9HUkFNX0NPTlRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE2MQorI2RlZmluZSBDTF9QUk9HUkFNX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgICAgIDB4MTE2MgorI2RlZmluZSBDTF9QUk9HUkFNX0RFVklDRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE2MworI2RlZmluZSBDTF9QUk9HUkFNX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE2NAorI2RlZmluZSBDTF9QUk9HUkFNX0JJTkFSWV9TSVpFUyAgICAgICAgICAgICAgICAgICAgIDB4MTE2NQorI2RlZmluZSBDTF9QUk9HUkFNX0JJTkFSSUVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE2NgorI2lmZGVmIENMX1ZFUlNJT05fMV8yCisjZGVmaW5lIENMX1BST0dSQU1fTlVNX0tFUk5FTFMgICAgICAgICAgICAgICAgICAgICAgMHgxMTY3CisjZGVmaW5lIENMX1BST0dSQU1fS0VSTkVMX05BTUVTICAgICAgICAgICAgICAgICAgICAgMHgxMTY4CisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMQorI2RlZmluZSBDTF9QUk9HUkFNX0lMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE2OQorI2VuZGlmCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzIKKyNkZWZpbmUgQ0xfUFJPR1JBTV9TQ09QRV9HTE9CQUxfQ1RPUlNfUFJFU0VOVCAgICAgICAweDExNkEKKyNkZWZpbmUgQ0xfUFJPR1JBTV9TQ09QRV9HTE9CQUxfRFRPUlNfUFJFU0VOVCAgICAgICAweDExNkIKKyNlbmRpZgorCisvKiBjbF9wcm9ncmFtX2J1aWxkX2luZm8gKi8KKyNkZWZpbmUgQ0xfUFJPR1JBTV9CVUlMRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweDExODEKKyNkZWZpbmUgQ0xfUFJPR1JBTV9CVUlMRF9PUFRJT05TICAgICAgICAgICAgICAgICAgICAweDExODIKKyNkZWZpbmUgQ0xfUFJPR1JBTV9CVUlMRF9MT0cgICAgICAgICAgICAgICAgICAgICAgICAweDExODMKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9QUk9HUkFNX0JJTkFSWV9UWVBFICAgICAgICAgICAgICAgICAgICAgIDB4MTE4NAorI2VuZGlmCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgQ0xfUFJPR1JBTV9CVUlMRF9HTE9CQUxfVkFSSUFCTEVfVE9UQUxfU0laRSAweDExODUKKyNlbmRpZgorCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKworLyogY2xfcHJvZ3JhbV9iaW5hcnlfdHlwZSAqLworI2RlZmluZSBDTF9QUk9HUkFNX0JJTkFSWV9UWVBFX05PTkUgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTF9QUk9HUkFNX0JJTkFSWV9UWVBFX0NPTVBJTEVEX09CSkVDVCAgICAgIDB4MQorI2RlZmluZSBDTF9QUk9HUkFNX0JJTkFSWV9UWVBFX0xJQlJBUlkgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBDTF9QUk9HUkFNX0JJTkFSWV9UWVBFX0VYRUNVVEFCTEUgICAgICAgICAgIDB4NAorCisjZW5kaWYKKworLyogY2xfYnVpbGRfc3RhdHVzICovCisjZGVmaW5lIENMX0JVSUxEX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDTF9CVUlMRF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIENMX0JVSUxEX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIKKyNkZWZpbmUgQ0xfQlVJTERfSU5fUFJPR1JFU1MgICAgICAgICAgICAgICAgICAgICAgICAtMworCisvKiBjbF9rZXJuZWxfaW5mbyAqLworI2RlZmluZSBDTF9LRVJORUxfRlVOQ1RJT05fTkFNRSAgICAgICAgICAgICAgICAgICAgIDB4MTE5MAorI2RlZmluZSBDTF9LRVJORUxfTlVNX0FSR1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE5MQorI2RlZmluZSBDTF9LRVJORUxfUkVGRVJFTkNFX0NPVU5UICAgICAgICAgICAgICAgICAgIDB4MTE5MgorI2RlZmluZSBDTF9LRVJORUxfQ09OVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE5MworI2RlZmluZSBDTF9LRVJORUxfUFJPR1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE5NAorI2lmZGVmIENMX1ZFUlNJT05fMV8yCisjZGVmaW5lIENMX0tFUk5FTF9BVFRSSUJVVEVTICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTk1CisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMV8yCisKKy8qIGNsX2tlcm5lbF9hcmdfaW5mbyAqLworI2RlZmluZSBDTF9LRVJORUxfQVJHX0FERFJFU1NfUVVBTElGSUVSICAgICAgICAgICAgIDB4MTE5NgorI2RlZmluZSBDTF9LRVJORUxfQVJHX0FDQ0VTU19RVUFMSUZJRVIgICAgICAgICAgICAgIDB4MTE5NworI2RlZmluZSBDTF9LRVJORUxfQVJHX1RZUEVfTkFNRSAgICAgICAgICAgICAgICAgICAgIDB4MTE5OAorI2RlZmluZSBDTF9LRVJORUxfQVJHX1RZUEVfUVVBTElGSUVSICAgICAgICAgICAgICAgIDB4MTE5OQorI2RlZmluZSBDTF9LRVJORUxfQVJHX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE5QQorCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMV8yCisKKy8qIGNsX2tlcm5lbF9hcmdfYWRkcmVzc19xdWFsaWZpZXIgKi8KKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19BRERSRVNTX0dMT0JBTCAgICAgICAgICAgICAgICAweDExOUIKKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19BRERSRVNTX0xPQ0FMICAgICAgICAgICAgICAgICAweDExOUMKKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19BRERSRVNTX0NPTlNUQU5UICAgICAgICAgICAgICAweDExOUQKKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19BRERSRVNTX1BSSVZBVEUgICAgICAgICAgICAgICAweDExOUUKKworI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCisvKiBjbF9rZXJuZWxfYXJnX2FjY2Vzc19xdWFsaWZpZXIgKi8KKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19BQ0NFU1NfUkVBRF9PTkxZICAgICAgICAgICAgICAweDExQTAKKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19BQ0NFU1NfV1JJVEVfT05MWSAgICAgICAgICAgICAweDExQTEKKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19BQ0NFU1NfUkVBRF9XUklURSAgICAgICAgICAgICAweDExQTIKKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19BQ0NFU1NfTk9ORSAgICAgICAgICAgICAgICAgICAweDExQTMKKworI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCisvKiBjbF9rZXJuZWxfYXJnX3R5cGVfcXVhbGlmaWVyICovCisjZGVmaW5lIENMX0tFUk5FTF9BUkdfVFlQRV9OT05FICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDTF9LRVJORUxfQVJHX1RZUEVfQ09OU1QgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENMX0tFUk5FTF9BUkdfVFlQRV9SRVNUUklDVCAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQ0xfS0VSTkVMX0FSR19UWVBFX1ZPTEFUSUxFICAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2lmZGVmIENMX1ZFUlNJT05fMl8wCisjZGVmaW5lIENMX0tFUk5FTF9BUkdfVFlQRV9QSVBFICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyNlbmRpZgorCisjZW5kaWYKKworLyogY2xfa2VybmVsX3dvcmtfZ3JvdXBfaW5mbyAqLworI2RlZmluZSBDTF9LRVJORUxfV09SS19HUk9VUF9TSVpFICAgICAgICAgICAgICAgICAgIDB4MTFCMAorI2RlZmluZSBDTF9LRVJORUxfQ09NUElMRV9XT1JLX0dST1VQX1NJWkUgICAgICAgICAgIDB4MTFCMQorI2RlZmluZSBDTF9LRVJORUxfTE9DQUxfTUVNX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4MTFCMgorI2RlZmluZSBDTF9LRVJORUxfUFJFRkVSUkVEX1dPUktfR1JPVVBfU0laRV9NVUxUSVBMRSAweDExQjMKKyNkZWZpbmUgQ0xfS0VSTkVMX1BSSVZBVEVfTUVNX1NJWkUgICAgICAgICAgICAgICAgICAweDExQjQKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9LRVJORUxfR0xPQkFMX1dPUktfU0laRSAgICAgICAgICAgICAgICAgIDB4MTFCNQorI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMQorCisvKiBjbF9rZXJuZWxfc3ViX2dyb3VwX2luZm8gKi8KKyNkZWZpbmUgQ0xfS0VSTkVMX01BWF9TVUJfR1JPVVBfU0laRV9GT1JfTkRSQU5HRSAgICAweDIwMzMKKyNkZWZpbmUgQ0xfS0VSTkVMX1NVQl9HUk9VUF9DT1VOVF9GT1JfTkRSQU5HRSAgICAgICAweDIwMzQKKyNkZWZpbmUgQ0xfS0VSTkVMX0xPQ0FMX1NJWkVfRk9SX1NVQl9HUk9VUF9DT1VOVCAgICAweDExQjgKKyNkZWZpbmUgQ0xfS0VSTkVMX01BWF9OVU1fU1VCX0dST1VQUyAgICAgICAgICAgICAgICAweDExQjkKKyNkZWZpbmUgQ0xfS0VSTkVMX0NPTVBJTEVfTlVNX1NVQl9HUk9VUFMgICAgICAgICAgICAweDExQkEKKworI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorCisvKiBjbF9rZXJuZWxfZXhlY19pbmZvICovCisjZGVmaW5lIENMX0tFUk5FTF9FWEVDX0lORk9fU1ZNX1BUUlMgICAgICAgICAgICAgICAgMHgxMUI2CisjZGVmaW5lIENMX0tFUk5FTF9FWEVDX0lORk9fU1ZNX0ZJTkVfR1JBSU5fU1lTVEVNICAgMHgxMUI3CisKKyNlbmRpZgorCisvKiBjbF9ldmVudF9pbmZvICovCisjZGVmaW5lIENMX0VWRU5UX0NPTU1BTkRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgMHgxMUQwCisjZGVmaW5lIENMX0VWRU5UX0NPTU1BTkRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgMHgxMUQxCisjZGVmaW5lIENMX0VWRU5UX1JFRkVSRU5DRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgMHgxMUQyCisjZGVmaW5lIENMX0VWRU5UX0NPTU1BTkRfRVhFQ1VUSU9OX1NUQVRVUyAgICAgICAgICAgMHgxMUQzCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKKyNkZWZpbmUgQ0xfRVZFTlRfQ09OVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExRDQKKyNlbmRpZgorCisvKiBjbF9jb21tYW5kX3R5cGUgKi8KKyNkZWZpbmUgQ0xfQ09NTUFORF9ORFJBTkdFX0tFUk5FTCAgICAgICAgICAgICAgICAgICAweDExRjAKKyNkZWZpbmUgQ0xfQ09NTUFORF9UQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExRjEKKyNkZWZpbmUgQ0xfQ09NTUFORF9OQVRJVkVfS0VSTkVMICAgICAgICAgICAgICAgICAgICAweDExRjIKKyNkZWZpbmUgQ0xfQ09NTUFORF9SRUFEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAweDExRjMKKyNkZWZpbmUgQ0xfQ09NTUFORF9XUklURV9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAweDExRjQKKyNkZWZpbmUgQ0xfQ09NTUFORF9DT1BZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAweDExRjUKKyNkZWZpbmUgQ0xfQ09NTUFORF9SRUFEX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAweDExRjYKKyNkZWZpbmUgQ0xfQ09NTUFORF9XUklURV9JTUFHRSAgICAgICAgICAgICAgICAgICAgICAweDExRjcKKyNkZWZpbmUgQ0xfQ09NTUFORF9DT1BZX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAweDExRjgKKyNkZWZpbmUgQ0xfQ09NTUFORF9DT1BZX0lNQUdFX1RPX0JVRkZFUiAgICAgICAgICAgICAweDExRjkKKyNkZWZpbmUgQ0xfQ09NTUFORF9DT1BZX0JVRkZFUl9UT19JTUFHRSAgICAgICAgICAgICAweDExRkEKKyNkZWZpbmUgQ0xfQ09NTUFORF9NQVBfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAweDExRkIKKyNkZWZpbmUgQ0xfQ09NTUFORF9NQVBfSU1BR0UgICAgICAgICAgICAgICAgICAgICAgICAweDExRkMKKyNkZWZpbmUgQ0xfQ09NTUFORF9VTk1BUF9NRU1fT0JKRUNUICAgICAgICAgICAgICAgICAweDExRkQKKyNkZWZpbmUgQ0xfQ09NTUFORF9NQVJLRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExRkUKKyNkZWZpbmUgQ0xfQ09NTUFORF9BQ1FVSVJFX0dMX09CSkVDVFMgICAgICAgICAgICAgICAweDExRkYKKyNkZWZpbmUgQ0xfQ09NTUFORF9SRUxFQVNFX0dMX09CSkVDVFMgICAgICAgICAgICAgICAweDEyMDAKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMQorI2RlZmluZSBDTF9DT01NQU5EX1JFQURfQlVGRkVSX1JFQ1QgICAgICAgICAgICAgICAgIDB4MTIwMQorI2RlZmluZSBDTF9DT01NQU5EX1dSSVRFX0JVRkZFUl9SRUNUICAgICAgICAgICAgICAgIDB4MTIwMgorI2RlZmluZSBDTF9DT01NQU5EX0NPUFlfQlVGRkVSX1JFQ1QgICAgICAgICAgICAgICAgIDB4MTIwMworI2RlZmluZSBDTF9DT01NQU5EX1VTRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwNAorI2VuZGlmCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKyNkZWZpbmUgQ0xfQ09NTUFORF9CQVJSSUVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDUKKyNkZWZpbmUgQ0xfQ09NTUFORF9NSUdSQVRFX01FTV9PQkpFQ1RTICAgICAgICAgICAgICAweDEyMDYKKyNkZWZpbmUgQ0xfQ09NTUFORF9GSUxMX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAweDEyMDcKKyNkZWZpbmUgQ0xfQ09NTUFORF9GSUxMX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAweDEyMDgKKyNlbmRpZgorI2lmZGVmIENMX1ZFUlNJT05fMl8wCisjZGVmaW5lIENMX0NPTU1BTkRfU1ZNX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjA5CisjZGVmaW5lIENMX0NPTU1BTkRfU1ZNX01FTUNQWSAgICAgICAgICAgICAgICAgICAgICAgMHgxMjBBCisjZGVmaW5lIENMX0NPTU1BTkRfU1ZNX01FTUZJTEwgICAgICAgICAgICAgICAgICAgICAgMHgxMjBCCisjZGVmaW5lIENMX0NPTU1BTkRfU1ZNX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjBDCisjZGVmaW5lIENMX0NPTU1BTkRfU1ZNX1VOTUFQICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjBECisjZW5kaWYKKyNpZmRlZiBDTF9WRVJTSU9OXzNfMAorI2RlZmluZSBDTF9DT01NQU5EX1NWTV9NSUdSQVRFX01FTSAgICAgICAgICAgICAgICAgIDB4MTIwRQorI2VuZGlmCisKKy8qIGNvbW1hbmQgZXhlY3V0aW9uIHN0YXR1cyAqLworI2RlZmluZSBDTF9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTF9SVU5OSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTF9TVUJNSVRURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBDTF9RVUVVRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworCisvKiBjbF9idWZmZXJfY3JlYXRlX3R5cGUgKi8KKyNpZmRlZiBDTF9WRVJTSU9OXzFfMQorI2RlZmluZSBDTF9CVUZGRVJfQ1JFQVRFX1RZUEVfUkVHSU9OICAgICAgICAgICAgICAgIDB4MTIyMAorI2VuZGlmCisKKy8qIGNsX3Byb2ZpbGluZ19pbmZvICovCisjZGVmaW5lIENMX1BST0ZJTElOR19DT01NQU5EX1FVRVVFRCAgICAgICAgICAgICAgICAgMHgxMjgwCisjZGVmaW5lIENMX1BST0ZJTElOR19DT01NQU5EX1NVQk1JVCAgICAgICAgICAgICAgICAgMHgxMjgxCisjZGVmaW5lIENMX1BST0ZJTElOR19DT01NQU5EX1NUQVJUICAgICAgICAgICAgICAgICAgMHgxMjgyCisjZGVmaW5lIENMX1BST0ZJTElOR19DT01NQU5EX0VORCAgICAgICAgICAgICAgICAgICAgMHgxMjgzCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgQ0xfUFJPRklMSU5HX0NPTU1BTkRfQ09NUExFVEUgICAgICAgICAgICAgICAweDEyODQKKyNlbmRpZgorCisvKiBjbF9kZXZpY2VfYXRvbWljX2NhcGFiaWxpdGllcyAtIGJpdGZpZWxkICovCisjaWZkZWYgQ0xfVkVSU0lPTl8zXzAKKyNkZWZpbmUgQ0xfREVWSUNFX0FUT01JQ19PUkRFUl9SRUxBWEVEICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENMX0RFVklDRV9BVE9NSUNfT1JERVJfQUNRX1JFTCAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBDTF9ERVZJQ0VfQVRPTUlDX09SREVSX1NFUV9DU1QgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQ0xfREVWSUNFX0FUT01JQ19TQ09QRV9XT1JLX0lURU0gICAgICAgICgxIDw8IDMpCisjZGVmaW5lIENMX0RFVklDRV9BVE9NSUNfU0NPUEVfV09SS19HUk9VUCAgICAgICAoMSA8PCA0KQorI2RlZmluZSBDTF9ERVZJQ0VfQVRPTUlDX1NDT1BFX0RFVklDRSAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgQ0xfREVWSUNFX0FUT01JQ19TQ09QRV9BTExfREVWSUNFUyAgICAgICgxIDw8IDYpCisjZW5kaWYKKworLyogY2xfZGV2aWNlX2RldmljZV9lbnF1ZXVlX2NhcGFiaWxpdGllcyAtIGJpdGZpZWxkICovCisjaWZkZWYgQ0xfVkVSU0lPTl8zXzAKKyNkZWZpbmUgQ0xfREVWSUNFX1FVRVVFX1NVUFBPUlRFRCAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENMX0RFVklDRV9RVUVVRV9SRVBMQUNFQUJMRV9ERUZBVUxUICAgICAoMSA8PCAxKQorI2VuZGlmCisKKy8qIGNsX2tocm9ub3NfdmVuZG9yX2lkICovCisjZGVmaW5lIENMX0tIUk9OT1NfVkVORE9SX0lEX0NPREVQTEFZICAgICAgICAgICAgICAgMHgxMDAwNAorCisjaWZkZWYgQ0xfVkVSU0lPTl8zXzAKKworLyogY2xfdmVyc2lvbiAqLworI2RlZmluZSBDTF9WRVJTSU9OX01BSk9SX0JJVFMgKDEwKQorI2RlZmluZSBDTF9WRVJTSU9OX01JTk9SX0JJVFMgKDEwKQorI2RlZmluZSBDTF9WRVJTSU9OX1BBVENIX0JJVFMgKDEyKQorCisjZGVmaW5lIENMX1ZFUlNJT05fTUFKT1JfTUFTSyAoKDEgPDwgQ0xfVkVSU0lPTl9NQUpPUl9CSVRTKSAtIDEpCisjZGVmaW5lIENMX1ZFUlNJT05fTUlOT1JfTUFTSyAoKDEgPDwgQ0xfVkVSU0lPTl9NSU5PUl9CSVRTKSAtIDEpCisjZGVmaW5lIENMX1ZFUlNJT05fUEFUQ0hfTUFTSyAoKDEgPDwgQ0xfVkVSU0lPTl9QQVRDSF9CSVRTKSAtIDEpCisKKyNkZWZpbmUgQ0xfVkVSU0lPTl9NQUpPUih2ZXJzaW9uKSBcCisgICgodmVyc2lvbikgPj4gKENMX1ZFUlNJT05fTUlOT1JfQklUUyArIENMX1ZFUlNJT05fUEFUQ0hfQklUUykpCisKKyNkZWZpbmUgQ0xfVkVSU0lPTl9NSU5PUih2ZXJzaW9uKSBcCisgICgoKHZlcnNpb24pID4+IENMX1ZFUlNJT05fUEFUQ0hfQklUUykgJiBDTF9WRVJTSU9OX01JTk9SX01BU0spCisKKyNkZWZpbmUgQ0xfVkVSU0lPTl9QQVRDSCh2ZXJzaW9uKSAoKHZlcnNpb24pICYgQ0xfVkVSU0lPTl9QQVRDSF9NQVNLKQorCisjZGVmaW5lIENMX01BS0VfVkVSU0lPTihtYWpvciwgbWlub3IsIHBhdGNoKSAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChtYWpvcikgJiBDTF9WRVJTSU9OX01BSk9SX01BU0spICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPDwgKENMX1ZFUlNJT05fTUlOT1JfQklUUyArIENMX1ZFUlNJT05fUEFUQ0hfQklUUykpIHwgICAgICBcCisgICAoKChtaW5vcikgJiBDTF9WRVJTSU9OX01JTk9SX01BU0spIDw8IENMX1ZFUlNJT05fUEFUQ0hfQklUUykgfCBcCisgICAoKHBhdGNoKSAmIENMX1ZFUlNJT05fUEFUQ0hfTUFTSykpCisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFBsYXRmb3JtIEFQSSAqLworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0UGxhdGZvcm1JRHMoY2xfdWludCAgICAgICAgICBudW1fZW50cmllcywKKyAgICAgICAgICAgICAgICAgY2xfcGxhdGZvcm1faWQgKiBwbGF0Zm9ybXMsCisgICAgICAgICAgICAgICAgIGNsX3VpbnQgKiAgICAgICAgbnVtX3BsYXRmb3JtcykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEdldFBsYXRmb3JtSW5mbyhjbF9wbGF0Zm9ybV9pZCAgIHBsYXRmb3JtLAorICAgICAgICAgICAgICAgICAgY2xfcGxhdGZvcm1faW5mbyBwYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCAqICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisvKiBEZXZpY2UgQVBJcyAqLworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0RGV2aWNlSURzKGNsX3BsYXRmb3JtX2lkICAgcGxhdGZvcm0sCisgICAgICAgICAgICAgICBjbF9kZXZpY2VfdHlwZSAgIGRldmljZV90eXBlLAorICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICBudW1fZW50cmllcywKKyAgICAgICAgICAgICAgIGNsX2RldmljZV9pZCAqICAgZGV2aWNlcywKKyAgICAgICAgICAgICAgIGNsX3VpbnQgKiAgICAgICAgbnVtX2RldmljZXMpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXREZXZpY2VJbmZvKGNsX2RldmljZV9pZCAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgY2xfZGV2aWNlX2luZm8gIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgICAgIHNpemVfdCAqICAgICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xDcmVhdGVTdWJEZXZpY2VzKGNsX2RldmljZV9pZCAgICAgICAgICAgICAgICAgICAgICAgICBpbl9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZGV2aWNlX3BhcnRpdGlvbl9wcm9wZXJ0eSAqIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXZpY2VzLAorICAgICAgICAgICAgICAgICAgIGNsX2RldmljZV9pZCAqICAgICAgICAgICAgICAgICAgICAgICBvdXRfZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICBjbF91aW50ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2RldmljZXNfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsUmV0YWluRGV2aWNlKGNsX2RldmljZV9pZCBkZXZpY2UpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZWxlYXNlRGV2aWNlKGNsX2RldmljZV9pZCBkZXZpY2UpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMl8xCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFNldERlZmF1bHREZXZpY2VDb21tYW5kUXVldWUoY2xfY29udGV4dCAgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfY29tbWFuZF9xdWV1ZSAgICAgY29tbWFuZF9xdWV1ZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzE7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEdldERldmljZUFuZEhvc3RUaW1lcihjbF9kZXZpY2VfaWQgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWxvbmcqICAgICAgIGRldmljZV90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF91bG9uZyogICAgICAgaG9zdF90aW1lc3RhbXApIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8xOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRIb3N0VGltZXIoY2xfZGV2aWNlX2lkIGRldmljZSwKKyAgICAgICAgICAgICAgIGNsX3Vsb25nICogICBob3N0X3RpbWVzdGFtcCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzE7CisKKyNlbmRpZgorCisvKiBDb250ZXh0IEFQSXMgKi8KK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfY29udGV4dCBDTF9BUElfQ0FMTAorY2xDcmVhdGVDb250ZXh0KGNvbnN0IGNsX2NvbnRleHRfcHJvcGVydGllcyAqIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgbnVtX2RldmljZXMsCisgICAgICAgICAgICAgICAgY29uc3QgY2xfZGV2aWNlX2lkICogZGV2aWNlcywKKyAgICAgICAgICAgICAgICB2b2lkIChDTF9DQUxMQkFDSyAqIHBmbl9ub3RpZnkpKGNvbnN0IGNoYXIgKiBlcnJpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHByaXZhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICB1c2VyX2RhdGEpLAorICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgIHVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfY29udGV4dCBDTF9BUElfQ0FMTAorY2xDcmVhdGVDb250ZXh0RnJvbVR5cGUoY29uc3QgY2xfY29udGV4dF9wcm9wZXJ0aWVzICogcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsX2RldmljZV90eXBlICAgICAgZGV2aWNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIChDTF9DQUxMQkFDSyAqIHBmbl9ub3RpZnkpKGNvbnN0IGNoYXIgKiBlcnJpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogcHJpdmF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICB1c2VyX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgICB1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsUmV0YWluQ29udGV4dChjbF9jb250ZXh0IGNvbnRleHQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZWxlYXNlQ29udGV4dChjbF9jb250ZXh0IGNvbnRleHQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRDb250ZXh0SW5mbyhjbF9jb250ZXh0ICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgY2xfY29udGV4dF9pbmZvICAgIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplLAorICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICAgcGFyYW1fdmFsdWUsCisgICAgICAgICAgICAgICAgIHNpemVfdCAqICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzNfMAorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xTZXRDb250ZXh0RGVzdHJ1Y3RvckNhbGxiYWNrKGNsX2NvbnRleHQgICAgICAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKENMX0NBTExCQUNLKiBwZm5fbm90aWZ5KShjbF9jb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgIHVzZXJfZGF0YSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8zXzA7CisKKyNlbmRpZgorCisvKiBDb21tYW5kIFF1ZXVlIEFQSXMgKi8KKworI2lmZGVmIENMX1ZFUlNJT05fMl8wCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfY29tbWFuZF9xdWV1ZSBDTF9BUElfQ0FMTAorY2xDcmVhdGVDb21tYW5kUXVldWVXaXRoUHJvcGVydGllcyhjbF9jb250ZXh0ICAgICAgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGV2aWNlX2lkICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfcXVldWVfcHJvcGVydGllcyAqICAgIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ludCAqICAgICAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKKyNlbmRpZgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZXRhaW5Db21tYW5kUXVldWUoY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsUmVsZWFzZUNvbW1hbmRRdWV1ZShjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRDb21tYW5kUXVldWVJbmZvKGNsX2NvbW1hbmRfcXVldWUgICAgICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIGNsX2NvbW1hbmRfcXVldWVfaW5mbyBwYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiAgICAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisvKiBNZW1vcnkgT2JqZWN0IEFQSXMgKi8KK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfbWVtIENMX0FQSV9DQUxMCitjbENyZWF0ZUJ1ZmZlcihjbF9jb250ZXh0ICAgY29udGV4dCwKKyAgICAgICAgICAgICAgIGNsX21lbV9mbGFncyBmbGFncywKKyAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBzaXplLAorICAgICAgICAgICAgICAgdm9pZCAqICAgICAgIGhvc3RfcHRyLAorICAgICAgICAgICAgICAgY2xfaW50ICogICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworI2lmZGVmIENMX1ZFUlNJT05fMV8xCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfbWVtIENMX0FQSV9DQUxMCitjbENyZWF0ZVN1YkJ1ZmZlcihjbF9tZW0gICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgY2xfbWVtX2ZsYWdzICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgY2xfYnVmZmVyX2NyZWF0ZV90eXBlICAgIGJ1ZmZlcl9jcmVhdGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiAgICAgICAgICAgICBidWZmZXJfY3JlYXRlX2luZm8sCisgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMV8yCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfbWVtIENMX0FQSV9DQUxMCitjbENyZWF0ZUltYWdlKGNsX2NvbnRleHQgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgIGNsX21lbV9mbGFncyAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICBjb25zdCBjbF9pbWFnZV9mb3JtYXQgKiBpbWFnZV9mb3JtYXQsCisgICAgICAgICAgICAgIGNvbnN0IGNsX2ltYWdlX2Rlc2MgKiAgIGltYWdlX2Rlc2MsCisgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIGhvc3RfcHRyLAorICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKyNlbmRpZgorCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9tZW0gQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlUGlwZShjbF9jb250ZXh0ICAgICAgICAgICAgICAgICBjb250ZXh0LAorICAgICAgICAgICAgIGNsX21lbV9mbGFncyAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgICAgICAgIHBpcGVfcGFja2V0X3NpemUsCisgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgcGlwZV9tYXhfcGFja2V0cywKKyAgICAgICAgICAgICBjb25zdCBjbF9waXBlX3Byb3BlcnRpZXMgKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgIGNsX2ludCAqICAgICAgICAgICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKworI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzNfMAorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX21lbSBDTF9BUElfQ0FMTAorY2xDcmVhdGVCdWZmZXJXaXRoUHJvcGVydGllcyhjbF9jb250ZXh0ICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX21lbV9wcm9wZXJ0aWVzICogcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfbWVtX2ZsYWdzICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICAgIGhvc3RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzNfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9tZW0gQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlSW1hZ2VXaXRoUHJvcGVydGllcyhjbF9jb250ZXh0ICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfbWVtX3Byb3BlcnRpZXMgKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbV9mbGFncyAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfaW1hZ2VfZm9ybWF0ICogICBpbWFnZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfaW1hZ2VfZGVzYyAqICAgICBpbWFnZV9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgaG9zdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfaW50ICogICAgICAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8zXzA7CisKKyNlbmRpZgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZXRhaW5NZW1PYmplY3QoY2xfbWVtIG1lbW9iaikgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFJlbGVhc2VNZW1PYmplY3QoY2xfbWVtIG1lbW9iaikgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEdldFN1cHBvcnRlZEltYWdlRm9ybWF0cyhjbF9jb250ZXh0ICAgICAgICAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfbWVtX2ZsYWdzICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW1fb2JqZWN0X3R5cGUgICBpbWFnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgbnVtX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbWFnZV9mb3JtYXQgKiAgICBpbWFnZV9mb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAqICAgICAgICAgICAgbnVtX2ltYWdlX2Zvcm1hdHMpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRNZW1PYmplY3RJbmZvKGNsX21lbSAgICAgICAgICAgbWVtb2JqLAorICAgICAgICAgICAgICAgICAgIGNsX21lbV9pbmZvICAgICAgcGFyYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgKiAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0SW1hZ2VJbmZvKGNsX21lbSAgICAgICAgICAgaW1hZ2UsCisgICAgICAgICAgICAgICBjbF9pbWFnZV9pbmZvICAgIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgICAgc2l6ZV90ICogICAgICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRQaXBlSW5mbyhjbF9tZW0gICAgICAgICAgIHBpcGUsCisgICAgICAgICAgICAgIGNsX3BpcGVfaW5mbyAgICAgcGFyYW1fbmFtZSwKKyAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplLAorICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgICBzaXplX3QgKiAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKworI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMQorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xTZXRNZW1PYmplY3REZXN0cnVjdG9yQ2FsbGJhY2soY2xfbWVtIG1lbW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKENMX0NBTExCQUNLICogcGZuX25vdGlmeSkoY2xfbWVtIG1lbW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHVzZXJfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKworI2VuZGlmCisKKy8qIFNWTSBBbGxvY2F0aW9uIEFQSXMgKi8KKworI2lmZGVmIENMX1ZFUlNJT05fMl8wCisKK2V4dGVybiBDTF9BUElfRU5UUlkgdm9pZCAqIENMX0FQSV9DQUxMCitjbFNWTUFsbG9jKGNsX2NvbnRleHQgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgY2xfc3ZtX21lbV9mbGFncyBmbGFncywKKyAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBzaXplLAorICAgICAgICAgICBjbF91aW50ICAgICAgICAgIGFsaWdubWVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgdm9pZCBDTF9BUElfQ0FMTAorY2xTVk1GcmVlKGNsX2NvbnRleHQgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgc3ZtX3BvaW50ZXIpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8wOworCisjZW5kaWYKKworLyogU2FtcGxlciBBUElzICovCisKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX3NhbXBsZXIgQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlU2FtcGxlcldpdGhQcm9wZXJ0aWVzKGNsX2NvbnRleHQgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfc2FtcGxlcl9wcm9wZXJ0aWVzICogIHNhbXBsZXJfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ludCAqICAgICAgICAgICAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKKyNlbmRpZgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZXRhaW5TYW1wbGVyKGNsX3NhbXBsZXIgc2FtcGxlcikgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFJlbGVhc2VTYW1wbGVyKGNsX3NhbXBsZXIgc2FtcGxlcikgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEdldFNhbXBsZXJJbmZvKGNsX3NhbXBsZXIgICAgICAgICBzYW1wbGVyLAorICAgICAgICAgICAgICAgICBjbF9zYW1wbGVyX2luZm8gICAgcGFyYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgc2l6ZV90ICogICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworLyogUHJvZ3JhbSBPYmplY3QgQVBJcyAqLworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9wcm9ncmFtIENMX0FQSV9DQUxMCitjbENyZWF0ZVByb2dyYW1XaXRoU291cmNlKGNsX2NvbnRleHQgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqICAgICBzdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICBsZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfcHJvZ3JhbSBDTF9BUElfQ0FMTAorY2xDcmVhdGVQcm9ncmFtV2l0aEJpbmFyeShjbF9jb250ZXh0ICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9kZXZpY2VfaWQgKiAgICAgICAgICAgZGV2aWNlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgICAgICAgICAgICAgICBsZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqICAgICAgICAgYmluYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ludCAqICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICAgICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9wcm9ncmFtIENMX0FQSV9DQUxMCitjbENyZWF0ZVByb2dyYW1XaXRoQnVpbHRJbktlcm5lbHMoY2xfY29udGV4dCAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgIG51bV9kZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2RldmljZV9pZCAqICBkZXZpY2VfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogICAgICAgICAga2VybmVsX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ludCAqICAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKyNlbmRpZgorCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzEKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9wcm9ncmFtIENMX0FQSV9DQUxMCitjbENyZWF0ZVByb2dyYW1XaXRoSUwoY2xfY29udGV4dCAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogICAgaWwsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICBjbF9pbnQqICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzE7CisKKyNlbmRpZgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZXRhaW5Qcm9ncmFtKGNsX3Byb2dyYW0gcHJvZ3JhbSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFJlbGVhc2VQcm9ncmFtKGNsX3Byb2dyYW0gcHJvZ3JhbSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEJ1aWxkUHJvZ3JhbShjbF9wcm9ncmFtICAgICAgICAgICBwcm9ncmFtLAorICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgbnVtX2RldmljZXMsCisgICAgICAgICAgICAgICBjb25zdCBjbF9kZXZpY2VfaWQgKiBkZXZpY2VfbGlzdCwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgIG9wdGlvbnMsCisgICAgICAgICAgICAgICB2b2lkIChDTF9DQUxMQkFDSyAqICBwZm5fbm90aWZ5KShjbF9wcm9ncmFtIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKSwKKyAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgIHVzZXJfZGF0YSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xDb21waWxlUHJvZ3JhbShjbF9wcm9ncmFtICAgICAgICAgICBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgICBudW1fZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2xfZGV2aWNlX2lkICogZGV2aWNlX2xpc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgIG51bV9pbnB1dF9oZWFkZXJzLAorICAgICAgICAgICAgICAgICBjb25zdCBjbF9wcm9ncmFtICogICBpbnB1dF9oZWFkZXJzLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqICAgICAgICBoZWFkZXJfaW5jbHVkZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgdm9pZCAoQ0xfQ0FMTEJBQ0sgKiAgcGZuX25vdGlmeSkoY2xfcHJvZ3JhbSBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKSwKKyAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgdXNlcl9kYXRhKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9wcm9ncmFtIENMX0FQSV9DQUxMCitjbExpbmtQcm9ncmFtKGNsX2NvbnRleHQgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgIG51bV9kZXZpY2VzLAorICAgICAgICAgICAgICBjb25zdCBjbF9kZXZpY2VfaWQgKiBkZXZpY2VfbGlzdCwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgbnVtX2lucHV0X3Byb2dyYW1zLAorICAgICAgICAgICAgICBjb25zdCBjbF9wcm9ncmFtICogICBpbnB1dF9wcm9ncmFtcywKKyAgICAgICAgICAgICAgdm9pZCAoQ0xfQ0FMTEJBQ0sgKiAgcGZuX25vdGlmeSkoY2xfcHJvZ3JhbSBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKSwKKyAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgdXNlcl9kYXRhLAorICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKyNlbmRpZgorCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzIKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBDTF9BUElfUFJFRklYX19WRVJTSU9OXzJfMl9ERVBSRUNBVEVEIGNsX2ludCBDTF9BUElfQ0FMTAorY2xTZXRQcm9ncmFtUmVsZWFzZUNhbGxiYWNrKGNsX3Byb2dyYW0gICAgICAgICAgcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIChDTF9DQUxMQkFDSyAqIHBmbl9ub3RpZnkpKGNsX3Byb2dyYW0gcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiB1c2VyX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgdXNlcl9kYXRhKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMl9ERVBSRUNBVEVEOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xTZXRQcm9ncmFtU3BlY2lhbGl6YXRpb25Db25zdGFudChjbF9wcm9ncmFtICBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICBzcGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICBzcGVjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNwZWNfdmFsdWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8yOworCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMV8yCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFVubG9hZFBsYXRmb3JtQ29tcGlsZXIoY2xfcGxhdGZvcm1faWQgcGxhdGZvcm0pIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisjZW5kaWYKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0UHJvZ3JhbUluZm8oY2xfcHJvZ3JhbSAgICAgICAgIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNsX3Byb2dyYW1faW5mbyAgICBwYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgICAgICBzaXplX3QgKiAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRQcm9ncmFtQnVpbGRJbmZvKGNsX3Byb2dyYW0gICAgICAgICAgICBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgIGNsX2RldmljZV9pZCAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgY2xfcHJvZ3JhbV9idWlsZF9pbmZvIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqICAgICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKy8qIEtlcm5lbCBPYmplY3QgQVBJcyAqLworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9rZXJuZWwgQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlS2VybmVsKGNsX3Byb2dyYW0gICAgICBwcm9ncmFtLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqICAgIGtlcm5lbF9uYW1lLAorICAgICAgICAgICAgICAgY2xfaW50ICogICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlS2VybmVsc0luUHJvZ3JhbShjbF9wcm9ncmFtICAgICBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgIG51bV9rZXJuZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2tlcm5lbCAqICAgIGtlcm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAqICAgICAgbnVtX2tlcm5lbHNfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworI2lmZGVmIENMX1ZFUlNJT05fMl8xCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfa2VybmVsIENMX0FQSV9DQUxMCitjbENsb25lS2VybmVsKGNsX2tlcm5lbCAgICAgc291cmNlX2tlcm5lbCwKKyAgICAgICAgICAgICAgY2xfaW50KiAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzE7CisKKyNlbmRpZgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZXRhaW5LZXJuZWwoY2xfa2VybmVsICAgIGtlcm5lbCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFJlbGVhc2VLZXJuZWwoY2xfa2VybmVsICAga2VybmVsKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsU2V0S2VybmVsQXJnKGNsX2tlcm5lbCAgICBrZXJuZWwsCisgICAgICAgICAgICAgICBjbF91aW50ICAgICAgYXJnX2luZGV4LAorICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIGFyZ19zaXplLAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGFyZ192YWx1ZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xTZXRLZXJuZWxBcmdTVk1Qb2ludGVyKGNsX2tlcm5lbCAgICBrZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgIGFyZ19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogYXJnX3ZhbHVlKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsU2V0S2VybmVsRXhlY0luZm8oY2xfa2VybmVsICAgICAgICAgICAga2VybmVsLAorICAgICAgICAgICAgICAgICAgICBjbF9rZXJuZWxfZXhlY19pbmZvICBwYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogICAgICAgICBwYXJhbV92YWx1ZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKKyNlbmRpZgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRLZXJuZWxJbmZvKGNsX2tlcm5lbCAgICAgICBrZXJuZWwsCisgICAgICAgICAgICAgICAgY2xfa2VybmVsX2luZm8gIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgICAgIHNpemVfdCAqICAgICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRLZXJuZWxBcmdJbmZvKGNsX2tlcm5lbCAgICAgICBrZXJuZWwsCisgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgIGFyZ19pbmR4LAorICAgICAgICAgICAgICAgICAgIGNsX2tlcm5lbF9hcmdfaW5mbyAgcGFyYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgcGFyYW1fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2VuZGlmCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEdldEtlcm5lbFdvcmtHcm91cEluZm8oY2xfa2VybmVsICAgICAgICAgICAgICAgICAga2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2RldmljZV9pZCAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbF9rZXJuZWxfd29ya19ncm91cF9pbmZvICBwYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgICAgcGFyYW1fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogICAgICAgICAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzEKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0S2VybmVsU3ViR3JvdXBJbmZvKGNsX2tlcm5lbCAgICAgICAgICAgICAgICAgICBrZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfa2VybmVsX3N1Yl9ncm91cF9pbmZvICAgIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICBpbnB1dF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMTsKKworI2VuZGlmCisKKy8qIEV2ZW50IE9iamVjdCBBUElzICovCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xXYWl0Rm9yRXZlbnRzKGNsX3VpbnQgICAgICAgICAgICAgbnVtX2V2ZW50cywKKyAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICAgIGV2ZW50X2xpc3QpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRFdmVudEluZm8oY2xfZXZlbnQgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgIGNsX2V2ZW50X2luZm8gICAgcGFyYW1fbmFtZSwKKyAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgcGFyYW1fdmFsdWUsCisgICAgICAgICAgICAgICBzaXplX3QgKiAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworI2lmZGVmIENMX1ZFUlNJT05fMV8xCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfZXZlbnQgQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlVXNlckV2ZW50KGNsX2NvbnRleHQgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIGNsX2ludCAqICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCisjZW5kaWYKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsUmV0YWluRXZlbnQoY2xfZXZlbnQgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZWxlYXNlRXZlbnQoY2xfZXZlbnQgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsU2V0VXNlckV2ZW50U3RhdHVzKGNsX2V2ZW50ICAgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgICAgIGV4ZWN1dGlvbl9zdGF0dXMpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xTZXRFdmVudENhbGxiYWNrKGNsX2V2ZW50ICAgIGV2ZW50LAorICAgICAgICAgICAgICAgICAgIGNsX2ludCAgICAgIGNvbW1hbmRfZXhlY19jYWxsYmFja190eXBlLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKENMX0NBTExCQUNLICogcGZuX25vdGlmeSkoY2xfZXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgICBldmVudF9jb21tYW5kX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgIHVzZXJfZGF0YSksCisgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgdXNlcl9kYXRhKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKworI2VuZGlmCisKKy8qIFByb2ZpbGluZyBBUElzICovCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRFdmVudFByb2ZpbGluZ0luZm8oY2xfZXZlbnQgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsX3Byb2ZpbGluZ19pbmZvICAgcGFyYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgcGFyYW1fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworLyogRmx1c2ggYW5kIEZpbmlzaCBBUElzICovCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xGbHVzaChjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xGaW5pc2goY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworLyogRW5xdWV1ZWQgQ29tbWFuZHMgQVBJcyAqLworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVJlYWRCdWZmZXIoY2xfY29tbWFuZF9xdWV1ZSAgICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgY2xfYm9vbCAgICAgICAgICAgICBibG9ja2luZ19yZWFkLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICAgIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVJlYWRCdWZmZXJSZWN0KGNsX2NvbW1hbmRfcXVldWUgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfYm9vbCAgICAgICAgICAgICBibG9ja2luZ19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICAgICBidWZmZXJfb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICAgICBob3N0X29yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgICAgcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBidWZmZXJfcm93X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBidWZmZXJfc2xpY2VfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIGhvc3Rfcm93X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBob3N0X3NsaWNlX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgICBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKworI2VuZGlmCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVXcml0ZUJ1ZmZlcihjbF9jb21tYW5kX3F1ZXVlICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBjbF9ib29sICAgICAgICAgICAgYmxvY2tpbmdfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogICAgICAgcHRyLAorICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMQorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlV3JpdGVCdWZmZXJSZWN0KGNsX2NvbW1hbmRfcXVldWUgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ib29sICAgICAgICAgICAgIGJsb2NraW5nX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgICAgYnVmZmVyX29yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICAgIGhvc3Rfb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgICAgcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgYnVmZmVyX3Jvd19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIGJ1ZmZlcl9zbGljZV9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIGhvc3Rfcm93X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgaG9zdF9zbGljZV9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogICAgICAgIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogICAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMV8yCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVGaWxsQnVmZmVyKGNsX2NvbW1hbmRfcXVldWUgICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogICAgICAgcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgIHBhdHRlcm5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2VuZGlmCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVDb3B5QnVmZmVyKGNsX2NvbW1hbmRfcXVldWUgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgY2xfbWVtICAgICAgICAgICAgICBzcmNfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgIGRzdF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgc3JjX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogICAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworI2lmZGVmIENMX1ZFUlNJT05fMV8xCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVDb3B5QnVmZmVyUmVjdChjbF9jb21tYW5kX3F1ZXVlICAgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgIHNyY19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgIGRzdF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICAgIHNyY19vcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICAgIGRzdF9vcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICAgIHJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgc3JjX3Jvd19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgc3JjX3NsaWNlX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBkc3Rfcm93X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBkc3Rfc2xpY2VfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKworI2VuZGlmCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVSZWFkSW1hZ2UoY2xfY29tbWFuZF9xdWV1ZSAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICBjbF9ib29sICAgICAgICAgICAgICBibG9ja2luZ19yZWFkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgICAgIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICAgICByZWdpb24sCisgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgcm93X3BpdGNoLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIHNsaWNlX3BpdGNoLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgIHB0ciwKKyAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICAgICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlV3JpdGVJbWFnZShjbF9jb21tYW5kX3F1ZXVlICAgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgICAgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgIGNsX2Jvb2wgICAgICAgICAgICAgYmxvY2tpbmdfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgICAgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICAgIHJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBpbnB1dF9yb3dfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgaW5wdXRfc2xpY2VfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiAgICAgICAgcHRyLAorICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICAgIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlRmlsbEltYWdlKGNsX2NvbW1hbmRfcXVldWUgICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogICAgICAgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICAgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgICByZWdpb24sCisgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2VuZGlmCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVDb3B5SW1hZ2UoY2xfY29tbWFuZF9xdWV1ZSAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgICBzcmNfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgY2xfbWVtICAgICAgICAgICAgICAgZHN0X2ltYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgICAgIHNyY19vcmlnaW4sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICAgICAgZHN0X29yaWdpbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiAgICAgICByZWdpb24sCisgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgICAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZUNvcHlJbWFnZVRvQnVmZmVyKGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgc3JjX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfbWVtICAgICAgICAgICBkc3RfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICBzcmNfb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICByZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgIGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZUNvcHlCdWZmZXJUb0ltYWdlKGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgc3JjX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgZHN0X2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBzcmNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICBkc3Rfb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICByZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSB2b2lkICogQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZU1hcEJ1ZmZlcihjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgY2xfbWVtICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgY2xfYm9vbCAgICAgICAgICBibG9ja2luZ19tYXAsCisgICAgICAgICAgICAgICAgICAgY2xfbWFwX2ZsYWdzICAgICBtYXBfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSB2b2lkICogQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZU1hcEltYWdlKGNsX2NvbW1hbmRfcXVldWUgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICAgIGNsX2Jvb2wgICAgICAgICAgIGJsb2NraW5nX21hcCwKKyAgICAgICAgICAgICAgICAgIGNsX21hcF9mbGFncyAgICAgIG1hcF9mbGFncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgIHJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCAqICAgICAgICAgIGltYWdlX3Jvd19waXRjaCwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCAqICAgICAgICAgIGltYWdlX3NsaWNlX3BpdGNoLAorICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgIGNsX2ludCAqICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVVubWFwTWVtT2JqZWN0KGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgbWVtb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICBtYXBwZWRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlTWlncmF0ZU1lbU9iamVjdHMoY2xfY29tbWFuZF9xdWV1ZSAgICAgICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgICBudW1fbWVtX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9tZW0gKiAgICAgICAgIG1lbV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfbWVtX21pZ3JhdGlvbl9mbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICAgICAgIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisjZW5kaWYKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwoY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICBjbF9rZXJuZWwgICAgICAgIGtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICB3b3JrX2RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICBnbG9iYWxfd29ya19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqICAgZ2xvYmFsX3dvcmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICBsb2NhbF93b3JrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZU5hdGl2ZUtlcm5lbChjbF9jb21tYW5kX3F1ZXVlICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKENMX0NBTExCQUNLICogdXNlcl9mdW5jKSh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgY2JfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICBudW1fbWVtX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfbWVtICogICAgbWVtX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKiAgICAgYXJnc19tZW1fbG9jLAorICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlTWFya2VyV2l0aFdhaXRMaXN0KGNsX2NvbW1hbmRfcXVldWUgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZUJhcnJpZXJXaXRoV2FpdExpc3QoY2xfY29tbWFuZF9xdWV1ZSAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMl8wCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVTVk1GcmVlKGNsX2NvbW1hbmRfcXVldWUgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9zdm1fcG9pbnRlcnMsCisgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgIHN2bV9wb2ludGVyc1tdLAorICAgICAgICAgICAgICAgICB2b2lkIChDTF9DQUxMQkFDSyAqIHBmbl9mcmVlX2Z1bmMpKGNsX2NvbW1hbmRfcXVldWUgcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICBudW1fc3ZtX3BvaW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgc3ZtX3BvaW50ZXJzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICB1c2VyX2RhdGEpLAorICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICB1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVNWTU1lbWNweShjbF9jb21tYW5kX3F1ZXVlICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgIGNsX2Jvb2wgICAgICAgICAgIGJsb2NraW5nX2NvcHksCisgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgZHN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogICAgICBzcmNfcHRyLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVNWTU1lbUZpbGwoY2xfY29tbWFuZF9xdWV1ZSAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgc3ZtX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqICAgICAgcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgcGF0dGVybl9zaXplLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVTVk1NYXAoY2xfY29tbWFuZF9xdWV1ZSAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICBjbF9ib29sICAgICAgICAgICBibG9ja2luZ19tYXAsCisgICAgICAgICAgICAgICAgY2xfbWFwX2ZsYWdzICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgc3ZtX3B0ciwKKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVTVk1Vbm1hcChjbF9jb21tYW5kX3F1ZXVlICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgc3ZtX3B0ciwKKyAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8wOworCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMl8xCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVTVk1NaWdyYXRlTWVtKGNsX2NvbW1hbmRfcXVldWUgICAgICAgICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgbnVtX3N2bV9wb2ludGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKiAgICAgICAgICAgIHN2bV9wb2ludGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogICAgICAgICAgIHNpemVzLAorICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW1fbWlncmF0aW9uX2ZsYWdzICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgICAgICAgIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMTsKKworI2VuZGlmCisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCisvKiBFeHRlbnNpb24gZnVuY3Rpb24gYWNjZXNzCisgKgorICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uIGZ1bmN0aW9uIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbiBuYW1lLAorICogb3IgTlVMTCBpZiBhIHZhbGlkIGZ1bmN0aW9uIGNhbiBub3QgYmUgZm91bmQuICBUaGUgY2xpZW50IG11c3QKKyAqIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgYWRkcmVzcyBpcyBub3QgTlVMTCwgYmVmb3JlIHVzaW5nIG9yCisgKiBjYWxsaW5nIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBhZGRyZXNzLgorICovCitleHRlcm4gQ0xfQVBJX0VOVFJZIHZvaWQgKiBDTF9BUElfQ0FMTAorY2xHZXRFeHRlbnNpb25GdW5jdGlvbkFkZHJlc3NGb3JQbGF0Zm9ybShjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqICAgZnVuY19uYW1lKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2VuZGlmCisKKyNpZmRlZiBDTF9VU0VfREVQUkVDQVRFRF9PUEVOQ0xfMV8wX0FQSVMKKyAgICAvKgorICAgICAqICBXQVJOSU5HOgorICAgICAqICAgICBUaGlzIEFQSSBpbnRyb2R1Y2VzIG11dGFibGUgc3RhdGUgaW50byB0aGUgT3BlbkNMIGltcGxlbWVudGF0aW9uLiBJdCBoYXMgYmVlbiBSRU1PVkVECisgICAgICogIHRvIGJldHRlciBmYWNpbGl0YXRlIHRocmVhZCBzYWZldHkuICBUaGUgMS4wIEFQSSBpcyBub3QgdGhyZWFkIHNhZmUuIEl0IGlzIG5vdCB0ZXN0ZWQgYnkgdGhlCisgICAgICogIE9wZW5DTCAxLjEgY29uZm9ybWFuY2UgdGVzdCwgYW5kIGNvbnNlcXVlbnRseSBtYXkgbm90IHdvcmsgb3IgbWF5IG5vdCB3b3JrIGRlcGVuZGFibHkuCisgICAgICogIEl0IGlzIGxpa2VseSB0byBiZSBub24tcGVyZm9ybWFudC4gVXNlIG9mIHRoaXMgQVBJIGlzIG5vdCBhZHZpc2VkLiBVc2UgYXQgeW91ciBvd24gcmlzay4KKyAgICAgKgorICAgICAqICBTb2Z0d2FyZSBkZXZlbG9wZXJzIHByZXZpb3VzbHkgcmVseWluZyBvbiB0aGlzIEFQSSBhcmUgaW5zdHJ1Y3RlZCB0byBzZXQgdGhlIGNvbW1hbmQgcXVldWUKKyAgICAgKiAgcHJvcGVydGllcyB3aGVuIGNyZWF0aW5nIHRoZSBxdWV1ZSwgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorICAgIGNsU2V0Q29tbWFuZFF1ZXVlUHJvcGVydHkoY2xfY29tbWFuZF9xdWV1ZSAgICAgICAgICAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2NvbW1hbmRfcXVldWVfcHJvcGVydGllcyAgIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ib29sICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9jb21tYW5kX3F1ZXVlX3Byb3BlcnRpZXMgKiBvbGRfcHJvcGVydGllcykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzBfREVQUkVDQVRFRDsKKyNlbmRpZiAvKiBDTF9VU0VfREVQUkVDQVRFRF9PUEVOQ0xfMV8wX0FQSVMgKi8KKworLyogRGVwcmVjYXRlZCBPcGVuQ0wgMS4xIEFQSXMgKi8KK2V4dGVybiBDTF9BUElfRU5UUlkgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8xXzFfREVQUkVDQVRFRCBjbF9tZW0gQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlSW1hZ2UyRChjbF9jb250ZXh0ICAgICAgICAgICAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgIGNsX21lbV9mbGFncyAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IGNsX2ltYWdlX2Zvcm1hdCAqIGltYWdlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgaW1hZ2Vfcm93X3BpdGNoLAorICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIGhvc3RfcHRyLAorICAgICAgICAgICAgICAgIGNsX2ludCAqICAgICAgICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQgY2xfbWVtIENMX0FQSV9DQUxMCitjbENyZWF0ZUltYWdlM0QoY2xfY29udGV4dCAgICAgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICBjbF9tZW1fZmxhZ3MgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBjbF9pbWFnZV9mb3JtYXQgKiBpbWFnZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIGltYWdlX2RlcHRoLAorICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIGltYWdlX3Jvd19waXRjaCwKKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBpbWFnZV9zbGljZV9waXRjaCwKKyAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICBob3N0X3B0ciwKKyAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzFfREVQUkVDQVRFRDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBDTF9BUElfUFJFRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlTWFya2VyKGNsX2NvbW1hbmRfcXVldWUgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVXYWl0Rm9yRXZlbnRzKGNsX2NvbW1hbmRfcXVldWUgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgIG51bV9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqIGV2ZW50X2xpc3QpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQ7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8xXzFfREVQUkVDQVRFRCBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZUJhcnJpZXIoY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQgY2xfaW50IENMX0FQSV9DQUxMCitjbFVubG9hZENvbXBpbGVyKHZvaWQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQ7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8xXzFfREVQUkVDQVRFRCB2b2lkICogQ0xfQVBJX0NBTEwKK2NsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzKGNvbnN0IGNoYXIgKiBmdW5jX25hbWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQ7CisKKy8qIERlcHJlY2F0ZWQgT3BlbkNMIDIuMCBBUElzICovCitleHRlcm4gQ0xfQVBJX0VOVFJZIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMV8yX0RFUFJFQ0FURUQgY2xfY29tbWFuZF9xdWV1ZSBDTF9BUElfQ0FMTAorY2xDcmVhdGVDb21tYW5kUXVldWUoY2xfY29udGV4dCAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgY2xfY29tbWFuZF9xdWV1ZV9wcm9wZXJ0aWVzICAgIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICAgICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yX0RFUFJFQ0FURUQ7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8xXzJfREVQUkVDQVRFRCBjbF9zYW1wbGVyIENMX0FQSV9DQUxMCitjbENyZWF0ZVNhbXBsZXIoY2xfY29udGV4dCAgICAgICAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgIGNsX2Jvb2wgICAgICAgICAgICAgbm9ybWFsaXplZF9jb29yZHMsCisgICAgICAgICAgICAgICAgY2xfYWRkcmVzc2luZ19tb2RlICBhZGRyZXNzaW5nX21vZGUsCisgICAgICAgICAgICAgICAgY2xfZmlsdGVyX21vZGUgICAgICBmaWx0ZXJfbW9kZSwKKyAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMl9ERVBSRUNBVEVEOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMV8yX0RFUFJFQ0FURUQgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVUYXNrKGNsX2NvbW1hbmRfcXVldWUgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgIGNsX2tlcm5lbCAgICAgICAgIGtlcm5lbCwKKyAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yX0RFUFJFQ0FURUQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLyogX19PUEVOQ0xfQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML2NsX2QzZDEwLmggYi9PcGVuQ0wvQ0wvY2xfZDNkMTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRlZGIwCi0tLSAvZGV2L251bGwKKysrIGIvT3BlbkNML0NML2NsX2QzZDEwLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAyMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19PUEVOQ0xfQ0xfRDNEMTBfSAorI2RlZmluZSBfX09QRU5DTF9DTF9EM0QxMF9ICisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2lmIF9NU0NfVkVSID49MTUwMAorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyMDEgKQorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxkM2QxMC5oPgorI2lmIGRlZmluZWQoX01TQ19WRVIpCisjaWYgX01TQ19WRVIgPj0xNTAwCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPENML2NsLmg+CisjaW5jbHVkZSA8Q0wvY2xfcGxhdGZvcm0uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjbF9raHJfZDNkMTBfc2hhcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBjbF9raHJfZDNkMTBfc2hhcmluZyAxCisKK3R5cGVkZWYgY2xfdWludCBjbF9kM2QxMF9kZXZpY2Vfc291cmNlX2tocjsKK3R5cGVkZWYgY2xfdWludCBjbF9kM2QxMF9kZXZpY2Vfc2V0X2tocjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgQ0xfSU5WQUxJRF9EM0QxMF9ERVZJQ0VfS0hSICAgICAgICAgICAgICAgICAgLTEwMDIKKyNkZWZpbmUgQ0xfSU5WQUxJRF9EM0QxMF9SRVNPVVJDRV9LSFIgICAgICAgICAgICAgICAgLTEwMDMKKyNkZWZpbmUgQ0xfRDNEMTBfUkVTT1VSQ0VfQUxSRUFEWV9BQ1FVSVJFRF9LSFIgICAgICAgLTEwMDQKKyNkZWZpbmUgQ0xfRDNEMTBfUkVTT1VSQ0VfTk9UX0FDUVVJUkVEX0tIUiAgICAgICAgICAgLTEwMDUKKworLyogY2xfZDNkMTBfZGV2aWNlX3NvdXJjZV9udiAqLworI2RlZmluZSBDTF9EM0QxMF9ERVZJQ0VfS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMTAKKyNkZWZpbmUgQ0xfRDNEMTBfRFhHSV9BREFQVEVSX0tIUiAgICAgICAgICAgICAgICAgICAgMHg0MDExCisKKy8qIGNsX2QzZDEwX2RldmljZV9zZXRfbnYgKi8KKyNkZWZpbmUgQ0xfUFJFRkVSUkVEX0RFVklDRVNfRk9SX0QzRDEwX0tIUiAgICAgICAgICAgMHg0MDEyCisjZGVmaW5lIENMX0FMTF9ERVZJQ0VTX0ZPUl9EM0QxMF9LSFIgICAgICAgICAgICAgICAgIDB4NDAxMworCisvKiBjbF9jb250ZXh0X2luZm8gKi8KKyNkZWZpbmUgQ0xfQ09OVEVYVF9EM0QxMF9ERVZJQ0VfS0hSICAgICAgICAgICAgICAgICAgMHg0MDE0CisjZGVmaW5lIENMX0NPTlRFWFRfRDNEMTBfUFJFRkVSX1NIQVJFRF9SRVNPVVJDRVNfS0hSIDB4NDAyQworCisvKiBjbF9tZW1faW5mbyAqLworI2RlZmluZSBDTF9NRU1fRDNEMTBfUkVTT1VSQ0VfS0hSICAgICAgICAgICAgICAgICAgICAweDQwMTUKKworLyogY2xfaW1hZ2VfaW5mbyAqLworI2RlZmluZSBDTF9JTUFHRV9EM0QxMF9TVUJSRVNPVVJDRV9LSFIgICAgICAgICAgICAgICAweDQwMTYKKworLyogY2xfY29tbWFuZF90eXBlICovCisjZGVmaW5lIENMX0NPTU1BTkRfQUNRVUlSRV9EM0QxMF9PQkpFQ1RTX0tIUiAgICAgICAgIDB4NDAxNworI2RlZmluZSBDTF9DT01NQU5EX1JFTEVBU0VfRDNEMTBfT0JKRUNUU19LSFIgICAgICAgICAweDQwMTgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbEdldERldmljZUlEc0Zyb21EM0QxMEtIUl9mbikoCisgICAgY2xfcGxhdGZvcm1faWQgICAgICAgICAgICAgcGxhdGZvcm0sCisgICAgY2xfZDNkMTBfZGV2aWNlX3NvdXJjZV9raHIgZDNkX2RldmljZV9zb3VyY2UsCisgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgICAgZDNkX29iamVjdCwKKyAgICBjbF9kM2QxMF9kZXZpY2Vfc2V0X2tociAgICBkM2RfZGV2aWNlX3NldCwKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICBudW1fZW50cmllcywKKyAgICBjbF9kZXZpY2VfaWQgKiAgICAgICAgICAgICBkZXZpY2VzLAorICAgIGNsX3VpbnQgKiAgICAgICAgICAgICAgICAgIG51bV9kZXZpY2VzKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9tZW0gKENMX0FQSV9DQUxMICpjbENyZWF0ZUZyb21EM0QxMEJ1ZmZlcktIUl9mbikoCisgICAgY2xfY29udGV4dCAgICAgY29udGV4dCwKKyAgICBjbF9tZW1fZmxhZ3MgICBmbGFncywKKyAgICBJRDNEMTBCdWZmZXIgKiByZXNvdXJjZSwKKyAgICBjbF9pbnQgKiAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfbWVtIChDTF9BUElfQ0FMTCAqY2xDcmVhdGVGcm9tRDNEMTBUZXh0dXJlMkRLSFJfZm4pKAorICAgIGNsX2NvbnRleHQgICAgICAgIGNvbnRleHQsCisgICAgY2xfbWVtX2ZsYWdzICAgICAgZmxhZ3MsCisgICAgSUQzRDEwVGV4dHVyZTJEICogcmVzb3VyY2UsCisgICAgVUlOVCAgICAgICAgICAgICAgc3VicmVzb3VyY2UsCisgICAgY2xfaW50ICogICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX21lbSAoQ0xfQVBJX0NBTEwgKmNsQ3JlYXRlRnJvbUQzRDEwVGV4dHVyZTNES0hSX2ZuKSgKKyAgICBjbF9jb250ZXh0ICAgICAgICBjb250ZXh0LAorICAgIGNsX21lbV9mbGFncyAgICAgIGZsYWdzLAorICAgIElEM0QxMFRleHR1cmUzRCAqIHJlc291cmNlLAorICAgIFVJTlQgICAgICAgICAgICAgIHN1YnJlc291cmNlLAorICAgIGNsX2ludCAqICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbEVucXVldWVBY3F1aXJlRDNEMTBPYmplY3RzS0hSX2ZuKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgY2xfdWludCAgICAgICAgICBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKiAgIG1lbV9vYmplY3RzLAorICAgIGNsX3VpbnQgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKiAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqY2xFbnF1ZXVlUmVsZWFzZUQzRDEwT2JqZWN0c0tIUl9mbikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgIGNsX3VpbnQgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICogICBtZW1fb2JqZWN0cywKKyAgICBjbF91aW50ICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICogZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICogICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fT1BFTkNMX0NMX0QzRDEwX0ggKi8KKwpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML2NsX2QzZDExLmggYi9PcGVuQ0wvQ0wvY2xfZDNkMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGVkOTA2Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlbkNML0NML2NsX2QzZDExLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAyMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19PUEVOQ0xfQ0xfRDNEMTFfSAorI2RlZmluZSBfX09QRU5DTF9DTF9EM0QxMV9ICisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2lmIF9NU0NfVkVSID49MTUwMAorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyMDEgKQorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxkM2QxMS5oPgorI2lmIGRlZmluZWQoX01TQ19WRVIpCisjaWYgX01TQ19WRVIgPj0xNTAwCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPENML2NsLmg+CisjaW5jbHVkZSA8Q0wvY2xfcGxhdGZvcm0uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjbF9raHJfZDNkMTFfc2hhcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBjbF9raHJfZDNkMTFfc2hhcmluZyAxCisKK3R5cGVkZWYgY2xfdWludCBjbF9kM2QxMV9kZXZpY2Vfc291cmNlX2tocjsKK3R5cGVkZWYgY2xfdWludCBjbF9kM2QxMV9kZXZpY2Vfc2V0X2tocjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgQ0xfSU5WQUxJRF9EM0QxMV9ERVZJQ0VfS0hSICAgICAgICAgICAgICAgICAgLTEwMDYKKyNkZWZpbmUgQ0xfSU5WQUxJRF9EM0QxMV9SRVNPVVJDRV9LSFIgICAgICAgICAgICAgICAgLTEwMDcKKyNkZWZpbmUgQ0xfRDNEMTFfUkVTT1VSQ0VfQUxSRUFEWV9BQ1FVSVJFRF9LSFIgICAgICAgLTEwMDgKKyNkZWZpbmUgQ0xfRDNEMTFfUkVTT1VSQ0VfTk9UX0FDUVVJUkVEX0tIUiAgICAgICAgICAgLTEwMDkKKworLyogY2xfZDNkMTFfZGV2aWNlX3NvdXJjZSAqLworI2RlZmluZSBDTF9EM0QxMV9ERVZJQ0VfS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMTkKKyNkZWZpbmUgQ0xfRDNEMTFfRFhHSV9BREFQVEVSX0tIUiAgICAgICAgICAgICAgICAgICAgMHg0MDFBCisKKy8qIGNsX2QzZDExX2RldmljZV9zZXQgKi8KKyNkZWZpbmUgQ0xfUFJFRkVSUkVEX0RFVklDRVNfRk9SX0QzRDExX0tIUiAgICAgICAgICAgMHg0MDFCCisjZGVmaW5lIENMX0FMTF9ERVZJQ0VTX0ZPUl9EM0QxMV9LSFIgICAgICAgICAgICAgICAgIDB4NDAxQworCisvKiBjbF9jb250ZXh0X2luZm8gKi8KKyNkZWZpbmUgQ0xfQ09OVEVYVF9EM0QxMV9ERVZJQ0VfS0hSICAgICAgICAgICAgICAgICAgMHg0MDFECisjZGVmaW5lIENMX0NPTlRFWFRfRDNEMTFfUFJFRkVSX1NIQVJFRF9SRVNPVVJDRVNfS0hSIDB4NDAyRAorCisvKiBjbF9tZW1faW5mbyAqLworI2RlZmluZSBDTF9NRU1fRDNEMTFfUkVTT1VSQ0VfS0hSICAgICAgICAgICAgICAgICAgICAweDQwMUUKKworLyogY2xfaW1hZ2VfaW5mbyAqLworI2RlZmluZSBDTF9JTUFHRV9EM0QxMV9TVUJSRVNPVVJDRV9LSFIgICAgICAgICAgICAgICAweDQwMUYKKworLyogY2xfY29tbWFuZF90eXBlICovCisjZGVmaW5lIENMX0NPTU1BTkRfQUNRVUlSRV9EM0QxMV9PQkpFQ1RTX0tIUiAgICAgICAgIDB4NDAyMAorI2RlZmluZSBDTF9DT01NQU5EX1JFTEVBU0VfRDNEMTFfT0JKRUNUU19LSFIgICAgICAgICAweDQwMjEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbEdldERldmljZUlEc0Zyb21EM0QxMUtIUl9mbikoCisgICAgY2xfcGxhdGZvcm1faWQgICAgICAgICAgICAgcGxhdGZvcm0sCisgICAgY2xfZDNkMTFfZGV2aWNlX3NvdXJjZV9raHIgZDNkX2RldmljZV9zb3VyY2UsCisgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgICAgZDNkX29iamVjdCwKKyAgICBjbF9kM2QxMV9kZXZpY2Vfc2V0X2tociAgICBkM2RfZGV2aWNlX3NldCwKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICBudW1fZW50cmllcywKKyAgICBjbF9kZXZpY2VfaWQgKiAgICAgICAgICAgICBkZXZpY2VzLAorICAgIGNsX3VpbnQgKiAgICAgICAgICAgICAgICAgIG51bV9kZXZpY2VzKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9tZW0gKENMX0FQSV9DQUxMICpjbENyZWF0ZUZyb21EM0QxMUJ1ZmZlcktIUl9mbikoCisgICAgY2xfY29udGV4dCAgICAgY29udGV4dCwKKyAgICBjbF9tZW1fZmxhZ3MgICBmbGFncywKKyAgICBJRDNEMTFCdWZmZXIgKiByZXNvdXJjZSwKKyAgICBjbF9pbnQgKiAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYgY2xfbWVtIChDTF9BUElfQ0FMTCAqY2xDcmVhdGVGcm9tRDNEMTFUZXh0dXJlMkRLSFJfZm4pKAorICAgIGNsX2NvbnRleHQgICAgICAgIGNvbnRleHQsCisgICAgY2xfbWVtX2ZsYWdzICAgICAgZmxhZ3MsCisgICAgSUQzRDExVGV4dHVyZTJEICogcmVzb3VyY2UsCisgICAgVUlOVCAgICAgICAgICAgICAgc3VicmVzb3VyY2UsCisgICAgY2xfaW50ICogICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX21lbSAoQ0xfQVBJX0NBTEwgKmNsQ3JlYXRlRnJvbUQzRDExVGV4dHVyZTNES0hSX2ZuKSgKKyAgICBjbF9jb250ZXh0ICAgICAgICBjb250ZXh0LAorICAgIGNsX21lbV9mbGFncyAgICAgIGZsYWdzLAorICAgIElEM0QxMVRleHR1cmUzRCAqIHJlc291cmNlLAorICAgIFVJTlQgICAgICAgICAgICAgIHN1YnJlc291cmNlLAorICAgIGNsX2ludCAqICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbEVucXVldWVBY3F1aXJlRDNEMTFPYmplY3RzS0hSX2ZuKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgY2xfdWludCAgICAgICAgICBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKiAgIG1lbV9vYmplY3RzLAorICAgIGNsX3VpbnQgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKiAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqY2xFbnF1ZXVlUmVsZWFzZUQzRDExT2JqZWN0c0tIUl9mbikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgIGNsX3VpbnQgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICogICBtZW1fb2JqZWN0cywKKyAgICBjbF91aW50ICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICogZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICogICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fT1BFTkNMX0NMX0QzRDExX0ggKi8KKwpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML2NsX2R4OV9tZWRpYV9zaGFyaW5nLmggYi9PcGVuQ0wvQ0wvY2xfZHg5X21lZGlhX3NoYXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQyYjIzCi0tLSAvZGV2L251bGwKKysrIGIvT3BlbkNML0NML2NsX2R4OV9tZWRpYV9zaGFyaW5nLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAyMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19PUEVOQ0xfQ0xfRFg5X01FRElBX1NIQVJJTkdfSAorI2RlZmluZSBfX09QRU5DTF9DTF9EWDlfTUVESUFfU0hBUklOR19ICisKKyNpbmNsdWRlIDxDTC9jbC5oPgorI2luY2x1ZGUgPENML2NsX3BsYXRmb3JtLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNsX2tocl9keDlfbWVkaWFfc2hhcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIGNsX2tocl9keDlfbWVkaWFfc2hhcmluZyAxCisKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9keDlfbWVkaWFfYWRhcHRlcl90eXBlX2tocjsKK3R5cGVkZWYgY2xfdWludCAgICAgICAgICAgICBjbF9keDlfbWVkaWFfYWRhcHRlcl9zZXRfa2hyOworICAgIAorI2lmIGRlZmluZWQoX1dJTjMyKQorI2luY2x1ZGUgPGQzZDkuaD4KK3R5cGVkZWYgc3RydWN0IF9jbF9keDlfc3VyZmFjZV9pbmZvX2tocgoreworICAgIElEaXJlY3QzRFN1cmZhY2U5ICpyZXNvdXJjZTsKKyAgICBIQU5ETEUgc2hhcmVkX2hhbmRsZTsKK30gY2xfZHg5X3N1cmZhY2VfaW5mb19raHI7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFcnJvciBDb2RlcyAqLworI2RlZmluZSBDTF9JTlZBTElEX0RYOV9NRURJQV9BREFQVEVSX0tIUiAgICAgICAgICAgICAgICAtMTAxMAorI2RlZmluZSBDTF9JTlZBTElEX0RYOV9NRURJQV9TVVJGQUNFX0tIUiAgICAgICAgICAgICAgICAtMTAxMQorI2RlZmluZSBDTF9EWDlfTUVESUFfU1VSRkFDRV9BTFJFQURZX0FDUVVJUkVEX0tIUiAgICAgICAtMTAxMgorI2RlZmluZSBDTF9EWDlfTUVESUFfU1VSRkFDRV9OT1RfQUNRVUlSRURfS0hSICAgICAgICAgICAtMTAxMworCisvKiBjbF9tZWRpYV9hZGFwdGVyX3R5cGVfa2hyICovCisjZGVmaW5lIENMX0FEQVBURVJfRDNEOV9LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMjAKKyNkZWZpbmUgQ0xfQURBUFRFUl9EM0Q5RVhfS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAyMQorI2RlZmluZSBDTF9BREFQVEVSX0RYVkFfS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDIyCisKKy8qIGNsX21lZGlhX2FkYXB0ZXJfc2V0X2tociAqLworI2RlZmluZSBDTF9QUkVGRVJSRURfREVWSUNFU19GT1JfRFg5X01FRElBX0FEQVBURVJfS0hSICAgMHgyMDIzCisjZGVmaW5lIENMX0FMTF9ERVZJQ0VTX0ZPUl9EWDlfTUVESUFfQURBUFRFUl9LSFIgICAgICAgICAweDIwMjQKKworLyogY2xfY29udGV4dF9pbmZvICovCisjZGVmaW5lIENMX0NPTlRFWFRfQURBUFRFUl9EM0Q5X0tIUiAgICAgICAgICAgICAgICAgICAgICAweDIwMjUKKyNkZWZpbmUgQ0xfQ09OVEVYVF9BREFQVEVSX0QzRDlFWF9LSFIgICAgICAgICAgICAgICAgICAgIDB4MjAyNgorI2RlZmluZSBDTF9DT05URVhUX0FEQVBURVJfRFhWQV9LSFIgICAgICAgICAgICAgICAgICAgICAgMHgyMDI3CisKKy8qIGNsX21lbV9pbmZvICovCisjZGVmaW5lIENMX01FTV9EWDlfTUVESUFfQURBUFRFUl9UWVBFX0tIUiAgICAgICAgICAgICAgICAweDIwMjgKKyNkZWZpbmUgQ0xfTUVNX0RYOV9NRURJQV9TVVJGQUNFX0lORk9fS0hSICAgICAgICAgICAgICAgIDB4MjAyOQorCisvKiBjbF9pbWFnZV9pbmZvICovCisjZGVmaW5lIENMX0lNQUdFX0RYOV9NRURJQV9QTEFORV9LSFIgICAgICAgICAgICAgICAgICAgICAweDIwMkEKKworLyogY2xfY29tbWFuZF90eXBlICovCisjZGVmaW5lIENMX0NPTU1BTkRfQUNRVUlSRV9EWDlfTUVESUFfU1VSRkFDRVNfS0hSICAgICAgICAweDIwMkIKKyNkZWZpbmUgQ0xfQ09NTUFORF9SRUxFQVNFX0RYOV9NRURJQV9TVVJGQUNFU19LSFIgICAgICAgIDB4MjAyQworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKmNsR2V0RGV2aWNlSURzRnJvbURYOU1lZGlhQWRhcHRlcktIUl9mbikoCisgICAgY2xfcGxhdGZvcm1faWQgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0sCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX21lZGlhX2FkYXB0ZXJzLAorICAgIGNsX2R4OV9tZWRpYV9hZGFwdGVyX3R5cGVfa2hyICogIG1lZGlhX2FkYXB0ZXJfdHlwZSwKKyAgICB2b2lkICogICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9hZGFwdGVycywKKyAgICBjbF9keDlfbWVkaWFfYWRhcHRlcl9zZXRfa2hyICAgICBtZWRpYV9hZGFwdGVyX3NldCwKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZW50cmllcywKKyAgICBjbF9kZXZpY2VfaWQgKiAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAorICAgIGNsX3VpbnQgKiAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXZpY2VzKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9tZW0gKENMX0FQSV9DQUxMICpjbENyZWF0ZUZyb21EWDlNZWRpYVN1cmZhY2VLSFJfZm4pKAorICAgIGNsX2NvbnRleHQgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgY2xfbWVtX2ZsYWdzICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgY2xfZHg5X21lZGlhX2FkYXB0ZXJfdHlwZV9raHIgYWRhcHRlcl90eXBlLAorICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfaW5mbywKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGNsX2ludCAqICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbEVucXVldWVBY3F1aXJlRFg5TWVkaWFTdXJmYWNlc0tIUl9mbikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgIGNsX3VpbnQgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICogICBtZW1fb2JqZWN0cywKKyAgICBjbF91aW50ICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICogZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICogICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKmNsRW5xdWV1ZVJlbGVhc2VEWDlNZWRpYVN1cmZhY2VzS0hSX2ZuKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgY2xfdWludCAgICAgICAgICBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKiAgIG1lbV9vYmplY3RzLAorICAgIGNsX3VpbnQgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKiAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfaW50ZWxfZHg5X21lZGlhX3NoYXJpbmcgZXh0ZW5zaW9uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgY2xfaW50ZWxfZHg5X21lZGlhX3NoYXJpbmcgMQorCit0eXBlZGVmIGNsX3VpbnQgY2xfZHg5X2RldmljZV9zb3VyY2VfaW50ZWw7Cit0eXBlZGVmIGNsX3VpbnQgY2xfZHg5X2RldmljZV9zZXRfaW50ZWw7CisKKy8qIGVycm9yIGNvZGVzICovCisjZGVmaW5lIENMX0lOVkFMSURfRFg5X0RFVklDRV9JTlRFTCAgICAgICAgICAgICAgICAgICAtMTAxMAorI2RlZmluZSBDTF9JTlZBTElEX0RYOV9SRVNPVVJDRV9JTlRFTCAgICAgICAgICAgICAgICAgLTEwMTEKKyNkZWZpbmUgQ0xfRFg5X1JFU09VUkNFX0FMUkVBRFlfQUNRVUlSRURfSU5URUwgICAgICAgIC0xMDEyCisjZGVmaW5lIENMX0RYOV9SRVNPVVJDRV9OT1RfQUNRVUlSRURfSU5URUwgICAgICAgICAgICAtMTAxMworCisvKiBjbF9keDlfZGV2aWNlX3NvdXJjZV9pbnRlbCAqLworI2RlZmluZSBDTF9EM0Q5X0RFVklDRV9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDIyCisjZGVmaW5lIENMX0QzRDlFWF9ERVZJQ0VfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAweDQwNzAKKyNkZWZpbmUgQ0xfRFhWQV9ERVZJQ0VfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDA3MQorCisvKiBjbF9keDlfZGV2aWNlX3NldF9pbnRlbCAqLworI2RlZmluZSBDTF9QUkVGRVJSRURfREVWSUNFU19GT1JfRFg5X0lOVEVMICAgICAgICAgICAgMHg0MDI0CisjZGVmaW5lIENMX0FMTF9ERVZJQ0VTX0ZPUl9EWDlfSU5URUwgICAgICAgICAgICAgICAgICAweDQwMjUKKworLyogY2xfY29udGV4dF9pbmZvICovCisjZGVmaW5lIENMX0NPTlRFWFRfRDNEOV9ERVZJQ0VfSU5URUwgICAgICAgICAgICAgICAgICAweDQwMjYKKyNkZWZpbmUgQ0xfQ09OVEVYVF9EM0Q5RVhfREVWSUNFX0lOVEVMICAgICAgICAgICAgICAgIDB4NDA3MgorI2RlZmluZSBDTF9DT05URVhUX0RYVkFfREVWSUNFX0lOVEVMICAgICAgICAgICAgICAgICAgMHg0MDczCisKKy8qIGNsX21lbV9pbmZvICovCisjZGVmaW5lIENMX01FTV9EWDlfUkVTT1VSQ0VfSU5URUwgICAgICAgICAgICAgICAgICAgICAweDQwMjcKKyNkZWZpbmUgQ0xfTUVNX0RYOV9TSEFSRURfSEFORExFX0lOVEVMICAgICAgICAgICAgICAgIDB4NDA3NAorCisvKiBjbF9pbWFnZV9pbmZvICovCisjZGVmaW5lIENMX0lNQUdFX0RYOV9QTEFORV9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAweDQwNzUKKworLyogY2xfY29tbWFuZF90eXBlICovCisjZGVmaW5lIENMX0NPTU1BTkRfQUNRVUlSRV9EWDlfT0JKRUNUU19JTlRFTCAgICAgICAgICAweDQwMkEKKyNkZWZpbmUgQ0xfQ09NTUFORF9SRUxFQVNFX0RYOV9PQkpFQ1RTX0lOVEVMICAgICAgICAgIDB4NDAyQgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0RGV2aWNlSURzRnJvbURYOUlOVEVMKAorICAgIGNsX3BsYXRmb3JtX2lkICAgICAgICAgICAgICBwbGF0Zm9ybSwKKyAgICBjbF9keDlfZGV2aWNlX3NvdXJjZV9pbnRlbCAgZHg5X2RldmljZV9zb3VyY2UsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIGR4OV9vYmplY3QsCisgICAgY2xfZHg5X2RldmljZV9zZXRfaW50ZWwgICAgIGR4OV9kZXZpY2Vfc2V0LAorICAgIGNsX3VpbnQgICAgICAgICAgICAgICAgICAgICBudW1fZW50cmllcywKKyAgICBjbF9kZXZpY2VfaWQqICAgICAgICAgICAgICAgZGV2aWNlcywKKyAgICBjbF91aW50KiAgICAgICAgICAgICAgICAgICAgbnVtX2RldmljZXMpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwqIGNsR2V0RGV2aWNlSURzRnJvbURYOUlOVEVMX2ZuKSgKKyAgICBjbF9wbGF0Zm9ybV9pZCAgICAgICAgICAgICAgcGxhdGZvcm0sCisgICAgY2xfZHg5X2RldmljZV9zb3VyY2VfaW50ZWwgIGR4OV9kZXZpY2Vfc291cmNlLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBkeDlfb2JqZWN0LAorICAgIGNsX2R4OV9kZXZpY2Vfc2V0X2ludGVsICAgICBkeDlfZGV2aWNlX3NldCwKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgbnVtX2VudHJpZXMsCisgICAgY2xfZGV2aWNlX2lkKiAgICAgICAgICAgICAgIGRldmljZXMsCisgICAgY2xfdWludCogICAgICAgICAgICAgICAgICAgIG51bV9kZXZpY2VzKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9tZW0gQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlRnJvbURYOU1lZGlhU3VyZmFjZUlOVEVMKAorICAgIGNsX2NvbnRleHQgICAgICAgICAgICAgICAgICBjb250ZXh0LAorICAgIGNsX21lbV9mbGFncyAgICAgICAgICAgICAgICBmbGFncywKKyAgICBJRGlyZWN0M0RTdXJmYWNlOSogICAgICAgICAgcmVzb3VyY2UsCisgICAgSEFORExFICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEhhbmRsZSwKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUsCisgICAgY2xfaW50KiAgICAgICAgICAgICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKwordHlwZWRlZiBjbF9tZW0gKENMX0FQSV9DQUxMICpjbENyZWF0ZUZyb21EWDlNZWRpYVN1cmZhY2VJTlRFTF9mbikoCisgICAgY2xfY29udGV4dCAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgY2xfbWVtX2ZsYWdzICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIElEaXJlY3QzRFN1cmZhY2U5KiAgICAgICAgICByZXNvdXJjZSwKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkSGFuZGxlLAorICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSwKKyAgICBjbF9pbnQqICAgICAgICAgICAgICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlQWNxdWlyZURYOU9iamVjdHNJTlRFTCgKKyAgICBjbF9jb21tYW5kX3F1ZXVlICAgICAgICAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtKiAgICAgICAgICAgICAgIG1lbV9vYmplY3RzLAorICAgIGNsX3VpbnQgICAgICAgICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCogICAgICAgICAgICAgZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50KiAgICAgICAgICAgICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzE7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqY2xFbnF1ZXVlQWNxdWlyZURYOU9iamVjdHNJTlRFTF9mbikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSAgICAgICAgICAgIGNvbW1hbmRfcXVldWUsCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgIG51bV9vYmplY3RzLAorICAgIGNvbnN0IGNsX21lbSogICAgICAgICAgICAgICBtZW1fb2JqZWN0cywKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQqICAgICAgICAgICAgIGV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCogICAgICAgICAgICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlUmVsZWFzZURYOU9iamVjdHNJTlRFTCgKKyAgICBjbF9jb21tYW5kX3F1ZXVlICAgICAgICAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgY2xfbWVtKiAgICAgICAgICAgICAgICAgICAgIG1lbV9vYmplY3RzLAorICAgIGNsX3VpbnQgICAgICAgICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCogICAgICAgICAgICAgZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50KiAgICAgICAgICAgICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzE7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqY2xFbnF1ZXVlUmVsZWFzZURYOU9iamVjdHNJTlRFTF9mbikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSAgICAgICAgICAgIGNvbW1hbmRfcXVldWUsCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgIG51bV9vYmplY3RzLAorICAgIGNsX21lbSogICAgICAgICAgICAgICAgICAgICBtZW1fb2JqZWN0cywKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQqICAgICAgICAgICAgIGV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCogICAgICAgICAgICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fT1BFTkNMX0NMX0RYOV9NRURJQV9TSEFSSU5HX0ggKi8KKwpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML2NsX2R4OV9tZWRpYV9zaGFyaW5nX2ludGVsLmggYi9PcGVuQ0wvQ0wvY2xfZHg5X21lZGlhX3NoYXJpbmdfaW50ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjUxOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlbkNML0NML2NsX2R4OV9tZWRpYV9zaGFyaW5nX2ludGVsLmgKQEAgLTAsMCArMSwxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDIwIFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPENML2NsX2R4OV9tZWRpYV9zaGFyaW5nLmg+CisjcHJhZ21hIG1lc3NhZ2UoIlRoZSBJbnRlbCBEWDkgbWVkaWEgc2hhcmluZyBleHRlbnNpb25zIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGNsX2R4OV9tZWRpYV9zaGFyaW5nLmguICBQbGVhc2UgaW5jbHVkZSBjbF9keDlfbWVkaWFfc2hhcmluZy5oIGRpcmVjdGx5LiIpCmRpZmYgLS1naXQgYS9PcGVuQ0wvQ0wvY2xfZWdsLmggYi9PcGVuQ0wvQ0wvY2xfZWdsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3YTM3YwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5DTC9DTC9jbF9lZ2wuaApAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDIwIFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX09QRU5DTF9DTF9FR0xfSAorI2RlZmluZSBfX09QRU5DTF9DTF9FR0xfSAorCisjaW5jbHVkZSA8Q0wvY2wuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIENvbW1hbmQgdHlwZSBmb3IgZXZlbnRzIGNyZWF0ZWQgd2l0aCBjbEVucXVldWVBY3F1aXJlRUdMT2JqZWN0c0tIUiAqLworI2RlZmluZSBDTF9DT01NQU5EX0VHTF9GRU5DRV9TWU5DX09CSkVDVF9LSFIgIDB4MjAyRgorI2RlZmluZSBDTF9DT01NQU5EX0FDUVVJUkVfRUdMX09CSkVDVFNfS0hSICAgIDB4MjAyRAorI2RlZmluZSBDTF9DT01NQU5EX1JFTEVBU0VfRUdMX09CSkVDVFNfS0hSICAgIDB4MjAyRQorCisvKiBFcnJvciB0eXBlIGZvciBjbENyZWF0ZUZyb21FR0xJbWFnZUtIUiAqLworI2RlZmluZSBDTF9JTlZBTElEX0VHTF9PQkpFQ1RfS0hSICAgICAgICAgICAgIC0xMDkzCisjZGVmaW5lIENMX0VHTF9SRVNPVVJDRV9OT1RfQUNRVUlSRURfS0hSICAgICAgLTEwOTIKKworLyogQ0xlZ2xJbWFnZUtIUiBpcyBhbiBvcGFxdWUgaGFuZGxlIHRvIGFuIEVHTEltYWdlICovCit0eXBlZGVmIHZvaWQqIENMZWdsSW1hZ2VLSFI7CisKKy8qIENMZWdsRGlzcGxheUtIUiBpcyBhbiBvcGFxdWUgaGFuZGxlIHRvIGFuIEVHTERpc3BsYXkgKi8KK3R5cGVkZWYgdm9pZCogQ0xlZ2xEaXNwbGF5S0hSOworCisvKiBDTGVnbFN5bmNLSFIgaXMgYW4gb3BhcXVlIGhhbmRsZSB0byBhbiBFR0xTeW5jIG9iamVjdCAqLwordHlwZWRlZiB2b2lkKiBDTGVnbFN5bmNLSFI7CisKKy8qIHByb3BlcnRpZXMgcGFzc2VkIHRvIGNsQ3JlYXRlRnJvbUVHTEltYWdlS0hSICovCit0eXBlZGVmIGludHB0cl90IGNsX2VnbF9pbWFnZV9wcm9wZXJ0aWVzX2tocjsKKworCisjZGVmaW5lIGNsX2tocl9lZ2xfaW1hZ2UgMQorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX21lbSBDTF9BUElfQ0FMTAorY2xDcmVhdGVGcm9tRUdMSW1hZ2VLSFIoY2xfY29udGV4dCAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBDTGVnbERpc3BsYXlLSFIgICAgICAgICAgICAgZWdsZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENMZWdsSW1hZ2VLSFIgICAgICAgICAgICAgICBlZ2xpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbV9mbGFncyAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2VnbF9pbWFnZV9wcm9wZXJ0aWVzX2tociAqIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgICAgICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX21lbSAoQ0xfQVBJX0NBTEwgKmNsQ3JlYXRlRnJvbUVHTEltYWdlS0hSX2ZuKSgKKyAgICBjbF9jb250ZXh0ICAgICAgICAgICAgICAgICAgY29udGV4dCwKKyAgICBDTGVnbERpc3BsYXlLSFIgICAgICAgICAgICAgZWdsZGlzcGxheSwKKyAgICBDTGVnbEltYWdlS0hSICAgICAgICAgICAgICAgZWdsaW1hZ2UsCisgICAgY2xfbWVtX2ZsYWdzICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIGNvbnN0IGNsX2VnbF9pbWFnZV9wcm9wZXJ0aWVzX2tociAqIHByb3BlcnRpZXMsCisgICAgY2xfaW50ICogICAgICAgICAgICAgICAgICAgIGVycmNvZGVfcmV0KTsKKworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlQWNxdWlyZUVHTE9iamVjdHNLSFIoY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICBudW1fb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX21lbSAqICAgbWVtX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbEVucXVldWVBY3F1aXJlRUdMT2JqZWN0c0tIUl9mbikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgIGNsX3VpbnQgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICogICBtZW1fb2JqZWN0cywKKyAgICBjbF91aW50ICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICogZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICogICAgICAgZXZlbnQpOworCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVSZWxlYXNlRUdMT2JqZWN0c0tIUihjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgIG51bV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfbWVtICogICBtZW1fb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKmNsRW5xdWV1ZVJlbGVhc2VFR0xPYmplY3RzS0hSX2ZuKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgY2xfdWludCAgICAgICAgICBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKiAgIG1lbV9vYmplY3RzLAorICAgIGNsX3VpbnQgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKiAgICAgICBldmVudCk7CisKKworI2RlZmluZSBjbF9raHJfZWdsX2V2ZW50IDEKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9ldmVudCBDTF9BUElfQ0FMTAorY2xDcmVhdGVFdmVudEZyb21FR0xTeW5jS0hSKGNsX2NvbnRleHQgICAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMZWdsU3luY0tIUiAgICBzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMZWdsRGlzcGxheUtIUiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ludCAqICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfZXZlbnQgKENMX0FQSV9DQUxMICpjbENyZWF0ZUV2ZW50RnJvbUVHTFN5bmNLSFJfZm4pKAorICAgIGNsX2NvbnRleHQgICAgICBjb250ZXh0LAorICAgIENMZWdsU3luY0tIUiAgICBzeW5jLAorICAgIENMZWdsRGlzcGxheUtIUiBkaXNwbGF5LAorICAgIGNsX2ludCAqICAgICAgICBlcnJjb2RlX3JldCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX09QRU5DTF9DTF9FR0xfSCAqLwpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML2NsX2V4dC5oIGIvT3BlbkNML0NML2NsX2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDAyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuQ0wvQ0wvY2xfZXh0LmgKQEAgLTAsMCArMSwxNzIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMjAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjbF9leHQuaCBjb250YWlucyBPcGVuQ0wgZXh0ZW5zaW9ucyB3aGljaCBkb24ndCBoYXZlIGV4dGVybmFsICovCisvKiAoT3BlbkdMLCBEM0QpIGRlcGVuZGVuY2llcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZm5kZWYgX19DTF9FWFRfSAorI2RlZmluZSBfX0NMX0VYVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPENML2NsLmg+CisKKy8qIGNsX2tocl9mcDY0IGV4dGVuc2lvbiAtIG5vIGV4dGVuc2lvbiAjZGVmaW5lIHNpbmNlIGl0IGhhcyBubyBmdW5jdGlvbnMgICovCisvKiBDTF9ERVZJQ0VfRE9VQkxFX0ZQX0NPTkZJRyBpcyBkZWZpbmVkIGluIENMLmggZm9yIE9wZW5DTCA+PSAxMjAgKi8KKworI2lmIENMX1RBUkdFVF9PUEVOQ0xfVkVSU0lPTiA8PSAxMTAKKyNkZWZpbmUgQ0xfREVWSUNFX0RPVUJMRV9GUF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgIDB4MTAzMgorI2VuZGlmCisKKy8qIGNsX2tocl9mcDE2IGV4dGVuc2lvbiAtIG5vIGV4dGVuc2lvbiAjZGVmaW5lIHNpbmNlIGl0IGhhcyBubyBmdW5jdGlvbnMgICovCisjZGVmaW5lIENMX0RFVklDRV9IQUxGX0ZQX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgMHgxMDMzCisKKy8qIE1lbW9yeSBvYmplY3QgZGVzdHJ1Y3Rpb24KKyAqCisgKiBBcHBsZSBleHRlbnNpb24gZm9yIHVzZSB0byBtYW5hZ2UgZXh0ZXJuYWxseSBhbGxvY2F0ZWQgYnVmZmVycyB1c2VkIHdpdGggY2xfbWVtIG9iamVjdHMgd2l0aCBDTF9NRU1fVVNFX0hPU1RfUFRSCisgKgorICogUmVnaXN0ZXJzIGEgdXNlciBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1lbW9yeSBvYmplY3QgaXMgZGVsZXRlZCBhbmQgaXRzIHJlc291cmNlcworICogZnJlZWQuIEVhY2ggY2FsbCB0byBjbFNldE1lbU9iamVjdENhbGxiYWNrRm4gcmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgdXNlciBjYWxsYmFjayBmdW5jdGlvbiBvbiBhIGNhbGxiYWNrCisgKiBzdGFjayBhc3NvY2lhdGVkIHdpdGggbWVtb2JqLiBUaGUgcmVnaXN0ZXJlZCB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGluIHRoZSByZXZlcnNlIG9yZGVyIGluCisgKiB3aGljaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gVGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYW5kIHRoZW4gdGhlIG1lbW9yeSBvYmplY3QgaXMgZGVsZXRlZAorICogYW5kIGl0cyByZXNvdXJjZXMgZnJlZWQuIFRoaXMgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHRoZSBhcHBsaWNhdGlvbiAoYW5kIGxpYnJhcmllcykgdXNpbmcgbWVtb2JqIHRvIGJlCisgKiBub3RpZmllZCB3aGVuIHRoZSBtZW1vcnkgcmVmZXJlbmNlZCBieSBob3N0X3B0ciwgc3BlY2lmaWVkIHdoZW4gdGhlIG1lbW9yeSBvYmplY3QgaXMgY3JlYXRlZCBhbmQgdXNlZCBhcworICogdGhlIHN0b3JhZ2UgYml0cyBmb3IgdGhlIG1lbW9yeSBvYmplY3QsIGNhbiBiZSByZXVzZWQgb3IgZnJlZWQuCisgKgorICogVGhlIGFwcGxpY2F0aW9uIG1heSBub3QgY2FsbCBDTCBhcGkncyB3aXRoIHRoZSBjbF9tZW0gb2JqZWN0IHBhc3NlZCB0byB0aGUgcGZuX25vdGlmeS4KKyAqCisgKiBQbGVhc2UgY2hlY2sgZm9yIHRoZSAiY2xfQVBQTEVfU2V0TWVtT2JqZWN0RGVzdHJ1Y3RvciIgZXh0ZW5zaW9uIHVzaW5nIGNsR2V0RGV2aWNlSW5mbyhDTF9ERVZJQ0VfRVhURU5TSU9OUykKKyAqIGJlZm9yZSB1c2luZy4KKyAqLworI2RlZmluZSBjbF9BUFBMRV9TZXRNZW1PYmplY3REZXN0cnVjdG9yIDEKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMIGNsU2V0TWVtT2JqZWN0RGVzdHJ1Y3RvckFQUExFKCAgY2xfbWVtIG1lbW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqIHBmbl9ub3RpZnkpKGNsX21lbSBtZW1vYmosIHZvaWQgKiB1c2VyX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiB1c2VyX2RhdGEpICAgICAgICAgICAgIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisKKy8qIENvbnRleHQgTG9nZ2luZyBGdW5jdGlvbnMKKyAqCisgKiBUaGUgbmV4dCB0aHJlZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgdGhlIHBmbl9ub3RpZnkgcGFyYW1ldGVyIHRvIGNsQ3JlYXRlQ29udGV4dCgpLgorICogUGxlYXNlIGNoZWNrIGZvciB0aGUgImNsX0FQUExFX0NvbnRleHRMb2dnaW5nRnVuY3Rpb25zIiBleHRlbnNpb24gdXNpbmcgY2xHZXREZXZpY2VJbmZvKENMX0RFVklDRV9FWFRFTlNJT05TKQorICogYmVmb3JlIHVzaW5nLgorICoKKyAqIGNsTG9nTWVzc2FnZXNUb1N5c3RlbUxvZyBmb3J3YXJkcyBvbiBhbGwgbG9nIG1lc3NhZ2VzIHRvIHRoZSBBcHBsZSBTeXN0ZW0gTG9nZ2VyCisgKi8KKyNkZWZpbmUgY2xfQVBQTEVfQ29udGV4dExvZ2dpbmdGdW5jdGlvbnMgMQorZXh0ZXJuIENMX0FQSV9FTlRSWSB2b2lkIENMX0FQSV9DQUxMIGNsTG9nTWVzc2FnZXNUb1N5c3RlbUxvZ0FQUExFKCAgY29uc3QgY2hhciAqIGVycnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHByaXZhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgdXNlcl9kYXRhKSAgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKy8qIGNsTG9nTWVzc2FnZXNUb1N0ZG91dCBzZW5kcyBhbGwgbG9nIG1lc3NhZ2VzIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3Igc3Rkb3V0ICovCitleHRlcm4gQ0xfQVBJX0VOVFJZIHZvaWQgQ0xfQVBJX0NBTEwgY2xMb2dNZXNzYWdlc1RvU3Rkb3V0QVBQTEUoICAgY29uc3QgY2hhciAqIGVycnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiBwcml2YXRlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgdXNlcl9kYXRhKSAgICBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworLyogY2xMb2dNZXNzYWdlc1RvU3RkZXJyIHNlbmRzIGFsbCBsb2cgbWVzc2FnZXMgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciBzdGRlcnIgKi8KK2V4dGVybiBDTF9BUElfRU5UUlkgdm9pZCBDTF9BUElfQ0FMTCBjbExvZ01lc3NhZ2VzVG9TdGRlcnJBUFBMRSggICBjb25zdCBjaGFyICogZXJyc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHByaXZhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICB1c2VyX2RhdGEpICAgIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfa2hyX2ljZCBleHRlbnNpb24gKgorKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9raHJfaWNkIDEKKworLyogY2xfcGxhdGZvcm1faW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0xfUExBVEZPUk1fSUNEX1NVRkZJWF9LSFIgICAgICAgICAgICAgICAgICAweDA5MjAKKworLyogQWRkaXRpb25hbCBFcnJvciBDb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0xfUExBVEZPUk1fTk9UX0ZPVU5EX0tIUiAgICAgICAgICAgICAgICAgICAtMTAwMQorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xJY2RHZXRQbGF0Zm9ybUlEc0tIUihjbF91aW50ICAgICAgICAgIG51bV9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICBjbF9wbGF0Zm9ybV9pZCAqIHBsYXRmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAqICAgICAgICBudW1fcGxhdGZvcm1zKTsKKwordHlwZWRlZiBjbF9pbnQKKyhDTF9BUElfQ0FMTCAqY2xJY2RHZXRQbGF0Zm9ybUlEc0tIUl9mbikoY2xfdWludCAgICAgICAgICBudW1fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfcGxhdGZvcm1faWQgKiBwbGF0Zm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgKiAgICAgICAgbnVtX3BsYXRmb3Jtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNsX2tocl9pbF9wcm9ncmFtIGV4dGVuc2lvbiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgY2xfa2hyX2lsX3Byb2dyYW0gMQorCisvKiBOZXcgcHJvcGVydHkgdG8gY2xHZXREZXZpY2VJbmZvIGZvciByZXRyaWV2aW5nIHN1cHBvcnRlZCBpbnRlcm1lZGlhdGUKKyAqIGxhbmd1YWdlcworICovCisjZGVmaW5lIENMX0RFVklDRV9JTF9WRVJTSU9OX0tIUiAgICAgICAgICAgICAgICAgICAgMHgxMDVCCisKKy8qIE5ldyBwcm9wZXJ0eSB0byBjbEdldFByb2dyYW1JbmZvIGZvciByZXRyaWV2aW5nIGZvciByZXRyaWV2aW5nIHRoZSBJTCBvZiBhCisgKiBwcm9ncmFtCisgKi8KKyNkZWZpbmUgQ0xfUFJPR1JBTV9JTF9LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExNjkKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9wcm9ncmFtIENMX0FQSV9DQUxMCitjbENyZWF0ZVByb2dyYW1XaXRoSUxLSFIoY2xfY29udGV4dCAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xfaW50ICogICAgIGVycmNvZGVfcmV0KTsKKwordHlwZWRlZiBjbF9wcm9ncmFtCisoQ0xfQVBJX0NBTEwgKmNsQ3JlYXRlUHJvZ3JhbVdpdGhJTEtIUl9mbikoY2xfY29udGV4dCAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfaW50ICogICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworLyogRXh0ZW5zaW9uOiBjbF9raHJfaW1hZ2UyZF9mcm9tX2J1ZmZlcgorICoKKyAqIFRoaXMgZXh0ZW5zaW9uIGFsbG93cyBhIDJEIGltYWdlIHRvIGJlIGNyZWF0ZWQgZnJvbSBhIGNsX21lbSBidWZmZXIgd2l0aG91dAorICogYSBjb3B5LiBUaGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSAyRCBpbWFnZSBjcmVhdGVkIGZyb20gYSBidWZmZXIgaW4gYW4KKyAqIE9wZW5DTCBwcm9ncmFtIGlzIGltYWdlMmRfdC4gQm90aCB0aGUgc2FtcGxlciBhbmQgc2FtcGxlci1sZXNzIHJlYWRfaW1hZ2UKKyAqIGJ1aWx0LWluIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkIGZvciAyRCBpbWFnZXMgYW5kIDJEIGltYWdlcyBjcmVhdGVkIGZyb20KKyAqIGEgYnVmZmVyLiAgU2ltaWxhcmx5LCB0aGUgd3JpdGVfaW1hZ2UgYnVpbHQtaW5zIGFyZSBhbHNvIHN1cHBvcnRlZCBmb3IgMkQKKyAqIGltYWdlcyBjcmVhdGVkIGZyb20gYSBidWZmZXIuCisgKgorICogV2hlbiB0aGUgMkQgaW1hZ2UgZnJvbSBidWZmZXIgaXMgY3JlYXRlZCwgdGhlIGNsaWVudCBtdXN0IHNwZWNpZnkgdGhlCisgKiB3aWR0aCwgaGVpZ2h0LCBpbWFnZSBmb3JtYXQgKGkuZS4gY2hhbm5lbCBvcmRlciBhbmQgY2hhbm5lbCBkYXRhIHR5cGUpCisgKiBhbmQgb3B0aW9uYWxseSB0aGUgcm93IHBpdGNoLgorICoKKyAqIFRoZSBwaXRjaCBzcGVjaWZpZWQgbXVzdCBiZSBhIG11bHRpcGxlIG9mCisgKiBDTF9ERVZJQ0VfSU1BR0VfUElUQ0hfQUxJR05NRU5UX0tIUiBwaXhlbHMuCisgKiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgbXVzdCBiZSBhbGlnbmVkIHRvCisgKiBDTF9ERVZJQ0VfSU1BR0VfQkFTRV9BRERSRVNTX0FMSUdOTUVOVF9LSFIgcGl4ZWxzLgorICovCisKKyNkZWZpbmUgQ0xfREVWSUNFX0lNQUdFX1BJVENIX0FMSUdOTUVOVF9LSFIgICAgICAgICAgICAgIDB4MTA0QQorI2RlZmluZSBDTF9ERVZJQ0VfSU1BR0VfQkFTRV9BRERSRVNTX0FMSUdOTUVOVF9LSFIgICAgICAgMHgxMDRCCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjbF9raHJfaW5pdGlhbGl6ZV9tZW1vcnkgZXh0ZW5zaW9uICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDTF9DT05URVhUX01FTU9SWV9JTklUSUFMSVpFX0tIUiAgICAgICAgICAgIDB4MjAzMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xfa2hyX3Rlcm1pbmF0ZV9jb250ZXh0IGV4dGVuc2lvbiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ0xfQ09OVEVYVF9URVJNSU5BVEVEX0tIUiAgICAgICAgICAgICAgICAgICAtMTEyMQorCisjZGVmaW5lIENMX0RFVklDRV9URVJNSU5BVEVfQ0FQQUJJTElUWV9LSFIgICAgICAgICAgMHgyMDMxCisjZGVmaW5lIENMX0NPTlRFWFRfVEVSTUlOQVRFX0tIUiAgICAgICAgICAgICAgICAgICAgMHgyMDMyCisKKyNkZWZpbmUgY2xfa2hyX3Rlcm1pbmF0ZV9jb250ZXh0IDEKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFRlcm1pbmF0ZUNvbnRleHRLSFIoY2xfY29udGV4dCBjb250ZXh0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9pbnQKKyhDTF9BUElfQ0FMTCAqY2xUZXJtaW5hdGVDb250ZXh0S0hSX2ZuKShjbF9jb250ZXh0IGNvbnRleHQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisKKy8qCisgKiBFeHRlbnNpb246IGNsX2tocl9zcGlyCisgKgorICogVGhpcyBleHRlbnNpb24gYWRkcyBzdXBwb3J0IHRvIGNyZWF0ZSBhbiBPcGVuQ0wgcHJvZ3JhbSBvYmplY3QgZnJvbSBhCisgKiBTdGFuZGFyZCBQb3J0YWJsZSBJbnRlcm1lZGlhdGUgUmVwcmVzZW50YXRpb24gKFNQSVIpIGluc3RhbmNlCisgKi8KKworI2RlZmluZSBDTF9ERVZJQ0VfU1BJUl9WRVJTSU9OUyAgICAgICAgICAgICAgICAgICAgIDB4NDBFMAorI2RlZmluZSBDTF9QUk9HUkFNX0JJTkFSWV9UWVBFX0lOVEVSTUVESUFURSAgICAgICAgIDB4NDBFMQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xfa2hyX2NyZWF0ZV9jb21tYW5kX3F1ZXVlIGV4dGVuc2lvbiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGNsX2tocl9jcmVhdGVfY29tbWFuZF9xdWV1ZSAxCisKK3R5cGVkZWYgY2xfcHJvcGVydGllcyBjbF9xdWV1ZV9wcm9wZXJ0aWVzX2tocjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9jb21tYW5kX3F1ZXVlIENMX0FQSV9DQUxMCitjbENyZWF0ZUNvbW1hbmRRdWV1ZVdpdGhQcm9wZXJ0aWVzS0hSKGNsX2NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGV2aWNlX2lkIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfcXVldWVfcHJvcGVydGllc19raHIqIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ludCogZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX2NvbW1hbmRfcXVldWUKKyhDTF9BUElfQ0FMTCAqY2xDcmVhdGVDb21tYW5kUXVldWVXaXRoUHJvcGVydGllc0tIUl9mbikoY2xfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9xdWV1ZV9wcm9wZXJ0aWVzX2tociogcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfaW50KiBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9udl9kZXZpY2VfYXR0cmlidXRlX3F1ZXJ5IGV4dGVuc2lvbiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNsX252X2RldmljZV9hdHRyaWJ1dGVfcXVlcnkgZXh0ZW5zaW9uIC0gbm8gZXh0ZW5zaW9uICNkZWZpbmUgc2luY2UgaXQgaGFzIG5vIGZ1bmN0aW9ucyAqLworI2RlZmluZSBDTF9ERVZJQ0VfQ09NUFVURV9DQVBBQklMSVRZX01BSk9SX05WICAgICAgIDB4NDAwMAorI2RlZmluZSBDTF9ERVZJQ0VfQ09NUFVURV9DQVBBQklMSVRZX01JTk9SX05WICAgICAgIDB4NDAwMQorI2RlZmluZSBDTF9ERVZJQ0VfUkVHSVNURVJTX1BFUl9CTE9DS19OViAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBDTF9ERVZJQ0VfV0FSUF9TSVpFX05WICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBDTF9ERVZJQ0VfR1BVX09WRVJMQVBfTlYgICAgICAgICAgICAgICAgICAgIDB4NDAwNAorI2RlZmluZSBDTF9ERVZJQ0VfS0VSTkVMX0VYRUNfVElNRU9VVF9OViAgICAgICAgICAgIDB4NDAwNQorI2RlZmluZSBDTF9ERVZJQ0VfSU5URUdSQVRFRF9NRU1PUllfTlYgICAgICAgICAgICAgIDB4NDAwNgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfYW1kX2RldmljZV9hdHRyaWJ1dGVfcXVlcnkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENMX0RFVklDRV9QUk9GSUxJTkdfVElNRVJfT0ZGU0VUX0FNRCAgICAgICAgICAgIDB4NDAzNgorI2RlZmluZSBDTF9ERVZJQ0VfVE9QT0xPR1lfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMzcKKyNkZWZpbmUgQ0xfREVWSUNFX0JPQVJEX05BTUVfQU1EICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDM4CisjZGVmaW5lIENMX0RFVklDRV9HTE9CQUxfRlJFRV9NRU1PUllfQU1EICAgICAgICAgICAgICAgIDB4NDAzOQorI2RlZmluZSBDTF9ERVZJQ0VfU0lNRF9QRVJfQ09NUFVURV9VTklUX0FNRCAgICAgICAgICAgICAweDQwNDAKKyNkZWZpbmUgQ0xfREVWSUNFX1NJTURfV0lEVEhfQU1EICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDQxCisjZGVmaW5lIENMX0RFVklDRV9TSU1EX0lOU1RSVUNUSU9OX1dJRFRIX0FNRCAgICAgICAgICAgIDB4NDA0MgorI2RlZmluZSBDTF9ERVZJQ0VfV0FWRUZST05UX1dJRFRIX0FNRCAgICAgICAgICAgICAgICAgICAweDQwNDMKKyNkZWZpbmUgQ0xfREVWSUNFX0dMT0JBTF9NRU1fQ0hBTk5FTFNfQU1EICAgICAgICAgICAgICAgMHg0MDQ0CisjZGVmaW5lIENMX0RFVklDRV9HTE9CQUxfTUVNX0NIQU5ORUxfQkFOS1NfQU1EICAgICAgICAgIDB4NDA0NQorI2RlZmluZSBDTF9ERVZJQ0VfR0xPQkFMX01FTV9DSEFOTkVMX0JBTktfV0lEVEhfQU1EICAgICAweDQwNDYKKyNkZWZpbmUgQ0xfREVWSUNFX0xPQ0FMX01FTV9TSVpFX1BFUl9DT01QVVRFX1VOSVRfQU1EICAgMHg0MDQ3CisjZGVmaW5lIENMX0RFVklDRV9MT0NBTF9NRU1fQkFOS1NfQU1EICAgICAgICAgICAgICAgICAgIDB4NDA0OAorI2RlZmluZSBDTF9ERVZJQ0VfVEhSRUFEX1RSQUNFX1NVUFBPUlRFRF9BTUQgICAgICAgICAgICAweDQwNDkKKyNkZWZpbmUgQ0xfREVWSUNFX0dGWElQX01BSk9SX0FNRCAgICAgICAgICAgICAgICAgICAgICAgMHg0MDRBCisjZGVmaW5lIENMX0RFVklDRV9HRlhJUF9NSU5PUl9BTUQgICAgICAgICAgICAgICAgICAgICAgIDB4NDA0QgorI2RlZmluZSBDTF9ERVZJQ0VfQVZBSUxBQkxFX0FTWU5DX1FVRVVFU19BTUQgICAgICAgICAgICAweDQwNEMKKyNkZWZpbmUgQ0xfREVWSUNFX1BSRUZFUlJFRF9XT1JLX0dST1VQX1NJWkVfQU1EICAgICAgICAgMHg0MDMwCisjZGVmaW5lIENMX0RFVklDRV9NQVhfV09SS19HUk9VUF9TSVpFX0FNRCAgICAgICAgICAgICAgIDB4NDAzMQorI2RlZmluZSBDTF9ERVZJQ0VfUFJFRkVSUkVEX0NPTlNUQU5UX0JVRkZFUl9TSVpFX0FNRCAgICAweDQwMzMKKyNkZWZpbmUgQ0xfREVWSUNFX1BDSUVfSURfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDM0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9hcm1fcHJpbnRmIGV4dGVuc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENMX1BSSU5URl9DQUxMQkFDS19BUk0gICAgICAgICAgICAgICAgICAgICAgMHg0MEIwCisjZGVmaW5lIENMX1BSSU5URl9CVUZGRVJTSVpFX0FSTSAgICAgICAgICAgICAgICAgICAgMHg0MEIxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2V4dF9kZXZpY2VfZmlzc2lvbiBleHRlbnNpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9leHRfZGV2aWNlX2Zpc3Npb24gICAxCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFJlbGVhc2VEZXZpY2VFWFQoY2xfZGV2aWNlX2lkIGRldmljZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzE7CisKK3R5cGVkZWYgY2xfaW50CisoQ0xfQVBJX0NBTEwgKmNsUmVsZWFzZURldmljZUVYVF9mbikoY2xfZGV2aWNlX2lkIGRldmljZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzE7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFJldGFpbkRldmljZUVYVChjbF9kZXZpY2VfaWQgZGV2aWNlKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKwordHlwZWRlZiBjbF9pbnQKKyhDTF9BUElfQ0FMTCAqY2xSZXRhaW5EZXZpY2VFWFRfZm4pKGNsX2RldmljZV9pZCBkZXZpY2UpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCit0eXBlZGVmIGNsX3Vsb25nICBjbF9kZXZpY2VfcGFydGl0aW9uX3Byb3BlcnR5X2V4dDsKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbENyZWF0ZVN1YkRldmljZXNFWFQoY2xfZGV2aWNlX2lkICAgaW5fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2RldmljZV9wYXJ0aXRpb25fcHJvcGVydHlfZXh0ICogcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICBudW1fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgKiBvdXRfZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICogICAgICBudW1fZGV2aWNlcykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzE7CisKK3R5cGVkZWYgY2xfaW50CisoQ0xfQVBJX0NBTEwgKiBjbENyZWF0ZVN1YkRldmljZXNFWFRfZm4pKGNsX2RldmljZV9pZCAgIGluX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZGV2aWNlX3BhcnRpdGlvbl9wcm9wZXJ0eV9leHQgKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICBudW1fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGV2aWNlX2lkICogb3V0X2RldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgKiAgICAgIG51bV9kZXZpY2VzKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKworLyogY2xfZGV2aWNlX3BhcnRpdGlvbl9wcm9wZXJ0eV9leHQgKi8KKyNkZWZpbmUgQ0xfREVWSUNFX1BBUlRJVElPTl9FUVVBTExZX0VYVCAgICAgICAgICAgICAweDQwNTAKKyNkZWZpbmUgQ0xfREVWSUNFX1BBUlRJVElPTl9CWV9DT1VOVFNfRVhUICAgICAgICAgICAweDQwNTEKKyNkZWZpbmUgQ0xfREVWSUNFX1BBUlRJVElPTl9CWV9OQU1FU19FWFQgICAgICAgICAgICAweDQwNTIKKyNkZWZpbmUgQ0xfREVWSUNFX1BBUlRJVElPTl9CWV9BRkZJTklUWV9ET01BSU5fRVhUICAweDQwNTMKKworLyogY2xEZXZpY2VHZXRJbmZvIHNlbGVjdG9ycyAqLworI2RlZmluZSBDTF9ERVZJQ0VfUEFSRU5UX0RFVklDRV9FWFQgICAgICAgICAgICAgICAgIDB4NDA1NAorI2RlZmluZSBDTF9ERVZJQ0VfUEFSVElUSU9OX1RZUEVTX0VYVCAgICAgICAgICAgICAgIDB4NDA1NQorI2RlZmluZSBDTF9ERVZJQ0VfQUZGSU5JVFlfRE9NQUlOU19FWFQgICAgICAgICAgICAgIDB4NDA1NgorI2RlZmluZSBDTF9ERVZJQ0VfUkVGRVJFTkNFX0NPVU5UX0VYVCAgICAgICAgICAgICAgIDB4NDA1NworI2RlZmluZSBDTF9ERVZJQ0VfUEFSVElUSU9OX1NUWUxFX0VYVCAgICAgICAgICAgICAgIDB4NDA1OAorCisvKiBlcnJvciBjb2RlcyAqLworI2RlZmluZSBDTF9ERVZJQ0VfUEFSVElUSU9OX0ZBSUxFRF9FWFQgICAgICAgICAgICAgIC0xMDU3CisjZGVmaW5lIENMX0lOVkFMSURfUEFSVElUSU9OX0NPVU5UX0VYVCAgICAgICAgICAgICAgLTEwNTgKKyNkZWZpbmUgQ0xfSU5WQUxJRF9QQVJUSVRJT05fTkFNRV9FWFQgICAgICAgICAgICAgICAtMTA1OQorCisvKiBDTF9BRkZJTklUWV9ET01BSU5zICovCisjZGVmaW5lIENMX0FGRklOSVRZX0RPTUFJTl9MMV9DQUNIRV9FWFQgICAgICAgICAgICAgMHgxCisjZGVmaW5lIENMX0FGRklOSVRZX0RPTUFJTl9MMl9DQUNIRV9FWFQgICAgICAgICAgICAgMHgyCisjZGVmaW5lIENMX0FGRklOSVRZX0RPTUFJTl9MM19DQUNIRV9FWFQgICAgICAgICAgICAgMHgzCisjZGVmaW5lIENMX0FGRklOSVRZX0RPTUFJTl9MNF9DQUNIRV9FWFQgICAgICAgICAgICAgMHg0CisjZGVmaW5lIENMX0FGRklOSVRZX0RPTUFJTl9OVU1BX0VYVCAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBDTF9BRkZJTklUWV9ET01BSU5fTkVYVF9GSVNTSU9OQUJMRV9FWFQgICAgIDB4MTAwCisKKy8qIGNsX2RldmljZV9wYXJ0aXRpb25fcHJvcGVydHlfZXh0IGxpc3QgdGVybWluYXRvcnMgKi8KKyNkZWZpbmUgQ0xfUFJPUEVSVElFU19MSVNUX0VORF9FWFQgICAgICAgICAgICAgICAgICAoKGNsX2RldmljZV9wYXJ0aXRpb25fcHJvcGVydHlfZXh0KSAwKQorI2RlZmluZSBDTF9QQVJUSVRJT05fQllfQ09VTlRTX0xJU1RfRU5EX0VYVCAgICAgICAgICgoY2xfZGV2aWNlX3BhcnRpdGlvbl9wcm9wZXJ0eV9leHQpIDApCisjZGVmaW5lIENMX1BBUlRJVElPTl9CWV9OQU1FU19MSVNUX0VORF9FWFQgICAgICAgICAgKChjbF9kZXZpY2VfcGFydGl0aW9uX3Byb3BlcnR5X2V4dCkgMCAtIDEpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjbF9leHRfbWlncmF0ZV9tZW1vYmplY3QgZXh0ZW5zaW9uIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGNsX2V4dF9taWdyYXRlX21lbW9iamVjdCAxCisKK3R5cGVkZWYgY2xfYml0ZmllbGQgY2xfbWVtX21pZ3JhdGlvbl9mbGFnc19leHQ7CisKKyNkZWZpbmUgQ0xfTUlHUkFURV9NRU1fT0JKRUNUX0hPU1RfRVhUICAgICAgICAgICAgICAweDEKKworI2RlZmluZSBDTF9DT01NQU5EX01JR1JBVEVfTUVNX09CSkVDVF9FWFQgICAgICAgICAgIDB4NDA0MAorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlTWlncmF0ZU1lbU9iamVjdEVYVChjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgbnVtX21lbV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9tZW0gKiAgIG1lbV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW1fbWlncmF0aW9uX2ZsYWdzX2V4dCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgZXZlbnQpOworCit0eXBlZGVmIGNsX2ludAorKENMX0FQSV9DQUxMICpjbEVucXVldWVNaWdyYXRlTWVtT2JqZWN0RVhUX2ZuKShjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgbnVtX21lbV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9tZW0gKiAgIG1lbV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW1fbWlncmF0aW9uX2ZsYWdzX2V4dCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgZXZlbnQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfZXh0X2N4eF9mb3Jfb3BlbmNsIGV4dGVuc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9leHRfY3h4X2Zvcl9vcGVuY2wgMQorCisjZGVmaW5lIENMX0RFVklDRV9DWFhfRk9SX09QRU5DTF9OVU1FUklDX1ZFUlNJT05fRVhUIDB4NDIzMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX3Fjb21fZXh0X2hvc3RfcHRyIGV4dGVuc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9xY29tX2V4dF9ob3N0X3B0ciAxCisKKyNkZWZpbmUgQ0xfTUVNX0VYVF9IT1NUX1BUUl9RQ09NICAgICAgICAgICAgICAgICAgKDEgPDwgMjkpCisKKyNkZWZpbmUgQ0xfREVWSUNFX0VYVF9NRU1fUEFERElOR19JTl9CWVRFU19RQ09NICAgMHg0MEEwCisjZGVmaW5lIENMX0RFVklDRV9QQUdFX1NJWkVfUUNPTSAgICAgICAgICAgICAgICAgIDB4NDBBMQorI2RlZmluZSBDTF9JTUFHRV9ST1dfQUxJR05NRU5UX1FDT00gICAgICAgICAgICAgICAweDQwQTIKKyNkZWZpbmUgQ0xfSU1BR0VfU0xJQ0VfQUxJR05NRU5UX1FDT00gICAgICAgICAgICAgMHg0MEEzCisjZGVmaW5lIENMX01FTV9IT1NUX1VOQ0FDSEVEX1FDT00gICAgICAgICAgICAgICAgIDB4NDBBNAorI2RlZmluZSBDTF9NRU1fSE9TVF9XUklURUJBQ0tfUUNPTSAgICAgICAgICAgICAgICAweDQwQTUKKyNkZWZpbmUgQ0xfTUVNX0hPU1RfV1JJVEVUSFJPVUdIX1FDT00gICAgICAgICAgICAgMHg0MEE2CisjZGVmaW5lIENMX01FTV9IT1NUX1dSSVRFX0NPTUJJTklOR19RQ09NICAgICAgICAgIDB4NDBBNworCit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ltYWdlX3BpdGNoX2luZm9fcWNvbTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0RGV2aWNlSW1hZ2VJbmZvUUNPTShjbF9kZXZpY2VfaWQgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2ltYWdlX2Zvcm1hdCAgICppbWFnZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xfaW1hZ2VfcGl0Y2hfaW5mb19xY29tIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICpwYXJhbV92YWx1ZV9zaXplX3JldCk7CisKK3R5cGVkZWYgc3RydWN0IF9jbF9tZW1fZXh0X2hvc3RfcHRyCit7CisgICAgLyogVHlwZSBvZiBleHRlcm5hbCBtZW1vcnkgYWxsb2NhdGlvbi4gKi8KKyAgICAvKiBMZWdhbCB2YWx1ZXMgd2lsbCBiZSBkZWZpbmVkIGluIGxheWVyZWQgZXh0ZW5zaW9ucy4gKi8KKyAgICBjbF91aW50ICBhbGxvY2F0aW9uX3R5cGU7CisKKyAgICAvKiBIb3N0IGNhY2hlIHBvbGljeSBmb3IgdGhpcyBleHRlcm5hbCBtZW1vcnkgYWxsb2NhdGlvbi4gKi8KKyAgICBjbF91aW50ICBob3N0X2NhY2hlX3BvbGljeTsKKworfSBjbF9tZW1fZXh0X2hvc3RfcHRyOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX3Fjb21fZXh0X2hvc3RfcHRyX2lvY29oZXJlbnQgZXh0ZW5zaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ2FjaGUgcG9saWN5IHNwZWNpZnlpbmcgaW8tY29oZXJlbmNlICovCisjZGVmaW5lIENMX01FTV9IT1NUX0lPQ09IRVJFTlRfUUNPTSAgICAgICAgICAgICAgIDB4NDBBOQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfcWNvbV9pb25faG9zdF9wdHIgZXh0ZW5zaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ0xfTUVNX0lPTl9IT1NUX1BUUl9RQ09NICAgICAgICAgICAgICAgICAgMHg0MEE4CisKK3R5cGVkZWYgc3RydWN0IF9jbF9tZW1faW9uX2hvc3RfcHRyCit7CisgICAgLyogVHlwZSBvZiBleHRlcm5hbCBtZW1vcnkgYWxsb2NhdGlvbi4gKi8KKyAgICAvKiBNdXN0IGJlIENMX01FTV9JT05fSE9TVF9QVFJfUUNPTSBmb3IgSU9OIGFsbG9jYXRpb25zLiAqLworICAgIGNsX21lbV9leHRfaG9zdF9wdHIgIGV4dF9ob3N0X3B0cjsKKworICAgIC8qIElPTiBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICBpb25fZmlsZWRlc2M7CisKKyAgICAvKiBIb3N0IHBvaW50ZXIgdG8gdGhlIElPTiBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgaW9uX2hvc3RwdHI7CisKK30gY2xfbWVtX2lvbl9ob3N0X3B0cjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX3Fjb21fYW5kcm9pZF9uYXRpdmVfYnVmZmVyX2hvc3RfcHRyIGV4dGVuc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENMX01FTV9BTkRST0lEX05BVElWRV9CVUZGRVJfSE9TVF9QVFJfUUNPTSAgICAgICAgICAgICAgICAgIDB4NDBDNgorCit0eXBlZGVmIHN0cnVjdCBfY2xfbWVtX2FuZHJvaWRfbmF0aXZlX2J1ZmZlcl9ob3N0X3B0cgoreworICAgIC8qIFR5cGUgb2YgZXh0ZXJuYWwgbWVtb3J5IGFsbG9jYXRpb24uICovCisgICAgLyogTXVzdCBiZSBDTF9NRU1fQU5EUk9JRF9OQVRJVkVfQlVGRkVSX0hPU1RfUFRSX1FDT00gZm9yIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlcnMuICovCisgICAgY2xfbWVtX2V4dF9ob3N0X3B0ciAgZXh0X2hvc3RfcHRyOworCisgICAgLyogVmlydHVhbCBwb2ludGVyIHRvIHRoZSBhbmRyb2lkIG5hdGl2ZSBidWZmZXIgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgICBhbmJfcHRyOworCit9IGNsX21lbV9hbmRyb2lkX25hdGl2ZV9idWZmZXJfaG9zdF9wdHI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xfaW1nX3l1dl9pbWFnZSBleHRlbnNpb24gKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW1hZ2UgZm9ybWF0cyB1c2VkIGluIGNsQ3JlYXRlSW1hZ2UgKi8KKyNkZWZpbmUgQ0xfTlYyMV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwRDAKKyNkZWZpbmUgQ0xfWVYxMl9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwRDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjbF9pbWdfY2FjaGVkX2FsbG9jYXRpb25zIGV4dGVuc2lvbiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGbGFnIHZhbHVlcyB1c2VkIGJ5IGNsQ3JlYXRlQnVmZmVyICovCisjZGVmaW5lIENMX01FTV9VU0VfVU5DQUNIRURfQ1BVX01FTU9SWV9JTUcgICAgICAgICAgKDEgPDwgMjYpCisjZGVmaW5lIENMX01FTV9VU0VfQ0FDSEVEX0NQVV9NRU1PUllfSU1HICAgICAgICAgICAgKDEgPDwgMjcpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xfaW1nX3VzZV9ncmFsbG9jX3B0ciBleHRlbnNpb24gKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgY2xfaW1nX3VzZV9ncmFsbG9jX3B0ciAxCisKKy8qIEZsYWcgdmFsdWVzIHVzZWQgYnkgY2xDcmVhdGVCdWZmZXIgKi8KKyNkZWZpbmUgQ0xfTUVNX1VTRV9HUkFMTE9DX1BUUl9JTUcgICAgICAgICAgICAgICAgICAoMSA8PCAyOCkKKworLyogVG8gYmUgdXNlZCBieSBjbEdldEV2ZW50SW5mbzogKi8KKyNkZWZpbmUgQ0xfQ09NTUFORF9BQ1FVSVJFX0dSQUxMT0NfT0JKRUNUU19JTUcgICAgICAweDQwRDIKKyNkZWZpbmUgQ0xfQ09NTUFORF9SRUxFQVNFX0dSQUxMT0NfT0JKRUNUU19JTUcgICAgICAweDQwRDMKKworLyogRXJyb3IgY29kZXMgZnJvbSBjbEVucXVldWVBY3F1aXJlR3JhbGxvY09iamVjdHNJTUcgYW5kIGNsRW5xdWV1ZVJlbGVhc2VHcmFsbG9jT2JqZWN0c0lNRyAqLworI2RlZmluZSBDTF9HUkFMTE9DX1JFU09VUkNFX05PVF9BQ1FVSVJFRF9JTUcgICAgICAgIDB4NDBENAorI2RlZmluZSBDTF9JTlZBTElEX0dSQUxMT0NfT0JKRUNUX0lNRyAgICAgICAgICAgICAgIDB4NDBENQorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlQWNxdWlyZUdyYWxsb2NPYmplY3RzSU1HKGNsX2NvbW1hbmRfcXVldWUgICAgICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgICBudW1fb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9tZW0gKiAgICAgICAgbWVtX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogICAgICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVJlbGVhc2VHcmFsbG9jT2JqZWN0c0lNRyhjbF9jb21tYW5kX3F1ZXVlICAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfbWVtICogICAgICAgIG1lbV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICAgICAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNsX2ltZ19nZW5lcmF0ZV9taXBtYXAgZXh0ZW5zaW9uICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGNsX2ltZ19nZW5lcmF0ZV9taXBtYXAgMQorCit0eXBlZGVmIGNsX3VpbnQgY2xfbWlwbWFwX2ZpbHRlcl9tb2RlX2ltZzsKKworLyogVG8gYmUgdXNlZCBieSBjbEVucXVldWVHZW5lcmF0ZU1pcG1hcElNRyAqLworI2RlZmluZSBDTF9NSVBNQVBfRklMVEVSX0FOWV9JTUcgMHgwCisjZGVmaW5lIENMX01JUE1BUF9GSUxURVJfQk9YX0lNRyAweDEKKworLyogVG8gYmUgdXNlZCBieSBjbEdldEV2ZW50SW5mbyAqLworI2RlZmluZSBDTF9DT01NQU5EX0dFTkVSQVRFX01JUE1BUF9JTUcgMHg0MEQ2CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVHZW5lcmF0ZU1pcG1hcElNRyhjbF9jb21tYW5kX3F1ZXVlICAgICAgICAgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW0gICAgICAgICAgICAgICAgICAgIHNyY19pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbSAgICAgICAgICAgICAgICAgICAgZHN0X2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfbWlwbWFwX2ZpbHRlcl9tb2RlX2ltZyBtaXBtYXBfZmlsdGVyX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICAgICAgICphcnJheV9yZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICAgICAgICptaXBfcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICAgICAgICAgICAgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICpldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xfaW1nX21lbV9wcm9wZXJ0aWVzIGV4dGVuc2lvbiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9pbWdfbWVtX3Byb3BlcnRpZXMgMQorCisvKiBUbyBiZSB1c2VkIGJ5IGNsQ3JlYXRlQnVmZmVyV2l0aFByb3BlcnRpZXMgKi8KKyNkZWZpbmUgQ0xfTUVNX0FMTE9DX0ZMQUdTX0lNRyAweDQwRDcKKworLyogVG8gYmUgdXNlZCB3aWl0aCB0aGUgQ0xfTUVNX0FMTE9DX0ZMQUdTX0lNRyBwcm9wZXJ0eSAqLwordHlwZWRlZiBjbF9iaXRmaWVsZCBjbF9tZW1fYWxsb2NfZmxhZ3NfaW1nOworCisvKiBUbyBiZSB1c2VkIHdpdGggY2xfbWVtX2FsbG9jX2ZsYWdzX2ltZyAqLworI2RlZmluZSBDTF9NRU1fQUxMT0NfUkVMQVhfUkVRVUlSRU1FTlRTX0lNRyAoMSA8PCAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2tocl9zdWJncm91cHMgZXh0ZW5zaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGNsX2tocl9zdWJncm91cHMgMQorCisjaWYgIWRlZmluZWQoQ0xfVkVSU0lPTl8yXzEpCisvKiBGb3IgT3BlbkNMIDIuMSBhbmQgbmV3ZXIsIGNsX2tlcm5lbF9zdWJfZ3JvdXBfaW5mbyBpcyBkZWNsYXJlZCBpbiBDTC5oLgorICAgSW4gaGluZHNpZ2h0LCB0aGVyZSBzaG91bGQgaGF2ZSBiZWVuIGEga2hyIHN1ZmZpeCBvbiB0aGlzIHR5cGUgZm9yCisgICB0aGUgZXh0ZW5zaW9uLCBidXQga2VlcGluZyBpdCB1bi1zdWZmaXhlZCB0byBtYWludGFpbiBiYWNrd2FyZHMKKyAgIGNvbXBhdGliaWxpdHkuICovCit0eXBlZGVmIGNsX3VpbnQgICAgICAgICAgICAgY2xfa2VybmVsX3N1Yl9ncm91cF9pbmZvOworI2VuZGlmCisKKy8qIGNsX2tlcm5lbF9zdWJfZ3JvdXBfaW5mbyAqLworI2RlZmluZSBDTF9LRVJORUxfTUFYX1NVQl9HUk9VUF9TSVpFX0ZPUl9ORFJBTkdFX0tIUiAgICAweDIwMzMKKyNkZWZpbmUgQ0xfS0VSTkVMX1NVQl9HUk9VUF9DT1VOVF9GT1JfTkRSQU5HRV9LSFIgICAgICAgMHgyMDM0CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEdldEtlcm5lbFN1Ykdyb3VwSW5mb0tIUihjbF9rZXJuZWwgICAgaW5fa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGV2aWNlX2lkIGluX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2tlcm5lbF9zdWJfZ3JvdXBfaW5mbyBwYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIGlucHV0X3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogaW5wdXRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICBwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzBfREVQUkVDQVRFRDsKKwordHlwZWRlZiBjbF9pbnQKKyhDTF9BUElfQ0FMTCAqIGNsR2V0S2VybmVsU3ViR3JvdXBJbmZvS0hSX2ZuKShjbF9rZXJuZWwgICAgaW5fa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2RldmljZV9pZCBpbl9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfa2VybmVsX3N1Yl9ncm91cF9pbmZvIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIGlucHV0X3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGlucHV0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBwYXJhbV92YWx1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICBwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiAgICAgcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8wX0RFUFJFQ0FURUQ7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9raHJfbWlwbWFwX2ltYWdlIGV4dGVuc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjbF9zYW1wbGVyX3Byb3BlcnRpZXMgKi8KKyNkZWZpbmUgQ0xfU0FNUExFUl9NSVBfRklMVEVSX01PREVfS0hSICAgICAgICAgICAgICAweDExNTUKKyNkZWZpbmUgQ0xfU0FNUExFUl9MT0RfTUlOX0tIUiAgICAgICAgICAgICAgICAgICAgICAweDExNTYKKyNkZWZpbmUgQ0xfU0FNUExFUl9MT0RfTUFYX0tIUiAgICAgICAgICAgICAgICAgICAgICAweDExNTcKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2tocl9wcmlvcml0eV9oaW50cyBleHRlbnNpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoaXMgZXh0ZW5zaW9uIGRlZmluZSBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICBJdCBzaG91bGRuJ3QgYmUgcmVxdWlyZWQgc2luY2UgdGhpcyBleHRlbnNpb24gaGFzIG5vIG5ldyBmdW5jdGlvbnMuICovCisjZGVmaW5lIGNsX2tocl9wcmlvcml0eV9oaW50cyAxCisKK3R5cGVkZWYgY2xfdWludCAgY2xfcXVldWVfcHJpb3JpdHlfa2hyOworCisvKiBjbF9jb21tYW5kX3F1ZXVlX3Byb3BlcnRpZXMgKi8KKyNkZWZpbmUgQ0xfUVVFVUVfUFJJT1JJVFlfS0hSIDB4MTA5NgorCisvKiBjbF9xdWV1ZV9wcmlvcml0eV9raHIgKi8KKyNkZWZpbmUgQ0xfUVVFVUVfUFJJT1JJVFlfSElHSF9LSFIgKDE8PDApCisjZGVmaW5lIENMX1FVRVVFX1BSSU9SSVRZX01FRF9LSFIgKDE8PDEpCisjZGVmaW5lIENMX1FVRVVFX1BSSU9SSVRZX0xPV19LSFIgKDE8PDIpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9raHJfdGhyb3R0bGVfaGludHMgZXh0ZW5zaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGV4dGVuc2lvbiBkZWZpbmUgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICAgSXQgc2hvdWxkbid0IGJlIHJlcXVpcmVkIHNpbmNlIHRoaXMgZXh0ZW5zaW9uIGhhcyBubyBuZXcgZnVuY3Rpb25zLiAqLworI2RlZmluZSBjbF9raHJfdGhyb3R0bGVfaGludHMgMQorCit0eXBlZGVmIGNsX3VpbnQgIGNsX3F1ZXVlX3Rocm90dGxlX2tocjsKKworLyogY2xfY29tbWFuZF9xdWV1ZV9wcm9wZXJ0aWVzICovCisjZGVmaW5lIENMX1FVRVVFX1RIUk9UVExFX0tIUiAweDEwOTcKKworLyogY2xfcXVldWVfdGhyb3R0bGVfa2hyICovCisjZGVmaW5lIENMX1FVRVVFX1RIUk9UVExFX0hJR0hfS0hSICgxPDwwKQorI2RlZmluZSBDTF9RVUVVRV9USFJPVFRMRV9NRURfS0hSICgxPDwxKQorI2RlZmluZSBDTF9RVUVVRV9USFJPVFRMRV9MT1dfS0hSICgxPDwyKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfa2hyX3N1Ymdyb3VwX25hbWVkX2JhcnJpZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoaXMgZXh0ZW5zaW9uIGRlZmluZSBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICBJdCBzaG91bGRuJ3QgYmUgcmVxdWlyZWQgc2luY2UgdGhpcyBleHRlbnNpb24gaGFzIG5vIG5ldyBmdW5jdGlvbnMuICovCisjZGVmaW5lIGNsX2tocl9zdWJncm91cF9uYW1lZF9iYXJyaWVyIDEKKworLyogY2xfZGV2aWNlX2luZm8gKi8KKyNkZWZpbmUgQ0xfREVWSUNFX01BWF9OQU1FRF9CQVJSSUVSX0NPVU5UX0tIUiAgICAgICAweDIwMzUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2tocl9leHRlbmRlZF92ZXJzaW9uaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgY2xfa2hyX2V4dGVuZGVkX3ZlcnNpb25pbmcgMQorCisjZGVmaW5lIENMX1ZFUlNJT05fTUFKT1JfQklUU19LSFIgKDEwKQorI2RlZmluZSBDTF9WRVJTSU9OX01JTk9SX0JJVFNfS0hSICgxMCkKKyNkZWZpbmUgQ0xfVkVSU0lPTl9QQVRDSF9CSVRTX0tIUiAoMTIpCisKKyNkZWZpbmUgQ0xfVkVSU0lPTl9NQUpPUl9NQVNLX0tIUiAoKDEgPDwgQ0xfVkVSU0lPTl9NQUpPUl9CSVRTX0tIUikgLSAxKQorI2RlZmluZSBDTF9WRVJTSU9OX01JTk9SX01BU0tfS0hSICgoMSA8PCBDTF9WRVJTSU9OX01JTk9SX0JJVFNfS0hSKSAtIDEpCisjZGVmaW5lIENMX1ZFUlNJT05fUEFUQ0hfTUFTS19LSFIgKCgxIDw8IENMX1ZFUlNJT05fUEFUQ0hfQklUU19LSFIpIC0gMSkKKworI2RlZmluZSBDTF9WRVJTSU9OX01BSk9SX0tIUih2ZXJzaW9uKSAoKHZlcnNpb24pID4+IChDTF9WRVJTSU9OX01JTk9SX0JJVFNfS0hSICsgQ0xfVkVSU0lPTl9QQVRDSF9CSVRTX0tIUikpCisjZGVmaW5lIENMX1ZFUlNJT05fTUlOT1JfS0hSKHZlcnNpb24pICgoKHZlcnNpb24pID4+IENMX1ZFUlNJT05fUEFUQ0hfQklUU19LSFIpICYgQ0xfVkVSU0lPTl9NSU5PUl9NQVNLX0tIUikKKyNkZWZpbmUgQ0xfVkVSU0lPTl9QQVRDSF9LSFIodmVyc2lvbikgKCh2ZXJzaW9uKSAmIENMX1ZFUlNJT05fUEFUQ0hfTUFTS19LSFIpCisKKyNkZWZpbmUgQ0xfTUFLRV9WRVJTSU9OX0tIUihtYWpvciwgbWlub3IsIHBhdGNoKSBcCisgICAgKCgoKG1ham9yKSAmIENMX1ZFUlNJT05fTUFKT1JfTUFTS19LSFIpIDw8IChDTF9WRVJTSU9OX01JTk9SX0JJVFNfS0hSICsgQ0xfVkVSU0lPTl9QQVRDSF9CSVRTX0tIUikpIHwgXAorICAgICgoKG1pbm9yKSAmICBDTF9WRVJTSU9OX01JTk9SX01BU0tfS0hSKSA8PCBDTF9WRVJTSU9OX1BBVENIX0JJVFNfS0hSKSB8IFwKKyAgICAoKHBhdGNoKSAmIENMX1ZFUlNJT05fUEFUQ0hfTUFTS19LSFIpKQorCit0eXBlZGVmIGNsX3VpbnQgY2xfdmVyc2lvbl9raHI7CisKKyNkZWZpbmUgQ0xfTkFNRV9WRVJTSU9OX01BWF9OQU1FX1NJWkVfS0hSIDY0CisKK3R5cGVkZWYgc3RydWN0IF9jbF9uYW1lX3ZlcnNpb25fa2hyCit7CisgICAgY2xfdmVyc2lvbl9raHIgdmVyc2lvbjsKKyAgICBjaGFyIG5hbWVbQ0xfTkFNRV9WRVJTSU9OX01BWF9OQU1FX1NJWkVfS0hSXTsKK30gY2xfbmFtZV92ZXJzaW9uX2tocjsKKworLyogY2xfcGxhdGZvcm1faW5mbyAqLworI2RlZmluZSBDTF9QTEFURk9STV9OVU1FUklDX1ZFUlNJT05fS0hSICAgICAgICAgICAgICAgICAgMHgwOTA2CisjZGVmaW5lIENMX1BMQVRGT1JNX0VYVEVOU0lPTlNfV0lUSF9WRVJTSU9OX0tIUiAgICAgICAgICAweDA5MDcKKworLyogY2xfZGV2aWNlX2luZm8gKi8KKyNkZWZpbmUgQ0xfREVWSUNFX05VTUVSSUNfVkVSU0lPTl9LSFIgICAgICAgICAgICAgICAgICAgIDB4MTA1RQorI2RlZmluZSBDTF9ERVZJQ0VfT1BFTkNMX0NfTlVNRVJJQ19WRVJTSU9OX0tIUiAgICAgICAgICAgMHgxMDVGCisjZGVmaW5lIENMX0RFVklDRV9FWFRFTlNJT05TX1dJVEhfVkVSU0lPTl9LSFIgICAgICAgICAgICAweDEwNjAKKyNkZWZpbmUgQ0xfREVWSUNFX0lMU19XSVRIX1ZFUlNJT05fS0hSICAgICAgICAgICAgICAgICAgIDB4MTA2MQorI2RlZmluZSBDTF9ERVZJQ0VfQlVJTFRfSU5fS0VSTkVMU19XSVRIX1ZFUlNJT05fS0hSICAgICAgMHgxMDYyCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9raHJfZGV2aWNlX3V1aWQgZXh0ZW5zaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGNsX2tocl9kZXZpY2VfdXVpZCAxCisKKyNkZWZpbmUgQ0xfVVVJRF9TSVpFX0tIUiAxNgorI2RlZmluZSBDTF9MVUlEX1NJWkVfS0hSIDgKKworI2RlZmluZSBDTF9ERVZJQ0VfVVVJRF9LSFIgICAgICAgICAgMHgxMDZBCisjZGVmaW5lIENMX0RSSVZFUl9VVUlEX0tIUiAgICAgICAgICAweDEwNkIKKyNkZWZpbmUgQ0xfREVWSUNFX0xVSURfVkFMSURfS0hSICAgIDB4MTA2QworI2RlZmluZSBDTF9ERVZJQ0VfTFVJRF9LSFIgICAgICAgICAgMHgxMDZECisjZGVmaW5lIENMX0RFVklDRV9OT0RFX01BU0tfS0hSICAgICAweDEwNkUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2tocl9wY2lfYnVzX2luZm8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgY2xfa2hyX3BjaV9idXNfaW5mbyAxCisKK3R5cGVkZWYgc3RydWN0IF9jbF9kZXZpY2VfcGNpX2J1c19pbmZvX2tociB7CisgICAgY2xfdWludCBwY2lfZG9tYWluOworICAgIGNsX3VpbnQgcGNpX2J1czsKKyAgICBjbF91aW50IHBjaV9kZXZpY2U7CisgICAgY2xfdWludCBwY2lfZnVuY3Rpb247Cit9IGNsX2RldmljZV9wY2lfYnVzX2luZm9fa2hyOworCisvKiBjbF9kZXZpY2VfaW5mbyAqLworI2RlZmluZSBDTF9ERVZJQ0VfUENJX0JVU19JTkZPX0tIUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTBGCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9raHJfc3VnZ2VzdGVkX2xvY2FsX3dvcmtfc2l6ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9raHJfc3VnZ2VzdGVkX2xvY2FsX3dvcmtfc2l6ZSAxCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEdldEtlcm5lbFN1Z2dlc3RlZExvY2FsV29ya1NpemVLSFIoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgIGNsX2tlcm5lbCBrZXJuZWwsCisgICAgY2xfdWludCB3b3JrX2RpbSwKKyAgICBjb25zdCBzaXplX3QqIGdsb2JhbF93b3JrX29mZnNldCwKKyAgICBjb25zdCBzaXplX3QqIGdsb2JhbF93b3JrX3NpemUsCisgICAgc2l6ZV90KiBzdWdnZXN0ZWRfbG9jYWxfd29ya19zaXplKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzNfMDsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICoKK2NsR2V0S2VybmVsU3VnZ2VzdGVkTG9jYWxXb3JrU2l6ZUtIUl9mbikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgIGNsX2tlcm5lbCBrZXJuZWwsCisgICAgY2xfdWludCB3b3JrX2RpbSwKKyAgICBjb25zdCBzaXplX3QqIGdsb2JhbF93b3JrX29mZnNldCwKKyAgICBjb25zdCBzaXplX3QqIGdsb2JhbF93b3JrX3NpemUsCisgICAgc2l6ZV90KiBzdWdnZXN0ZWRfbG9jYWxfd29ya19zaXplKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzNfMDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2tocl9pbnRlZ2VyX2RvdF9wcm9kdWN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGNsX2tocl9pbnRlZ2VyX2RvdF9wcm9kdWN0IDEKKwordHlwZWRlZiBjbF9iaXRmaWVsZCAgICAgICAgIGNsX2RldmljZV9pbnRlZ2VyX2RvdF9wcm9kdWN0X2NhcGFiaWxpdGllc19raHI7CisKKy8qIGNsX2RldmljZV9pbnRlZ2VyX2RvdF9wcm9kdWN0X2NhcGFiaWxpdGllc19raHIgKi8KKyNkZWZpbmUgQ0xfREVWSUNFX0lOVEVHRVJfRE9UX1BST0RVQ1RfSU5QVVRfNHg4QklUX1BBQ0tFRF9LSFIgKDEgPDwgMCkKKyNkZWZpbmUgQ0xfREVWSUNFX0lOVEVHRVJfRE9UX1BST0RVQ1RfSU5QVVRfNHg4QklUX0tIUiAgICAgICgxIDw8IDEpCisKKy8qIGNsX2RldmljZV9pbmZvICovCisjZGVmaW5lIENMX0RFVklDRV9JTlRFR0VSX0RPVF9QUk9EVUNUX0NBUEFCSUxJVElFU19LSFIgICAgICAweDEwNzMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xfYXJtX2ltcG9ydF9tZW1vcnkgZXh0ZW5zaW9uICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9hcm1faW1wb3J0X21lbW9yeSAxCisKK3R5cGVkZWYgaW50cHRyX3QgY2xfaW1wb3J0X3Byb3BlcnRpZXNfYXJtOworCisvKiBEZWZhdWx0IGFuZCB2YWxpZCBwcm9wb3J0aWVzIG5hbWUgZm9yIGNsX2FybV9pbXBvcnRfbWVtb3J5ICovCisjZGVmaW5lIENMX0lNUE9SVF9UWVBFX0FSTSAgICAgICAgICAgICAgICAgICAgICAgIDB4NDBCMgorCisvKiBIb3N0IHByb2Nlc3MgbWVtb3J5IHR5cGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ0xfSU1QT1JUX1RZUEVfQVJNIHByb3BlcnR5ICovCisjZGVmaW5lIENMX0lNUE9SVF9UWVBFX0hPU1RfQVJNICAgICAgICAgICAgICAgICAgIDB4NDBCMworCisvKiBETUEgQlVGIG1lbW9yeSB0eXBlIHZhbHVlIGZvciBDTF9JTVBPUlRfVFlQRV9BUk0gcHJvcGVydHkgKi8KKyNkZWZpbmUgQ0xfSU1QT1JUX1RZUEVfRE1BX0JVRl9BUk0gICAgICAgICAgICAgICAgMHg0MEI0CisKKy8qIFByb3RlY3RlZCBtZW1vcnkgcHJvcGVydHkgKi8KKyNkZWZpbmUgQ0xfSU1QT1JUX1RZUEVfUFJPVEVDVEVEX0FSTSAgICAgICAgICAgICAgMHg0MEI1CisKKy8qIEFuZHJvaWQgaGFyZHdhcmUgYnVmZmVyIHR5cGUgdmFsdWUgZm9yIENMX0lNUE9SVF9UWVBFX0FSTSBwcm9wZXJ0eSAqLworI2RlZmluZSBDTF9JTVBPUlRfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9BUk0gMHg0MUUyCisKKy8qIERhdGEgY29uc2lzdGVuY3kgd2l0aCBob3N0IHByb3BlcnR5ICovCisjZGVmaW5lIENMX0lNUE9SVF9ETUFfQlVGX0RBVEFfQ09OU0lTVEVOQ1lfV0lUSF9IT1NUX0FSTSAweDQxRTMKKworLyogSW5kZXggb2YgcGxhbmUgaW4gYSBtdWx0aXBsYW5hciBoYXJkd2FyZSBidWZmZXIgKi8KKyNkZWZpbmUgQ0xfSU1QT1JUX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1BMQU5FX0lOREVYX0FSTSAweDQxRUYKKworLyogSW5kZXggb2YgbGF5ZXIgaW4gYSBtdWx0aWxheWVyIGhhcmR3YXJlIGJ1ZmZlciAqLworI2RlZmluZSBDTF9JTVBPUlRfQU5EUk9JRF9IQVJEV0FSRV9CVUZGRVJfTEFZRVJfSU5ERVhfQVJNIDB4NDFGMAorCisvKiBJbXBvcnQgbWVtb3J5IHNpemUgdmFsdWUgdG8gaW5kaWNhdGUgYSBzaXplIGZvciB0aGUgd2hvbGUgYnVmZmVyICovCisjZGVmaW5lIENMX0lNUE9SVF9NRU1PUllfV0hPTEVfQUxMT0NBVElPTl9BUk0gU0laRV9NQVgKKworLyogVGhpcyBleHRlbnNpb24gYWRkcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGFsbG93cyBmb3IgZGlyZWN0IG1lbW9yeSBpbXBvcnQgaW50bworICogT3BlbkNMIHZpYSB0aGUgY2xJbXBvcnRNZW1vcnlBUk0gZnVuY3Rpb24uCisgKgorICogTWVtb3J5IGltcG9ydGVkIHRocm91Z2ggdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBtYXBwZWQgaW50byB0aGUgZGV2aWNlJ3MgcGFnZQorICogdGFibGVzIGRpcmVjdGx5LCBwcm92aWRpbmcgemVybyBjb3B5IGFjY2Vzcy4gSXQgd2lsbCBuZXZlciBmYWxsIGJhY2sgdG8gY29weQorICogb3BlcmF0aW9ucyBhbmQgYWxpYXNlZCBidWZmZXJzLgorICoKKyAqIFR5cGVzIG9mIG1lbW9yeSBzdXBwb3J0ZWQgZm9yIGltcG9ydCBhcmUgc3BlY2lmaWVkIGFzIGFkZGl0aW9uYWwgZXh0ZW5zaW9uCisgKiBzdHJpbmdzLgorICoKKyAqIFRoaXMgZXh0ZW5zaW9uIHByb2R1Y2VzIGNsX21lbSBhbGxvY2F0aW9ucyB3aGljaCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlcgorICogdXNlcnMgb2YgY2xfbWVtIGluIHRoZSBzdGFuZGFyZCBBUEkuCisgKgorICogVGhpcyBleHRlbnNpb24gbWFwcyBwYWdlcyB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlIG5vcm1hbCBidWZmZXIgY3JlYXRpb24KKyAqIGZ1bmN0aW9uIGNsQ3JlYXRlQnVmZmVyLgorICovCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX21lbSBDTF9BUElfQ0FMTAorY2xJbXBvcnRNZW1vcnlBUk0oIGNsX2NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBjbF9tZW1fZmxhZ3MgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfaW1wb3J0X3Byb3BlcnRpZXNfYXJtICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKm1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBjbF9pbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjbF9hcm1fc2hhcmVkX3ZpcnR1YWxfbWVtb3J5IGV4dGVuc2lvbiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9hcm1fc2hhcmVkX3ZpcnR1YWxfbWVtb3J5IDEKKworLyogVXNlZCBieSBjbEdldERldmljZUluZm8gKi8KKyNkZWZpbmUgQ0xfREVWSUNFX1NWTV9DQVBBQklMSVRJRVNfQVJNICAgICAgICAgICAgICAgICAgMHg0MEI2CisKKy8qIFVzZWQgYnkgY2xHZXRNZW1PYmplY3RJbmZvICovCisjZGVmaW5lIENMX01FTV9VU0VTX1NWTV9QT0lOVEVSX0FSTSAgICAgICAgICAgICAgICAgICAgIDB4NDBCNworCisvKiBVc2VkIGJ5IGNsU2V0S2VybmVsRXhlY0luZm9BUk06ICovCisjZGVmaW5lIENMX0tFUk5FTF9FWEVDX0lORk9fU1ZNX1BUUlNfQVJNICAgICAgICAgICAgICAgIDB4NDBCOAorI2RlZmluZSBDTF9LRVJORUxfRVhFQ19JTkZPX1NWTV9GSU5FX0dSQUlOX1NZU1RFTV9BUk0gICAweDQwQjkKKworLyogVG8gYmUgdXNlZCBieSBjbEdldEV2ZW50SW5mbzogKi8KKyNkZWZpbmUgQ0xfQ09NTUFORF9TVk1fRlJFRV9BUk0gICAgICAgICAgICAgICAgICAgICAgICAgMHg0MEJBCisjZGVmaW5lIENMX0NPTU1BTkRfU1ZNX01FTUNQWV9BUk0gICAgICAgICAgICAgICAgICAgICAgIDB4NDBCQgorI2RlZmluZSBDTF9DT01NQU5EX1NWTV9NRU1GSUxMX0FSTSAgICAgICAgICAgICAgICAgICAgICAweDQwQkMKKyNkZWZpbmUgQ0xfQ09NTUFORF9TVk1fTUFQX0FSTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MEJECisjZGVmaW5lIENMX0NPTU1BTkRfU1ZNX1VOTUFQX0FSTSAgICAgICAgICAgICAgICAgICAgICAgIDB4NDBCRQorCisvKiBGbGFnIHZhbHVlcyByZXR1cm5lZCBieSBjbEdldERldmljZUluZm8gd2l0aCBDTF9ERVZJQ0VfU1ZNX0NBUEFCSUxJVElFU19BUk0gYXMgdGhlIHBhcmFtX25hbWUuICovCisjZGVmaW5lIENMX0RFVklDRV9TVk1fQ09BUlNFX0dSQUlOX0JVRkZFUl9BUk0gICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENMX0RFVklDRV9TVk1fRklORV9HUkFJTl9CVUZGRVJfQVJNICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIENMX0RFVklDRV9TVk1fRklORV9HUkFJTl9TWVNURU1fQVJNICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIENMX0RFVklDRV9TVk1fQVRPTUlDU19BUk0gICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisKKy8qIEZsYWcgdmFsdWVzIHVzZWQgYnkgY2xTVk1BbGxvY0FSTTogKi8KKyNkZWZpbmUgQ0xfTUVNX1NWTV9GSU5FX0dSQUlOX0JVRkZFUl9BUk0gICAgICAgICAgICAgICAgKDEgPDwgMTApCisjZGVmaW5lIENMX01FTV9TVk1fQVRPTUlDU19BUk0gICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQorCit0eXBlZGVmIGNsX2JpdGZpZWxkIGNsX3N2bV9tZW1fZmxhZ3NfYXJtOwordHlwZWRlZiBjbF91aW50ICAgICBjbF9rZXJuZWxfZXhlY19pbmZvX2FybTsKK3R5cGVkZWYgY2xfYml0ZmllbGQgY2xfZGV2aWNlX3N2bV9jYXBhYmlsaXRpZXNfYXJtOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIHZvaWQgKiBDTF9BUElfQ0FMTAorY2xTVk1BbGxvY0FSTShjbF9jb250ZXh0ICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgIGNsX3N2bV9tZW1fZmxhZ3NfYXJtIGZsYWdzLAorICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgYWxpZ25tZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSB2b2lkIENMX0FQSV9DQUxMCitjbFNWTUZyZWVBUk0oY2xfY29udGV4dCAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICBzdm1fcG9pbnRlcikgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVTVk1GcmVlQVJNKGNsX2NvbW1hbmRfcXVldWUgIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9zdm1fcG9pbnRlcnMsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgIHN2bV9wb2ludGVyc1tdLAorICAgICAgICAgICAgICAgICAgICB2b2lkIChDTF9DQUxMQkFDSyAqIHBmbl9mcmVlX2Z1bmMpKGNsX2NvbW1hbmRfcXVldWUgcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICBudW1fc3ZtX3BvaW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgc3ZtX3BvaW50ZXJzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICB1c2VyX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICB1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVNWTU1lbWNweUFSTShjbF9jb21tYW5kX3F1ZXVlICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIGNsX2Jvb2wgICAgICAgICAgIGJsb2NraW5nX2NvcHksCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgZHN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogICAgICBzcmNfcHRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICogICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVNWTU1lbUZpbGxBUk0oY2xfY29tbWFuZF9xdWV1ZSAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgc3ZtX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqICAgICAgcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgcGF0dGVybl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVTVk1NYXBBUk0oY2xfY29tbWFuZF9xdWV1ZSAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBjbF9ib29sICAgICAgICAgICBibG9ja2luZ19tYXAsCisgICAgICAgICAgICAgICAgICAgY2xfbWFwX2ZsYWdzICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgc3ZtX3B0ciwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50ICogIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICBldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVTVk1Vbm1hcEFSTShjbF9jb21tYW5kX3F1ZXVlICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICAgICAgICAgICAgc3ZtX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xTZXRLZXJuZWxBcmdTVk1Qb2ludGVyQVJNKGNsX2tlcm5lbCAgICBrZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgIGFyZ19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogYXJnX3ZhbHVlKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsU2V0S2VybmVsRXhlY0luZm9BUk0oY2xfa2VybmVsICAgICAgICAgICAga2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICBjbF9rZXJuZWxfZXhlY19pbmZvX2FybSAgcGFyYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqICAgICAgICAgcGFyYW1fdmFsdWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNsX2FybV9nZXRfY29yZV9pZCBleHRlbnNpb24gKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKworI2RlZmluZSBjbF9hcm1fZ2V0X2NvcmVfaWQgMQorCisvKiBEZXZpY2UgaW5mbyBwcm9wZXJ0eSBmb3IgYml0ZmllbGQgb2YgY29yZXMgcHJlc2VudCAqLworI2RlZmluZSBDTF9ERVZJQ0VfQ09NUFVURV9VTklUU19CSVRGSUVMRF9BUk0gICAgICAweDQwQkYKKworI2VuZGlmICAvKiBDTF9WRVJTSU9OXzFfMiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2FybV9qb2Jfc2xvdF9zZWxlY3Rpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBjbF9hcm1fam9iX3Nsb3Rfc2VsZWN0aW9uIDEKKworLyogY2xfZGV2aWNlX2luZm8gKi8KKyNkZWZpbmUgQ0xfREVWSUNFX0pPQl9TTE9UU19BUk0gICAgICAgICAgICAgICAgICAgMHg0MUUwCisKKy8qIGNsX2NvbW1hbmRfcXVldWVfcHJvcGVydGllcyAqLworI2RlZmluZSBDTF9RVUVVRV9KT0JfU0xPVF9BUk0gICAgICAgICAgICAgICAgICAgICAweDQxRTEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9hcm1fc2NoZWR1bGluZ19jb250cm9scworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGNsX2FybV9zY2hlZHVsaW5nX2NvbnRyb2xzIDEKKwordHlwZWRlZiBjbF9iaXRmaWVsZCBjbF9kZXZpY2Vfc2NoZWR1bGluZ19jb250cm9sc19jYXBhYmlsaXRpZXNfYXJtOworCisvKiBjbF9kZXZpY2VfaW5mbyAqLworI2RlZmluZSBDTF9ERVZJQ0VfU0NIRURVTElOR19DT05UUk9MU19DQVBBQklMSVRJRVNfQVJNICAgICAgICAgIDB4NDFFNAorCisjZGVmaW5lIENMX0RFVklDRV9TQ0hFRFVMSU5HX0tFUk5FTF9CQVRDSElOR19BUk0gICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBDTF9ERVZJQ0VfU0NIRURVTElOR19XT1JLR1JPVVBfQkFUQ0hfU0laRV9BUk0gICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQ0xfREVWSUNFX1NDSEVEVUxJTkdfV09SS0dST1VQX0JBVENIX1NJWkVfTU9ESUZJRVJfQVJNICgxIDw8IDIpCisjZGVmaW5lIENMX0RFVklDRV9TQ0hFRFVMSU5HX0RFRkVSUkVEX0ZMVVNIX0FSTSAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBDTF9ERVZJQ0VfU0NIRURVTElOR19SRUdJU1RFUl9BTExPQ0FUSU9OX0FSTSAgICAgICAgICAgKDEgPDwgNCkKKworI2RlZmluZSBDTF9ERVZJQ0VfU1VQUE9SVEVEX1JFR0lTVEVSX0FMTE9DQVRJT05TX0FSTSAgICAgICAgICAgIDB4NDFFQgorCisvKiBjbF9rZXJuZWxfaW5mbyAqLworI2RlZmluZSBDTF9LRVJORUxfRVhFQ19JTkZPX1dPUktHUk9VUF9CQVRDSF9TSVpFX0FSTSAgICAgICAgICAgIDB4NDFFNQorI2RlZmluZSBDTF9LRVJORUxfRVhFQ19JTkZPX1dPUktHUk9VUF9CQVRDSF9TSVpFX01PRElGSUVSX0FSTSAgIDB4NDFFNgorCisvKiBjbF9xdWV1ZV9wcm9wZXJ0aWVzICovCisjZGVmaW5lIENMX1FVRVVFX0tFUk5FTF9CQVRDSElOR19BUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MUU3CisjZGVmaW5lIENMX1FVRVVFX0RFRkVSUkVEX0ZMVVNIX0FSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MUVDCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9hcm1fY29udHJvbGxlZF9rZXJuZWxfdGVybWluYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBjbF9hcm1fY29udHJvbGxlZF9rZXJuZWxfdGVybWluYXRpb24gMQorCisvKiBFcnJvciBjb2RlIHRvIGluZGljYXRlIGtlcm5lbCB0ZXJtaW5hdGVkIHdpdGggZmFpbHVyZSAqLworI2RlZmluZSBDTF9DT01NQU5EX1RFUk1JTkFURURfSVRTRUxGX1dJVEhfRkFJTFVSRV9BUk0gLTExMDgKKworLyogY2xfZGV2aWNlX2luZm8gKi8KKyNkZWZpbmUgQ0xfREVWSUNFX0NPTlRST0xMRURfVEVSTUlOQVRJT05fQ0FQQUJJTElUSUVTX0FSTSAweDQxRUUKKworLyogQml0IGZpZWxkcyBmb3IgY29udHJvbGxlZCB0ZXJtaW5hdGlvbiBmZWF0dXJlIHF1ZXJ5ICovCit0eXBlZGVmIGNsX2JpdGZpZWxkIGNsX2RldmljZV9jb250cm9sbGVkX3Rlcm1pbmF0aW9uX2NhcGFiaWxpdGllc19hcm07CisKKyNkZWZpbmUgQ0xfREVWSUNFX0NPTlRST0xMRURfVEVSTUlOQVRJT05fU1VDQ0VTU19BUk0gKDEgPDwgMCkKKyNkZWZpbmUgQ0xfREVWSUNFX0NPTlRST0xMRURfVEVSTUlOQVRJT05fRkFJTFVSRV9BUk0gKDEgPDwgMSkKKyNkZWZpbmUgQ0xfREVWSUNFX0NPTlRST0xMRURfVEVSTUlOQVRJT05fUVVFUllfQVJNICgxIDw8IDIpCisKKy8qIGNsX2V2ZW50X2luZm8gKi8KKyNkZWZpbmUgQ0xfRVZFTlRfQ09NTUFORF9URVJNSU5BVElPTl9SRUFTT05fQVJNIDB4NDFFRAorCisvKiBWYWx1ZXMgcmV0dXJuZWQgZm9yIGV2ZW50IHRlcm1pbmF0aW9uIHJlYXNvbiBxdWVyeSAqLwordHlwZWRlZiBjbF91aW50IGNsX2NvbW1hbmRfdGVybWluYXRpb25fcmVhc29uX2FybTsKKworI2RlZmluZSBDTF9DT01NQU5EX1RFUk1JTkFUSU9OX0NPTVBMRVRJT05fQVJNICAwCisjZGVmaW5lIENMX0NPTU1BTkRfVEVSTUlOQVRJT05fQ09OVFJPTExFRF9TVUNDRVNTX0FSTSAxCisjZGVmaW5lIENMX0NPTU1BTkRfVEVSTUlOQVRJT05fQ09OVFJPTExFRF9GQUlMVVJFX0FSTSAyCisjZGVmaW5lIENMX0NPTU1BTkRfVEVSTUlOQVRJT05fRVJST1JfQVJNIDMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF90aHJlYWRfbG9jYWxfZXhlYyBleHRlbnNpb24gKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBjbF9pbnRlbF90aHJlYWRfbG9jYWxfZXhlYyAxCisKKyNkZWZpbmUgQ0xfUVVFVUVfVEhSRUFEX0xPQ0FMX0VYRUNfRU5BQkxFX0lOVEVMICAgICAgKCgoY2xfYml0ZmllbGQpMSkgPDwgMzEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF9kZXZpY2VfcGFydGl0aW9uX2J5X25hbWVzIGV4dGVuc2lvbiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgY2xfaW50ZWxfZGV2aWNlX3BhcnRpdGlvbl9ieV9uYW1lcyAxCisKKyNkZWZpbmUgQ0xfREVWSUNFX1BBUlRJVElPTl9CWV9OQU1FU19JTlRFTCAgICAgICAgICAweDQwNTIKKyNkZWZpbmUgQ0xfUEFSVElUSU9OX0JZX05BTUVTX0xJU1RfRU5EX0lOVEVMICAgICAgICAtMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2ludGVsX2FjY2VsZXJhdG9yIGV4dGVuc2lvbiAgICAgICAgICAgICAgICAqCisqIGNsX2ludGVsX21vdGlvbl9lc3RpbWF0aW9uIGV4dGVuc2lvbiAgICAgICAgICAqCisqIGNsX2ludGVsX2FkdmFuY2VkX21vdGlvbl9lc3RpbWF0aW9uIGV4dGVuc2lvbiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGNsX2ludGVsX2FjY2VsZXJhdG9yIDEKKyNkZWZpbmUgY2xfaW50ZWxfbW90aW9uX2VzdGltYXRpb24gMQorI2RlZmluZSBjbF9pbnRlbF9hZHZhbmNlZF9tb3Rpb25fZXN0aW1hdGlvbiAxCisKK3R5cGVkZWYgc3RydWN0IF9jbF9hY2NlbGVyYXRvcl9pbnRlbCogY2xfYWNjZWxlcmF0b3JfaW50ZWw7Cit0eXBlZGVmIGNsX3VpbnQgY2xfYWNjZWxlcmF0b3JfdHlwZV9pbnRlbDsKK3R5cGVkZWYgY2xfdWludCBjbF9hY2NlbGVyYXRvcl9pbmZvX2ludGVsOworCit0eXBlZGVmIHN0cnVjdCBfY2xfbW90aW9uX2VzdGltYXRpb25fZGVzY19pbnRlbCB7CisgICAgY2xfdWludCBtYl9ibG9ja190eXBlOworICAgIGNsX3VpbnQgc3VicGl4ZWxfbW9kZTsKKyAgICBjbF91aW50IHNhZF9hZGp1c3RfbW9kZTsKKyAgICBjbF91aW50IHNlYXJjaF9wYXRoX3R5cGU7Cit9IGNsX21vdGlvbl9lc3RpbWF0aW9uX2Rlc2NfaW50ZWw7CisKKy8qIGVycm9yIGNvZGVzICovCisjZGVmaW5lIENMX0lOVkFMSURfQUNDRUxFUkFUT1JfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA5NAorI2RlZmluZSBDTF9JTlZBTElEX0FDQ0VMRVJBVE9SX1RZUEVfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgLTEwOTUKKyNkZWZpbmUgQ0xfSU5WQUxJRF9BQ0NFTEVSQVRPUl9ERVNDUklQVE9SX0lOVEVMICAgICAgICAgICAgICAgICAgIC0xMDk2CisjZGVmaW5lIENMX0FDQ0VMRVJBVE9SX1RZUEVfTk9UX1NVUFBPUlRFRF9JTlRFTCAgICAgICAgICAgICAgICAgICAtMTA5NworCisvKiBjbF9hY2NlbGVyYXRvcl90eXBlX2ludGVsICovCisjZGVmaW5lIENMX0FDQ0VMRVJBVE9SX1RZUEVfTU9USU9OX0VTVElNQVRJT05fSU5URUwgICAgICAgICAgICAgICAweDAKKworLyogY2xfYWNjZWxlcmF0b3JfaW5mb19pbnRlbCAqLworI2RlZmluZSBDTF9BQ0NFTEVSQVRPUl9ERVNDUklQVE9SX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDkwCisjZGVmaW5lIENMX0FDQ0VMRVJBVE9SX1JFRkVSRU5DRV9DT1VOVF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAweDQwOTEKKyNkZWZpbmUgQ0xfQUNDRUxFUkFUT1JfQ09OVEVYVF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDA5MgorI2RlZmluZSBDTF9BQ0NFTEVSQVRPUl9UWVBFX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDkzCisKKy8qIGNsX21vdGlvbl9kZXRlY3RfZGVzY19pbnRlbCBmbGFncyAqLworI2RlZmluZSBDTF9NRV9NQl9UWVBFXzE2eDE2X0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX01FX01CX1RZUEVfOHg4X0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfTUVfTUJfVFlQRV80eDRfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorCisjZGVmaW5lIENMX01FX1NVQlBJWEVMX01PREVfSU5URUdFUl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfTUVfU1VCUElYRUxfTU9ERV9IUEVMX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTF9NRV9TVUJQSVhFTF9NT0RFX1FQRUxfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisKKyNkZWZpbmUgQ0xfTUVfU0FEX0FESlVTVF9NT0RFX05PTkVfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTF9NRV9TQURfQURKVVNUX01PREVfSEFBUl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisKKyNkZWZpbmUgQ0xfTUVfU0VBUkNIX1BBVEhfUkFESVVTXzJfMl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTF9NRV9TRUFSQ0hfUEFUSF9SQURJVVNfNF80X0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIENMX01FX1NFQVJDSF9QQVRIX1JBRElVU18xNl8xMl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAweDUKKworI2RlZmluZSBDTF9NRV9TS0lQX0JMT0NLX1RZUEVfMTZ4MTZfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX01FX0NIUk9NQV9JTlRSQV9QUkVESUNUX0VOQUJMRURfSU5URUwgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfTUVfTFVNQV9JTlRSQV9QUkVESUNUX0VOQUJMRURfSU5URUwgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBDTF9NRV9TS0lQX0JMT0NLX1RZUEVfOHg4X0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisKKyNkZWZpbmUgQ0xfTUVfRk9SV0FSRF9JTlBVVF9NT0RFX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTF9NRV9CQUNLV0FSRF9JTlBVVF9NT0RFX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIENMX01FX0JJRElSRUNUSU9OX0lOUFVUX01PREVfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAweDMKKworI2RlZmluZSBDTF9NRV9CSURJUl9XRUlHSFRfUVVBUlRFUl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQ0xfTUVfQklESVJfV0VJR0hUX1RISVJEX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIENMX01FX0JJRElSX1dFSUdIVF9IQUxGX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBDTF9NRV9CSURJUl9XRUlHSFRfVFdPX1RISVJEX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgNDMKKyNkZWZpbmUgQ0xfTUVfQklESVJfV0VJR0hUX1RIUkVFX1FVQVJURVJfSU5URUwgICAgICAgICAgICAgICAgICAgIDQ4CisKKyNkZWZpbmUgQ0xfTUVfQ09TVF9QRU5BTFRZX05PTkVfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTF9NRV9DT1NUX1BFTkFMVFlfTE9XX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIENMX01FX0NPU1RfUEVOQUxUWV9OT1JNQUxfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgQ0xfTUVfQ09TVF9QRU5BTFRZX0hJR0hfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworCisjZGVmaW5lIENMX01FX0NPU1RfUFJFQ0lTSU9OX1FQRUxfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfTUVfQ09TVF9QUkVDSVNJT05fSFBFTF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTF9NRV9DT1NUX1BSRUNJU0lPTl9QRUxfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIENMX01FX0NPU1RfUFJFQ0lTSU9OX0RQRUxfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKworI2RlZmluZSBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0lOVEVMICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfSE9SSVpPTlRBTF9JTlRFTCAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9EQ19JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0RJQUdPTkFMX0RPV05fTEVGVF9JTlRFTCAgICAgICAgMHgzCisKKyNkZWZpbmUgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9ESUFHT05BTF9ET1dOX1JJR0hUX0lOVEVMICAgICAgIDB4NAorI2RlZmluZSBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1BMQU5FX0lOVEVMICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfVkVSVElDQUxfUklHSFRfSU5URUwgICAgICAgICAgICAweDUKKyNkZWZpbmUgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9IT1JJWk9OVEFMX0RPV05fSU5URUwgICAgICAgICAgIDB4NgorI2RlZmluZSBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0xFRlRfSU5URUwgICAgICAgICAgICAgMHg3CisjZGVmaW5lIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfSE9SSVpPTlRBTF9VUF9JTlRFTCAgICAgICAgICAgICAweDgKKworI2RlZmluZSBDTF9NRV9DSFJPTUFfUFJFRElDVE9SX01PREVfRENfSU5URUwgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX01FX0NIUk9NQV9QUkVESUNUT1JfTU9ERV9IT1JJWk9OVEFMX0lOVEVMICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfTUVfQ0hST01BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0lOVEVMICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBDTF9NRV9DSFJPTUFfUFJFRElDVE9SX01PREVfUExBTkVfSU5URUwgICAgICAgICAgICAgICAgICAgMHgzCisKKy8qIGNsX2RldmljZV9pbmZvICovCisjZGVmaW5lIENMX0RFVklDRV9NRV9WRVJTSU9OX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwN0UKKworI2RlZmluZSBDTF9NRV9WRVJTSU9OX0xFR0FDWV9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX01FX1ZFUlNJT05fQURWQU5DRURfVkVSXzFfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfTUVfVkVSU0lPTl9BRFZBTkNFRF9WRVJfMl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2FjY2VsZXJhdG9yX2ludGVsIENMX0FQSV9DQUxMCitjbENyZWF0ZUFjY2VsZXJhdG9ySU5URUwoCisgICAgY2xfY29udGV4dCAgICAgICAgICAgICAgICAgICBjb250ZXh0LAorICAgIGNsX2FjY2VsZXJhdG9yX3R5cGVfaW50ZWwgICAgYWNjZWxlcmF0b3JfdHlwZSwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Jfc2l6ZSwKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsCisgICAgY2xfaW50KiAgICAgICAgICAgICAgICAgICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYgY2xfYWNjZWxlcmF0b3JfaW50ZWwgKENMX0FQSV9DQUxMICpjbENyZWF0ZUFjY2VsZXJhdG9ySU5URUxfZm4pKAorICAgIGNsX2NvbnRleHQgICAgICAgICAgICAgICAgICAgY29udGV4dCwKKyAgICBjbF9hY2NlbGVyYXRvcl90eXBlX2ludGVsICAgIGFjY2VsZXJhdG9yX3R5cGUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NpemUsCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLAorICAgIGNsX2ludCogICAgICAgICAgICAgICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRBY2NlbGVyYXRvckluZm9JTlRFTCgKKyAgICBjbF9hY2NlbGVyYXRvcl9pbnRlbCAgICAgICAgIGFjY2VsZXJhdG9yLAorICAgIGNsX2FjY2VsZXJhdG9yX2luZm9faW50ZWwgICAgcGFyYW1fbmFtZSwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbEdldEFjY2VsZXJhdG9ySW5mb0lOVEVMX2ZuKSgKKyAgICBjbF9hY2NlbGVyYXRvcl9pbnRlbCAgICAgICAgIGFjY2VsZXJhdG9yLAorICAgIGNsX2FjY2VsZXJhdG9yX2luZm9faW50ZWwgICAgcGFyYW1fbmFtZSwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsUmV0YWluQWNjZWxlcmF0b3JJTlRFTCgKKyAgICBjbF9hY2NlbGVyYXRvcl9pbnRlbCAgICAgICAgIGFjY2VsZXJhdG9yKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbFJldGFpbkFjY2VsZXJhdG9ySU5URUxfZm4pKAorICAgIGNsX2FjY2VsZXJhdG9yX2ludGVsICAgICAgICAgYWNjZWxlcmF0b3IpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xSZWxlYXNlQWNjZWxlcmF0b3JJTlRFTCgKKyAgICBjbF9hY2NlbGVyYXRvcl9pbnRlbCAgICAgICAgIGFjY2VsZXJhdG9yKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICpjbFJlbGVhc2VBY2NlbGVyYXRvcklOVEVMX2ZuKSgKKyAgICBjbF9hY2NlbGVyYXRvcl9pbnRlbCAgICAgICAgIGFjY2VsZXJhdG9yKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF9zaW11bHRhbmVvdXNfc2hhcmluZyBleHRlbnNpb24gKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBjbF9pbnRlbF9zaW11bHRhbmVvdXNfc2hhcmluZyAxCisKKyNkZWZpbmUgQ0xfREVWSUNFX1NJTVVMVEFORU9VU19JTlRFUk9QU19JTlRFTCAgICAgICAgICAgIDB4NDEwNAorI2RlZmluZSBDTF9ERVZJQ0VfTlVNX1NJTVVMVEFORU9VU19JTlRFUk9QU19JTlRFTCAgICAgICAgMHg0MTA1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF9lZ2xfaW1hZ2VfeXV2IGV4dGVuc2lvbiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgY2xfaW50ZWxfZWdsX2ltYWdlX3l1diAxCisKKyNkZWZpbmUgQ0xfRUdMX1lVVl9QTEFORV9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwNworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfaW50ZWxfcGFja2VkX3l1diBleHRlbnNpb24gKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGNsX2ludGVsX3BhY2tlZF95dXYgMQorCisjZGVmaW5lIENMX1lVWVZfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwNzYKKyNkZWZpbmUgQ0xfVVlWWV9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDA3NworI2RlZmluZSBDTF9ZVllVX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDc4CisjZGVmaW5lIENMX1ZZVVlfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwNzkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2ludGVsX3JlcXVpcmVkX3N1Ymdyb3VwX3NpemUgZXh0ZW5zaW9uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBjbF9pbnRlbF9yZXF1aXJlZF9zdWJncm91cF9zaXplIDEKKworI2RlZmluZSBDTF9ERVZJQ0VfU1VCX0dST1VQX1NJWkVTX0lOVEVMICAgICAgICAgICAgICAgICAgMHg0MTA4CisjZGVmaW5lIENMX0tFUk5FTF9TUElMTF9NRU1fU0laRV9JTlRFTCAgICAgICAgICAgICAgICAgICAweDQxMDkKKyNkZWZpbmUgQ0xfS0VSTkVMX0NPTVBJTEVfU1VCX0dST1VQX1NJWkVfSU5URUwgICAgICAgICAgIDB4NDEwQQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF9kcml2ZXJfZGlhZ25vc3RpY3MgZXh0ZW5zaW9uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGNsX2ludGVsX2RyaXZlcl9kaWFnbm9zdGljcyAxCisKK3R5cGVkZWYgY2xfdWludCBjbF9kaWFnbm9zdGljc192ZXJib3NlX2xldmVsOworCisjZGVmaW5lIENMX0NPTlRFWFRfU0hPV19ESUFHTk9TVElDU19JTlRFTCAgICAgICAgICAgICAgICAweDQxMDYKKworI2RlZmluZSBDTF9DT05URVhUX0RJQUdOT1NUSUNTX0xFVkVMX0FMTF9JTlRFTCAgICAgICAgICAgKCAweGZmICkKKyNkZWZpbmUgQ0xfQ09OVEVYVF9ESUFHTk9TVElDU19MRVZFTF9HT09EX0lOVEVMICAgICAgICAgICggMSApCisjZGVmaW5lIENMX0NPTlRFWFRfRElBR05PU1RJQ1NfTEVWRUxfQkFEX0lOVEVMICAgICAgICAgICAoIDEgPDwgMSApCisjZGVmaW5lIENMX0NPTlRFWFRfRElBR05PU1RJQ1NfTEVWRUxfTkVVVFJBTF9JTlRFTCAgICAgICAoIDEgPDwgMiApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF9wbGFuYXJfeXV2IGV4dGVuc2lvbiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ0xfTlYxMl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwRQorCisjZGVmaW5lIENMX01FTV9OT19BQ0NFU1NfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgMjQgKQorI2RlZmluZSBDTF9NRU1fQUNDRVNTX0ZMQUdTX1VOUkVTVFJJQ1RFRF9JTlRFTCAgICAgICAgICAgICAgKCAxIDw8IDI1ICkKKworI2RlZmluZSBDTF9ERVZJQ0VfUExBTkFSX1lVVl9NQVhfV0lEVEhfSU5URUwgICAgICAgICAgICAgICAgMHg0MTdFCisjZGVmaW5lIENMX0RFVklDRV9QTEFOQVJfWVVWX01BWF9IRUlHSFRfSU5URUwgICAgICAgICAgICAgICAweDQxN0YKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfaW50ZWxfZGV2aWNlX3NpZGVfYXZjX21vdGlvbl9lc3RpbWF0aW9uIGV4dGVuc2lvbiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDTF9ERVZJQ0VfQVZDX01FX1ZFUlNJT05fSU5URUwgICAgICAgICAgICAgICAgICAgICAgMHg0MTBCCisjZGVmaW5lIENMX0RFVklDRV9BVkNfTUVfU1VQUE9SVFNfVEVYVFVSRV9TQU1QTEVSX1VTRV9JTlRFTCAweDQxMEMKKyNkZWZpbmUgQ0xfREVWSUNFX0FWQ19NRV9TVVBQT1JUU19QUkVFTVBUSU9OX0lOVEVMICAgICAgICAgIDB4NDEwRAorCisjZGVmaW5lIENMX0FWQ19NRV9WRVJTSU9OXzBfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAgICAvKiBObyBzdXBwb3J0LiAqLworI2RlZmluZSBDTF9BVkNfTUVfVkVSU0lPTl8xX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxICAgLyogRmlyc3Qgc3VwcG9ydGVkIHZlcnNpb24uICovCisKKyNkZWZpbmUgQ0xfQVZDX01FX01BSk9SXzE2eDE2X0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTF9BVkNfTUVfTUFKT1JfMTZ4OF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIENMX0FWQ19NRV9NQUpPUl84eDE2X0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgQ0xfQVZDX01FX01BSk9SXzh4OF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworCisjZGVmaW5lIENMX0FWQ19NRV9NSU5PUl84eDhfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfQVZDX01FX01JTk9SXzh4NF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTF9BVkNfTUVfTUlOT1JfNHg4X0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIENMX0FWQ19NRV9NSU5PUl80eDRfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKworI2RlZmluZSBDTF9BVkNfTUVfTUFKT1JfRk9SV0FSRF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX0FWQ19NRV9NQUpPUl9CQUNLV0FSRF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfQVZDX01FX01BSk9SX0JJRElSRUNUSU9OQUxfSU5URUwgICAgICAgICAgICAgICAgIDB4MgorCisjZGVmaW5lIENMX0FWQ19NRV9QQVJUSVRJT05fTUFTS19BTExfSU5URUwgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfQVZDX01FX1BBUlRJVElPTl9NQVNLXzE2eDE2X0lOVEVMICAgICAgICAgICAgICAgIDB4N0UKKyNkZWZpbmUgQ0xfQVZDX01FX1BBUlRJVElPTl9NQVNLXzE2eDhfSU5URUwgICAgICAgICAgICAgICAgIDB4N0QKKyNkZWZpbmUgQ0xfQVZDX01FX1BBUlRJVElPTl9NQVNLXzh4MTZfSU5URUwgICAgICAgICAgICAgICAgIDB4N0IKKyNkZWZpbmUgQ0xfQVZDX01FX1BBUlRJVElPTl9NQVNLXzh4OF9JTlRFTCAgICAgICAgICAgICAgICAgIDB4NzcKKyNkZWZpbmUgQ0xfQVZDX01FX1BBUlRJVElPTl9NQVNLXzh4NF9JTlRFTCAgICAgICAgICAgICAgICAgIDB4NkYKKyNkZWZpbmUgQ0xfQVZDX01FX1BBUlRJVElPTl9NQVNLXzR4OF9JTlRFTCAgICAgICAgICAgICAgICAgIDB4NUYKKyNkZWZpbmUgQ0xfQVZDX01FX1BBUlRJVElPTl9NQVNLXzR4NF9JTlRFTCAgICAgICAgICAgICAgICAgIDB4M0YKKworI2RlZmluZSBDTF9BVkNfTUVfU0VBUkNIX1dJTkRPV19FWEhBVVNUSVZFX0lOVEVMICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX0FWQ19NRV9TRUFSQ0hfV0lORE9XX1NNQUxMX0lOVEVMICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfQVZDX01FX1NFQVJDSF9XSU5ET1dfVElOWV9JTlRFTCAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBDTF9BVkNfTUVfU0VBUkNIX1dJTkRPV19FWFRSQV9USU5ZX0lOVEVMICAgICAgICAgICAgMHgzCisjZGVmaW5lIENMX0FWQ19NRV9TRUFSQ0hfV0lORE9XX0RJQU1PTkRfSU5URUwgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgQ0xfQVZDX01FX1NFQVJDSF9XSU5ET1dfTEFSR0VfRElBTU9ORF9JTlRFTCAgICAgICAgIDB4NQorI2RlZmluZSBDTF9BVkNfTUVfU0VBUkNIX1dJTkRPV19SRVNFUlZFRDBfSU5URUwgICAgICAgICAgICAgMHg2CisjZGVmaW5lIENMX0FWQ19NRV9TRUFSQ0hfV0lORE9XX1JFU0VSVkVEMV9JTlRFTCAgICAgICAgICAgICAweDcKKyNkZWZpbmUgQ0xfQVZDX01FX1NFQVJDSF9XSU5ET1dfQ1VTVE9NX0lOVEVMICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBDTF9BVkNfTUVfU0VBUkNIX1dJTkRPV18xNngxMl9SQURJVVNfSU5URUwgICAgICAgICAgMHg5CisjZGVmaW5lIENMX0FWQ19NRV9TRUFSQ0hfV0lORE9XXzR4NF9SQURJVVNfSU5URUwgICAgICAgICAgICAweDIKKyNkZWZpbmUgQ0xfQVZDX01FX1NFQVJDSF9XSU5ET1dfMngyX1JBRElVU19JTlRFTCAgICAgICAgICAgIDB4YQorCisjZGVmaW5lIENMX0FWQ19NRV9TQURfQURKVVNUX01PREVfTk9ORV9JTlRFTCAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfQVZDX01FX1NBRF9BREpVU1RfTU9ERV9IQUFSX0lOVEVMICAgICAgICAgICAgICAgIDB4MgorCisjZGVmaW5lIENMX0FWQ19NRV9TVUJQSVhFTF9NT0RFX0lOVEVHRVJfSU5URUwgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfQVZDX01FX1NVQlBJWEVMX01PREVfSFBFTF9JTlRFTCAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTF9BVkNfTUVfU1VCUElYRUxfTU9ERV9RUEVMX0lOVEVMICAgICAgICAgICAgICAgICAgMHgzCisKKyNkZWZpbmUgQ0xfQVZDX01FX0NPU1RfUFJFQ0lTSU9OX1FQRUxfSU5URUwgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTF9BVkNfTUVfQ09TVF9QUkVDSVNJT05fSFBFTF9JTlRFTCAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIENMX0FWQ19NRV9DT1NUX1BSRUNJU0lPTl9QRUxfSU5URUwgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgQ0xfQVZDX01FX0NPU1RfUFJFQ0lTSU9OX0RQRUxfSU5URUwgICAgICAgICAgICAgICAgIDB4MworCisjZGVmaW5lIENMX0FWQ19NRV9CSURJUl9XRUlHSFRfUVVBUlRFUl9JTlRFTCAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIENMX0FWQ19NRV9CSURJUl9XRUlHSFRfVEhJUkRfSU5URUwgICAgICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIENMX0FWQ19NRV9CSURJUl9XRUlHSFRfSEFMRl9JTlRFTCAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIENMX0FWQ19NRV9CSURJUl9XRUlHSFRfVFdPX1RISVJEX0lOVEVMICAgICAgICAgICAgICAweDJCCisjZGVmaW5lIENMX0FWQ19NRV9CSURJUl9XRUlHSFRfVEhSRUVfUVVBUlRFUl9JTlRFTCAgICAgICAgICAweDMwCisKKyNkZWZpbmUgQ0xfQVZDX01FX0JPUkRFUl9SRUFDSEVEX0xFRlRfSU5URUwgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTF9BVkNfTUVfQk9SREVSX1JFQUNIRURfUklHSFRfSU5URUwgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIENMX0FWQ19NRV9CT1JERVJfUkVBQ0hFRF9UT1BfSU5URUwgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgQ0xfQVZDX01FX0JPUkRFUl9SRUFDSEVEX0JPVFRPTV9JTlRFTCAgICAgICAgICAgICAgIDB4OAorCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLX1BBUlRJVElPTl8xNngxNl9JTlRFTCAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfQVZDX01FX1NLSVBfQkxPQ0tfUEFSVElUSU9OXzh4OF9JTlRFTCAgICAgICAgICAgIDB4NDAwMAorCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzE2eDE2X0ZPUldBUkRfRU5BQkxFX0lOVEVMICAgICAoIDB4MSA8PCAyNCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzE2eDE2X0JBQ0tXQVJEX0VOQUJMRV9JTlRFTCAgICAoIDB4MiA8PCAyNCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzE2eDE2X0RVQUxfRU5BQkxFX0lOVEVMICAgICAgICAoIDB4MyA8PCAyNCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF9GT1JXQVJEX0VOQUJMRV9JTlRFTCAgICAgICAoIDB4NTUgPDwgMjQgKQorI2RlZmluZSBDTF9BVkNfTUVfU0tJUF9CTE9DS184eDhfQkFDS1dBUkRfRU5BQkxFX0lOVEVMICAgICAgKCAweEFBIDw8IDI0ICkKKyNkZWZpbmUgQ0xfQVZDX01FX1NLSVBfQkxPQ0tfOHg4X0RVQUxfRU5BQkxFX0lOVEVMICAgICAgICAgICggMHhGRiA8PCAyNCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF8wX0ZPUldBUkRfRU5BQkxFX0lOVEVMICAgICAoIDB4MSA8PCAyNCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF8wX0JBQ0tXQVJEX0VOQUJMRV9JTlRFTCAgICAoIDB4MiA8PCAyNCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF8xX0ZPUldBUkRfRU5BQkxFX0lOVEVMICAgICAoIDB4MSA8PCAyNiApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF8xX0JBQ0tXQVJEX0VOQUJMRV9JTlRFTCAgICAoIDB4MiA8PCAyNiApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF8yX0ZPUldBUkRfRU5BQkxFX0lOVEVMICAgICAoIDB4MSA8PCAyOCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF8yX0JBQ0tXQVJEX0VOQUJMRV9JTlRFTCAgICAoIDB4MiA8PCAyOCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF8zX0ZPUldBUkRfRU5BQkxFX0lOVEVMICAgICAoIDB4MSA8PCAzMCApCisjZGVmaW5lIENMX0FWQ19NRV9TS0lQX0JMT0NLXzh4OF8zX0JBQ0tXQVJEX0VOQUJMRV9JTlRFTCAgICAoIDB4MiA8PCAzMCApCisKKyNkZWZpbmUgQ0xfQVZDX01FX0JMT0NLX0JBU0VEX1NLSVBfNHg0X0lOVEVMICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ0xfQVZDX01FX0JMT0NLX0JBU0VEX1NLSVBfOHg4X0lOVEVMICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBDTF9BVkNfTUVfSU5UUkFfMTZ4MTZfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX0FWQ19NRV9JTlRSQV84eDhfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfQVZDX01FX0lOVFJBXzR4NF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorCisjZGVmaW5lIENMX0FWQ19NRV9JTlRSQV9MVU1BX1BBUlRJVElPTl9NQVNLXzE2eDE2X0lOVEVMICAgICAweDYKKyNkZWZpbmUgQ0xfQVZDX01FX0lOVFJBX0xVTUFfUEFSVElUSU9OX01BU0tfOHg4X0lOVEVMICAgICAgIDB4NQorI2RlZmluZSBDTF9BVkNfTUVfSU5UUkFfTFVNQV9QQVJUSVRJT05fTUFTS180eDRfSU5URUwgICAgICAgMHgzCisKKyNkZWZpbmUgQ0xfQVZDX01FX0lOVFJBX05FSUdIQk9SX0xFRlRfTUFTS19FTkFCTEVfSU5URUwgICAgICAgICAweDYwCisjZGVmaW5lIENMX0FWQ19NRV9JTlRSQV9ORUlHSEJPUl9VUFBFUl9NQVNLX0VOQUJMRV9JTlRFTCAgICAgICAgMHgxMAorI2RlZmluZSBDTF9BVkNfTUVfSU5UUkFfTkVJR0hCT1JfVVBQRVJfUklHSFRfTUFTS19FTkFCTEVfSU5URUwgIDB4OAorI2RlZmluZSBDTF9BVkNfTUVfSU5UUkFfTkVJR0hCT1JfVVBQRVJfTEVGVF9NQVNLX0VOQUJMRV9JTlRFTCAgIDB4NAorCisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0lOVEVMICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0hPUklaT05UQUxfSU5URUwgICAgICAgICAgMHgxCisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0RDX0lOVEVMICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0RJQUdPTkFMX0RPV05fTEVGVF9JTlRFTCAgMHgzCisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0RJQUdPTkFMX0RPV05fUklHSFRfSU5URUwgMHg0CisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1BMQU5FX0lOVEVMICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX1JJR0hUX0lOVEVMICAgICAgMHg1CisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0hPUklaT05UQUxfRE9XTl9JTlRFTCAgICAgMHg2CisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0xFRlRfSU5URUwgICAgICAgMHg3CisjZGVmaW5lIENMX0FWQ19NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0hPUklaT05UQUxfVVBfSU5URUwgICAgICAgMHg4CisjZGVmaW5lIENMX0FWQ19NRV9DSFJPTUFfUFJFRElDVE9SX01PREVfRENfSU5URUwgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX0FWQ19NRV9DSFJPTUFfUFJFRElDVE9SX01PREVfSE9SSVpPTlRBTF9JTlRFTCAgICAgICAgMHgxCisjZGVmaW5lIENMX0FWQ19NRV9DSFJPTUFfUFJFRElDVE9SX01PREVfVkVSVElDQUxfSU5URUwgICAgICAgICAgMHgyCisjZGVmaW5lIENMX0FWQ19NRV9DSFJPTUFfUFJFRElDVE9SX01PREVfUExBTkVfSU5URUwgICAgICAgICAgICAgMHgzCisKKyNkZWZpbmUgQ0xfQVZDX01FX0ZSQU1FX0ZPUldBUkRfSU5URUwgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTF9BVkNfTUVfRlJBTUVfQkFDS1dBUkRfSU5URUwgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIENMX0FWQ19NRV9GUkFNRV9EVUFMX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKworI2RlZmluZSBDTF9BVkNfTUVfU0xJQ0VfVFlQRV9QUkVEX0lOVEVMICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIENMX0FWQ19NRV9TTElDRV9UWVBFX0JQUkVEX0lOVEVMICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ0xfQVZDX01FX1NMSUNFX1RZUEVfSU5UUkFfSU5URUwgICAgICAgICAgICAgICAgICAgIDB4MgorCisjZGVmaW5lIENMX0FWQ19NRV9JTlRFUkxBQ0VEX1NDQU5fVE9QX0ZJRUxEX0lOVEVMICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0xfQVZDX01FX0lOVEVSTEFDRURfU0NBTl9CT1RUT01fRklFTERfSU5URUwgICAgICAgIDB4MQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF91bmlmaWVkX3NoYXJlZF9tZW1vcnkgZXh0ZW5zaW9uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGVzZSBBUElzIGFyZSBpbiBzeW5jIHdpdGggUmV2aXNpb24gUSBvZiB0aGUgY2xfaW50ZWxfdW5pZmllZF9zaGFyZWRfbWVtb3J5IHNwZWMhICovCisKKyNkZWZpbmUgY2xfaW50ZWxfdW5pZmllZF9zaGFyZWRfbWVtb3J5IDEKKworLyogY2xfZGV2aWNlX2luZm8gKi8KKyNkZWZpbmUgQ0xfREVWSUNFX0hPU1RfTUVNX0NBUEFCSUxJVElFU19JTlRFTCAgICAgICAgICAgICAgICAgICAweDQxOTAKKyNkZWZpbmUgQ0xfREVWSUNFX0RFVklDRV9NRU1fQ0FQQUJJTElUSUVTX0lOVEVMICAgICAgICAgICAgICAgICAweDQxOTEKKyNkZWZpbmUgQ0xfREVWSUNFX1NJTkdMRV9ERVZJQ0VfU0hBUkVEX01FTV9DQVBBQklMSVRJRVNfSU5URUwgICAweDQxOTIKKyNkZWZpbmUgQ0xfREVWSUNFX0NST1NTX0RFVklDRV9TSEFSRURfTUVNX0NBUEFCSUxJVElFU19JTlRFTCAgICAweDQxOTMKKyNkZWZpbmUgQ0xfREVWSUNFX1NIQVJFRF9TWVNURU1fTUVNX0NBUEFCSUxJVElFU19JTlRFTCAgICAgICAgICAweDQxOTQKKwordHlwZWRlZiBjbF9iaXRmaWVsZCBjbF9kZXZpY2VfdW5pZmllZF9zaGFyZWRfbWVtb3J5X2NhcGFiaWxpdGllc19pbnRlbDsKKworLyogY2xfZGV2aWNlX3VuaWZpZWRfc2hhcmVkX21lbW9yeV9jYXBhYmlsaXRpZXNfaW50ZWwgLSBiaXRmaWVsZCAqLworI2RlZmluZSBDTF9VTklGSUVEX1NIQVJFRF9NRU1PUllfQUNDRVNTX0lOVEVMICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENMX1VOSUZJRURfU0hBUkVEX01FTU9SWV9BVE9NSUNfQUNDRVNTX0lOVEVMICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQ0xfVU5JRklFRF9TSEFSRURfTUVNT1JZX0NPTkNVUlJFTlRfQUNDRVNTX0lOVEVMICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBDTF9VTklGSUVEX1NIQVJFRF9NRU1PUllfQ09OQ1VSUkVOVF9BVE9NSUNfQUNDRVNTX0lOVEVMICgxIDw8IDMpCisKK3R5cGVkZWYgY2xfcHJvcGVydGllcyBjbF9tZW1fcHJvcGVydGllc19pbnRlbDsKKworLyogY2xfbWVtX3Byb3BlcnRpZXNfaW50ZWwgKi8KKyNkZWZpbmUgQ0xfTUVNX0FMTE9DX0ZMQUdTX0lOVEVMICAgICAgICAweDQxOTUKKwordHlwZWRlZiBjbF9iaXRmaWVsZCBjbF9tZW1fYWxsb2NfZmxhZ3NfaW50ZWw7CisKKy8qIGNsX21lbV9hbGxvY19mbGFnc19pbnRlbCAtIGJpdGZpZWxkICovCisjZGVmaW5lIENMX01FTV9BTExPQ19XUklURV9DT01CSU5FRF9JTlRFTCAgICAgICAgICAgICAgICgxIDw8IDApCisKK3R5cGVkZWYgY2xfdWludCBjbF9tZW1faW5mb19pbnRlbDsKKworLyogY2xfbWVtX2FsbG9jX2luZm9faW50ZWwgKi8KKyNkZWZpbmUgQ0xfTUVNX0FMTE9DX1RZUEVfSU5URUwgICAgICAgICAweDQxOUEKKyNkZWZpbmUgQ0xfTUVNX0FMTE9DX0JBU0VfUFRSX0lOVEVMICAgICAweDQxOUIKKyNkZWZpbmUgQ0xfTUVNX0FMTE9DX1NJWkVfSU5URUwgICAgICAgICAweDQxOUMKKyNkZWZpbmUgQ0xfTUVNX0FMTE9DX0RFVklDRV9JTlRFTCAgICAgICAweDQxOUQKKy8qIEVudW0gdmFsdWVzIDB4NDE5RS0weDQxOUYgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgcXVlcmllcy4gKi8KKwordHlwZWRlZiBjbF91aW50IGNsX3VuaWZpZWRfc2hhcmVkX21lbW9yeV90eXBlX2ludGVsOworCisvKiBjbF91bmlmaWVkX3NoYXJlZF9tZW1vcnlfdHlwZV9pbnRlbCAqLworI2RlZmluZSBDTF9NRU1fVFlQRV9VTktOT1dOX0lOVEVMICAgICAgIDB4NDE5NgorI2RlZmluZSBDTF9NRU1fVFlQRV9IT1NUX0lOVEVMICAgICAgICAgIDB4NDE5NworI2RlZmluZSBDTF9NRU1fVFlQRV9ERVZJQ0VfSU5URUwgICAgICAgIDB4NDE5OAorI2RlZmluZSBDTF9NRU1fVFlQRV9TSEFSRURfSU5URUwgICAgICAgIDB4NDE5OQorCit0eXBlZGVmIGNsX3VpbnQgY2xfbWVtX2FkdmljZV9pbnRlbDsKKworLyogY2xfbWVtX2FkdmljZV9pbnRlbCAqLworLyogRW51bSB2YWx1ZXMgMHg0MjA4LTB4NDIwRiBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBtZW1vcnkgYWR2aWNlcy4gKi8KKworLyogY2xfa2VybmVsX2V4ZWNfaW5mbyAqLworI2RlZmluZSBDTF9LRVJORUxfRVhFQ19JTkZPX0lORElSRUNUX0hPU1RfQUNDRVNTX0lOVEVMICAgICAgMHg0MjAwCisjZGVmaW5lIENMX0tFUk5FTF9FWEVDX0lORk9fSU5ESVJFQ1RfREVWSUNFX0FDQ0VTU19JTlRFTCAgICAweDQyMDEKKyNkZWZpbmUgQ0xfS0VSTkVMX0VYRUNfSU5GT19JTkRJUkVDVF9TSEFSRURfQUNDRVNTX0lOVEVMICAgIDB4NDIwMgorI2RlZmluZSBDTF9LRVJORUxfRVhFQ19JTkZPX1VTTV9QVFJTX0lOVEVMICAgICAgICAgICAgICAgICAgMHg0MjAzCisKKy8qIGNsX2NvbW1hbmRfdHlwZSAqLworI2RlZmluZSBDTF9DT01NQU5EX01FTUZJTExfSU5URUwgICAgICAgIDB4NDIwNAorI2RlZmluZSBDTF9DT01NQU5EX01FTUNQWV9JTlRFTCAgICAgICAgIDB4NDIwNQorI2RlZmluZSBDTF9DT01NQU5EX01JR1JBVEVNRU1fSU5URUwgICAgIDB4NDIwNgorI2RlZmluZSBDTF9DT01NQU5EX01FTUFEVklTRV9JTlRFTCAgICAgIDB4NDIwNworCitleHRlcm4gQ0xfQVBJX0VOVFJZIHZvaWQqIENMX0FQSV9DQUxMCitjbEhvc3RNZW1BbGxvY0lOVEVMKAorICAgICAgICAgICAgY2xfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgY29uc3QgY2xfbWVtX3Byb3BlcnRpZXNfaW50ZWwqIHByb3BlcnRpZXMsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNsX3VpbnQgYWxpZ25tZW50LAorICAgICAgICAgICAgY2xfaW50KiBlcnJjb2RlX3JldCk7CisKK3R5cGVkZWYgdm9pZCogKENMX0FQSV9DQUxMICoKK2NsSG9zdE1lbUFsbG9jSU5URUxfZm4pKAorICAgICAgICAgICAgY2xfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgY29uc3QgY2xfbWVtX3Byb3BlcnRpZXNfaW50ZWwqIHByb3BlcnRpZXMsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNsX3VpbnQgYWxpZ25tZW50LAorICAgICAgICAgICAgY2xfaW50KiBlcnJjb2RlX3JldCk7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgdm9pZCogQ0xfQVBJX0NBTEwKK2NsRGV2aWNlTWVtQWxsb2NJTlRFTCgKKyAgICAgICAgICAgIGNsX2NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGNsX2RldmljZV9pZCBkZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjbF9tZW1fcHJvcGVydGllc19pbnRlbCogcHJvcGVydGllcywKKyAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgY2xfdWludCBhbGlnbm1lbnQsCisgICAgICAgICAgICBjbF9pbnQqIGVycmNvZGVfcmV0KTsKKwordHlwZWRlZiB2b2lkKiAoQ0xfQVBJX0NBTEwgKgorY2xEZXZpY2VNZW1BbGxvY0lOVEVMX2ZuKSgKKyAgICAgICAgICAgIGNsX2NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGNsX2RldmljZV9pZCBkZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjbF9tZW1fcHJvcGVydGllc19pbnRlbCogcHJvcGVydGllcywKKyAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgY2xfdWludCBhbGlnbm1lbnQsCisgICAgICAgICAgICBjbF9pbnQqIGVycmNvZGVfcmV0KTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSB2b2lkKiBDTF9BUElfQ0FMTAorY2xTaGFyZWRNZW1BbGxvY0lOVEVMKAorICAgICAgICAgICAgY2xfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgY2xfZGV2aWNlX2lkIGRldmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNsX21lbV9wcm9wZXJ0aWVzX2ludGVsKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBjbF91aW50IGFsaWdubWVudCwKKyAgICAgICAgICAgIGNsX2ludCogZXJyY29kZV9yZXQpOworCit0eXBlZGVmIHZvaWQqIChDTF9BUElfQ0FMTCAqCitjbFNoYXJlZE1lbUFsbG9jSU5URUxfZm4pKAorICAgICAgICAgICAgY2xfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgY2xfZGV2aWNlX2lkIGRldmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNsX21lbV9wcm9wZXJ0aWVzX2ludGVsKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBjbF91aW50IGFsaWdubWVudCwKKyAgICAgICAgICAgIGNsX2ludCogZXJyY29kZV9yZXQpOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xNZW1GcmVlSU5URUwoCisgICAgICAgICAgICBjbF9jb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICB2b2lkKiBwdHIpOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKgorY2xNZW1GcmVlSU5URUxfZm4pKAorICAgICAgICAgICAgY2xfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgdm9pZCogcHRyKTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsTWVtQmxvY2tpbmdGcmVlSU5URUwoCisgICAgICAgICAgICBjbF9jb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICB2b2lkKiBwdHIpOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKgorY2xNZW1CbG9ja2luZ0ZyZWVJTlRFTF9mbikoCisgICAgICAgICAgICBjbF9jb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICB2b2lkKiBwdHIpOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRNZW1BbGxvY0luZm9JTlRFTCgKKyAgICAgICAgICAgIGNsX2NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIHB0ciwKKyAgICAgICAgICAgIGNsX21lbV9pbmZvX2ludGVsIHBhcmFtX25hbWUsCisgICAgICAgICAgICBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgIHZvaWQqIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgc2l6ZV90KiBwYXJhbV92YWx1ZV9zaXplX3JldCk7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqCitjbEdldE1lbUFsbG9jSW5mb0lOVEVMX2ZuKSgKKyAgICAgICAgICAgIGNsX2NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIHB0ciwKKyAgICAgICAgICAgIGNsX21lbV9pbmZvX2ludGVsIHBhcmFtX25hbWUsCisgICAgICAgICAgICBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgIHZvaWQqIHBhcmFtX3ZhbHVlLAorICAgICAgICAgICAgc2l6ZV90KiBwYXJhbV92YWx1ZV9zaXplX3JldCk7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbFNldEtlcm5lbEFyZ01lbVBvaW50ZXJJTlRFTCgKKyAgICAgICAgICAgIGNsX2tlcm5lbCBrZXJuZWwsCisgICAgICAgICAgICBjbF91aW50IGFyZ19pbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIGFyZ192YWx1ZSk7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqCitjbFNldEtlcm5lbEFyZ01lbVBvaW50ZXJJTlRFTF9mbikoCisgICAgICAgICAgICBjbF9rZXJuZWwga2VybmVsLAorICAgICAgICAgICAgY2xfdWludCBhcmdfaW5kZXgsCisgICAgICAgICAgICBjb25zdCB2b2lkKiBhcmdfdmFsdWUpOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlTWVtc2V0SU5URUwoICAgICAgIC8qIERlcHJlY2F0ZWQgKi8KKyAgICAgICAgICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgIHZvaWQqIGRzdF9wdHIsCisgICAgICAgICAgICBjbF9pbnQgdmFsdWUsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICBjb25zdCBjbF9ldmVudCogZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgY2xfZXZlbnQqIGV2ZW50KTsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICoKK2NsRW5xdWV1ZU1lbXNldElOVEVMX2ZuKSggICAvKiBEZXByZWNhdGVkICovCisgICAgICAgICAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICB2b2lkKiBkc3RfcHRyLAorICAgICAgICAgICAgY2xfaW50IHZhbHVlLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQqIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgIGNsX2V2ZW50KiBldmVudCk7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVNZW1GaWxsSU5URUwoCisgICAgICAgICAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICB2b2lkKiBkc3RfcHRyLAorICAgICAgICAgICAgY29uc3Qgdm9pZCogcGF0dGVybiwKKyAgICAgICAgICAgIHNpemVfdCBwYXR0ZXJuX3NpemUsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICBjb25zdCBjbF9ldmVudCogZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgY2xfZXZlbnQqIGV2ZW50KTsKKwordHlwZWRlZiBjbF9pbnQgKENMX0FQSV9DQUxMICoKK2NsRW5xdWV1ZU1lbUZpbGxJTlRFTF9mbikoCisgICAgICAgICAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICB2b2lkKiBkc3RfcHRyLAorICAgICAgICAgICAgY29uc3Qgdm9pZCogcGF0dGVybiwKKyAgICAgICAgICAgIHNpemVfdCBwYXR0ZXJuX3NpemUsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICBjb25zdCBjbF9ldmVudCogZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgY2xfZXZlbnQqIGV2ZW50KTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZU1lbWNweUlOVEVMKAorICAgICAgICAgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgY2xfYm9vbCBibG9ja2luZywKKyAgICAgICAgICAgIHZvaWQqIGRzdF9wdHIsCisgICAgICAgICAgICBjb25zdCB2b2lkKiBzcmNfcHRyLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQqIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgIGNsX2V2ZW50KiBldmVudCk7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqCitjbEVucXVldWVNZW1jcHlJTlRFTF9mbikoCisgICAgICAgICAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICBjbF9ib29sIGJsb2NraW5nLAorICAgICAgICAgICAgdm9pZCogZHN0X3B0ciwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNyY19wdHIsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICBjb25zdCBjbF9ldmVudCogZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgY2xfZXZlbnQqIGV2ZW50KTsKKworI2lmZGVmIENMX1ZFUlNJT05fMV8yCisKKy8qIEJlY2F1c2UgdGhlc2UgQVBJcyB1c2UgY2xfbWVtX21pZ3JhdGlvbl9mbGFncywgdGhleSByZXF1aXJlCisgICBPcGVuQ0wgMS4yOiAqLworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlTWlncmF0ZU1lbUlOVEVMKAorICAgICAgICAgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgY29uc3Qgdm9pZCogcHRyLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBjbF9tZW1fbWlncmF0aW9uX2ZsYWdzIGZsYWdzLAorICAgICAgICAgICAgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50KiBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICBjbF9ldmVudCogZXZlbnQpOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKgorY2xFbnF1ZXVlTWlncmF0ZU1lbUlOVEVMX2ZuKSgKKyAgICAgICAgICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgY2xfbWVtX21pZ3JhdGlvbl9mbGFncyBmbGFncywKKyAgICAgICAgICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgICAgICAgICBjb25zdCBjbF9ldmVudCogZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgY2xfZXZlbnQqIGV2ZW50KTsKKworI2VuZGlmCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVNZW1BZHZpc2VJTlRFTCgKKyAgICAgICAgICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgY2xfbWVtX2FkdmljZV9pbnRlbCBhZHZpY2UsCisgICAgICAgICAgICBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQqIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgIGNsX2V2ZW50KiBldmVudCk7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqCitjbEVucXVldWVNZW1BZHZpc2VJTlRFTF9mbikoCisgICAgICAgICAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICBjb25zdCB2b2lkKiBwdHIsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNsX21lbV9hZHZpY2VfaW50ZWwgYWR2aWNlLAorICAgICAgICAgICAgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgIGNvbnN0IGNsX2V2ZW50KiBldmVudF93YWl0X2xpc3QsCisgICAgICAgICAgICBjbF9ldmVudCogZXZlbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2ludGVsX2NyZWF0ZV9idWZmZXJfd2l0aF9wcm9wZXJ0aWVzIGV4dGVuc2lvbiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGNsX2ludGVsX2NyZWF0ZV9idWZmZXJfd2l0aF9wcm9wZXJ0aWVzIDEKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9tZW0gQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlQnVmZmVyV2l0aFByb3BlcnRpZXNJTlRFTCgKKyAgICBjbF9jb250ZXh0ICAgY29udGV4dCwKKyAgICBjb25zdCBjbF9tZW1fcHJvcGVydGllc19pbnRlbCogcHJvcGVydGllcywKKyAgICBjbF9tZW1fZmxhZ3MgZmxhZ3MsCisgICAgc2l6ZV90ICAgICAgIHNpemUsCisgICAgdm9pZCAqICAgICAgIGhvc3RfcHRyLAorICAgIGNsX2ludCAqICAgICBlcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfbWVtIChDTF9BUElfQ0FMTCAqCitjbENyZWF0ZUJ1ZmZlcldpdGhQcm9wZXJ0aWVzSU5URUxfZm4pKAorICAgIGNsX2NvbnRleHQgICBjb250ZXh0LAorICAgIGNvbnN0IGNsX21lbV9wcm9wZXJ0aWVzX2ludGVsKiBwcm9wZXJ0aWVzLAorICAgIGNsX21lbV9mbGFncyBmbGFncywKKyAgICBzaXplX3QgICAgICAgc2l6ZSwKKyAgICB2b2lkICogICAgICAgaG9zdF9wdHIsCisgICAgY2xfaW50ICogICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF9tZW1fY2hhbm5lbF9wcm9wZXJ0eSBleHRlbnNpb24gKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDTF9NRU1fQ0hBTk5FTF9JTlRFTCAgICAgICAgICAgIDB4NDIxMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNsX2ludGVsX21lbV9mb3JjZV9ob3N0X21lbW9yeSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGNsX2ludGVsX21lbV9mb3JjZV9ob3N0X21lbW9yeSAxCisKKy8qIGNsX21lbV9mbGFncyAqLworI2RlZmluZSBDTF9NRU1fRk9SQ0VfSE9TVF9NRU1PUllfSU5URUwgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY2xfaW50ZWxfY29tbWFuZF9xdWV1ZV9mYW1pbGllcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjbF9pbnRlbF9jb21tYW5kX3F1ZXVlX2ZhbWlsaWVzIDEKKwordHlwZWRlZiBjbF9iaXRmaWVsZCAgICAgICAgIGNsX2NvbW1hbmRfcXVldWVfY2FwYWJpbGl0aWVzX2ludGVsOworCisjZGVmaW5lIENMX1FVRVVFX0ZBTUlMWV9NQVhfTkFNRV9TSVpFX0lOVEVMICAgICAgICAgICAgICAgICA2NAorCit0eXBlZGVmIHN0cnVjdCBfY2xfcXVldWVfZmFtaWx5X3Byb3BlcnRpZXNfaW50ZWwgeworICAgIGNsX2NvbW1hbmRfcXVldWVfcHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgIGNsX2NvbW1hbmRfcXVldWVfY2FwYWJpbGl0aWVzX2ludGVsIGNhcGFiaWxpdGllczsKKyAgICBjbF91aW50IGNvdW50OworICAgIGNoYXIgbmFtZVtDTF9RVUVVRV9GQU1JTFlfTUFYX05BTUVfU0laRV9JTlRFTF07Cit9IGNsX3F1ZXVlX2ZhbWlseV9wcm9wZXJ0aWVzX2ludGVsOworCisvKiBjbF9kZXZpY2VfaW5mbyAqLworI2RlZmluZSBDTF9ERVZJQ0VfUVVFVUVfRkFNSUxZX1BST1BFUlRJRVNfSU5URUwgICAgICAgICAgICAgMHg0MThCCisKKy8qIGNsX3F1ZXVlX3Byb3BlcnRpZXMgKi8KKyNkZWZpbmUgQ0xfUVVFVUVfRkFNSUxZX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDE4QworI2RlZmluZSBDTF9RVUVVRV9JTkRFWF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MThECisKKy8qIGNsX2NvbW1hbmRfcXVldWVfY2FwYWJpbGl0aWVzX2ludGVsICovCisjZGVmaW5lIENMX1FVRVVFX0RFRkFVTFRfQ0FQQUJJTElUSUVTX0lOVEVMICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENMX1FVRVVFX0NBUEFCSUxJVFlfQ1JFQVRFX1NJTkdMRV9RVUVVRV9FVkVOVFNfSU5URUwgKDEgPDwgMCkKKyNkZWZpbmUgQ0xfUVVFVUVfQ0FQQUJJTElUWV9DUkVBVEVfQ1JPU1NfUVVFVUVfRVZFTlRTX0lOVEVMICgxIDw8IDEpCisjZGVmaW5lIENMX1FVRVVFX0NBUEFCSUxJVFlfU0lOR0xFX1FVRVVFX0VWRU5UX1dBSVRfTElTVF9JTlRFTCAoMSA8PCAyKQorI2RlZmluZSBDTF9RVUVVRV9DQVBBQklMSVRZX0NST1NTX1FVRVVFX0VWRU5UX1dBSVRfTElTVF9JTlRFTCAoMSA8PCAzKQorI2RlZmluZSBDTF9RVUVVRV9DQVBBQklMSVRZX1RSQU5TRkVSX0JVRkZFUl9JTlRFTCAgICAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgQ0xfUVVFVUVfQ0FQQUJJTElUWV9UUkFOU0ZFUl9CVUZGRVJfUkVDVF9JTlRFTCAgICAgICgxIDw8IDkpCisjZGVmaW5lIENMX1FVRVVFX0NBUEFCSUxJVFlfTUFQX0JVRkZFUl9JTlRFTCAgICAgICAgICAgICAgICAoMSA8PCAxMCkKKyNkZWZpbmUgQ0xfUVVFVUVfQ0FQQUJJTElUWV9GSUxMX0JVRkZFUl9JTlRFTCAgICAgICAgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBDTF9RVUVVRV9DQVBBQklMSVRZX1RSQU5TRkVSX0lNQUdFX0lOVEVMICAgICAgICAgICAgKDEgPDwgMTIpCisjZGVmaW5lIENMX1FVRVVFX0NBUEFCSUxJVFlfTUFQX0lNQUdFX0lOVEVMICAgICAgICAgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgQ0xfUVVFVUVfQ0FQQUJJTElUWV9GSUxMX0lNQUdFX0lOVEVMICAgICAgICAgICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBDTF9RVUVVRV9DQVBBQklMSVRZX1RSQU5TRkVSX0JVRkZFUl9JTUFHRV9JTlRFTCAgICAgKDEgPDwgMTUpCisjZGVmaW5lIENMX1FVRVVFX0NBUEFCSUxJVFlfVFJBTlNGRVJfSU1BR0VfQlVGRkVSX0lOVEVMICAgICAoMSA8PCAxNikKKyNkZWZpbmUgQ0xfUVVFVUVfQ0FQQUJJTElUWV9NQVJLRVJfSU5URUwgICAgICAgICAgICAgICAgICAgICgxIDw8IDI0KQorI2RlZmluZSBDTF9RVUVVRV9DQVBBQklMSVRZX0JBUlJJRVJfSU5URUwgICAgICAgICAgICAgICAgICAgKDEgPDwgMjUpCisjZGVmaW5lIENMX1FVRVVFX0NBUEFCSUxJVFlfS0VSTkVMX0lOVEVMICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNikKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX19DTF9FWFRfSCAqLwpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML2NsX2V4dF9pbnRlbC5oIGIvT3BlbkNML0NML2NsX2V4dF9pbnRlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YWU4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuQ0wvQ0wvY2xfZXh0X2ludGVsLmgKQEAgLTAsMCArMSwxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDIwIFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxDTC9jbF9leHQuaD4KKyNwcmFnbWEgbWVzc2FnZSgiVGhlIEludGVsIGV4dGVuc2lvbnMgaGF2ZSBiZWVuIG1vdmVkIGludG8gY2xfZXh0LmguICBQbGVhc2UgaW5jbHVkZSBjbF9leHQuaCBkaXJlY3RseS4iKQpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML2NsX2dsLmggYi9PcGVuQ0wvQ0wvY2xfZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWEwZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlbkNML0NML2NsX2dsLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAyMSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19PUEVOQ0xfQ0xfR0xfSAorI2RlZmluZSBfX09QRU5DTF9DTF9HTF9ICisKKyNpbmNsdWRlIDxDTC9jbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgY2xfdWludCAgICAgY2xfZ2xfb2JqZWN0X3R5cGU7Cit0eXBlZGVmIGNsX3VpbnQgICAgIGNsX2dsX3RleHR1cmVfaW5mbzsKK3R5cGVkZWYgY2xfdWludCAgICAgY2xfZ2xfcGxhdGZvcm1faW5mbzsKK3R5cGVkZWYgc3RydWN0IF9fR0xzeW5jICpjbF9HTHN5bmM7CisKKy8qIGNsX2dsX29iamVjdF90eXBlID0gMHgyMDAwIC0gMHgyMDBGIGVudW0gdmFsdWVzIGFyZSBjdXJyZW50bHkgdGFrZW4gICAgICAgICAgICovCisjZGVmaW5lIENMX0dMX09CSkVDVF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgQ0xfR0xfT0JKRUNUX1RFWFRVUkUyRCAgICAgICAgICAgICAgICAgIDB4MjAwMQorI2RlZmluZSBDTF9HTF9PQkpFQ1RfVEVYVFVSRTNEICAgICAgICAgICAgICAgICAgMHgyMDAyCisjZGVmaW5lIENMX0dMX09CSkVDVF9SRU5ERVJCVUZGRVIgICAgICAgICAgICAgICAweDIwMDMKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9HTF9PQkpFQ1RfVEVYVFVSRTJEX0FSUkFZICAgICAgICAgICAgMHgyMDBFCisjZGVmaW5lIENMX0dMX09CSkVDVF9URVhUVVJFMUQgICAgICAgICAgICAgICAgICAweDIwMEYKKyNkZWZpbmUgQ0xfR0xfT0JKRUNUX1RFWFRVUkUxRF9BUlJBWSAgICAgICAgICAgIDB4MjAxMAorI2RlZmluZSBDTF9HTF9PQkpFQ1RfVEVYVFVSRV9CVUZGRVIgICAgICAgICAgICAgMHgyMDExCisjZW5kaWYKKworLyogY2xfZ2xfdGV4dHVyZV9pbmZvICAgICAgICAgICAqLworI2RlZmluZSBDTF9HTF9URVhUVVJFX1RBUkdFVCAgICAgICAgICAgICAgICAgICAgMHgyMDA0CisjZGVmaW5lIENMX0dMX01JUE1BUF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAweDIwMDUKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorI2RlZmluZSBDTF9HTF9OVU1fU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEyCisjZW5kaWYKKworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX21lbSBDTF9BUElfQ0FMTAorY2xDcmVhdGVGcm9tR0xCdWZmZXIoY2xfY29udGV4dCAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGNsX21lbV9mbGFncyAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgY2xfR0x1aW50ICAgICAgYnVmb2JqLAorICAgICAgICAgICAgICAgICAgICAgY2xfaW50ICogICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9tZW0gQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlRnJvbUdMVGV4dHVyZShjbF9jb250ZXh0ICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBjbF9tZW1fZmxhZ3MgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY2xfR0xlbnVtICAgICAgIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICBjbF9HTGludCAgICAgICAgbWlwbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgY2xfR0x1aW50ICAgICAgIHRleHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgY2xfaW50ICogICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2VuZGlmCisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfbWVtIENMX0FQSV9DQUxMCitjbENyZWF0ZUZyb21HTFJlbmRlcmJ1ZmZlcihjbF9jb250ZXh0ICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX21lbV9mbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX0dMdWludCAgICByZW5kZXJidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRHTE9iamVjdEluZm8oY2xfbWVtICAgICAgICAgICAgICAgIG1lbW9iaiwKKyAgICAgICAgICAgICAgICAgIGNsX2dsX29iamVjdF90eXBlICogICBnbF9vYmplY3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgIGNsX0dMdWludCAqICAgICAgICAgICBnbF9vYmplY3RfbmFtZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEdldEdMVGV4dHVyZUluZm8oY2xfbWVtICAgICAgICAgICAgICAgbWVtb2JqLAorICAgICAgICAgICAgICAgICAgIGNsX2dsX3RleHR1cmVfaW5mbyAgIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgKiAgICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMCitjbEVucXVldWVBY3F1aXJlR0xPYmplY3RzKGNsX2NvbW1hbmRfcXVldWUgICAgICBjb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX21lbSAqICAgICAgICBtZW1fb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgIG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9ldmVudCAqICAgICAgZXZlbnRfd2FpdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ldmVudCAqICAgICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xFbnF1ZXVlUmVsZWFzZUdMT2JqZWN0cyhjbF9jb21tYW5kX3F1ZXVlICAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAgICAgICAgICAgICAgIG51bV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbF9tZW0gKiAgICAgICAgbWVtX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfZXZlbnQgKiAgICAgIGV2ZW50X3dhaXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZXZlbnQgKiAgICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworCisvKiBEZXByZWNhdGVkIE9wZW5DTCAxLjEgQVBJcyAqLworZXh0ZXJuIENMX0FQSV9FTlRSWSBDTF9BUElfUFJFRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEIGNsX21lbSBDTF9BUElfQ0FMTAorY2xDcmVhdGVGcm9tR0xUZXh0dXJlMkQoY2xfY29udGV4dCAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW1fZmxhZ3MgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9HTGVudW0gICAgICAgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfR0xpbnQgICAgICAgIG1pcGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfR0x1aW50ICAgICAgIHRleHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbnQgKiAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQ7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8xXzFfREVQUkVDQVRFRCBjbF9tZW0gQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlRnJvbUdMVGV4dHVyZTNEKGNsX2NvbnRleHQgICAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfbWVtX2ZsYWdzICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfR0xlbnVtICAgICAgIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsX0dMaW50ICAgICAgICBtaXBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsX0dMdWludCAgICAgICB0ZXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xfaW50ICogICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEOworCisvKiBjbF9raHJfZ2xfc2hhcmluZyBleHRlbnNpb24gICovCisKKyNkZWZpbmUgY2xfa2hyX2dsX3NoYXJpbmcgMQorCit0eXBlZGVmIGNsX3VpbnQgICAgIGNsX2dsX2NvbnRleHRfaW5mbzsKKworLyogQWRkaXRpb25hbCBFcnJvciBDb2RlcyAgKi8KKyNkZWZpbmUgQ0xfSU5WQUxJRF9HTF9TSEFSRUdST1VQX1JFRkVSRU5DRV9LSFIgIC0xMDAwCisKKy8qIGNsX2dsX2NvbnRleHRfaW5mbyAgKi8KKyNkZWZpbmUgQ0xfQ1VSUkVOVF9ERVZJQ0VfRk9SX0dMX0NPTlRFWFRfS0hSICAgIDB4MjAwNgorI2RlZmluZSBDTF9ERVZJQ0VTX0ZPUl9HTF9DT05URVhUX0tIUiAgICAgICAgICAgMHgyMDA3CisKKy8qIEFkZGl0aW9uYWwgY2xfY29udGV4dF9wcm9wZXJ0aWVzICAqLworI2RlZmluZSBDTF9HTF9DT05URVhUX0tIUiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA4CisjZGVmaW5lIENMX0VHTF9ESVNQTEFZX0tIUiAgICAgICAgICAgICAgICAgICAgICAweDIwMDkKKyNkZWZpbmUgQ0xfR0xYX0RJU1BMQVlfS0hSICAgICAgICAgICAgICAgICAgICAgIDB4MjAwQQorI2RlZmluZSBDTF9XR0xfSERDX0tIUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBCCisjZGVmaW5lIENMX0NHTF9TSEFSRUdST1VQX0tIUiAgICAgICAgICAgICAgICAgICAweDIwMEMKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0R0xDb250ZXh0SW5mb0tIUihjb25zdCBjbF9jb250ZXh0X3Byb3BlcnRpZXMgKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgIGNsX2dsX2NvbnRleHRfaW5mbyAgICAgICAgICAgIHBhcmFtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50IChDTF9BUElfQ0FMTCAqY2xHZXRHTENvbnRleHRJbmZvS0hSX2ZuKSgKKyAgICBjb25zdCBjbF9jb250ZXh0X3Byb3BlcnRpZXMgKiBwcm9wZXJ0aWVzLAorICAgIGNsX2dsX2NvbnRleHRfaW5mbyAgICAgICAgICAgIHBhcmFtX25hbWUsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICB2b2lkICogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZSwKKyAgICBzaXplX3QgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbV92YWx1ZV9zaXplX3JldCk7CisKKy8qIAorICogIGNsX2tocl9nbF9ldmVudCBleHRlbnNpb24KKyAqLworI2RlZmluZSBDTF9DT01NQU5EX0dMX0ZFTkNFX1NZTkNfT0JKRUNUX0tIUiAgICAgMHgyMDBECisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfZXZlbnQgQ0xfQVBJX0NBTEwKK2NsQ3JlYXRlRXZlbnRGcm9tR0xzeW5jS0hSKGNsX2NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX0dMc3luYyAgc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ludCAqICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fT1BFTkNMX0NMX0dMX0ggKi8KZGlmZiAtLWdpdCBhL09wZW5DTC9DTC9jbF9nbF9leHQuaCBiL09wZW5DTC9DTC9jbF9nbF9leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWM4MTgxCi0tLSAvZGV2L251bGwKKysrIGIvT3BlbkNML0NML2NsX2dsX2V4dC5oCkBAIC0wLDAgKzEsMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAyMSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxDTC9jbF9nbC5oPgorI3ByYWdtYSBtZXNzYWdlKCJBbGwgT3BlbkdMLXJlbGF0ZWQgZXh0ZW5zaW9ucyBoYXZlIGJlZW4gbW92ZWQgaW50byBjbF9nbC5oLiAgUGxlYXNlIGluY2x1ZGUgY2xfZ2wuaCBkaXJlY3RseS4iKQpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML2NsX2hhbGYuaCBiL09wZW5DTC9DTC9jbF9oYWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjNDIyMwotLS0gL2Rldi9udWxsCisrKyBiL09wZW5DTC9DTC9jbF9oYWxmLmgKQEAgLTAsMCArMSw0NDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpcyBhIGhlYWRlci1vbmx5IHV0aWxpdHkgbGlicmFyeSB0aGF0IHByb3ZpZGVzIE9wZW5DTCBob3N0IGNvZGUgd2l0aAorICogcm91dGluZXMgZm9yIGNvbnZlcnRpbmcgdG8vZnJvbSBjbF9oYWxmIHZhbHVlcy4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICoKKyAqICAgICNpbmNsdWRlIDxDTC9jbF9oYWxmLmg+CisgKiAgICAuLi4KKyAqICAgIGNsX2hhbGYgaCA9IGNsX2hhbGZfZnJvbV9mbG9hdCgwLjVmLCBDTF9IQUxGX1JURSk7CisgKiAgICBjbF9mbG9hdCBmID0gY2xfaGFsZl90b19mbG9hdChoKTsKKyAqLworCisjaWZuZGVmIE9QRU5DTF9DTF9IQUxGX0gKKyNkZWZpbmUgT1BFTkNMX0NMX0hBTEZfSAorCisjaW5jbHVkZSA8Q0wvY2xfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqCisgKiBSb3VuZGluZyBtb2RlIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHRvIGNsX2hhbGYuCisgKi8KK3R5cGVkZWYgZW51bQoreworICBDTF9IQUxGX1JURSwgLy8gcm91bmQgdG8gbmVhcmVzdCBldmVuCisgIENMX0hBTEZfUlRaLCAvLyByb3VuZCB0b3dhcmRzIHplcm8KKyAgQ0xfSEFMRl9SVFAsIC8vIHJvdW5kIHRvd2FyZHMgcG9zaXRpdmUgaW5maW5pdHkKKyAgQ0xfSEFMRl9SVE4sIC8vIHJvdW5kIHRvd2FyZHMgbmVnYXRpdmUgaW5maW5pdHkKK30gY2xfaGFsZl9yb3VuZGluZ19tb2RlOworCisKKy8qIFByaXZhdGUgdXRpbGl0eSBtYWNyb3MuICovCisjZGVmaW5lIENMX0hBTEZfRVhQX01BU0sgMHg3QzAwCisjZGVmaW5lIENMX0hBTEZfTUFYX0ZJTklURV9NQUcgMHg3QkZGCisKKworLyoKKyAqIFV0aWxpdHkgdG8gZGVhbCB3aXRoIHZhbHVlcyB0aGF0IG92ZXJmbG93IHdoZW4gY29udmVydGluZyB0byBoYWxmIHByZWNpc2lvbi4KKyAqLworc3RhdGljIGlubGluZSBjbF9oYWxmIGNsX2hhbGZfaGFuZGxlX292ZXJmbG93KGNsX2hhbGZfcm91bmRpbmdfbW9kZSByb3VuZGluZ19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNpZ24pCit7CisgIGlmIChyb3VuZGluZ19tb2RlID09IENMX0hBTEZfUlRaKQorICB7CisgICAgLy8gUm91bmQgb3ZlcmZsb3cgdG93YXJkcyB6ZXJvIC0+IGxhcmdlc3QgZmluaXRlIG51bWJlciAocHJlc2VydmluZyBzaWduKQorICAgIHJldHVybiAoc2lnbiA8PCAxNSkgfCBDTF9IQUxGX01BWF9GSU5JVEVfTUFHOworICB9CisgIGVsc2UgaWYgKHJvdW5kaW5nX21vZGUgPT0gQ0xfSEFMRl9SVFAgJiYgc2lnbikKKyAgeworICAgIC8vIFJvdW5kIG5lZ2F0aXZlIG92ZXJmbG93IHRvd2FyZHMgcG9zaXRpdmUgaW5maW5pdHkgLT4gbW9zdCBuZWdhdGl2ZSBmaW5pdGUgbnVtYmVyCisgICAgcmV0dXJuICgxIDw8IDE1KSB8IENMX0hBTEZfTUFYX0ZJTklURV9NQUc7CisgIH0KKyAgZWxzZSBpZiAocm91bmRpbmdfbW9kZSA9PSBDTF9IQUxGX1JUTiAmJiAhc2lnbikKKyAgeworICAgIC8vIFJvdW5kIHBvc2l0aXZlIG92ZXJmbG93IHRvd2FyZHMgbmVnYXRpdmUgaW5maW5pdHkgLT4gbGFyZ2VzdCBmaW5pdGUgbnVtYmVyCisgICAgcmV0dXJuIENMX0hBTEZfTUFYX0ZJTklURV9NQUc7CisgIH0KKworICAvLyBPdmVyZmxvdyB0byBpbmZpbml0eQorICByZXR1cm4gKHNpZ24gPDwgMTUpIHwgQ0xfSEFMRl9FWFBfTUFTSzsKK30KKworLyoKKyAqIFV0aWxpdHkgdG8gZGVhbCB3aXRoIHZhbHVlcyB0aGF0IHVuZGVyZmxvdyB3aGVuIGNvbnZlcnRpbmcgdG8gaGFsZiBwcmVjaXNpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgY2xfaGFsZiBjbF9oYWxmX2hhbmRsZV91bmRlcmZsb3coY2xfaGFsZl9yb3VuZGluZ19tb2RlIHJvdW5kaW5nX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNpZ24pCit7CisgIGlmIChyb3VuZGluZ19tb2RlID09IENMX0hBTEZfUlRQICYmICFzaWduKQorICB7CisgICAgLy8gUm91bmQgdW5kZXJmbG93IHRvd2FyZHMgcG9zaXRpdmUgaW5maW5pdHkgLT4gc21hbGxlc3QgcG9zaXRpdmUgdmFsdWUKKyAgICByZXR1cm4gKHNpZ24gPDwgMTUpIHwgMTsKKyAgfQorICBlbHNlIGlmIChyb3VuZGluZ19tb2RlID09IENMX0hBTEZfUlROICYmIHNpZ24pCisgIHsKKyAgICAvLyBSb3VuZCB1bmRlcmZsb3cgdG93YXJkcyBuZWdhdGl2ZSBpbmZpbml0eSAtPiBsYXJnZXN0IG5lZ2F0aXZlIHZhbHVlCisgICAgcmV0dXJuIChzaWduIDw8IDE1KSB8IDE7CisgIH0KKworICAvLyBGbHVzaCB0byB6ZXJvCisgIHJldHVybiAoc2lnbiA8PCAxNSk7Cit9CisKKworLyoqCisgKiBDb252ZXJ0IGEgY2xfZmxvYXQgdG8gYSBjbF9oYWxmLgorICovCitzdGF0aWMgaW5saW5lIGNsX2hhbGYgY2xfaGFsZl9mcm9tX2Zsb2F0KGNsX2Zsb2F0IGYsIGNsX2hhbGZfcm91bmRpbmdfbW9kZSByb3VuZGluZ19tb2RlKQoreworICAvLyBUeXBlLXB1bm5pbmcgdG8gZ2V0IGRpcmVjdCBhY2Nlc3MgdG8gdW5kZXJseWluZyBiaXRzCisgIHVuaW9uCisgIHsKKyAgICBjbF9mbG9hdCBmOworICAgIHVpbnQzMl90IGk7CisgIH0gZjMyOworICBmMzIuZiA9IGY7CisKKyAgLy8gRXh0cmFjdCBzaWduIGJpdAorICB1aW50MTZfdCBzaWduID0gZjMyLmkgPj4gMzE7CisKKyAgLy8gRXh0cmFjdCBGUDMyIGV4cG9uZW50IGFuZCBtYW50aXNzYQorICB1aW50MzJfdCBmX2V4cCA9IChmMzIuaSA+PiAoQ0xfRkxUX01BTlRfRElHIC0gMSkpICYgMHhGRjsKKyAgdWludDMyX3QgZl9tYW50ID0gZjMyLmkgJiAoKDEgPDwgKENMX0ZMVF9NQU5UX0RJRyAtIDEpKSAtIDEpOworCisgIC8vIFJlbW92ZSBGUDMyIGV4cG9uZW50IGJpYXMKKyAgaW50MzJfdCBleHAgPSBmX2V4cCAtIENMX0ZMVF9NQVhfRVhQICsgMTsKKworICAvLyBBZGQgRlAxNiBleHBvbmVudCBiaWFzCisgIHVpbnQxNl90IGhfZXhwID0gKHVpbnQxNl90KShleHAgKyBDTF9IQUxGX01BWF9FWFAgLSAxKTsKKworICAvLyBQb3NpdGlvbiBvZiB0aGUgYml0IHRoYXQgd2lsbCBiZWNvbWUgdGhlIEZQMTYgbWFudGlzc2EgTFNCCisgIHVpbnQzMl90IGxzYl9wb3MgPSBDTF9GTFRfTUFOVF9ESUcgLSBDTF9IQUxGX01BTlRfRElHOworCisgIC8vIENoZWNrIGZvciBOYU4gLyBpbmZpbml0eQorICBpZiAoZl9leHAgPT0gMHhGRikKKyAgeworICAgIGlmIChmX21hbnQpCisgICAgeworICAgICAgLy8gTmFOIC0+IHByb3BhZ2F0ZSBtYW50aXNzYSBhbmQgc2lsZW5jZSBpdAorICAgICAgdWludDE2X3QgaF9tYW50ID0gKHVpbnQxNl90KShmX21hbnQgPj4gbHNiX3Bvcyk7CisgICAgICBoX21hbnQgfD0gMHgyMDA7CisgICAgICByZXR1cm4gKHNpZ24gPDwgMTUpIHwgQ0xfSEFMRl9FWFBfTUFTSyB8IGhfbWFudDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIEluZmluaXR5IC0+IHplcm8gbWFudGlzc2EKKyAgICAgIHJldHVybiAoc2lnbiA8PCAxNSkgfCBDTF9IQUxGX0VYUF9NQVNLOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIGZvciB6ZXJvCisgIGlmICghZl9leHAgJiYgIWZfbWFudCkKKyAgeworICAgIHJldHVybiAoc2lnbiA8PCAxNSk7CisgIH0KKworICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKKyAgaWYgKGV4cCA+PSBDTF9IQUxGX01BWF9FWFApCisgIHsKKyAgICByZXR1cm4gY2xfaGFsZl9oYW5kbGVfb3ZlcmZsb3cocm91bmRpbmdfbW9kZSwgc2lnbik7CisgIH0KKworICAvLyBDaGVjayBmb3IgdW5kZXJmbG93CisgIGlmIChleHAgPCAoQ0xfSEFMRl9NSU5fRVhQIC0gQ0xfSEFMRl9NQU5UX0RJRyAtIDEpKQorICB7CisgICAgcmV0dXJuIGNsX2hhbGZfaGFuZGxlX3VuZGVyZmxvdyhyb3VuZGluZ19tb2RlLCBzaWduKTsKKyAgfQorCisgIC8vIENoZWNrIGZvciB2YWx1ZSB0aGF0IHdpbGwgYmVjb21lIGRlbm9ybWFsCisgIGlmIChleHAgPCAtMTQpCisgIHsKKyAgICAvLyBEZW5vcm1hbCAtPiBpbmNsdWRlIHRoZSBpbXBsaWNpdCAxIGZyb20gdGhlIEZQMzIgbWFudGlzc2EKKyAgICBoX2V4cCA9IDA7CisgICAgZl9tYW50IHw9IDEgPDwgKENMX0ZMVF9NQU5UX0RJRyAtIDEpOworCisgICAgLy8gTWFudGlzc2Egc2hpZnQgYW1vdW50IGRlcGVuZHMgb24gZXhwb25lbnQKKyAgICBsc2JfcG9zID0gLWV4cCArIChDTF9GTFRfTUFOVF9ESUcgLSAyNSk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBGUDE2IG1hbnRpc3NhIGJ5IHNoaWZ0aW5nIEZQMzIgbWFudGlzc2EKKyAgdWludDE2X3QgaF9tYW50ID0gKHVpbnQxNl90KShmX21hbnQgPj4gbHNiX3Bvcyk7CisKKyAgLy8gQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHJvdW5kCisgIHVpbnQzMl90IGhhbGZ3YXkgPSAxIDw8IChsc2JfcG9zIC0gMSk7CisgIHVpbnQzMl90IG1hc2sgPSAoaGFsZndheSA8PCAxKSAtIDE7CisgIHN3aXRjaCAocm91bmRpbmdfbW9kZSkKKyAgeworICAgIGNhc2UgQ0xfSEFMRl9SVEU6CisgICAgICBpZiAoKGZfbWFudCAmIG1hc2spID4gaGFsZndheSkKKyAgICAgIHsKKyAgICAgICAgLy8gTW9yZSB0aGFuIGhhbGZ3YXkgLT4gcm91bmQgdXAKKyAgICAgICAgaF9tYW50ICs9IDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoZl9tYW50ICYgbWFzaykgPT0gaGFsZndheSkKKyAgICAgIHsKKyAgICAgICAgLy8gRXhhY3RseSBoYWxmd2F5IC0+IHJvdW5kIHRvIG5lYXJlc3QgZXZlbgorICAgICAgICBpZiAoaF9tYW50ICYgMHgxKQorICAgICAgICAgIGhfbWFudCArPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDTF9IQUxGX1JUWjoKKyAgICAgIC8vIE1hbnRpc3NhIGhhcyBhbHJlYWR5IGJlZW4gdHJ1bmNhdGVkIC0+IGRvIG5vdGhpbmcKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0xfSEFMRl9SVFA6CisgICAgICBpZiAoKGZfbWFudCAmIG1hc2spICYmICFzaWduKQorICAgICAgeworICAgICAgICAvLyBSb3VuZCBwb3NpdGl2ZSBudW1iZXJzIHVwCisgICAgICAgIGhfbWFudCArPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDTF9IQUxGX1JUTjoKKyAgICAgIGlmICgoZl9tYW50ICYgbWFzaykgJiYgc2lnbikKKyAgICAgIHsKKyAgICAgICAgLy8gUm91bmQgbmVnYXRpdmUgbnVtYmVycyBkb3duCisgICAgICAgIGhfbWFudCArPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICAvLyBDaGVjayBmb3IgbWFudGlzc2Egb3ZlcmZsb3cKKyAgaWYgKGhfbWFudCAmIDB4NDAwKQorICB7CisgICAgaF9leHAgKz0gMTsKKyAgICBoX21hbnQgPSAwOworICB9CisKKyAgcmV0dXJuIChzaWduIDw8IDE1KSB8IChoX2V4cCA8PCAxMCkgfCBoX21hbnQ7Cit9CisKKworLyoqCisgKiBDb252ZXJ0IGEgY2xfZG91YmxlIHRvIGEgY2xfaGFsZi4KKyAqLworc3RhdGljIGlubGluZSBjbF9oYWxmIGNsX2hhbGZfZnJvbV9kb3VibGUoY2xfZG91YmxlIGQsIGNsX2hhbGZfcm91bmRpbmdfbW9kZSByb3VuZGluZ19tb2RlKQoreworICAvLyBUeXBlLXB1bm5pbmcgdG8gZ2V0IGRpcmVjdCBhY2Nlc3MgdG8gdW5kZXJseWluZyBiaXRzCisgIHVuaW9uCisgIHsKKyAgICBjbF9kb3VibGUgZDsKKyAgICB1aW50NjRfdCBpOworICB9IGY2NDsKKyAgZjY0LmQgPSBkOworCisgIC8vIEV4dHJhY3Qgc2lnbiBiaXQKKyAgdWludDE2X3Qgc2lnbiA9IGY2NC5pID4+IDYzOworCisgIC8vIEV4dHJhY3QgRlA2NCBleHBvbmVudCBhbmQgbWFudGlzc2EKKyAgdWludDY0X3QgZF9leHAgPSAoZjY0LmkgPj4gKENMX0RCTF9NQU5UX0RJRyAtIDEpKSAmIDB4N0ZGOworICB1aW50NjRfdCBkX21hbnQgPSBmNjQuaSAmICgoKHVpbnQ2NF90KTEgPDwgKENMX0RCTF9NQU5UX0RJRyAtIDEpKSAtIDEpOworCisgIC8vIFJlbW92ZSBGUDY0IGV4cG9uZW50IGJpYXMKKyAgaW50NjRfdCBleHAgPSBkX2V4cCAtIENMX0RCTF9NQVhfRVhQICsgMTsKKworICAvLyBBZGQgRlAxNiBleHBvbmVudCBiaWFzCisgIHVpbnQxNl90IGhfZXhwID0gKHVpbnQxNl90KShleHAgKyBDTF9IQUxGX01BWF9FWFAgLSAxKTsKKworICAvLyBQb3NpdGlvbiBvZiB0aGUgYml0IHRoYXQgd2lsbCBiZWNvbWUgdGhlIEZQMTYgbWFudGlzc2EgTFNCCisgIHVpbnQzMl90IGxzYl9wb3MgPSBDTF9EQkxfTUFOVF9ESUcgLSBDTF9IQUxGX01BTlRfRElHOworCisgIC8vIENoZWNrIGZvciBOYU4gLyBpbmZpbml0eQorICBpZiAoZF9leHAgPT0gMHg3RkYpCisgIHsKKyAgICBpZiAoZF9tYW50KQorICAgIHsKKyAgICAgIC8vIE5hTiAtPiBwcm9wYWdhdGUgbWFudGlzc2EgYW5kIHNpbGVuY2UgaXQKKyAgICAgIHVpbnQxNl90IGhfbWFudCA9ICh1aW50MTZfdCkoZF9tYW50ID4+IGxzYl9wb3MpOworICAgICAgaF9tYW50IHw9IDB4MjAwOworICAgICAgcmV0dXJuIChzaWduIDw8IDE1KSB8IENMX0hBTEZfRVhQX01BU0sgfCBoX21hbnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBJbmZpbml0eSAtPiB6ZXJvIG1hbnRpc3NhCisgICAgICByZXR1cm4gKHNpZ24gPDwgMTUpIHwgQ0xfSEFMRl9FWFBfTUFTSzsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3IgemVybworICBpZiAoIWRfZXhwICYmICFkX21hbnQpCisgIHsKKyAgICByZXR1cm4gKHNpZ24gPDwgMTUpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93CisgIGlmIChleHAgPj0gQ0xfSEFMRl9NQVhfRVhQKQorICB7CisgICAgcmV0dXJuIGNsX2hhbGZfaGFuZGxlX292ZXJmbG93KHJvdW5kaW5nX21vZGUsIHNpZ24pOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIHVuZGVyZmxvdworICBpZiAoZXhwIDwgKENMX0hBTEZfTUlOX0VYUCAtIENMX0hBTEZfTUFOVF9ESUcgLSAxKSkKKyAgeworICAgIHJldHVybiBjbF9oYWxmX2hhbmRsZV91bmRlcmZsb3cocm91bmRpbmdfbW9kZSwgc2lnbik7CisgIH0KKworICAvLyBDaGVjayBmb3IgdmFsdWUgdGhhdCB3aWxsIGJlY29tZSBkZW5vcm1hbAorICBpZiAoZXhwIDwgLTE0KQorICB7CisgICAgLy8gSW5jbHVkZSB0aGUgaW1wbGljaXQgMSBmcm9tIHRoZSBGUDY0IG1hbnRpc3NhCisgICAgaF9leHAgPSAwOworICAgIGRfbWFudCB8PSAodWludDY0X3QpMSA8PCAoQ0xfREJMX01BTlRfRElHIC0gMSk7CisKKyAgICAvLyBNYW50aXNzYSBzaGlmdCBhbW91bnQgZGVwZW5kcyBvbiBleHBvbmVudAorICAgIGxzYl9wb3MgPSAodWludDMyX3QpKC1leHAgKyAoQ0xfREJMX01BTlRfRElHIC0gMjUpKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIEZQMTYgbWFudGlzc2EgYnkgc2hpZnRpbmcgRlA2NCBtYW50aXNzYQorICB1aW50MTZfdCBoX21hbnQgPSAodWludDE2X3QpKGRfbWFudCA+PiBsc2JfcG9zKTsKKworICAvLyBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gcm91bmQKKyAgdWludDY0X3QgaGFsZndheSA9ICh1aW50NjRfdCkxIDw8IChsc2JfcG9zIC0gMSk7CisgIHVpbnQ2NF90IG1hc2sgPSAoaGFsZndheSA8PCAxKSAtIDE7CisgIHN3aXRjaCAocm91bmRpbmdfbW9kZSkKKyAgeworICAgIGNhc2UgQ0xfSEFMRl9SVEU6CisgICAgICBpZiAoKGRfbWFudCAmIG1hc2spID4gaGFsZndheSkKKyAgICAgIHsKKyAgICAgICAgLy8gTW9yZSB0aGFuIGhhbGZ3YXkgLT4gcm91bmQgdXAKKyAgICAgICAgaF9tYW50ICs9IDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoZF9tYW50ICYgbWFzaykgPT0gaGFsZndheSkKKyAgICAgIHsKKyAgICAgICAgLy8gRXhhY3RseSBoYWxmd2F5IC0+IHJvdW5kIHRvIG5lYXJlc3QgZXZlbgorICAgICAgICBpZiAoaF9tYW50ICYgMHgxKQorICAgICAgICAgIGhfbWFudCArPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDTF9IQUxGX1JUWjoKKyAgICAgIC8vIE1hbnRpc3NhIGhhcyBhbHJlYWR5IGJlZW4gdHJ1bmNhdGVkIC0+IGRvIG5vdGhpbmcKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0xfSEFMRl9SVFA6CisgICAgICBpZiAoKGRfbWFudCAmIG1hc2spICYmICFzaWduKQorICAgICAgeworICAgICAgICAvLyBSb3VuZCBwb3NpdGl2ZSBudW1iZXJzIHVwCisgICAgICAgIGhfbWFudCArPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDTF9IQUxGX1JUTjoKKyAgICAgIGlmICgoZF9tYW50ICYgbWFzaykgJiYgc2lnbikKKyAgICAgIHsKKyAgICAgICAgLy8gUm91bmQgbmVnYXRpdmUgbnVtYmVycyBkb3duCisgICAgICAgIGhfbWFudCArPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICAvLyBDaGVjayBmb3IgbWFudGlzc2Egb3ZlcmZsb3cKKyAgaWYgKGhfbWFudCAmIDB4NDAwKQorICB7CisgICAgaF9leHAgKz0gMTsKKyAgICBoX21hbnQgPSAwOworICB9CisKKyAgcmV0dXJuIChzaWduIDw8IDE1KSB8IChoX2V4cCA8PCAxMCkgfCBoX21hbnQ7Cit9CisKKworLyoqCisgKiBDb252ZXJ0IGEgY2xfaGFsZiB0byBhIGNsX2Zsb2F0LgorICovCitzdGF0aWMgaW5saW5lIGNsX2Zsb2F0IGNsX2hhbGZfdG9fZmxvYXQoY2xfaGFsZiBoKQoreworICAvLyBUeXBlLXB1bm5pbmcgdG8gZ2V0IGRpcmVjdCBhY2Nlc3MgdG8gdW5kZXJseWluZyBiaXRzCisgIHVuaW9uCisgIHsKKyAgICBjbF9mbG9hdCBmOworICAgIHVpbnQzMl90IGk7CisgIH0gZjMyOworCisgIC8vIEV4dHJhY3Qgc2lnbiBiaXQKKyAgdWludDE2X3Qgc2lnbiA9IGggPj4gMTU7CisKKyAgLy8gRXh0cmFjdCBGUDE2IGV4cG9uZW50IGFuZCBtYW50aXNzYQorICB1aW50MTZfdCBoX2V4cCA9IChoID4+IChDTF9IQUxGX01BTlRfRElHIC0gMSkpICYgMHgxRjsKKyAgdWludDE2X3QgaF9tYW50ID0gaCAmIDB4M0ZGOworCisgIC8vIFJlbW92ZSBGUDE2IGV4cG9uZW50IGJpYXMKKyAgaW50MzJfdCBleHAgPSBoX2V4cCAtIENMX0hBTEZfTUFYX0VYUCArIDE7CisKKyAgLy8gQWRkIEZQMzIgZXhwb25lbnQgYmlhcworICB1aW50MzJfdCBmX2V4cCA9IGV4cCArIENMX0ZMVF9NQVhfRVhQIC0gMTsKKworICAvLyBDaGVjayBmb3IgTmFOIC8gaW5maW5pdHkKKyAgaWYgKGhfZXhwID09IDB4MUYpCisgIHsKKyAgICBpZiAoaF9tYW50KQorICAgIHsKKyAgICAgIC8vIE5hTiAtPiBwcm9wYWdhdGUgbWFudGlzc2EgYW5kIHNpbGVuY2UgaXQKKyAgICAgIHVpbnQzMl90IGZfbWFudCA9IGhfbWFudCA8PCAoQ0xfRkxUX01BTlRfRElHIC0gQ0xfSEFMRl9NQU5UX0RJRyk7CisgICAgICBmX21hbnQgfD0gMHg0MDAwMDA7CisgICAgICBmMzIuaSA9IChzaWduIDw8IDMxKSB8IDB4N0Y4MDAwMDAgfCBmX21hbnQ7CisgICAgICByZXR1cm4gZjMyLmY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBJbmZpbml0eSAtPiB6ZXJvIG1hbnRpc3NhCisgICAgICBmMzIuaSA9IChzaWduIDw8IDMxKSB8IDB4N0Y4MDAwMDA7CisgICAgICByZXR1cm4gZjMyLmY7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgZm9yIHplcm8gLyBkZW5vcm1hbAorICBpZiAoaF9leHAgPT0gMCkKKyAgeworICAgIGlmIChoX21hbnQgPT0gMCkKKyAgICB7CisgICAgICAvLyBaZXJvIC0+IHplcm8gZXhwb25lbnQKKyAgICAgIGZfZXhwID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIERlbm9ybWFsIC0+IG5vcm1hbGl6ZSBpdAorICAgICAgLy8gLSBTaGlmdCBtYW50aXNzYSB0byBtYWtlIG1vc3Qtc2lnbmlmaWNhbnQgMSBpbXBsaWNpdAorICAgICAgLy8gLSBBZGp1c3QgZXhwb25lbnQgYWNjb3JkaW5nbHkKKyAgICAgIHVpbnQzMl90IHNoaWZ0ID0gMDsKKyAgICAgIHdoaWxlICgoaF9tYW50ICYgMHg0MDApID09IDApCisgICAgICB7CisgICAgICAgIGhfbWFudCA8PD0gMTsKKyAgICAgICAgc2hpZnQrKzsKKyAgICAgIH0KKyAgICAgIGhfbWFudCAmPSAweDNGRjsKKyAgICAgIGZfZXhwIC09IHNoaWZ0IC0gMTsKKyAgICB9CisgIH0KKworICBmMzIuaSA9IChzaWduIDw8IDMxKSB8IChmX2V4cCA8PCAyMykgfCAoaF9tYW50IDw8IDEzKTsKKyAgcmV0dXJuIGYzMi5mOworfQorCisKKyN1bmRlZiBDTF9IQUxGX0VYUF9NQVNLCisjdW5kZWYgQ0xfSEFMRl9NQVhfRklOSVRFX01BRworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmICAvKiBPUEVOQ0xfQ0xfSEFMRl9IICovCmRpZmYgLS1naXQgYS9PcGVuQ0wvQ0wvY2xfaWNkLmggYi9PcGVuQ0wvQ0wvY2xfaWNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhYzFkZQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5DTC9DTC9jbF9pY2QuaApAQCAtMCwwICsxLDEyOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgT1BFTkNMX0NMX0lDRF9ICisjZGVmaW5lIE9QRU5DTF9DTF9JQ0RfSAorCisjaW5jbHVkZSA8Q0wvY2wuaD4KKyNpbmNsdWRlIDxDTC9jbF9lZ2wuaD4KKyNpbmNsdWRlIDxDTC9jbF9leHQuaD4KKyNpbmNsdWRlIDxDTC9jbF9nbC5oPgorCisjaWYgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8Q0wvY2xfZDNkMTEuaD4KKyNpbmNsdWRlIDxDTC9jbF9kM2QxMC5oPgorI2luY2x1ZGUgPENML2NsX2R4OV9tZWRpYV9zaGFyaW5nLmg+CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHBvaW50ZXIgdHlwZSBkZWZpbml0aW9ucyBmb3IgZWFjaCBvZiB0aGUgQ0wgQVBJIGNhbGxzIGFzCisgKiB3ZWxsIGFzIGEgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgZGlzcGF0Y2ggdGFibGUgdXNlZCBieSB0aGUgS2hyb25vcyBJQ0QKKyAqIGxvYWRlciAoc2VlIGNsX2tocl9pY2QgZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24gZm9yIGJhY2tncm91bmQpLgorICovCisKKy8qIEFQSSBmdW5jdGlvbiBwb2ludGVyIGRlZmluaXRpb25zICovCisKKy8vIFBsYXRmb3JtIEFQSXMKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXRQbGF0Zm9ybUlEcykoCisgICAgY2xfdWludCBudW1fZW50cmllcywgY2xfcGxhdGZvcm1faWQgKnBsYXRmb3JtcywKKyAgICBjbF91aW50ICpudW1fcGxhdGZvcm1zKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldFBsYXRmb3JtSW5mbykoCisgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm0sIGNsX3BsYXRmb3JtX2luZm8gcGFyYW1fbmFtZSwKKyAgICBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwgdm9pZCAqcGFyYW1fdmFsdWUsCisgICAgc2l6ZV90ICpwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKy8vIERldmljZSBBUElzCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0RGV2aWNlSURzKSgKKyAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwgY2xfZGV2aWNlX3R5cGUgZGV2aWNlX3R5cGUsIGNsX3VpbnQgbnVtX2VudHJpZXMsCisgICAgY2xfZGV2aWNlX2lkICpkZXZpY2VzLCBjbF91aW50ICpudW1fZGV2aWNlcykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXREZXZpY2VJbmZvKSgKKyAgICBjbF9kZXZpY2VfaWQgZGV2aWNlLCBjbF9kZXZpY2VfaW5mbyBwYXJhbV9uYW1lLCBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICB2b2lkICpwYXJhbV92YWx1ZSwgc2l6ZV90ICpwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzFfMgorCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlU3ViRGV2aWNlcykoCisgICAgY2xfZGV2aWNlX2lkIGluX2RldmljZSwKKyAgICBjb25zdCBjbF9kZXZpY2VfcGFydGl0aW9uX3Byb3BlcnR5ICpwYXJ0aXRpb25fcHJvcGVydGllcywKKyAgICBjbF91aW50IG51bV9lbnRyaWVzLCBjbF9kZXZpY2VfaWQgKm91dF9kZXZpY2VzLCBjbF91aW50ICpudW1fZGV2aWNlcyk7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xSZXRhaW5EZXZpY2UpKAorICAgIGNsX2RldmljZV9pZCBkZXZpY2UpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsUmVsZWFzZURldmljZSkoCisgICAgY2xfZGV2aWNlX2lkIGRldmljZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKyNlbHNlCisKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsQ3JlYXRlU3ViRGV2aWNlczsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsUmV0YWluRGV2aWNlOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xSZWxlYXNlRGV2aWNlOworCisjZW5kaWYKKworLy8gQ29udGV4dCBBUElzCit0eXBlZGVmIGNsX2NvbnRleHQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUNvbnRleHQpKAorICAgIGNvbnN0IGNsX2NvbnRleHRfcHJvcGVydGllcyAqcHJvcGVydGllcywgY2xfdWludCBudW1fZGV2aWNlcywKKyAgICBjb25zdCBjbF9kZXZpY2VfaWQgKmRldmljZXMsCisgICAgdm9pZChDTF9DQUxMQkFDSyAqcGZuX25vdGlmeSkoY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgdm9pZCAqKSwKKyAgICB2b2lkICp1c2VyX2RhdGEsIGNsX2ludCAqZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2NvbnRleHQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUNvbnRleHRGcm9tVHlwZSkoCisgICAgY29uc3QgY2xfY29udGV4dF9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLCBjbF9kZXZpY2VfdHlwZSBkZXZpY2VfdHlwZSwKKyAgICB2b2lkKENMX0NBTExCQUNLICpwZm5fbm90aWZ5KShjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCB2b2lkICopLAorICAgIHZvaWQgKnVzZXJfZGF0YSwgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xSZXRhaW5Db250ZXh0KSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsUmVsZWFzZUNvbnRleHQpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXRDb250ZXh0SW5mbykoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9jb250ZXh0X2luZm8gcGFyYW1fbmFtZSwgc2l6ZV90IHBhcmFtX3ZhbHVlX3NpemUsCisgICAgdm9pZCAqcGFyYW1fdmFsdWUsIHNpemVfdCAqcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisvLyBDb21tYW5kIFF1ZXVlIEFQSXMKK3R5cGVkZWYgY2xfY29tbWFuZF9xdWV1ZShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlQ29tbWFuZFF1ZXVlKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX2RldmljZV9pZCBkZXZpY2UsCisgICAgY2xfY29tbWFuZF9xdWV1ZV9wcm9wZXJ0aWVzIHByb3BlcnRpZXMsCisgICAgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorCit0eXBlZGVmCitjbF9jb21tYW5kX3F1ZXVlKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVDb21tYW5kUXVldWVXaXRoUHJvcGVydGllcykoCisgICAgY2xfY29udGV4dCAvKiBjb250ZXh0ICovLCBjbF9kZXZpY2VfaWQgLyogZGV2aWNlICovLAorICAgIGNvbnN0IGNsX3F1ZXVlX3Byb3BlcnRpZXMgKiAvKiBwcm9wZXJ0aWVzICovLAorICAgIGNsX2ludCAqIC8qIGVycmNvZGVfcmV0ICovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xDcmVhdGVDb21tYW5kUXVldWVXaXRoUHJvcGVydGllczsKKworI2VuZGlmCisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xSZXRhaW5Db21tYW5kUXVldWUpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xSZWxlYXNlQ29tbWFuZFF1ZXVlKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0Q29tbWFuZFF1ZXVlSW5mbykoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF9jb21tYW5kX3F1ZXVlX2luZm8gcGFyYW1fbmFtZSwKKyAgICBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwgdm9pZCAqcGFyYW1fdmFsdWUsCisgICAgc2l6ZV90ICpwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKy8vIE1lbW9yeSBPYmplY3QgQVBJcwordHlwZWRlZiBjbF9tZW0oQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUJ1ZmZlcikoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9tZW1fZmxhZ3MgZmxhZ3MsIHNpemVfdCBzaXplLCB2b2lkICpob3N0X3B0ciwKKyAgICBjbF9pbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworI2lmZGVmIENMX1ZFUlNJT05fMV8yCisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVJbWFnZSkoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9tZW1fZmxhZ3MgZmxhZ3MsIGNvbnN0IGNsX2ltYWdlX2Zvcm1hdCAqaW1hZ2VfZm9ybWF0LAorICAgIGNvbnN0IGNsX2ltYWdlX2Rlc2MgKmltYWdlX2Rlc2MsIHZvaWQgKmhvc3RfcHRyLAorICAgIGNsX2ludCAqZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisjZWxzZQorCit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbENyZWF0ZUltYWdlOworCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fM18wCisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVCdWZmZXJXaXRoUHJvcGVydGllcykoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjb25zdCBjbF9tZW1fcHJvcGVydGllcyAqcHJvcGVydGllcywgY2xfbWVtX2ZsYWdzIGZsYWdzLAorICAgIHNpemVfdCBzaXplLCB2b2lkICpob3N0X3B0ciwKKyAgICBjbF9pbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzNfMDsKKwordHlwZWRlZiBjbF9tZW0oQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUltYWdlV2l0aFByb3BlcnRpZXMpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY29uc3QgY2xfbWVtX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsIGNsX21lbV9mbGFncyBmbGFncywKKyAgICBjb25zdCBjbF9pbWFnZV9mb3JtYXQgKmltYWdlX2Zvcm1hdCwgY29uc3QgY2xfaW1hZ2VfZGVzYyAqaW1hZ2VfZGVzYywKKyAgICB2b2lkICpob3N0X3B0ciwgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8zXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMKiBjbF9hcGlfY2xTZXRDb250ZXh0RGVzdHJ1Y3RvckNhbGxiYWNrKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsCisgICAgdm9pZChDTF9DQUxMQkFDSyogcGZuX25vdGlmeSkoY2xfY29udGV4dCBjb250ZXh0LCB2b2lkKiB1c2VyX2RhdGEpLAorICAgIHZvaWQqIHVzZXJfZGF0YSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8zXzA7CisKKyNlbHNlCisKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsQ3JlYXRlQnVmZmVyV2l0aFByb3BlcnRpZXM7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbENyZWF0ZUltYWdlV2l0aFByb3BlcnRpZXM7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbFNldENvbnRleHREZXN0cnVjdG9yQ2FsbGJhY2s7CisKKyNlbmRpZgorCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsUmV0YWluTWVtT2JqZWN0KSgKKyAgICBjbF9tZW0gbWVtb2JqKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbFJlbGVhc2VNZW1PYmplY3QpKAorICAgIGNsX21lbSBtZW1vYmopIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0U3VwcG9ydGVkSW1hZ2VGb3JtYXRzKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywgY2xfbWVtX29iamVjdF90eXBlIGltYWdlX3R5cGUsCisgICAgY2xfdWludCBudW1fZW50cmllcywgY2xfaW1hZ2VfZm9ybWF0ICppbWFnZV9mb3JtYXRzLAorICAgIGNsX3VpbnQgKm51bV9pbWFnZV9mb3JtYXRzKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldE1lbU9iamVjdEluZm8pKAorICAgIGNsX21lbSBtZW1vYmosIGNsX21lbV9pbmZvIHBhcmFtX25hbWUsIHNpemVfdCBwYXJhbV92YWx1ZV9zaXplLAorICAgIHZvaWQgKnBhcmFtX3ZhbHVlLCBzaXplX3QgKnBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldEltYWdlSW5mbykoCisgICAgY2xfbWVtIGltYWdlLCBjbF9pbWFnZV9pbmZvIHBhcmFtX25hbWUsIHNpemVfdCBwYXJhbV92YWx1ZV9zaXplLAorICAgIHZvaWQgKnBhcmFtX3ZhbHVlLCBzaXplX3QgKnBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworI2lmZGVmIENMX1ZFUlNJT05fMl8wCisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVQaXBlKSgKKyAgICBjbF9jb250ZXh0IC8qIGNvbnRleHQgKi8sIGNsX21lbV9mbGFncyAvKiBmbGFncyAqLywKKyAgICBjbF91aW50IC8qIHBpcGVfcGFja2V0X3NpemUgKi8sIGNsX3VpbnQgLyogcGlwZV9tYXhfcGFja2V0cyAqLywKKyAgICBjb25zdCBjbF9waXBlX3Byb3BlcnRpZXMgKiAvKiBwcm9wZXJ0aWVzICovLAorICAgIGNsX2ludCAqIC8qIGVycmNvZGVfcmV0ICovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldFBpcGVJbmZvKSgKKyAgICBjbF9tZW0gLyogcGlwZSAqLywgY2xfcGlwZV9pbmZvIC8qIHBhcmFtX25hbWUgKi8sCisgICAgc2l6ZV90IC8qIHBhcmFtX3ZhbHVlX3NpemUgKi8sIHZvaWQgKiAvKiBwYXJhbV92YWx1ZSAqLywKKyAgICBzaXplX3QgKiAvKiBwYXJhbV92YWx1ZV9zaXplX3JldCAqLykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKK3R5cGVkZWYgdm9pZCAqKENMX0FQSV9DQUxMICpjbF9hcGlfY2xTVk1BbGxvYykoCisgICAgY2xfY29udGV4dCAvKiBjb250ZXh0ICovLCBjbF9zdm1fbWVtX2ZsYWdzIC8qIGZsYWdzICovLCBzaXplX3QgLyogc2l6ZSAqLywKKyAgICB1bnNpZ25lZCBpbnQgLyogYWxpZ25tZW50ICovKUNMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8wOworCit0eXBlZGVmIHZvaWQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbFNWTUZyZWUpKAorICAgIGNsX2NvbnRleHQgLyogY29udGV4dCAqLywKKyAgICB2b2lkICogLyogc3ZtX3BvaW50ZXIgKi8pIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8wOworCisjZWxzZQorCit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbENyZWF0ZVBpcGU7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEdldFBpcGVJbmZvOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xTVk1BbGxvYzsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsU1ZNRnJlZTsKKworI2VuZGlmCisKKy8vIFNhbXBsZXIgQVBJcwordHlwZWRlZiBjbF9zYW1wbGVyKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVTYW1wbGVyKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX2Jvb2wgbm9ybWFsaXplZF9jb29yZHMsCisgICAgY2xfYWRkcmVzc2luZ19tb2RlIGFkZHJlc3NpbmdfbW9kZSwgY2xfZmlsdGVyX21vZGUgZmlsdGVyX21vZGUsCisgICAgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xSZXRhaW5TYW1wbGVyKSgKKyAgICBjbF9zYW1wbGVyIHNhbXBsZXIpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsUmVsZWFzZVNhbXBsZXIpKAorICAgIGNsX3NhbXBsZXIgc2FtcGxlcikgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXRTYW1wbGVySW5mbykoCisgICAgY2xfc2FtcGxlciBzYW1wbGVyLCBjbF9zYW1wbGVyX2luZm8gcGFyYW1fbmFtZSwgc2l6ZV90IHBhcmFtX3ZhbHVlX3NpemUsCisgICAgdm9pZCAqcGFyYW1fdmFsdWUsIHNpemVfdCAqcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzAKKwordHlwZWRlZgorY2xfc2FtcGxlcihDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlU2FtcGxlcldpdGhQcm9wZXJ0aWVzKSgKKyAgICBjbF9jb250ZXh0IC8qIGNvbnRleHQgKi8sCisgICAgY29uc3QgY2xfc2FtcGxlcl9wcm9wZXJ0aWVzICogLyogc2FtcGxlcl9wcm9wZXJ0aWVzICovLAorICAgIGNsX2ludCAqIC8qIGVycmNvZGVfcmV0ICovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xDcmVhdGVTYW1wbGVyV2l0aFByb3BlcnRpZXM7CisKKyNlbmRpZgorCisvLyBQcm9ncmFtIE9iamVjdCBBUElzCit0eXBlZGVmIGNsX3Byb2dyYW0oQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZVByb2dyYW1XaXRoU291cmNlKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX3VpbnQgY291bnQsIGNvbnN0IGNoYXIgKipzdHJpbmdzLAorICAgIGNvbnN0IHNpemVfdCAqbGVuZ3RocywgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfcHJvZ3JhbShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlUHJvZ3JhbVdpdGhCaW5hcnkpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfdWludCBudW1fZGV2aWNlcywgY29uc3QgY2xfZGV2aWNlX2lkICpkZXZpY2VfbGlzdCwKKyAgICBjb25zdCBzaXplX3QgKmxlbmd0aHMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipiaW5hcmllcywKKyAgICBjbF9pbnQgKmJpbmFyeV9zdGF0dXMsIGNsX2ludCAqZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKwordHlwZWRlZgorY2xfcHJvZ3JhbShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlUHJvZ3JhbVdpdGhCdWlsdEluS2VybmVscykoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF91aW50IG51bV9kZXZpY2VzLCBjb25zdCBjbF9kZXZpY2VfaWQgKmRldmljZV9saXN0LAorICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9uYW1lcywgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKyNlbHNlCisKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsQ3JlYXRlUHJvZ3JhbVdpdGhCdWlsdEluS2VybmVsczsKKworI2VuZGlmCisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xSZXRhaW5Qcm9ncmFtKSgKKyAgICBjbF9wcm9ncmFtIHByb2dyYW0pIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsUmVsZWFzZVByb2dyYW0pKAorICAgIGNsX3Byb2dyYW0gcHJvZ3JhbSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xCdWlsZFByb2dyYW0pKAorICAgIGNsX3Byb2dyYW0gcHJvZ3JhbSwgY2xfdWludCBudW1fZGV2aWNlcywgY29uc3QgY2xfZGV2aWNlX2lkICpkZXZpY2VfbGlzdCwKKyAgICBjb25zdCBjaGFyICpvcHRpb25zLAorICAgIHZvaWQoQ0xfQ0FMTEJBQ0sgKnBmbl9ub3RpZnkpKGNsX3Byb2dyYW0gcHJvZ3JhbSwgdm9pZCAqdXNlcl9kYXRhKSwKKyAgICB2b2lkICp1c2VyX2RhdGEpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENvbXBpbGVQcm9ncmFtKSgKKyAgICBjbF9wcm9ncmFtIHByb2dyYW0sIGNsX3VpbnQgbnVtX2RldmljZXMsIGNvbnN0IGNsX2RldmljZV9pZCAqZGV2aWNlX2xpc3QsCisgICAgY29uc3QgY2hhciAqb3B0aW9ucywgY2xfdWludCBudW1faW5wdXRfaGVhZGVycywKKyAgICBjb25zdCBjbF9wcm9ncmFtICppbnB1dF9oZWFkZXJzLCBjb25zdCBjaGFyICoqaGVhZGVyX2luY2x1ZGVfbmFtZXMsCisgICAgdm9pZChDTF9DQUxMQkFDSyAqcGZuX25vdGlmeSkoY2xfcHJvZ3JhbSBwcm9ncmFtLCB2b2lkICp1c2VyX2RhdGEpLAorICAgIHZvaWQgKnVzZXJfZGF0YSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYgY2xfcHJvZ3JhbShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsTGlua1Byb2dyYW0pKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfdWludCBudW1fZGV2aWNlcywgY29uc3QgY2xfZGV2aWNlX2lkICpkZXZpY2VfbGlzdCwKKyAgICBjb25zdCBjaGFyICpvcHRpb25zLCBjbF91aW50IG51bV9pbnB1dF9wcm9ncmFtcywKKyAgICBjb25zdCBjbF9wcm9ncmFtICppbnB1dF9wcm9ncmFtcywKKyAgICB2b2lkKENMX0NBTExCQUNLICpwZm5fbm90aWZ5KShjbF9wcm9ncmFtIHByb2dyYW0sIHZvaWQgKnVzZXJfZGF0YSksCisgICAgdm9pZCAqdXNlcl9kYXRhLCBjbF9pbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xDb21waWxlUHJvZ3JhbTsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsTGlua1Byb2dyYW07CisKKyNlbmRpZgorCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzIKKwordHlwZWRlZgorY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xTZXRQcm9ncmFtU3BlY2lhbGl6YXRpb25Db25zdGFudCkoCisgICAgY2xfcHJvZ3JhbSBwcm9ncmFtLCBjbF91aW50IHNwZWNfaWQsIHNpemVfdCBzcGVjX3NpemUsCisgICAgY29uc3Qgdm9pZCAqc3BlY192YWx1ZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzI7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xTZXRQcm9ncmFtUmVsZWFzZUNhbGxiYWNrKSgKKyAgICBjbF9wcm9ncmFtIHByb2dyYW0sCisgICAgdm9pZChDTF9DQUxMQkFDSyAqcGZuX25vdGlmeSkoY2xfcHJvZ3JhbSBwcm9ncmFtLCB2b2lkICp1c2VyX2RhdGEpLAorICAgIHZvaWQgKnVzZXJfZGF0YSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzI7CisKKyNlbHNlCisKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsU2V0UHJvZ3JhbVNwZWNpYWxpemF0aW9uQ29uc3RhbnQ7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbFNldFByb2dyYW1SZWxlYXNlQ2FsbGJhY2s7CisKKyNlbmRpZgorCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbFVubG9hZFBsYXRmb3JtQ29tcGlsZXIpKAorICAgIGNsX3BsYXRmb3JtX2lkIHBsYXRmb3JtKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xVbmxvYWRQbGF0Zm9ybUNvbXBpbGVyOworCisjZW5kaWYKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldFByb2dyYW1JbmZvKSgKKyAgICBjbF9wcm9ncmFtIHByb2dyYW0sIGNsX3Byb2dyYW1faW5mbyBwYXJhbV9uYW1lLCBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICB2b2lkICpwYXJhbV92YWx1ZSwgc2l6ZV90ICpwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXRQcm9ncmFtQnVpbGRJbmZvKSgKKyAgICBjbF9wcm9ncmFtIHByb2dyYW0sIGNsX2RldmljZV9pZCBkZXZpY2UsIGNsX3Byb2dyYW1fYnVpbGRfaW5mbyBwYXJhbV9uYW1lLAorICAgIHNpemVfdCBwYXJhbV92YWx1ZV9zaXplLCB2b2lkICpwYXJhbV92YWx1ZSwKKyAgICBzaXplX3QgKnBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworLy8gS2VybmVsIE9iamVjdCBBUElzCit0eXBlZGVmIGNsX2tlcm5lbChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlS2VybmVsKSgKKyAgICBjbF9wcm9ncmFtIHByb2dyYW0sIGNvbnN0IGNoYXIgKmtlcm5lbF9uYW1lLAorICAgIGNsX2ludCAqZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlS2VybmVsc0luUHJvZ3JhbSkoCisgICAgY2xfcHJvZ3JhbSBwcm9ncmFtLCBjbF91aW50IG51bV9rZXJuZWxzLCBjbF9rZXJuZWwgKmtlcm5lbHMsCisgICAgY2xfdWludCAqbnVtX2tlcm5lbHNfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbFJldGFpbktlcm5lbCkoCisgICAgY2xfa2VybmVsIGtlcm5lbCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xSZWxlYXNlS2VybmVsKSgKKyAgICBjbF9rZXJuZWwga2VybmVsKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbFNldEtlcm5lbEFyZykoCisgICAgY2xfa2VybmVsIGtlcm5lbCwgY2xfdWludCBhcmdfaW5kZXgsIHNpemVfdCBhcmdfc2l6ZSwKKyAgICBjb25zdCB2b2lkICphcmdfdmFsdWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0S2VybmVsSW5mbykoCisgICAgY2xfa2VybmVsIGtlcm5lbCwgY2xfa2VybmVsX2luZm8gcGFyYW1fbmFtZSwgc2l6ZV90IHBhcmFtX3ZhbHVlX3NpemUsCisgICAgdm9pZCAqcGFyYW1fdmFsdWUsIHNpemVfdCAqcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldEtlcm5lbEFyZ0luZm8pKAorICAgIGNsX2tlcm5lbCBrZXJuZWwsIGNsX3VpbnQgYXJnX2luZHgsIGNsX2tlcm5lbF9hcmdfaW5mbyBwYXJhbV9uYW1lLAorICAgIHNpemVfdCBwYXJhbV92YWx1ZV9zaXplLCB2b2lkICpwYXJhbV92YWx1ZSwKKyAgICBzaXplX3QgKnBhcmFtX3ZhbHVlX3NpemVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xHZXRLZXJuZWxBcmdJbmZvOworCisjZW5kaWYKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldEtlcm5lbFdvcmtHcm91cEluZm8pKAorICAgIGNsX2tlcm5lbCBrZXJuZWwsIGNsX2RldmljZV9pZCBkZXZpY2UsIGNsX2tlcm5lbF93b3JrX2dyb3VwX2luZm8gcGFyYW1fbmFtZSwKKyAgICBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwgdm9pZCAqcGFyYW1fdmFsdWUsCisgICAgc2l6ZV90ICpwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsU2V0S2VybmVsQXJnU1ZNUG9pbnRlcikoCisgICAgY2xfa2VybmVsIC8qIGtlcm5lbCAqLywgY2xfdWludCAvKiBhcmdfaW5kZXggKi8sCisgICAgY29uc3Qgdm9pZCAqIC8qIGFyZ192YWx1ZSAqLykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xTZXRLZXJuZWxFeGVjSW5mbykoCisgICAgY2xfa2VybmVsIC8qIGtlcm5lbCAqLywgY2xfa2VybmVsX2V4ZWNfaW5mbyAvKiBwYXJhbV9uYW1lICovLAorICAgIHNpemVfdCAvKiBwYXJhbV92YWx1ZV9zaXplICovLAorICAgIGNvbnN0IHZvaWQgKiAvKiBwYXJhbV92YWx1ZSAqLykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXRLZXJuZWxTdWJHcm91cEluZm9LSFIpKAorICAgIGNsX2tlcm5lbCAvKiBpbl9rZXJuZWwgKi8sIGNsX2RldmljZV9pZCAvKmluX2RldmljZSovLAorICAgIGNsX2tlcm5lbF9zdWJfZ3JvdXBfaW5mbyAvKiBwYXJhbV9uYW1lICovLCBzaXplX3QgLyppbnB1dF92YWx1ZV9zaXplKi8sCisgICAgY29uc3Qgdm9pZCAqIC8qaW5wdXRfdmFsdWUqLywgc2l6ZV90IC8qcGFyYW1fdmFsdWVfc2l6ZSovLAorICAgIHZvaWQgKiAvKnBhcmFtX3ZhbHVlKi8sCisgICAgc2l6ZV90ICogLypwYXJhbV92YWx1ZV9zaXplX3JldCovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xTZXRLZXJuZWxBcmdTVk1Qb2ludGVyOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xTZXRLZXJuZWxFeGVjSW5mbzsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsR2V0S2VybmVsU3ViR3JvdXBJbmZvS0hSOworCisjZW5kaWYKKworLy8gRXZlbnQgT2JqZWN0IEFQSXMKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xXYWl0Rm9yRXZlbnRzKSgKKyAgICBjbF91aW50IG51bV9ldmVudHMsIGNvbnN0IGNsX2V2ZW50ICpldmVudF9saXN0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldEV2ZW50SW5mbykoCisgICAgY2xfZXZlbnQgZXZlbnQsIGNsX2V2ZW50X2luZm8gcGFyYW1fbmFtZSwgc2l6ZV90IHBhcmFtX3ZhbHVlX3NpemUsCisgICAgdm9pZCAqcGFyYW1fdmFsdWUsIHNpemVfdCAqcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsUmV0YWluRXZlbnQpKGNsX2V2ZW50IGV2ZW50KQorICAgIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsUmVsZWFzZUV2ZW50KShjbF9ldmVudCBldmVudCkKKyAgICBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworLy8gUHJvZmlsaW5nIEFQSXMKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXRFdmVudFByb2ZpbGluZ0luZm8pKAorICAgIGNsX2V2ZW50IGV2ZW50LCBjbF9wcm9maWxpbmdfaW5mbyBwYXJhbV9uYW1lLCBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwKKyAgICB2b2lkICpwYXJhbV92YWx1ZSwgc2l6ZV90ICpwYXJhbV92YWx1ZV9zaXplX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKy8vIEZsdXNoIGFuZCBGaW5pc2ggQVBJcwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEZsdXNoKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRmluaXNoKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisvLyBFbnF1ZXVlZCBDb21tYW5kcyBBUElzCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZVJlYWRCdWZmZXIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIGJ1ZmZlciwgY2xfYm9vbCBibG9ja2luZ19yZWFkLAorICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjYiwgdm9pZCAqcHRyLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworI2lmZGVmIENMX1ZFUlNJT05fMV8xCisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlUmVhZEJ1ZmZlclJlY3QpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIGJ1ZmZlciwgY2xfYm9vbCBibG9ja2luZ19yZWFkLAorICAgIGNvbnN0IHNpemVfdCAqYnVmZmVyX29yaWdpbiwgY29uc3Qgc2l6ZV90ICpob3N0X29yaWdpbiwKKyAgICBjb25zdCBzaXplX3QgKnJlZ2lvbiwgc2l6ZV90IGJ1ZmZlcl9yb3dfcGl0Y2gsIHNpemVfdCBidWZmZXJfc2xpY2VfcGl0Y2gsCisgICAgc2l6ZV90IGhvc3Rfcm93X3BpdGNoLCBzaXplX3QgaG9zdF9zbGljZV9waXRjaCwgdm9pZCAqcHRyLAorICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xFbnF1ZXVlUmVhZEJ1ZmZlclJlY3Q7CisKKyNlbmRpZgorCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZVdyaXRlQnVmZmVyKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX21lbSBidWZmZXIsIGNsX2Jvb2wgYmxvY2tpbmdfd3JpdGUsCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNiLCBjb25zdCB2b2lkICpwdHIsIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzEKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVXcml0ZUJ1ZmZlclJlY3QpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIGJ1ZmZlciwgY2xfYm9vbCBibG9ja2luZ19yZWFkLAorICAgIGNvbnN0IHNpemVfdCAqYnVmZmVyX29yaWdpbiwgY29uc3Qgc2l6ZV90ICpob3N0X29yaWdpbiwKKyAgICBjb25zdCBzaXplX3QgKnJlZ2lvbiwgc2l6ZV90IGJ1ZmZlcl9yb3dfcGl0Y2gsIHNpemVfdCBidWZmZXJfc2xpY2VfcGl0Y2gsCisgICAgc2l6ZV90IGhvc3Rfcm93X3BpdGNoLCBzaXplX3QgaG9zdF9zbGljZV9waXRjaCwgY29uc3Qgdm9pZCAqcHRyLAorICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xFbnF1ZXVlV3JpdGVCdWZmZXJSZWN0OworCisjZW5kaWYKKworI2lmZGVmIENMX1ZFUlNJT05fMV8yCisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlRmlsbEJ1ZmZlcikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF9tZW0gYnVmZmVyLCBjb25zdCB2b2lkICpwYXR0ZXJuLAorICAgIHNpemVfdCBwYXR0ZXJuX3NpemUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjYiwKKyAgICBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LCBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICpldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKyNlbHNlCisKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsRW5xdWV1ZUZpbGxCdWZmZXI7CisKKyNlbmRpZgorCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZUNvcHlCdWZmZXIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIHNyY19idWZmZXIsIGNsX21lbSBkc3RfYnVmZmVyLAorICAgIHNpemVfdCBzcmNfb2Zmc2V0LCBzaXplX3QgZHN0X29mZnNldCwgc2l6ZV90IGNiLAorICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKworI2lmZGVmIENMX1ZFUlNJT05fMV8xCisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlQ29weUJ1ZmZlclJlY3QpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIHNyY19idWZmZXIsIGNsX21lbSBkc3RfYnVmZmVyLAorICAgIGNvbnN0IHNpemVfdCAqc3JjX29yaWdpbiwgY29uc3Qgc2l6ZV90ICpkc3Rfb3JpZ2luLCBjb25zdCBzaXplX3QgKnJlZ2lvbiwKKyAgICBzaXplX3Qgc3JjX3Jvd19waXRjaCwgc2l6ZV90IHNyY19zbGljZV9waXRjaCwgc2l6ZV90IGRzdF9yb3dfcGl0Y2gsCisgICAgc2l6ZV90IGRzdF9zbGljZV9waXRjaCwgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICpldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzE7CisKKyNlbHNlCisKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsRW5xdWV1ZUNvcHlCdWZmZXJSZWN0OworCisjZW5kaWYKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVSZWFkSW1hZ2UpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIGltYWdlLCBjbF9ib29sIGJsb2NraW5nX3JlYWQsCisgICAgY29uc3Qgc2l6ZV90ICpvcmlnaW4sIGNvbnN0IHNpemVfdCAqcmVnaW9uLCBzaXplX3Qgcm93X3BpdGNoLAorICAgIHNpemVfdCBzbGljZV9waXRjaCwgdm9pZCAqcHRyLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVXcml0ZUltYWdlKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX21lbSBpbWFnZSwgY2xfYm9vbCBibG9ja2luZ193cml0ZSwKKyAgICBjb25zdCBzaXplX3QgKm9yaWdpbiwgY29uc3Qgc2l6ZV90ICpyZWdpb24sIHNpemVfdCBpbnB1dF9yb3dfcGl0Y2gsCisgICAgc2l6ZV90IGlucHV0X3NsaWNlX3BpdGNoLCBjb25zdCB2b2lkICpwdHIsIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVGaWxsSW1hZ2UpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIGltYWdlLCBjb25zdCB2b2lkICpmaWxsX2NvbG9yLAorICAgIGNvbnN0IHNpemVfdCBvcmlnaW5bM10sIGNvbnN0IHNpemVfdCByZWdpb25bM10sCisgICAgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisjZWxzZQorCit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEVucXVldWVGaWxsSW1hZ2U7CisKKyNlbmRpZgorCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZUNvcHlJbWFnZSkoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF9tZW0gc3JjX2ltYWdlLCBjbF9tZW0gZHN0X2ltYWdlLAorICAgIGNvbnN0IHNpemVfdCAqc3JjX29yaWdpbiwgY29uc3Qgc2l6ZV90ICpkc3Rfb3JpZ2luLCBjb25zdCBzaXplX3QgKnJlZ2lvbiwKKyAgICBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LCBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICpldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlQ29weUltYWdlVG9CdWZmZXIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIHNyY19pbWFnZSwgY2xfbWVtIGRzdF9idWZmZXIsCisgICAgY29uc3Qgc2l6ZV90ICpzcmNfb3JpZ2luLCBjb25zdCBzaXplX3QgKnJlZ2lvbiwgc2l6ZV90IGRzdF9vZmZzZXQsCisgICAgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZUNvcHlCdWZmZXJUb0ltYWdlKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX21lbSBzcmNfYnVmZmVyLCBjbF9tZW0gZHN0X2ltYWdlLAorICAgIHNpemVfdCBzcmNfb2Zmc2V0LCBjb25zdCBzaXplX3QgKmRzdF9vcmlnaW4sIGNvbnN0IHNpemVfdCAqcmVnaW9uLAorICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiB2b2lkICooQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVNYXBCdWZmZXIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIGJ1ZmZlciwgY2xfYm9vbCBibG9ja2luZ19tYXAsCisgICAgY2xfbWFwX2ZsYWdzIG1hcF9mbGFncywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNiLAorICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50LCBjbF9pbnQgKmVycmNvZGVfcmV0KUNMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIHZvaWQgKihDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZU1hcEltYWdlKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX21lbSBpbWFnZSwgY2xfYm9vbCBibG9ja2luZ19tYXAsCisgICAgY2xfbWFwX2ZsYWdzIG1hcF9mbGFncywgY29uc3Qgc2l6ZV90ICpvcmlnaW4sIGNvbnN0IHNpemVfdCAqcmVnaW9uLAorICAgIHNpemVfdCAqaW1hZ2Vfcm93X3BpdGNoLCBzaXplX3QgKmltYWdlX3NsaWNlX3BpdGNoLAorICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50LCBjbF9pbnQgKmVycmNvZGVfcmV0KUNMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZVVubWFwTWVtT2JqZWN0KSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX21lbSBtZW1vYmosIHZvaWQgKm1hcHBlZF9wdHIsCisgICAgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVNaWdyYXRlTWVtT2JqZWN0cykoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF91aW50IG51bV9tZW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKm1lbV9vYmplY3RzLCBjbF9tZW1fbWlncmF0aW9uX2ZsYWdzIGZsYWdzLAorICAgIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2Vsc2UKKwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xFbnF1ZXVlTWlncmF0ZU1lbU9iamVjdHM7CisKKyNlbmRpZgorCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfa2VybmVsIGtlcm5lbCwgY2xfdWludCB3b3JrX2RpbSwKKyAgICBjb25zdCBzaXplX3QgKmdsb2JhbF93b3JrX29mZnNldCwgY29uc3Qgc2l6ZV90ICpnbG9iYWxfd29ya19zaXplLAorICAgIGNvbnN0IHNpemVfdCAqbG9jYWxfd29ya19zaXplLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVUYXNrKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX2tlcm5lbCBrZXJuZWwsCisgICAgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZU5hdGl2ZUtlcm5lbCkoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCB2b2lkKENMX0NBTExCQUNLICp1c2VyX2Z1bmMpKHZvaWQgKiksCisgICAgdm9pZCAqYXJncywgc2l6ZV90IGNiX2FyZ3MsIGNsX3VpbnQgbnVtX21lbV9vYmplY3RzLCBjb25zdCBjbF9tZW0gKm1lbV9saXN0LAorICAgIGNvbnN0IHZvaWQgKiphcmdzX21lbV9sb2MsIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCisjaWZkZWYgQ0xfVkVSU0lPTl8xXzIKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVNYXJrZXJXaXRoV2FpdExpc3QpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICpldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlQmFycmllcldpdGhXYWl0TGlzdCkoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiB2b2lkICooCisgICAgQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldEV4dGVuc2lvbkZ1bmN0aW9uQWRkcmVzc0ZvclBsYXRmb3JtKSgKKyAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwKKyAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lKUNMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisjZWxzZQorCit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEVucXVldWVNYXJrZXJXaXRoV2FpdExpc3Q7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEVucXVldWVCYXJyaWVyV2l0aFdhaXRMaXN0OwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xHZXRFeHRlbnNpb25GdW5jdGlvbkFkZHJlc3NGb3JQbGF0Zm9ybTsKKworI2VuZGlmCisKKy8vIFNoYXJlZCBWaXJ0dWFsIE1lbW9yeSBBUElzCisKKyNpZmRlZiBDTF9WRVJTSU9OXzJfMAorCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZVNWTUZyZWUpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgLyogY29tbWFuZF9xdWV1ZSAqLywgY2xfdWludCAvKiBudW1fc3ZtX3BvaW50ZXJzICovLAorICAgIHZvaWQgKiogLyogc3ZtX3BvaW50ZXJzICovLAorICAgIHZvaWQoQ0xfQ0FMTEJBQ0sgKnBmbl9mcmVlX2Z1bmMpKGNsX2NvbW1hbmRfcXVldWUgLyogcXVldWUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAvKiBudW1fc3ZtX3BvaW50ZXJzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiogLyogc3ZtX3BvaW50ZXJzW10gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIC8qIHVzZXJfZGF0YSAqLyksCisgICAgdm9pZCAqIC8qIHVzZXJfZGF0YSAqLywgY2xfdWludCAvKiBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCAqLywKKyAgICBjb25zdCBjbF9ldmVudCAqIC8qIGV2ZW50X3dhaXRfbGlzdCAqLywKKyAgICBjbF9ldmVudCAqIC8qIGV2ZW50ICovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVTVk1NZW1jcHkpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgLyogY29tbWFuZF9xdWV1ZSAqLywgY2xfYm9vbCAvKiBibG9ja2luZ19jb3B5ICovLAorICAgIHZvaWQgKiAvKiBkc3RfcHRyICovLCBjb25zdCB2b2lkICogLyogc3JjX3B0ciAqLywgc2l6ZV90IC8qIHNpemUgKi8sCisgICAgY2xfdWludCAvKiBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCAqLywKKyAgICBjb25zdCBjbF9ldmVudCAqIC8qIGV2ZW50X3dhaXRfbGlzdCAqLywKKyAgICBjbF9ldmVudCAqIC8qIGV2ZW50ICovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVTVk1NZW1GaWxsKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIC8qIGNvbW1hbmRfcXVldWUgKi8sIHZvaWQgKiAvKiBzdm1fcHRyICovLAorICAgIGNvbnN0IHZvaWQgKiAvKiBwYXR0ZXJuICovLCBzaXplX3QgLyogcGF0dGVybl9zaXplICovLCBzaXplX3QgLyogc2l6ZSAqLywKKyAgICBjbF91aW50IC8qIG51bV9ldmVudHNfaW5fd2FpdF9saXN0ICovLAorICAgIGNvbnN0IGNsX2V2ZW50ICogLyogZXZlbnRfd2FpdF9saXN0ICovLAorICAgIGNsX2V2ZW50ICogLyogZXZlbnQgKi8pIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZVNWTU1hcCkoCisgICAgY2xfY29tbWFuZF9xdWV1ZSAvKiBjb21tYW5kX3F1ZXVlICovLCBjbF9ib29sIC8qIGJsb2NraW5nX21hcCAqLywKKyAgICBjbF9tYXBfZmxhZ3MgLyogbWFwX2ZsYWdzICovLCB2b2lkICogLyogc3ZtX3B0ciAqLywgc2l6ZV90IC8qIHNpemUgKi8sCisgICAgY2xfdWludCAvKiBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCAqLywKKyAgICBjb25zdCBjbF9ldmVudCAqIC8qIGV2ZW50X3dhaXRfbGlzdCAqLywKKyAgICBjbF9ldmVudCAqIC8qIGV2ZW50ICovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVTVk1Vbm1hcCkoCisgICAgY2xfY29tbWFuZF9xdWV1ZSAvKiBjb21tYW5kX3F1ZXVlICovLCB2b2lkICogLyogc3ZtX3B0ciAqLywKKyAgICBjbF91aW50IC8qIG51bV9ldmVudHNfaW5fd2FpdF9saXN0ICovLAorICAgIGNvbnN0IGNsX2V2ZW50ICogLyogZXZlbnRfd2FpdF9saXN0ICovLAorICAgIGNsX2V2ZW50ICogLyogZXZlbnQgKi8pIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8wOworCisjZWxzZQorCit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEVucXVldWVTVk1GcmVlOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xFbnF1ZXVlU1ZNTWVtY3B5OwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xFbnF1ZXVlU1ZNTWVtRmlsbDsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsRW5xdWV1ZVNWTU1hcDsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsRW5xdWV1ZVNWTVVubWFwOworCisjZW5kaWYKKworLy8gRGVwcmVjYXRlZCBBUElzCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsU2V0Q29tbWFuZFF1ZXVlUHJvcGVydHkpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfY29tbWFuZF9xdWV1ZV9wcm9wZXJ0aWVzIHByb3BlcnRpZXMsCisgICAgY2xfYm9vbCBlbmFibGUsIGNsX2NvbW1hbmRfcXVldWVfcHJvcGVydGllcyAqb2xkX3Byb3BlcnRpZXMpCisgICAgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzBfREVQUkVDQVRFRDsKKwordHlwZWRlZiBjbF9tZW0oQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUltYWdlMkQpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfbWVtX2ZsYWdzIGZsYWdzLCBjb25zdCBjbF9pbWFnZV9mb3JtYXQgKmltYWdlX2Zvcm1hdCwKKyAgICBzaXplX3QgaW1hZ2Vfd2lkdGgsIHNpemVfdCBpbWFnZV9oZWlnaHQsIHNpemVfdCBpbWFnZV9yb3dfcGl0Y2gsCisgICAgdm9pZCAqaG9zdF9wdHIsIGNsX2ludCAqZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQ7CisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVJbWFnZTNEKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywgY29uc3QgY2xfaW1hZ2VfZm9ybWF0ICppbWFnZV9mb3JtYXQsCisgICAgc2l6ZV90IGltYWdlX3dpZHRoLCBzaXplX3QgaW1hZ2VfaGVpZ2h0LCBzaXplX3QgaW1hZ2VfZGVwdGgsCisgICAgc2l6ZV90IGltYWdlX3Jvd19waXRjaCwgc2l6ZV90IGltYWdlX3NsaWNlX3BpdGNoLCB2b2lkICpob3N0X3B0ciwKKyAgICBjbF9pbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsVW5sb2FkQ29tcGlsZXIpKHZvaWQpCisgICAgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzFfREVQUkVDQVRFRDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVNYXJrZXIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQ7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlV2FpdEZvckV2ZW50cykoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF91aW50IG51bV9ldmVudHMsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X2xpc3QpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQ7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlQmFycmllcikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEOworCit0eXBlZGVmIHZvaWQgKihDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzKSgKKyAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lKUNMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQ7CisKKy8vIEdMIGFuZCBvdGhlciBBUElzCit0eXBlZGVmIGNsX21lbShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlRnJvbUdMQnVmZmVyKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywgY2xfR0x1aW50IGJ1Zm9iaiwKKyAgICBpbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9tZW0oQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUZyb21HTFRleHR1cmUpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfbWVtX2ZsYWdzIGZsYWdzLCBjbF9HTGVudW0gdGFyZ2V0LCBjbF9HTGludCBtaXBsZXZlbCwKKyAgICBjbF9HTHVpbnQgdGV4dHVyZSwgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVGcm9tR0xUZXh0dXJlMkQpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfbWVtX2ZsYWdzIGZsYWdzLCBjbF9HTGVudW0gdGFyZ2V0LCBjbF9HTGludCBtaXBsZXZlbCwKKyAgICBjbF9HTHVpbnQgdGV4dHVyZSwgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVGcm9tR0xUZXh0dXJlM0QpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfbWVtX2ZsYWdzIGZsYWdzLCBjbF9HTGVudW0gdGFyZ2V0LCBjbF9HTGludCBtaXBsZXZlbCwKKyAgICBjbF9HTHVpbnQgdGV4dHVyZSwgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVGcm9tR0xSZW5kZXJidWZmZXIpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfbWVtX2ZsYWdzIGZsYWdzLCBjbF9HTHVpbnQgcmVuZGVyYnVmZmVyLAorICAgIGNsX2ludCAqZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0R0xPYmplY3RJbmZvKSgKKyAgICBjbF9tZW0gbWVtb2JqLCBjbF9nbF9vYmplY3RfdHlwZSAqZ2xfb2JqZWN0X3R5cGUsCisgICAgY2xfR0x1aW50ICpnbF9vYmplY3RfbmFtZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXRHTFRleHR1cmVJbmZvKSgKKyAgICBjbF9tZW0gbWVtb2JqLCBjbF9nbF90ZXh0dXJlX2luZm8gcGFyYW1fbmFtZSwgc2l6ZV90IHBhcmFtX3ZhbHVlX3NpemUsCisgICAgdm9pZCAqcGFyYW1fdmFsdWUsIHNpemVfdCAqcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZUFjcXVpcmVHTE9iamVjdHMpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfdWludCBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKm1lbV9vYmplY3RzLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVSZWxlYXNlR0xPYmplY3RzKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX3VpbnQgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICptZW1fb2JqZWN0cywgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICpldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKy8qIGNsX2tocl9nbF9zaGFyaW5nICovCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0R0xDb250ZXh0SW5mb0tIUikoCisgICAgY29uc3QgY2xfY29udGV4dF9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLCBjbF9nbF9jb250ZXh0X2luZm8gcGFyYW1fbmFtZSwKKyAgICBzaXplX3QgcGFyYW1fdmFsdWVfc2l6ZSwgdm9pZCAqcGFyYW1fdmFsdWUsIHNpemVfdCAqcGFyYW1fdmFsdWVfc2l6ZV9yZXQpOworCisvKiBjbF9raHJfZ2xfZXZlbnQgKi8KK3R5cGVkZWYgY2xfZXZlbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUV2ZW50RnJvbUdMc3luY0tIUikoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9HTHN5bmMgc3luYywgY2xfaW50ICplcnJjb2RlX3JldCk7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKworLyogY2xfa2hyX2QzZDEwX3NoYXJpbmcgKi8KKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldERldmljZUlEc0Zyb21EM0QxMEtIUikoCisgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm0sIGNsX2QzZDEwX2RldmljZV9zb3VyY2Vfa2hyIGQzZF9kZXZpY2Vfc291cmNlLAorICAgIHZvaWQgKmQzZF9vYmplY3QsIGNsX2QzZDEwX2RldmljZV9zZXRfa2hyIGQzZF9kZXZpY2Vfc2V0LAorICAgIGNsX3VpbnQgbnVtX2VudHJpZXMsIGNsX2RldmljZV9pZCAqZGV2aWNlcywKKyAgICBjbF91aW50ICpudW1fZGV2aWNlcykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVGcm9tRDNEMTBCdWZmZXJLSFIpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfbWVtX2ZsYWdzIGZsYWdzLCBJRDNEMTBCdWZmZXIgKnJlc291cmNlLAorICAgIGNsX2ludCAqZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX21lbShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlRnJvbUQzRDEwVGV4dHVyZTJES0hSKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywgSUQzRDEwVGV4dHVyZTJEICpyZXNvdXJjZSwKKyAgICBVSU5UIHN1YnJlc291cmNlLCBjbF9pbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZiBjbF9tZW0oQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUZyb21EM0QxMFRleHR1cmUzREtIUikoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9tZW1fZmxhZ3MgZmxhZ3MsIElEM0QxMFRleHR1cmUzRCAqcmVzb3VyY2UsCisgICAgVUlOVCBzdWJyZXNvdXJjZSwgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKK3R5cGVkZWYKK2NsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZUFjcXVpcmVEM0QxME9iamVjdHNLSFIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfdWludCBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKm1lbV9vYmplY3RzLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMDsKKwordHlwZWRlZgorY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlUmVsZWFzZUQzRDEwT2JqZWN0c0tIUikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF91aW50IG51bV9vYmplY3RzLAorICAgIGNvbnN0IGNsX21lbSAqbWVtX29iamVjdHMsIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTCBjbEdldERldmljZUlEc0Zyb21EM0QxMEtIUigKKyAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwgY2xfZDNkMTBfZGV2aWNlX3NvdXJjZV9raHIgZDNkX2RldmljZV9zb3VyY2UsCisgICAgdm9pZCAqZDNkX29iamVjdCwgY2xfZDNkMTBfZGV2aWNlX3NldF9raHIgZDNkX2RldmljZV9zZXQsCisgICAgY2xfdWludCBudW1fZW50cmllcywgY2xfZGV2aWNlX2lkICpkZXZpY2VzLCBjbF91aW50ICpudW1fZGV2aWNlcyk7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfbWVtIENMX0FQSV9DQUxMCitjbENyZWF0ZUZyb21EM0QxMEJ1ZmZlcktIUihjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElEM0QxMEJ1ZmZlciAqcmVzb3VyY2UsIGNsX2ludCAqZXJyY29kZV9yZXQpOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX21lbSBDTF9BUElfQ0FMTCBjbENyZWF0ZUZyb21EM0QxMFRleHR1cmUyREtIUigKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywgSUQzRDEwVGV4dHVyZTJEICpyZXNvdXJjZSwKKyAgICBVSU5UIHN1YnJlc291cmNlLCBjbF9pbnQgKmVycmNvZGVfcmV0KTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9tZW0gQ0xfQVBJX0NBTEwgY2xDcmVhdGVGcm9tRDNEMTBUZXh0dXJlM0RLSFIoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9tZW1fZmxhZ3MgZmxhZ3MsIElEM0QxMFRleHR1cmUzRCAqcmVzb3VyY2UsCisgICAgVUlOVCBzdWJyZXNvdXJjZSwgY2xfaW50ICplcnJjb2RlX3JldCk7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMIGNsRW5xdWV1ZUFjcXVpcmVEM0QxME9iamVjdHNLSFIoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF91aW50IG51bV9vYmplY3RzLAorICAgIGNvbnN0IGNsX21lbSAqbWVtX29iamVjdHMsIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwgY2xfZXZlbnQgKmV2ZW50KTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwgY2xFbnF1ZXVlUmVsZWFzZUQzRDEwT2JqZWN0c0tIUigKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX3VpbnQgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICptZW1fb2JqZWN0cywgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LCBjbF9ldmVudCAqZXZlbnQpOworCisvKiBjbF9raHJfZDNkMTFfc2hhcmluZyAqLwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEdldERldmljZUlEc0Zyb21EM0QxMUtIUikoCisgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm0sIGNsX2QzZDExX2RldmljZV9zb3VyY2Vfa2hyIGQzZF9kZXZpY2Vfc291cmNlLAorICAgIHZvaWQgKmQzZF9vYmplY3QsIGNsX2QzZDExX2RldmljZV9zZXRfa2hyIGQzZF9kZXZpY2Vfc2V0LAorICAgIGNsX3VpbnQgbnVtX2VudHJpZXMsIGNsX2RldmljZV9pZCAqZGV2aWNlcywKKyAgICBjbF91aW50ICpudW1fZGV2aWNlcykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVGcm9tRDNEMTFCdWZmZXJLSFIpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfbWVtX2ZsYWdzIGZsYWdzLCBJRDNEMTFCdWZmZXIgKnJlc291cmNlLAorICAgIGNsX2ludCAqZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX21lbShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlRnJvbUQzRDExVGV4dHVyZTJES0hSKSgKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywgSUQzRDExVGV4dHVyZTJEICpyZXNvdXJjZSwKKyAgICBVSU5UIHN1YnJlc291cmNlLCBjbF9pbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZiBjbF9tZW0oQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUZyb21EM0QxMVRleHR1cmUzREtIUikoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9tZW1fZmxhZ3MgZmxhZ3MsIElEM0QxMVRleHR1cmUzRCAqcmVzb3VyY2UsCisgICAgVUlOVCBzdWJyZXNvdXJjZSwgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYKK2NsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZUFjcXVpcmVEM0QxMU9iamVjdHNLSFIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfdWludCBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKm1lbV9vYmplY3RzLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQgKmV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKwordHlwZWRlZgorY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlUmVsZWFzZUQzRDExT2JqZWN0c0tIUikoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF91aW50IG51bV9vYmplY3RzLAorICAgIGNvbnN0IGNsX21lbSAqbWVtX29iamVjdHMsIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCisvKiBjbF9raHJfZHg5X21lZGlhX3NoYXJpbmcgKi8KK3R5cGVkZWYKK2NsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0RGV2aWNlSURzRnJvbURYOU1lZGlhQWRhcHRlcktIUikoCisgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm0sIGNsX3VpbnQgbnVtX21lZGlhX2FkYXB0ZXJzLAorICAgIGNsX2R4OV9tZWRpYV9hZGFwdGVyX3R5cGVfa2hyICptZWRpYV9hZGFwdGVyc190eXBlLCB2b2lkICptZWRpYV9hZGFwdGVycywKKyAgICBjbF9keDlfbWVkaWFfYWRhcHRlcl9zZXRfa2hyIG1lZGlhX2FkYXB0ZXJfc2V0LCBjbF91aW50IG51bV9lbnRyaWVzLAorICAgIGNsX2RldmljZV9pZCAqZGV2aWNlcywgY2xfdWludCAqbnVtX2RldmljZXMpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX21lbShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlRnJvbURYOU1lZGlhU3VyZmFjZUtIUikoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9tZW1fZmxhZ3MgZmxhZ3MsCisgICAgY2xfZHg5X21lZGlhX2FkYXB0ZXJfdHlwZV9raHIgYWRhcHRlcl90eXBlLCB2b2lkICpzdXJmYWNlX2luZm8sCisgICAgY2xfdWludCBwbGFuZSwgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYKK2NsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZUFjcXVpcmVEWDlNZWRpYVN1cmZhY2VzS0hSKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX3VpbnQgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICptZW1fb2JqZWN0cywgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICpldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK3R5cGVkZWYKK2NsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsRW5xdWV1ZVJlbGVhc2VEWDlNZWRpYVN1cmZhY2VzS0hSKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX3VpbnQgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICptZW1fb2JqZWN0cywgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50ICpldmVudCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKKy8qIGNsX2tocl9kM2QxMV9zaGFyaW5nICovCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTCBjbEdldERldmljZUlEc0Zyb21EM0QxMUtIUigKKyAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwgY2xfZDNkMTFfZGV2aWNlX3NvdXJjZV9raHIgZDNkX2RldmljZV9zb3VyY2UsCisgICAgdm9pZCAqZDNkX29iamVjdCwgY2xfZDNkMTFfZGV2aWNlX3NldF9raHIgZDNkX2RldmljZV9zZXQsCisgICAgY2xfdWludCBudW1fZW50cmllcywgY2xfZGV2aWNlX2lkICpkZXZpY2VzLCBjbF91aW50ICpudW1fZGV2aWNlcyk7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfbWVtIENMX0FQSV9DQUxMCitjbENyZWF0ZUZyb21EM0QxMUJ1ZmZlcktIUihjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElEM0QxMUJ1ZmZlciAqcmVzb3VyY2UsIGNsX2ludCAqZXJyY29kZV9yZXQpOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX21lbSBDTF9BUElfQ0FMTCBjbENyZWF0ZUZyb21EM0QxMVRleHR1cmUyREtIUigKKyAgICBjbF9jb250ZXh0IGNvbnRleHQsIGNsX21lbV9mbGFncyBmbGFncywgSUQzRDExVGV4dHVyZTJEICpyZXNvdXJjZSwKKyAgICBVSU5UIHN1YnJlc291cmNlLCBjbF9pbnQgKmVycmNvZGVfcmV0KTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9tZW0gQ0xfQVBJX0NBTEwgY2xDcmVhdGVGcm9tRDNEMTFUZXh0dXJlM0RLSFIoCisgICAgY2xfY29udGV4dCBjb250ZXh0LCBjbF9tZW1fZmxhZ3MgZmxhZ3MsIElEM0QxMVRleHR1cmUzRCAqcmVzb3VyY2UsCisgICAgVUlOVCBzdWJyZXNvdXJjZSwgY2xfaW50ICplcnJjb2RlX3JldCk7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMIGNsRW5xdWV1ZUFjcXVpcmVEM0QxMU9iamVjdHNLSFIoCisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjbF91aW50IG51bV9vYmplY3RzLAorICAgIGNvbnN0IGNsX21lbSAqbWVtX29iamVjdHMsIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwgY2xfZXZlbnQgKmV2ZW50KTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwgY2xFbnF1ZXVlUmVsZWFzZUQzRDExT2JqZWN0c0tIUigKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX3VpbnQgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICptZW1fb2JqZWN0cywgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LCBjbF9ldmVudCAqZXZlbnQpOworCisvKiBjbF9raHJfZHg5X21lZGlhX3NoYXJpbmcgKi8KK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfaW50IENMX0FQSV9DQUxMIGNsR2V0RGV2aWNlSURzRnJvbURYOU1lZGlhQWRhcHRlcktIUigKKyAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwgY2xfdWludCBudW1fbWVkaWFfYWRhcHRlcnMsCisgICAgY2xfZHg5X21lZGlhX2FkYXB0ZXJfdHlwZV9raHIgKm1lZGlhX2FkYXB0ZXJfdHlwZSwgdm9pZCAqbWVkaWFfYWRhcHRlcnMsCisgICAgY2xfZHg5X21lZGlhX2FkYXB0ZXJfc2V0X2tociBtZWRpYV9hZGFwdGVyX3NldCwgY2xfdWludCBudW1fZW50cmllcywKKyAgICBjbF9kZXZpY2VfaWQgKmRldmljZXMsIGNsX3VpbnQgKm51bV9kZXZpY2VzKTsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9tZW0gQ0xfQVBJX0NBTEwgY2xDcmVhdGVGcm9tRFg5TWVkaWFTdXJmYWNlS0hSKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfbWVtX2ZsYWdzIGZsYWdzLAorICAgIGNsX2R4OV9tZWRpYV9hZGFwdGVyX3R5cGVfa2hyIGFkYXB0ZXJfdHlwZSwgdm9pZCAqc3VyZmFjZV9pbmZvLAorICAgIGNsX3VpbnQgcGxhbmUsIGNsX2ludCAqZXJyY29kZV9yZXQpOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTCBjbEVucXVldWVBY3F1aXJlRFg5TWVkaWFTdXJmYWNlc0tIUigKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX3VpbnQgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICptZW1fb2JqZWN0cywgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LCBjbF9ldmVudCAqZXZlbnQpOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTCBjbEVucXVldWVSZWxlYXNlRFg5TWVkaWFTdXJmYWNlc0tIUigKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX3VpbnQgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtICptZW1fb2JqZWN0cywgY2xfdWludCBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCAqZXZlbnRfd2FpdF9saXN0LCBjbF9ldmVudCAqZXZlbnQpOworCisjZWxzZQorCisvKiBjbF9raHJfZDNkMTBfc2hhcmluZyAqLwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xHZXREZXZpY2VJRHNGcm9tRDNEMTBLSFI7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbENyZWF0ZUZyb21EM0QxMEJ1ZmZlcktIUjsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsQ3JlYXRlRnJvbUQzRDEwVGV4dHVyZTJES0hSOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xDcmVhdGVGcm9tRDNEMTBUZXh0dXJlM0RLSFI7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEVucXVldWVBY3F1aXJlRDNEMTBPYmplY3RzS0hSOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xFbnF1ZXVlUmVsZWFzZUQzRDEwT2JqZWN0c0tIUjsKKworLyogY2xfa2hyX2QzZDExX3NoYXJpbmcgKi8KK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsR2V0RGV2aWNlSURzRnJvbUQzRDExS0hSOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xDcmVhdGVGcm9tRDNEMTFCdWZmZXJLSFI7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbENyZWF0ZUZyb21EM0QxMVRleHR1cmUyREtIUjsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsQ3JlYXRlRnJvbUQzRDExVGV4dHVyZTNES0hSOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xFbnF1ZXVlQWNxdWlyZUQzRDExT2JqZWN0c0tIUjsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsRW5xdWV1ZVJlbGVhc2VEM0QxMU9iamVjdHNLSFI7CisKKy8qIGNsX2tocl9keDlfbWVkaWFfc2hhcmluZyAqLwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xDcmVhdGVGcm9tRFg5TWVkaWFTdXJmYWNlS0hSOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xFbnF1ZXVlQWNxdWlyZURYOU1lZGlhU3VyZmFjZXNLSFI7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEVucXVldWVSZWxlYXNlRFg5TWVkaWFTdXJmYWNlc0tIUjsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsR2V0RGV2aWNlSURzRnJvbURYOU1lZGlhQWRhcHRlcktIUjsKKworI2VuZGlmCisKKy8qIE9wZW5DTCAxLjEgKi8KKworI2lmZGVmIENMX1ZFUlNJT05fMV8xCisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xTZXRFdmVudENhbGxiYWNrKSgKKyAgICBjbF9ldmVudCAvKiBldmVudCAqLywgY2xfaW50IC8qIGNvbW1hbmRfZXhlY19jYWxsYmFja190eXBlICovLAorICAgIHZvaWQoQ0xfQ0FMTEJBQ0sgKiAvKiBwZm5fbm90aWZ5ICovKShjbF9ldmVudCwgY2xfaW50LCB2b2lkICopLAorICAgIHZvaWQgKiAvKiB1c2VyX2RhdGEgKi8pIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCit0eXBlZGVmIGNsX21lbShDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ3JlYXRlU3ViQnVmZmVyKSgKKyAgICBjbF9tZW0gLyogYnVmZmVyICovLCBjbF9tZW1fZmxhZ3MgLyogZmxhZ3MgKi8sCisgICAgY2xfYnVmZmVyX2NyZWF0ZV90eXBlIC8qIGJ1ZmZlcl9jcmVhdGVfdHlwZSAqLywKKyAgICBjb25zdCB2b2lkICogLyogYnVmZmVyX2NyZWF0ZV9pbmZvICovLAorICAgIGNsX2ludCAqIC8qIGVycmNvZGVfcmV0ICovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKwordHlwZWRlZgorY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xTZXRNZW1PYmplY3REZXN0cnVjdG9yQ2FsbGJhY2spKAorICAgIGNsX21lbSAvKiBtZW1vYmogKi8sCisgICAgdm9pZChDTF9DQUxMQkFDSyAqIC8qcGZuX25vdGlmeSovKShjbF9tZW0gLyogbWVtb2JqICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIC8qdXNlcl9kYXRhKi8pLAorICAgIHZvaWQgKiAvKnVzZXJfZGF0YSAqLykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzE7CisKK3R5cGVkZWYgY2xfZXZlbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZVVzZXJFdmVudCkoCisgICAgY2xfY29udGV4dCAvKiBjb250ZXh0ICovLAorICAgIGNsX2ludCAqIC8qIGVycmNvZGVfcmV0ICovKSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMTsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbFNldFVzZXJFdmVudFN0YXR1cykoCisgICAgY2xfZXZlbnQgLyogZXZlbnQgKi8sCisgICAgY2xfaW50IC8qIGV4ZWN1dGlvbl9zdGF0dXMgKi8pIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xOworCisjZWxzZQorCit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbFNldEV2ZW50Q2FsbGJhY2s7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbENyZWF0ZVN1YkJ1ZmZlcjsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsU2V0TWVtT2JqZWN0RGVzdHJ1Y3RvckNhbGxiYWNrOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xDcmVhdGVVc2VyRXZlbnQ7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbFNldFVzZXJFdmVudFN0YXR1czsKKworI2VuZGlmCisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVTdWJEZXZpY2VzRVhUKSgKKyAgICBjbF9kZXZpY2VfaWQgaW5fZGV2aWNlLAorICAgIGNvbnN0IGNsX2RldmljZV9wYXJ0aXRpb25fcHJvcGVydHlfZXh0ICpwYXJ0aXRpb25fcHJvcGVydGllcywKKyAgICBjbF91aW50IG51bV9lbnRyaWVzLCBjbF9kZXZpY2VfaWQgKm91dF9kZXZpY2VzLCBjbF91aW50ICpudW1fZGV2aWNlcyk7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xSZXRhaW5EZXZpY2VFWFQpKAorICAgIGNsX2RldmljZV9pZCBkZXZpY2UpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsUmVsZWFzZURldmljZUVYVCkoCisgICAgY2xfZGV2aWNlX2lkIGRldmljZSkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzA7CisKKy8qIGNsX2tocl9lZ2xfaW1hZ2UgKi8KK3R5cGVkZWYgY2xfbWVtKENMX0FQSV9DQUxMICpjbF9hcGlfY2xDcmVhdGVGcm9tRUdMSW1hZ2VLSFIpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgQ0xlZ2xEaXNwbGF5S0hSIGRpc3BsYXksIENMZWdsSW1hZ2VLSFIgaW1hZ2UsCisgICAgY2xfbWVtX2ZsYWdzIGZsYWdzLCBjb25zdCBjbF9lZ2xfaW1hZ2VfcHJvcGVydGllc19raHIgKnByb3BlcnRpZXMsCisgICAgY2xfaW50ICplcnJjb2RlX3JldCk7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlQWNxdWlyZUVHTE9iamVjdHNLSFIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfdWludCBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKm1lbV9vYmplY3RzLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsIGNsX2V2ZW50ICpldmVudCk7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xFbnF1ZXVlUmVsZWFzZUVHTE9iamVjdHNLSFIpKAorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfdWludCBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0gKm1lbV9vYmplY3RzLCBjbF91aW50IG51bV9ldmVudHNfaW5fd2FpdF9saXN0LAorICAgIGNvbnN0IGNsX2V2ZW50ICpldmVudF93YWl0X2xpc3QsIGNsX2V2ZW50ICpldmVudCk7CisKKy8qIGNsX2tocl9lZ2xfZXZlbnQgKi8KK3R5cGVkZWYgY2xfZXZlbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZUV2ZW50RnJvbUVHTFN5bmNLSFIpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgQ0xlZ2xTeW5jS0hSIHN5bmMsIENMZWdsRGlzcGxheUtIUiBkaXNwbGF5LAorICAgIGNsX2ludCAqZXJyY29kZV9yZXQpOworCisjaWZkZWYgQ0xfVkVSU0lPTl8yXzEKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbFNldERlZmF1bHREZXZpY2VDb21tYW5kUXVldWUpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY2xfZGV2aWNlX2lkIGRldmljZSwKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8xOworCit0eXBlZGVmIGNsX3Byb2dyYW0oQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbENyZWF0ZVByb2dyYW1XaXRoSUwpKAorICAgIGNsX2NvbnRleHQgY29udGV4dCwgY29uc3Qgdm9pZCAqaWwsIHNpemVfdCBsZW5ndGgsCisgICAgY2xfaW50ICplcnJjb2RlX3JldCkgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzE7CisKK3R5cGVkZWYgY2xfaW50KENMX0FQSV9DQUxMICpjbF9hcGlfY2xHZXRLZXJuZWxTdWJHcm91cEluZm8pKAorICAgIGNsX2tlcm5lbCBrZXJuZWwsIGNsX2RldmljZV9pZCBkZXZpY2UsIGNsX2tlcm5lbF9zdWJfZ3JvdXBfaW5mbyBwYXJhbV9uYW1lLAorICAgIHNpemVfdCBpbnB1dF92YWx1ZV9zaXplLCBjb25zdCB2b2lkICppbnB1dF92YWx1ZSwgc2l6ZV90IHBhcmFtX3ZhbHVlX3NpemUsCisgICAgdm9pZCAqcGFyYW1fdmFsdWUsIHNpemVfdCAqcGFyYW1fdmFsdWVfc2l6ZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8xOworCit0eXBlZGVmIGNsX2tlcm5lbChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsQ2xvbmVLZXJuZWwpKAorICAgIGNsX2tlcm5lbCBzb3VyY2Vfa2VybmVsLCBjbF9pbnQgKmVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMTsKKwordHlwZWRlZiBjbF9pbnQoQ0xfQVBJX0NBTEwgKmNsX2FwaV9jbEVucXVldWVTVk1NaWdyYXRlTWVtKSgKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNsX3VpbnQgbnVtX3N2bV9wb2ludGVycywKKyAgICBjb25zdCB2b2lkICoqc3ZtX3BvaW50ZXJzLCBjb25zdCBzaXplX3QgKnNpemVzLAorICAgIGNsX21lbV9taWdyYXRpb25fZmxhZ3MgZmxhZ3MsIGNsX3VpbnQgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQgKmV2ZW50X3dhaXRfbGlzdCwKKyAgICBjbF9ldmVudCAqZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8xOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0RGV2aWNlQW5kSG9zdFRpbWVyKSgKKyAgICBjbF9kZXZpY2VfaWQgZGV2aWNlLCBjbF91bG9uZyAqZGV2aWNlX3RpbWVzdGFtcCwKKyAgICBjbF91bG9uZyAqaG9zdF90aW1lc3RhbXApIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8xOworCit0eXBlZGVmIGNsX2ludChDTF9BUElfQ0FMTCAqY2xfYXBpX2NsR2V0SG9zdFRpbWVyKSgKKyAgICBjbF9kZXZpY2VfaWQgZGV2aWNlLCBjbF91bG9uZyAqaG9zdF90aW1lc3RhbXApIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8xOworCisjZWxzZQorCit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbFNldERlZmF1bHREZXZpY2VDb21tYW5kUXVldWU7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbENyZWF0ZVByb2dyYW1XaXRoSUw7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEdldEtlcm5lbFN1Ykdyb3VwSW5mbzsKK3R5cGVkZWYgdm9pZCAqY2xfYXBpX2NsQ2xvbmVLZXJuZWw7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEVucXVldWVTVk1NaWdyYXRlTWVtOwordHlwZWRlZiB2b2lkICpjbF9hcGlfY2xHZXREZXZpY2VBbmRIb3N0VGltZXI7Cit0eXBlZGVmIHZvaWQgKmNsX2FwaV9jbEdldEhvc3RUaW1lcjsKKworI2VuZGlmCisKKy8qIFZlbmRvciBkaXNwYXRjaCB0YWJsZSBzdHJ1dHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCBfY2xfaWNkX2Rpc3BhdGNoIHsKKyAgLyogT3BlbkNMIDEuMCAqLworICBjbF9hcGlfY2xHZXRQbGF0Zm9ybUlEcyBjbEdldFBsYXRmb3JtSURzOworICBjbF9hcGlfY2xHZXRQbGF0Zm9ybUluZm8gY2xHZXRQbGF0Zm9ybUluZm87CisgIGNsX2FwaV9jbEdldERldmljZUlEcyBjbEdldERldmljZUlEczsKKyAgY2xfYXBpX2NsR2V0RGV2aWNlSW5mbyBjbEdldERldmljZUluZm87CisgIGNsX2FwaV9jbENyZWF0ZUNvbnRleHQgY2xDcmVhdGVDb250ZXh0OworICBjbF9hcGlfY2xDcmVhdGVDb250ZXh0RnJvbVR5cGUgY2xDcmVhdGVDb250ZXh0RnJvbVR5cGU7CisgIGNsX2FwaV9jbFJldGFpbkNvbnRleHQgY2xSZXRhaW5Db250ZXh0OworICBjbF9hcGlfY2xSZWxlYXNlQ29udGV4dCBjbFJlbGVhc2VDb250ZXh0OworICBjbF9hcGlfY2xHZXRDb250ZXh0SW5mbyBjbEdldENvbnRleHRJbmZvOworICBjbF9hcGlfY2xDcmVhdGVDb21tYW5kUXVldWUgY2xDcmVhdGVDb21tYW5kUXVldWU7CisgIGNsX2FwaV9jbFJldGFpbkNvbW1hbmRRdWV1ZSBjbFJldGFpbkNvbW1hbmRRdWV1ZTsKKyAgY2xfYXBpX2NsUmVsZWFzZUNvbW1hbmRRdWV1ZSBjbFJlbGVhc2VDb21tYW5kUXVldWU7CisgIGNsX2FwaV9jbEdldENvbW1hbmRRdWV1ZUluZm8gY2xHZXRDb21tYW5kUXVldWVJbmZvOworICBjbF9hcGlfY2xTZXRDb21tYW5kUXVldWVQcm9wZXJ0eSBjbFNldENvbW1hbmRRdWV1ZVByb3BlcnR5OworICBjbF9hcGlfY2xDcmVhdGVCdWZmZXIgY2xDcmVhdGVCdWZmZXI7CisgIGNsX2FwaV9jbENyZWF0ZUltYWdlMkQgY2xDcmVhdGVJbWFnZTJEOworICBjbF9hcGlfY2xDcmVhdGVJbWFnZTNEIGNsQ3JlYXRlSW1hZ2UzRDsKKyAgY2xfYXBpX2NsUmV0YWluTWVtT2JqZWN0IGNsUmV0YWluTWVtT2JqZWN0OworICBjbF9hcGlfY2xSZWxlYXNlTWVtT2JqZWN0IGNsUmVsZWFzZU1lbU9iamVjdDsKKyAgY2xfYXBpX2NsR2V0U3VwcG9ydGVkSW1hZ2VGb3JtYXRzIGNsR2V0U3VwcG9ydGVkSW1hZ2VGb3JtYXRzOworICBjbF9hcGlfY2xHZXRNZW1PYmplY3RJbmZvIGNsR2V0TWVtT2JqZWN0SW5mbzsKKyAgY2xfYXBpX2NsR2V0SW1hZ2VJbmZvIGNsR2V0SW1hZ2VJbmZvOworICBjbF9hcGlfY2xDcmVhdGVTYW1wbGVyIGNsQ3JlYXRlU2FtcGxlcjsKKyAgY2xfYXBpX2NsUmV0YWluU2FtcGxlciBjbFJldGFpblNhbXBsZXI7CisgIGNsX2FwaV9jbFJlbGVhc2VTYW1wbGVyIGNsUmVsZWFzZVNhbXBsZXI7CisgIGNsX2FwaV9jbEdldFNhbXBsZXJJbmZvIGNsR2V0U2FtcGxlckluZm87CisgIGNsX2FwaV9jbENyZWF0ZVByb2dyYW1XaXRoU291cmNlIGNsQ3JlYXRlUHJvZ3JhbVdpdGhTb3VyY2U7CisgIGNsX2FwaV9jbENyZWF0ZVByb2dyYW1XaXRoQmluYXJ5IGNsQ3JlYXRlUHJvZ3JhbVdpdGhCaW5hcnk7CisgIGNsX2FwaV9jbFJldGFpblByb2dyYW0gY2xSZXRhaW5Qcm9ncmFtOworICBjbF9hcGlfY2xSZWxlYXNlUHJvZ3JhbSBjbFJlbGVhc2VQcm9ncmFtOworICBjbF9hcGlfY2xCdWlsZFByb2dyYW0gY2xCdWlsZFByb2dyYW07CisgIGNsX2FwaV9jbFVubG9hZENvbXBpbGVyIGNsVW5sb2FkQ29tcGlsZXI7CisgIGNsX2FwaV9jbEdldFByb2dyYW1JbmZvIGNsR2V0UHJvZ3JhbUluZm87CisgIGNsX2FwaV9jbEdldFByb2dyYW1CdWlsZEluZm8gY2xHZXRQcm9ncmFtQnVpbGRJbmZvOworICBjbF9hcGlfY2xDcmVhdGVLZXJuZWwgY2xDcmVhdGVLZXJuZWw7CisgIGNsX2FwaV9jbENyZWF0ZUtlcm5lbHNJblByb2dyYW0gY2xDcmVhdGVLZXJuZWxzSW5Qcm9ncmFtOworICBjbF9hcGlfY2xSZXRhaW5LZXJuZWwgY2xSZXRhaW5LZXJuZWw7CisgIGNsX2FwaV9jbFJlbGVhc2VLZXJuZWwgY2xSZWxlYXNlS2VybmVsOworICBjbF9hcGlfY2xTZXRLZXJuZWxBcmcgY2xTZXRLZXJuZWxBcmc7CisgIGNsX2FwaV9jbEdldEtlcm5lbEluZm8gY2xHZXRLZXJuZWxJbmZvOworICBjbF9hcGlfY2xHZXRLZXJuZWxXb3JrR3JvdXBJbmZvIGNsR2V0S2VybmVsV29ya0dyb3VwSW5mbzsKKyAgY2xfYXBpX2NsV2FpdEZvckV2ZW50cyBjbFdhaXRGb3JFdmVudHM7CisgIGNsX2FwaV9jbEdldEV2ZW50SW5mbyBjbEdldEV2ZW50SW5mbzsKKyAgY2xfYXBpX2NsUmV0YWluRXZlbnQgY2xSZXRhaW5FdmVudDsKKyAgY2xfYXBpX2NsUmVsZWFzZUV2ZW50IGNsUmVsZWFzZUV2ZW50OworICBjbF9hcGlfY2xHZXRFdmVudFByb2ZpbGluZ0luZm8gY2xHZXRFdmVudFByb2ZpbGluZ0luZm87CisgIGNsX2FwaV9jbEZsdXNoIGNsRmx1c2g7CisgIGNsX2FwaV9jbEZpbmlzaCBjbEZpbmlzaDsKKyAgY2xfYXBpX2NsRW5xdWV1ZVJlYWRCdWZmZXIgY2xFbnF1ZXVlUmVhZEJ1ZmZlcjsKKyAgY2xfYXBpX2NsRW5xdWV1ZVdyaXRlQnVmZmVyIGNsRW5xdWV1ZVdyaXRlQnVmZmVyOworICBjbF9hcGlfY2xFbnF1ZXVlQ29weUJ1ZmZlciBjbEVucXVldWVDb3B5QnVmZmVyOworICBjbF9hcGlfY2xFbnF1ZXVlUmVhZEltYWdlIGNsRW5xdWV1ZVJlYWRJbWFnZTsKKyAgY2xfYXBpX2NsRW5xdWV1ZVdyaXRlSW1hZ2UgY2xFbnF1ZXVlV3JpdGVJbWFnZTsKKyAgY2xfYXBpX2NsRW5xdWV1ZUNvcHlJbWFnZSBjbEVucXVldWVDb3B5SW1hZ2U7CisgIGNsX2FwaV9jbEVucXVldWVDb3B5SW1hZ2VUb0J1ZmZlciBjbEVucXVldWVDb3B5SW1hZ2VUb0J1ZmZlcjsKKyAgY2xfYXBpX2NsRW5xdWV1ZUNvcHlCdWZmZXJUb0ltYWdlIGNsRW5xdWV1ZUNvcHlCdWZmZXJUb0ltYWdlOworICBjbF9hcGlfY2xFbnF1ZXVlTWFwQnVmZmVyIGNsRW5xdWV1ZU1hcEJ1ZmZlcjsKKyAgY2xfYXBpX2NsRW5xdWV1ZU1hcEltYWdlIGNsRW5xdWV1ZU1hcEltYWdlOworICBjbF9hcGlfY2xFbnF1ZXVlVW5tYXBNZW1PYmplY3QgY2xFbnF1ZXVlVW5tYXBNZW1PYmplY3Q7CisgIGNsX2FwaV9jbEVucXVldWVORFJhbmdlS2VybmVsIGNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWw7CisgIGNsX2FwaV9jbEVucXVldWVUYXNrIGNsRW5xdWV1ZVRhc2s7CisgIGNsX2FwaV9jbEVucXVldWVOYXRpdmVLZXJuZWwgY2xFbnF1ZXVlTmF0aXZlS2VybmVsOworICBjbF9hcGlfY2xFbnF1ZXVlTWFya2VyIGNsRW5xdWV1ZU1hcmtlcjsKKyAgY2xfYXBpX2NsRW5xdWV1ZVdhaXRGb3JFdmVudHMgY2xFbnF1ZXVlV2FpdEZvckV2ZW50czsKKyAgY2xfYXBpX2NsRW5xdWV1ZUJhcnJpZXIgY2xFbnF1ZXVlQmFycmllcjsKKyAgY2xfYXBpX2NsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzIGNsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzOworICBjbF9hcGlfY2xDcmVhdGVGcm9tR0xCdWZmZXIgY2xDcmVhdGVGcm9tR0xCdWZmZXI7CisgIGNsX2FwaV9jbENyZWF0ZUZyb21HTFRleHR1cmUyRCBjbENyZWF0ZUZyb21HTFRleHR1cmUyRDsKKyAgY2xfYXBpX2NsQ3JlYXRlRnJvbUdMVGV4dHVyZTNEIGNsQ3JlYXRlRnJvbUdMVGV4dHVyZTNEOworICBjbF9hcGlfY2xDcmVhdGVGcm9tR0xSZW5kZXJidWZmZXIgY2xDcmVhdGVGcm9tR0xSZW5kZXJidWZmZXI7CisgIGNsX2FwaV9jbEdldEdMT2JqZWN0SW5mbyBjbEdldEdMT2JqZWN0SW5mbzsKKyAgY2xfYXBpX2NsR2V0R0xUZXh0dXJlSW5mbyBjbEdldEdMVGV4dHVyZUluZm87CisgIGNsX2FwaV9jbEVucXVldWVBY3F1aXJlR0xPYmplY3RzIGNsRW5xdWV1ZUFjcXVpcmVHTE9iamVjdHM7CisgIGNsX2FwaV9jbEVucXVldWVSZWxlYXNlR0xPYmplY3RzIGNsRW5xdWV1ZVJlbGVhc2VHTE9iamVjdHM7CisgIGNsX2FwaV9jbEdldEdMQ29udGV4dEluZm9LSFIgY2xHZXRHTENvbnRleHRJbmZvS0hSOworCisgIC8qIGNsX2tocl9kM2QxMF9zaGFyaW5nICovCisgIGNsX2FwaV9jbEdldERldmljZUlEc0Zyb21EM0QxMEtIUiBjbEdldERldmljZUlEc0Zyb21EM0QxMEtIUjsKKyAgY2xfYXBpX2NsQ3JlYXRlRnJvbUQzRDEwQnVmZmVyS0hSIGNsQ3JlYXRlRnJvbUQzRDEwQnVmZmVyS0hSOworICBjbF9hcGlfY2xDcmVhdGVGcm9tRDNEMTBUZXh0dXJlMkRLSFIgY2xDcmVhdGVGcm9tRDNEMTBUZXh0dXJlMkRLSFI7CisgIGNsX2FwaV9jbENyZWF0ZUZyb21EM0QxMFRleHR1cmUzREtIUiBjbENyZWF0ZUZyb21EM0QxMFRleHR1cmUzREtIUjsKKyAgY2xfYXBpX2NsRW5xdWV1ZUFjcXVpcmVEM0QxME9iamVjdHNLSFIgY2xFbnF1ZXVlQWNxdWlyZUQzRDEwT2JqZWN0c0tIUjsKKyAgY2xfYXBpX2NsRW5xdWV1ZVJlbGVhc2VEM0QxME9iamVjdHNLSFIgY2xFbnF1ZXVlUmVsZWFzZUQzRDEwT2JqZWN0c0tIUjsKKworICAvKiBPcGVuQ0wgMS4xICovCisgIGNsX2FwaV9jbFNldEV2ZW50Q2FsbGJhY2sgY2xTZXRFdmVudENhbGxiYWNrOworICBjbF9hcGlfY2xDcmVhdGVTdWJCdWZmZXIgY2xDcmVhdGVTdWJCdWZmZXI7CisgIGNsX2FwaV9jbFNldE1lbU9iamVjdERlc3RydWN0b3JDYWxsYmFjayBjbFNldE1lbU9iamVjdERlc3RydWN0b3JDYWxsYmFjazsKKyAgY2xfYXBpX2NsQ3JlYXRlVXNlckV2ZW50IGNsQ3JlYXRlVXNlckV2ZW50OworICBjbF9hcGlfY2xTZXRVc2VyRXZlbnRTdGF0dXMgY2xTZXRVc2VyRXZlbnRTdGF0dXM7CisgIGNsX2FwaV9jbEVucXVldWVSZWFkQnVmZmVyUmVjdCBjbEVucXVldWVSZWFkQnVmZmVyUmVjdDsKKyAgY2xfYXBpX2NsRW5xdWV1ZVdyaXRlQnVmZmVyUmVjdCBjbEVucXVldWVXcml0ZUJ1ZmZlclJlY3Q7CisgIGNsX2FwaV9jbEVucXVldWVDb3B5QnVmZmVyUmVjdCBjbEVucXVldWVDb3B5QnVmZmVyUmVjdDsKKworICAvKiBjbF9leHRfZGV2aWNlX2Zpc3Npb24gKi8KKyAgY2xfYXBpX2NsQ3JlYXRlU3ViRGV2aWNlc0VYVCBjbENyZWF0ZVN1YkRldmljZXNFWFQ7CisgIGNsX2FwaV9jbFJldGFpbkRldmljZUVYVCBjbFJldGFpbkRldmljZUVYVDsKKyAgY2xfYXBpX2NsUmVsZWFzZURldmljZUVYVCBjbFJlbGVhc2VEZXZpY2VFWFQ7CisKKyAgLyogY2xfa2hyX2dsX2V2ZW50ICovCisgIGNsX2FwaV9jbENyZWF0ZUV2ZW50RnJvbUdMc3luY0tIUiBjbENyZWF0ZUV2ZW50RnJvbUdMc3luY0tIUjsKKworICAvKiBPcGVuQ0wgMS4yICovCisgIGNsX2FwaV9jbENyZWF0ZVN1YkRldmljZXMgY2xDcmVhdGVTdWJEZXZpY2VzOworICBjbF9hcGlfY2xSZXRhaW5EZXZpY2UgY2xSZXRhaW5EZXZpY2U7CisgIGNsX2FwaV9jbFJlbGVhc2VEZXZpY2UgY2xSZWxlYXNlRGV2aWNlOworICBjbF9hcGlfY2xDcmVhdGVJbWFnZSBjbENyZWF0ZUltYWdlOworICBjbF9hcGlfY2xDcmVhdGVQcm9ncmFtV2l0aEJ1aWx0SW5LZXJuZWxzIGNsQ3JlYXRlUHJvZ3JhbVdpdGhCdWlsdEluS2VybmVsczsKKyAgY2xfYXBpX2NsQ29tcGlsZVByb2dyYW0gY2xDb21waWxlUHJvZ3JhbTsKKyAgY2xfYXBpX2NsTGlua1Byb2dyYW0gY2xMaW5rUHJvZ3JhbTsKKyAgY2xfYXBpX2NsVW5sb2FkUGxhdGZvcm1Db21waWxlciBjbFVubG9hZFBsYXRmb3JtQ29tcGlsZXI7CisgIGNsX2FwaV9jbEdldEtlcm5lbEFyZ0luZm8gY2xHZXRLZXJuZWxBcmdJbmZvOworICBjbF9hcGlfY2xFbnF1ZXVlRmlsbEJ1ZmZlciBjbEVucXVldWVGaWxsQnVmZmVyOworICBjbF9hcGlfY2xFbnF1ZXVlRmlsbEltYWdlIGNsRW5xdWV1ZUZpbGxJbWFnZTsKKyAgY2xfYXBpX2NsRW5xdWV1ZU1pZ3JhdGVNZW1PYmplY3RzIGNsRW5xdWV1ZU1pZ3JhdGVNZW1PYmplY3RzOworICBjbF9hcGlfY2xFbnF1ZXVlTWFya2VyV2l0aFdhaXRMaXN0IGNsRW5xdWV1ZU1hcmtlcldpdGhXYWl0TGlzdDsKKyAgY2xfYXBpX2NsRW5xdWV1ZUJhcnJpZXJXaXRoV2FpdExpc3QgY2xFbnF1ZXVlQmFycmllcldpdGhXYWl0TGlzdDsKKyAgY2xfYXBpX2NsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzRm9yUGxhdGZvcm0KKyAgICAgIGNsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzRm9yUGxhdGZvcm07CisgIGNsX2FwaV9jbENyZWF0ZUZyb21HTFRleHR1cmUgY2xDcmVhdGVGcm9tR0xUZXh0dXJlOworCisgIC8qIGNsX2tocl9kM2QxMV9zaGFyaW5nICovCisgIGNsX2FwaV9jbEdldERldmljZUlEc0Zyb21EM0QxMUtIUiBjbEdldERldmljZUlEc0Zyb21EM0QxMUtIUjsKKyAgY2xfYXBpX2NsQ3JlYXRlRnJvbUQzRDExQnVmZmVyS0hSIGNsQ3JlYXRlRnJvbUQzRDExQnVmZmVyS0hSOworICBjbF9hcGlfY2xDcmVhdGVGcm9tRDNEMTFUZXh0dXJlMkRLSFIgY2xDcmVhdGVGcm9tRDNEMTFUZXh0dXJlMkRLSFI7CisgIGNsX2FwaV9jbENyZWF0ZUZyb21EM0QxMVRleHR1cmUzREtIUiBjbENyZWF0ZUZyb21EM0QxMVRleHR1cmUzREtIUjsKKyAgY2xfYXBpX2NsQ3JlYXRlRnJvbURYOU1lZGlhU3VyZmFjZUtIUiBjbENyZWF0ZUZyb21EWDlNZWRpYVN1cmZhY2VLSFI7CisgIGNsX2FwaV9jbEVucXVldWVBY3F1aXJlRDNEMTFPYmplY3RzS0hSIGNsRW5xdWV1ZUFjcXVpcmVEM0QxMU9iamVjdHNLSFI7CisgIGNsX2FwaV9jbEVucXVldWVSZWxlYXNlRDNEMTFPYmplY3RzS0hSIGNsRW5xdWV1ZVJlbGVhc2VEM0QxMU9iamVjdHNLSFI7CisKKyAgLyogY2xfa2hyX2R4OV9tZWRpYV9zaGFyaW5nICovCisgIGNsX2FwaV9jbEdldERldmljZUlEc0Zyb21EWDlNZWRpYUFkYXB0ZXJLSFIKKyAgICAgIGNsR2V0RGV2aWNlSURzRnJvbURYOU1lZGlhQWRhcHRlcktIUjsKKyAgY2xfYXBpX2NsRW5xdWV1ZUFjcXVpcmVEWDlNZWRpYVN1cmZhY2VzS0hSCisgICAgICBjbEVucXVldWVBY3F1aXJlRFg5TWVkaWFTdXJmYWNlc0tIUjsKKyAgY2xfYXBpX2NsRW5xdWV1ZVJlbGVhc2VEWDlNZWRpYVN1cmZhY2VzS0hSCisgICAgICBjbEVucXVldWVSZWxlYXNlRFg5TWVkaWFTdXJmYWNlc0tIUjsKKworICAvKiBjbF9raHJfZWdsX2ltYWdlICovCisgIGNsX2FwaV9jbENyZWF0ZUZyb21FR0xJbWFnZUtIUiBjbENyZWF0ZUZyb21FR0xJbWFnZUtIUjsKKyAgY2xfYXBpX2NsRW5xdWV1ZUFjcXVpcmVFR0xPYmplY3RzS0hSIGNsRW5xdWV1ZUFjcXVpcmVFR0xPYmplY3RzS0hSOworICBjbF9hcGlfY2xFbnF1ZXVlUmVsZWFzZUVHTE9iamVjdHNLSFIgY2xFbnF1ZXVlUmVsZWFzZUVHTE9iamVjdHNLSFI7CisKKyAgLyogY2xfa2hyX2VnbF9ldmVudCAqLworICBjbF9hcGlfY2xDcmVhdGVFdmVudEZyb21FR0xTeW5jS0hSIGNsQ3JlYXRlRXZlbnRGcm9tRUdMU3luY0tIUjsKKworICAvKiBPcGVuQ0wgMi4wICovCisgIGNsX2FwaV9jbENyZWF0ZUNvbW1hbmRRdWV1ZVdpdGhQcm9wZXJ0aWVzIGNsQ3JlYXRlQ29tbWFuZFF1ZXVlV2l0aFByb3BlcnRpZXM7CisgIGNsX2FwaV9jbENyZWF0ZVBpcGUgY2xDcmVhdGVQaXBlOworICBjbF9hcGlfY2xHZXRQaXBlSW5mbyBjbEdldFBpcGVJbmZvOworICBjbF9hcGlfY2xTVk1BbGxvYyBjbFNWTUFsbG9jOworICBjbF9hcGlfY2xTVk1GcmVlIGNsU1ZNRnJlZTsKKyAgY2xfYXBpX2NsRW5xdWV1ZVNWTUZyZWUgY2xFbnF1ZXVlU1ZNRnJlZTsKKyAgY2xfYXBpX2NsRW5xdWV1ZVNWTU1lbWNweSBjbEVucXVldWVTVk1NZW1jcHk7CisgIGNsX2FwaV9jbEVucXVldWVTVk1NZW1GaWxsIGNsRW5xdWV1ZVNWTU1lbUZpbGw7CisgIGNsX2FwaV9jbEVucXVldWVTVk1NYXAgY2xFbnF1ZXVlU1ZNTWFwOworICBjbF9hcGlfY2xFbnF1ZXVlU1ZNVW5tYXAgY2xFbnF1ZXVlU1ZNVW5tYXA7CisgIGNsX2FwaV9jbENyZWF0ZVNhbXBsZXJXaXRoUHJvcGVydGllcyBjbENyZWF0ZVNhbXBsZXJXaXRoUHJvcGVydGllczsKKyAgY2xfYXBpX2NsU2V0S2VybmVsQXJnU1ZNUG9pbnRlciBjbFNldEtlcm5lbEFyZ1NWTVBvaW50ZXI7CisgIGNsX2FwaV9jbFNldEtlcm5lbEV4ZWNJbmZvIGNsU2V0S2VybmVsRXhlY0luZm87CisKKyAgLyogY2xfa2hyX3N1Yl9ncm91cHMgKi8KKyAgY2xfYXBpX2NsR2V0S2VybmVsU3ViR3JvdXBJbmZvS0hSIGNsR2V0S2VybmVsU3ViR3JvdXBJbmZvS0hSOworCisgIC8qIE9wZW5DTCAyLjEgKi8KKyAgY2xfYXBpX2NsQ2xvbmVLZXJuZWwgY2xDbG9uZUtlcm5lbDsKKyAgY2xfYXBpX2NsQ3JlYXRlUHJvZ3JhbVdpdGhJTCBjbENyZWF0ZVByb2dyYW1XaXRoSUw7CisgIGNsX2FwaV9jbEVucXVldWVTVk1NaWdyYXRlTWVtIGNsRW5xdWV1ZVNWTU1pZ3JhdGVNZW07CisgIGNsX2FwaV9jbEdldERldmljZUFuZEhvc3RUaW1lciBjbEdldERldmljZUFuZEhvc3RUaW1lcjsKKyAgY2xfYXBpX2NsR2V0SG9zdFRpbWVyIGNsR2V0SG9zdFRpbWVyOworICBjbF9hcGlfY2xHZXRLZXJuZWxTdWJHcm91cEluZm8gY2xHZXRLZXJuZWxTdWJHcm91cEluZm87CisgIGNsX2FwaV9jbFNldERlZmF1bHREZXZpY2VDb21tYW5kUXVldWUgY2xTZXREZWZhdWx0RGV2aWNlQ29tbWFuZFF1ZXVlOworCisgIC8qIE9wZW5DTCAyLjIgKi8KKyAgY2xfYXBpX2NsU2V0UHJvZ3JhbVJlbGVhc2VDYWxsYmFjayBjbFNldFByb2dyYW1SZWxlYXNlQ2FsbGJhY2s7CisgIGNsX2FwaV9jbFNldFByb2dyYW1TcGVjaWFsaXphdGlvbkNvbnN0YW50IGNsU2V0UHJvZ3JhbVNwZWNpYWxpemF0aW9uQ29uc3RhbnQ7CisKKyAgLyogT3BlbkNMIDMuMCAqLworICBjbF9hcGlfY2xDcmVhdGVCdWZmZXJXaXRoUHJvcGVydGllcyBjbENyZWF0ZUJ1ZmZlcldpdGhQcm9wZXJ0aWVzOworICBjbF9hcGlfY2xDcmVhdGVJbWFnZVdpdGhQcm9wZXJ0aWVzIGNsQ3JlYXRlSW1hZ2VXaXRoUHJvcGVydGllczsKKyAgY2xfYXBpX2NsU2V0Q29udGV4dERlc3RydWN0b3JDYWxsYmFjayBjbFNldENvbnRleHREZXN0cnVjdG9yQ2FsbGJhY2s7CisKK30gY2xfaWNkX2Rpc3BhdGNoOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogI2lmbmRlZiBPUEVOQ0xfQ0xfSUNEX0ggKi8KZGlmZiAtLWdpdCBhL09wZW5DTC9DTC9jbF9sYXllci5oIGIvT3BlbkNML0NML2NsX2xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkYWU3NQotLS0gL2Rldi9udWxsCisrKyBiL09wZW5DTC9DTC9jbF9sYXllci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIE9wZW5DTCBpcyBhIHRyYWRlbWFyayBvZiBBcHBsZSBJbmMuIHVzZWQgdW5kZXIgbGljZW5zZSBieSBLaHJvbm9zLgorICovCisKKyNpZm5kZWYgT1BFTkNMX0NMX0xBWUVSX0gKKyNkZWZpbmUgT1BFTkNMX0NMX0xBWUVSX0gKKworI2luY2x1ZGUgPENML2NsX2ljZC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgY2xfdWludCBjbF9sYXllcl9pbmZvOwordHlwZWRlZiBjbF91aW50IGNsX2xheWVyX2FwaV92ZXJzaW9uOworI2RlZmluZSBDTF9MQVlFUl9BUElfVkVSU0lPTiAweDQyNDAKKyNkZWZpbmUgQ0xfTEFZRVJfQVBJX1ZFUlNJT05fMTAwIDEwMAorCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xHZXRMYXllckluZm8oY2xfbGF5ZXJfaW5mbyAgcGFyYW1fbmFtZSwKKyAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwYXJhbV92YWx1ZSwKKyAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgKnBhcmFtX3ZhbHVlX3NpemVfcmV0KTsKKwordHlwZWRlZiBjbF9pbnQKKyhDTF9BUElfQ0FMTCAqcGZuX2NsR2V0TGF5ZXJJbmZvKShjbF9sYXllcl9pbmZvICBwYXJhbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHBhcmFtX3ZhbHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcGFyYW1fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcGFyYW1fdmFsdWVfc2l6ZV9yZXQpOworCitleHRlcm4gQ0xfQVBJX0VOVFJZIGNsX2ludCBDTF9BUElfQ0FMTAorY2xJbml0TGF5ZXIoY2xfdWludCAgICAgICAgICAgICAgICAgbnVtX2VudHJpZXMsCisgICAgICAgICAgICBjb25zdCBjbF9pY2RfZGlzcGF0Y2ggICp0YXJnZXRfZGlzcGF0Y2gsCisgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgICAgICpudW1fZW50cmllc19yZXQsCisgICAgICAgICAgICBjb25zdCBjbF9pY2RfZGlzcGF0Y2ggKipsYXllcl9kaXNwYXRjaF9yZXQpOworCit0eXBlZGVmIGNsX2ludAorKENMX0FQSV9DQUxMICpwZm5fY2xJbml0TGF5ZXIpKGNsX3VpbnQgICAgICAgICAgICAgICAgIG51bV9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsX2ljZF9kaXNwYXRjaCAgKnRhcmdldF9kaXNwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICAgICAgICAgICAgICAgICpudW1fZW50cmllc19yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xfaWNkX2Rpc3BhdGNoICoqbGF5ZXJfZGlzcGF0Y2hfcmV0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIE9QRU5DTF9DTF9MQVlFUl9IICovCmRpZmYgLS1naXQgYS9PcGVuQ0wvQ0wvY2xfcGxhdGZvcm0uaCBiL09wZW5DTC9DTC9jbF9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTY1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuQ0wvQ0wvY2xfcGxhdGZvcm0uaApAQCAtMCwwICsxLDE0MDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAyMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DTF9QTEFURk9STV9ICisjZGVmaW5lIF9fQ0xfUExBVEZPUk1fSAorCisjaW5jbHVkZSA8Q0wvY2xfdmVyc2lvbi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICAjaWYgIWRlZmluZWQoQ0xfQVBJX0VOVFJZKQorICAgICAgICAjZGVmaW5lIENMX0FQSV9FTlRSWQorICAgICNlbmRpZgorICAgICNpZiAhZGVmaW5lZChDTF9BUElfQ0FMTCkKKyAgICAgICAgI2RlZmluZSBDTF9BUElfQ0FMTCAgICAgX19zdGRjYWxsCisgICAgI2VuZGlmCisgICAgI2lmICFkZWZpbmVkKENMX0NBTExCQUNLKQorICAgICAgICAjZGVmaW5lIENMX0NBTExCQUNLICAgICBfX3N0ZGNhbGwKKyAgICAjZW5kaWYKKyNlbHNlCisgICAgI2lmICFkZWZpbmVkKENMX0FQSV9FTlRSWSkKKyAgICAgICAgI2RlZmluZSBDTF9BUElfRU5UUlkKKyAgICAjZW5kaWYKKyAgICAjaWYgIWRlZmluZWQoQ0xfQVBJX0NBTEwpCisgICAgICAgICNkZWZpbmUgQ0xfQVBJX0NBTEwKKyAgICAjZW5kaWYKKyAgICAjaWYgIWRlZmluZWQoQ0xfQ0FMTEJBQ0spCisgICAgICAgICNkZWZpbmUgQ0xfQ0FMTEJBQ0sKKyAgICAjZW5kaWYKKyNlbmRpZgorCisvKgorICogRGVwcmVjYXRpb24gZmxhZ3MgcmVmZXIgdG8gdGhlIGxhc3QgdmVyc2lvbiBvZiB0aGUgaGVhZGVyIGluIHdoaWNoIHRoZQorICogZmVhdHVyZSB3YXMgbm90IGRlcHJlY2F0ZWQuCisgKgorICogRS5nLiBWRVJTSU9OXzFfMV9ERVBSRUNBVEVEIG1lYW5zIHRoZSBmZWF0dXJlIGlzIHByZXNlbnQgaW4gMS4xIHdpdGhvdXQKKyAqIGRlcHJlY2F0aW9uIGJ1dCBpcyBkZXByZWNhdGVkIGluIHZlcnNpb25zIGxhdGVyIHRoYW4gMS4xLgorICovCisKKyNpZm5kZWYgQ0xfQVBJX1NVRkZJWF9VU0VSCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfVVNFUgorI2VuZGlmCisKKyNpZm5kZWYgQ0xfQVBJX1BSRUZJWF9VU0VSCisjZGVmaW5lIENMX0FQSV9QUkVGSVhfVVNFUgorI2VuZGlmCisKKyNkZWZpbmUgQ0xfQVBJX1NVRkZJWF9DT01NT04gQ0xfQVBJX1NVRkZJWF9VU0VSCisjZGVmaW5lIENMX0FQSV9QUkVGSVhfQ09NTU9OIENMX0FQSV9QUkVGSVhfVVNFUgorCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wIENMX0FQSV9TVUZGSVhfQ09NTU9OCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8xIENMX0FQSV9TVUZGSVhfQ09NTU9OCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yIENMX0FQSV9TVUZGSVhfQ09NTU9OCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8wIENMX0FQSV9TVUZGSVhfQ09NTU9OCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8xIENMX0FQSV9TVUZGSVhfQ09NTU9OCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8yIENMX0FQSV9TVUZGSVhfQ09NTU9OCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fM18wIENMX0FQSV9TVUZGSVhfQ09NTU9OCisjZGVmaW5lIENMX0FQSV9TVUZGSVhfX0VYUEVSSU1FTlRBTCBDTF9BUElfU1VGRklYX0NPTU1PTgorCisKKyNpZmRlZiBfX0dOVUNfXworICAjZGVmaW5lIENMX0FQSV9TVUZGSVhfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyAgI2RlZmluZSBDTF9BUElfUFJFRklYX0RFUFJFQ0FURUQKKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorICAjZGVmaW5lIENMX0FQSV9TVUZGSVhfREVQUkVDQVRFRAorICAjZGVmaW5lIENMX0FQSV9QUkVGSVhfREVQUkVDQVRFRCBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQpCisjZWxzZQorICAjZGVmaW5lIENMX0FQSV9TVUZGSVhfREVQUkVDQVRFRAorICAjZGVmaW5lIENMX0FQSV9QUkVGSVhfREVQUkVDQVRFRAorI2VuZGlmCisKKyNpZmRlZiBDTF9VU0VfREVQUkVDQVRFRF9PUEVOQ0xfMV8wX0FQSVMKKyAgICAjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8wX0RFUFJFQ0FURUQgQ0xfQVBJX1NVRkZJWF9DT01NT04KKyAgICAjZGVmaW5lIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMV8wX0RFUFJFQ0FURUQgQ0xfQVBJX1BSRUZJWF9DT01NT04KKyNlbHNlCisgICAgI2RlZmluZSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMF9ERVBSRUNBVEVEIENMX0FQSV9TVUZGSVhfQ09NTU9OIENMX0FQSV9TVUZGSVhfREVQUkVDQVRFRAorICAgICNkZWZpbmUgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8xXzBfREVQUkVDQVRFRCBDTF9BUElfUFJFRklYX0NPTU1PTiBDTF9BUElfUFJFRklYX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaWZkZWYgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzFfMV9BUElTCisgICAgI2RlZmluZSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEIENMX0FQSV9TVUZGSVhfQ09NTU9OCisgICAgI2RlZmluZSBDTF9BUElfUFJFRklYX19WRVJTSU9OXzFfMV9ERVBSRUNBVEVEIENMX0FQSV9QUkVGSVhfQ09NTU9OCisjZWxzZQorICAgICNkZWZpbmUgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzFfREVQUkVDQVRFRCBDTF9BUElfU1VGRklYX0NPTU1PTiBDTF9BUElfU1VGRklYX0RFUFJFQ0FURUQKKyAgICAjZGVmaW5lIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMV8xX0RFUFJFQ0FURUQgQ0xfQVBJX1BSRUZJWF9DT01NT04gQ0xfQVBJX1BSRUZJWF9ERVBSRUNBVEVECisjZW5kaWYKKworI2lmZGVmIENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8xXzJfQVBJUworICAgICNkZWZpbmUgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzJfREVQUkVDQVRFRCBDTF9BUElfU1VGRklYX0NPTU1PTgorICAgICNkZWZpbmUgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8xXzJfREVQUkVDQVRFRCBDTF9BUElfUFJFRklYX0NPTU1PTgorI2Vsc2UKKyAgICAjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yX0RFUFJFQ0FURUQgQ0xfQVBJX1NVRkZJWF9DT01NT04gQ0xfQVBJX1NVRkZJWF9ERVBSRUNBVEVECisgICAgI2RlZmluZSBDTF9BUElfUFJFRklYX19WRVJTSU9OXzFfMl9ERVBSRUNBVEVEIENMX0FQSV9QUkVGSVhfQ09NTU9OIENMX0FQSV9QUkVGSVhfREVQUkVDQVRFRAorICNlbmRpZgorCisjaWZkZWYgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzJfMF9BUElTCisgICAgI2RlZmluZSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMF9ERVBSRUNBVEVEIENMX0FQSV9TVUZGSVhfQ09NTU9OCisgICAgI2RlZmluZSBDTF9BUElfUFJFRklYX19WRVJTSU9OXzJfMF9ERVBSRUNBVEVEIENMX0FQSV9QUkVGSVhfQ09NTU9OCisjZWxzZQorICAgICNkZWZpbmUgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzBfREVQUkVDQVRFRCBDTF9BUElfU1VGRklYX0NPTU1PTiBDTF9BUElfU1VGRklYX0RFUFJFQ0FURUQKKyAgICAjZGVmaW5lIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMl8wX0RFUFJFQ0FURUQgQ0xfQVBJX1BSRUZJWF9DT01NT04gQ0xfQVBJX1BSRUZJWF9ERVBSRUNBVEVECisjZW5kaWYKKworI2lmZGVmIENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8yXzFfQVBJUworICAgICNkZWZpbmUgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8yXzFfREVQUkVDQVRFRCBDTF9BUElfU1VGRklYX0NPTU1PTgorICAgICNkZWZpbmUgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8yXzFfREVQUkVDQVRFRCBDTF9BUElfUFJFRklYX0NPTU1PTgorI2Vsc2UKKyAgICAjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8xX0RFUFJFQ0FURUQgQ0xfQVBJX1NVRkZJWF9DT01NT04gQ0xfQVBJX1NVRkZJWF9ERVBSRUNBVEVECisgICAgI2RlZmluZSBDTF9BUElfUFJFRklYX19WRVJTSU9OXzJfMV9ERVBSRUNBVEVEIENMX0FQSV9QUkVGSVhfQ09NTU9OIENMX0FQSV9QUkVGSVhfREVQUkVDQVRFRAorI2VuZGlmCisKKyNpZmRlZiBDTF9VU0VfREVQUkVDQVRFRF9PUEVOQ0xfMl8yX0FQSVMKKyAgICAjZGVmaW5lIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMl8yX0RFUFJFQ0FURUQgQ0xfQVBJX1NVRkZJWF9DT01NT04KKyAgICAjZGVmaW5lIENMX0FQSV9QUkVGSVhfX1ZFUlNJT05fMl8yX0RFUFJFQ0FURUQgQ0xfQVBJX1BSRUZJWF9DT01NT04KKyNlbHNlCisgICAgI2RlZmluZSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzJfMl9ERVBSRUNBVEVEIENMX0FQSV9TVUZGSVhfQ09NTU9OIENMX0FQSV9TVUZGSVhfREVQUkVDQVRFRAorICAgICNkZWZpbmUgQ0xfQVBJX1BSRUZJWF9fVkVSU0lPTl8yXzJfREVQUkVDQVRFRCBDTF9BUElfUFJFRklYX0NPTU1PTiBDTF9BUElfUFJFRklYX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgKF9XSU4zMikgJiYgZGVmaW5lZChfTVNDX1ZFUikpCisKKy8qIGludHB0cl90IGlzIHVzZWQgaW4gY2wuaCBhbmQgcHJvdmlkZWQgYnkgc3RkZGVmLmggaW4gVmlzdWFsIEMrKywgYnV0IG5vdCBpbiBjbGFuZyAqLworLyogc3RkaW50Lmggd2FzIG1pc3NpbmcgYmVmb3JlIFZpc3VhbCBTdHVkaW8gMjAxMCwgaW5jbHVkZSBpdCBmb3IgbGF0ZXIgdmVyc2lvbnMgYW5kIGZvciBjbGFuZyAqLworI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBfTVNDX1ZFUiA+PSAxNjAwCisgICAgI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qIHNjYWxhciB0eXBlcyAgKi8KK3R5cGVkZWYgc2lnbmVkICAgX19pbnQ4ICAgICAgICAgY2xfY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4ICAgICAgICAgY2xfdWNoYXI7Cit0eXBlZGVmIHNpZ25lZCAgIF9faW50MTYgICAgICAgIGNsX3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2ICAgICAgICBjbF91c2hvcnQ7Cit0eXBlZGVmIHNpZ25lZCAgIF9faW50MzIgICAgICAgIGNsX2ludDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgICAgICAgY2xfdWludDsKK3R5cGVkZWYgc2lnbmVkICAgX19pbnQ2NCAgICAgICAgY2xfbG9uZzsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICAgICAgY2xfdWxvbmc7CisKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiAgICAgICAgY2xfaGFsZjsKK3R5cGVkZWYgZmxvYXQgICAgICAgICAgICAgICAgICAgY2xfZmxvYXQ7Cit0eXBlZGVmIGRvdWJsZSAgICAgICAgICAgICAgICAgIGNsX2RvdWJsZTsKKworLyogTWFjcm8gbmFtZXMgYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGRlZmluZWQgYnkgT3BlbkNMICovCisjZGVmaW5lIENMX0NIQVJfQklUICAgICAgICAgOAorI2RlZmluZSBDTF9TQ0hBUl9NQVggICAgICAgIDEyNworI2RlZmluZSBDTF9TQ0hBUl9NSU4gICAgICAgICgtMTI3LTEpCisjZGVmaW5lIENMX0NIQVJfTUFYICAgICAgICAgQ0xfU0NIQVJfTUFYCisjZGVmaW5lIENMX0NIQVJfTUlOICAgICAgICAgQ0xfU0NIQVJfTUlOCisjZGVmaW5lIENMX1VDSEFSX01BWCAgICAgICAgMjU1CisjZGVmaW5lIENMX1NIUlRfTUFYICAgICAgICAgMzI3NjcKKyNkZWZpbmUgQ0xfU0hSVF9NSU4gICAgICAgICAoLTMyNzY3LTEpCisjZGVmaW5lIENMX1VTSFJUX01BWCAgICAgICAgNjU1MzUKKyNkZWZpbmUgQ0xfSU5UX01BWCAgICAgICAgICAyMTQ3NDgzNjQ3CisjZGVmaW5lIENMX0lOVF9NSU4gICAgICAgICAgKC0yMTQ3NDgzNjQ3LTEpCisjZGVmaW5lIENMX1VJTlRfTUFYICAgICAgICAgMHhmZmZmZmZmZlUKKyNkZWZpbmUgQ0xfTE9OR19NQVggICAgICAgICAoKGNsX2xvbmcpIDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQorI2RlZmluZSBDTF9MT05HX01JTiAgICAgICAgICgoY2xfbG9uZykgLTB4N0ZGRkZGRkZGRkZGRkZGRkxMIC0gMUxMKQorI2RlZmluZSBDTF9VTE9OR19NQVggICAgICAgICgoY2xfdWxvbmcpIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCkKKworI2RlZmluZSBDTF9GTFRfRElHICAgICAgICAgIDYKKyNkZWZpbmUgQ0xfRkxUX01BTlRfRElHICAgICAyNAorI2RlZmluZSBDTF9GTFRfTUFYXzEwX0VYUCAgICszOAorI2RlZmluZSBDTF9GTFRfTUFYX0VYUCAgICAgICsxMjgKKyNkZWZpbmUgQ0xfRkxUX01JTl8xMF9FWFAgICAtMzcKKyNkZWZpbmUgQ0xfRkxUX01JTl9FWFAgICAgICAtMTI1CisjZGVmaW5lIENMX0ZMVF9SQURJWCAgICAgICAgMgorI2RlZmluZSBDTF9GTFRfTUFYICAgICAgICAgIDM0MDI4MjM0NjYzODUyODg1OTgxMTcwNDE4MzQ4NDUxNjkyNTQ0MC4wZgorI2RlZmluZSBDTF9GTFRfTUlOICAgICAgICAgIDEuMTc1NDk0MzUwODIyMjg3NTA3OTY5ZS0zOGYKKyNkZWZpbmUgQ0xfRkxUX0VQU0lMT04gICAgICAxLjE5MjA5Mjg5NTUwNzgxMjVlLTdmCisKKyNkZWZpbmUgQ0xfSEFMRl9ESUcgICAgICAgICAgMworI2RlZmluZSBDTF9IQUxGX01BTlRfRElHICAgICAxMQorI2RlZmluZSBDTF9IQUxGX01BWF8xMF9FWFAgICArNAorI2RlZmluZSBDTF9IQUxGX01BWF9FWFAgICAgICArMTYKKyNkZWZpbmUgQ0xfSEFMRl9NSU5fMTBfRVhQICAgLTQKKyNkZWZpbmUgQ0xfSEFMRl9NSU5fRVhQICAgICAgLTEzCisjZGVmaW5lIENMX0hBTEZfUkFESVggICAgICAgIDIKKyNkZWZpbmUgQ0xfSEFMRl9NQVggICAgICAgICAgNjU1MDQuMGYKKyNkZWZpbmUgQ0xfSEFMRl9NSU4gICAgICAgICAgNi4xMDM1MTU2MjVlLTA1ZgorI2RlZmluZSBDTF9IQUxGX0VQU0lMT04gICAgICA5Ljc2NTYyNWUtMDRmCisKKyNkZWZpbmUgQ0xfREJMX0RJRyAgICAgICAgICAxNQorI2RlZmluZSBDTF9EQkxfTUFOVF9ESUcgICAgIDUzCisjZGVmaW5lIENMX0RCTF9NQVhfMTBfRVhQICAgKzMwOAorI2RlZmluZSBDTF9EQkxfTUFYX0VYUCAgICAgICsxMDI0CisjZGVmaW5lIENMX0RCTF9NSU5fMTBfRVhQICAgLTMwNworI2RlZmluZSBDTF9EQkxfTUlOX0VYUCAgICAgIC0xMDIxCisjZGVmaW5lIENMX0RCTF9SQURJWCAgICAgICAgMgorI2RlZmluZSBDTF9EQkxfTUFYICAgICAgICAgIDEuNzk3NjkzMTM0ODYyMzE1OGUrMzA4CisjZGVmaW5lIENMX0RCTF9NSU4gICAgICAgICAgMi4yMjUwNzM4NTg1MDcyMDEzODMwOTBlLTMwOAorI2RlZmluZSBDTF9EQkxfRVBTSUxPTiAgICAgIDIuMjIwNDQ2MDQ5MjUwMzEzMDgwODQ3ZS0xNgorCisjZGVmaW5lIENMX01fRSAgICAgICAgICAgICAgMi43MTgyODE4Mjg0NTkwNDUyMzU0CisjZGVmaW5lIENMX01fTE9HMkUgICAgICAgICAgMS40NDI2OTUwNDA4ODg5NjM0MDc0CisjZGVmaW5lIENMX01fTE9HMTBFICAgICAgICAgMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NQorI2RlZmluZSBDTF9NX0xOMiAgICAgICAgICAgIDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDIKKyNkZWZpbmUgQ0xfTV9MTjEwICAgICAgICAgICAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAyCisjZGVmaW5lIENMX01fUEkgICAgICAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2RlZmluZSBDTF9NX1BJXzIgICAgICAgICAgIDEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMKKyNkZWZpbmUgQ0xfTV9QSV80ICAgICAgICAgICAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYyCisjZGVmaW5lIENMX01fMV9QSSAgICAgICAgICAgMC4zMTgzMDk4ODYxODM3OTA2NzE1NAorI2RlZmluZSBDTF9NXzJfUEkgICAgICAgICAgIDAuNjM2NjE5NzcyMzY3NTgxMzQzMDgKKyNkZWZpbmUgQ0xfTV8yX1NRUlRQSSAgICAgICAxLjEyODM3OTE2NzA5NTUxMjU3MzkwCisjZGVmaW5lIENMX01fU1FSVDIgICAgICAgICAgMS40MTQyMTM1NjIzNzMwOTUwNDg4MAorI2RlZmluZSBDTF9NX1NRUlQxXzIgICAgICAgIDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAKKworI2RlZmluZSBDTF9NX0VfRiAgICAgICAgICAgIDIuNzE4MjgxODI4ZgorI2RlZmluZSBDTF9NX0xPRzJFX0YgICAgICAgIDEuNDQyNjk1MDQxZgorI2RlZmluZSBDTF9NX0xPRzEwRV9GICAgICAgIDAuNDM0Mjk0NDgyZgorI2RlZmluZSBDTF9NX0xOMl9GICAgICAgICAgIDAuNjkzMTQ3MTgxZgorI2RlZmluZSBDTF9NX0xOMTBfRiAgICAgICAgIDIuMzAyNTg1MDkzZgorI2RlZmluZSBDTF9NX1BJX0YgICAgICAgICAgIDMuMTQxNTkyNjU0ZgorI2RlZmluZSBDTF9NX1BJXzJfRiAgICAgICAgIDEuNTcwNzk2MzI3ZgorI2RlZmluZSBDTF9NX1BJXzRfRiAgICAgICAgIDAuNzg1Mzk4MTYzZgorI2RlZmluZSBDTF9NXzFfUElfRiAgICAgICAgIDAuMzE4MzA5ODg2ZgorI2RlZmluZSBDTF9NXzJfUElfRiAgICAgICAgIDAuNjM2NjE5NzcyZgorI2RlZmluZSBDTF9NXzJfU1FSVFBJX0YgICAgIDEuMTI4Mzc5MTY3ZgorI2RlZmluZSBDTF9NX1NRUlQyX0YgICAgICAgIDEuNDE0MjEzNTYyZgorI2RlZmluZSBDTF9NX1NRUlQxXzJfRiAgICAgIDAuNzA3MTA2NzgxZgorCisjZGVmaW5lIENMX05BTiAgICAgICAgICAgICAgKENMX0lORklOSVRZIC0gQ0xfSU5GSU5JVFkpCisjZGVmaW5lIENMX0hVR0VfVkFMRiAgICAgICAgKChjbF9mbG9hdCkgMWU1MCkKKyNkZWZpbmUgQ0xfSFVHRV9WQUwgICAgICAgICAoKGNsX2RvdWJsZSkgMWU1MDApCisjZGVmaW5lIENMX01BWEZMT0FUICAgICAgICAgQ0xfRkxUX01BWAorI2RlZmluZSBDTF9JTkZJTklUWSAgICAgICAgIENMX0hVR0VfVkFMRgorCisjZWxzZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIHNjYWxhciB0eXBlcyAgKi8KK3R5cGVkZWYgaW50OF90ICAgICAgICAgIGNsX2NoYXI7Cit0eXBlZGVmIHVpbnQ4X3QgICAgICAgICBjbF91Y2hhcjsKK3R5cGVkZWYgaW50MTZfdCAgICAgICAgIGNsX3Nob3J0OwordHlwZWRlZiB1aW50MTZfdCAgICAgICAgY2xfdXNob3J0OwordHlwZWRlZiBpbnQzMl90ICAgICAgICAgY2xfaW50OwordHlwZWRlZiB1aW50MzJfdCAgICAgICAgY2xfdWludDsKK3R5cGVkZWYgaW50NjRfdCAgICAgICAgIGNsX2xvbmc7Cit0eXBlZGVmIHVpbnQ2NF90ICAgICAgICBjbF91bG9uZzsKKwordHlwZWRlZiB1aW50MTZfdCAgICAgICAgY2xfaGFsZjsKK3R5cGVkZWYgZmxvYXQgICAgICAgICAgIGNsX2Zsb2F0OwordHlwZWRlZiBkb3VibGUgICAgICAgICAgY2xfZG91YmxlOworCisvKiBNYWNybyBuYW1lcyBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZXMgZGVmaW5lZCBieSBPcGVuQ0wgKi8KKyNkZWZpbmUgQ0xfQ0hBUl9CSVQgICAgICAgICA4CisjZGVmaW5lIENMX1NDSEFSX01BWCAgICAgICAgMTI3CisjZGVmaW5lIENMX1NDSEFSX01JTiAgICAgICAgKC0xMjctMSkKKyNkZWZpbmUgQ0xfQ0hBUl9NQVggICAgICAgICBDTF9TQ0hBUl9NQVgKKyNkZWZpbmUgQ0xfQ0hBUl9NSU4gICAgICAgICBDTF9TQ0hBUl9NSU4KKyNkZWZpbmUgQ0xfVUNIQVJfTUFYICAgICAgICAyNTUKKyNkZWZpbmUgQ0xfU0hSVF9NQVggICAgICAgICAzMjc2NworI2RlZmluZSBDTF9TSFJUX01JTiAgICAgICAgICgtMzI3NjctMSkKKyNkZWZpbmUgQ0xfVVNIUlRfTUFYICAgICAgICA2NTUzNQorI2RlZmluZSBDTF9JTlRfTUFYICAgICAgICAgIDIxNDc0ODM2NDcKKyNkZWZpbmUgQ0xfSU5UX01JTiAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyNkZWZpbmUgQ0xfVUlOVF9NQVggICAgICAgICAweGZmZmZmZmZmVQorI2RlZmluZSBDTF9MT05HX01BWCAgICAgICAgICgoY2xfbG9uZykgMHg3RkZGRkZGRkZGRkZGRkZGTEwpCisjZGVmaW5lIENMX0xPTkdfTUlOICAgICAgICAgKChjbF9sb25nKSAtMHg3RkZGRkZGRkZGRkZGRkZGTEwgLSAxTEwpCisjZGVmaW5lIENMX1VMT05HX01BWCAgICAgICAgKChjbF91bG9uZykgMHhGRkZGRkZGRkZGRkZGRkZGVUxMKQorCisjZGVmaW5lIENMX0ZMVF9ESUcgICAgICAgICAgNgorI2RlZmluZSBDTF9GTFRfTUFOVF9ESUcgICAgIDI0CisjZGVmaW5lIENMX0ZMVF9NQVhfMTBfRVhQICAgKzM4CisjZGVmaW5lIENMX0ZMVF9NQVhfRVhQICAgICAgKzEyOAorI2RlZmluZSBDTF9GTFRfTUlOXzEwX0VYUCAgIC0zNworI2RlZmluZSBDTF9GTFRfTUlOX0VYUCAgICAgIC0xMjUKKyNkZWZpbmUgQ0xfRkxUX1JBRElYICAgICAgICAyCisjZGVmaW5lIENMX0ZMVF9NQVggICAgICAgICAgMzQwMjgyMzQ2NjM4NTI4ODU5ODExNzA0MTgzNDg0NTE2OTI1NDQwLjBmCisjZGVmaW5lIENMX0ZMVF9NSU4gICAgICAgICAgMS4xNzU0OTQzNTA4MjIyODc1MDc5NjllLTM4ZgorI2RlZmluZSBDTF9GTFRfRVBTSUxPTiAgICAgIDEuMTkyMDkyODk1NTA3ODEyNWUtN2YKKworI2RlZmluZSBDTF9IQUxGX0RJRyAgICAgICAgICAzCisjZGVmaW5lIENMX0hBTEZfTUFOVF9ESUcgICAgIDExCisjZGVmaW5lIENMX0hBTEZfTUFYXzEwX0VYUCAgICs0CisjZGVmaW5lIENMX0hBTEZfTUFYX0VYUCAgICAgICsxNgorI2RlZmluZSBDTF9IQUxGX01JTl8xMF9FWFAgICAtNAorI2RlZmluZSBDTF9IQUxGX01JTl9FWFAgICAgICAtMTMKKyNkZWZpbmUgQ0xfSEFMRl9SQURJWCAgICAgICAgMgorI2RlZmluZSBDTF9IQUxGX01BWCAgICAgICAgICA2NTUwNC4wZgorI2RlZmluZSBDTF9IQUxGX01JTiAgICAgICAgICA2LjEwMzUxNTYyNWUtMDVmCisjZGVmaW5lIENMX0hBTEZfRVBTSUxPTiAgICAgIDkuNzY1NjI1ZS0wNGYKKworI2RlZmluZSBDTF9EQkxfRElHICAgICAgICAgIDE1CisjZGVmaW5lIENMX0RCTF9NQU5UX0RJRyAgICAgNTMKKyNkZWZpbmUgQ0xfREJMX01BWF8xMF9FWFAgICArMzA4CisjZGVmaW5lIENMX0RCTF9NQVhfRVhQICAgICAgKzEwMjQKKyNkZWZpbmUgQ0xfREJMX01JTl8xMF9FWFAgICAtMzA3CisjZGVmaW5lIENMX0RCTF9NSU5fRVhQICAgICAgLTEwMjEKKyNkZWZpbmUgQ0xfREJMX1JBRElYICAgICAgICAyCisjZGVmaW5lIENMX0RCTF9NQVggICAgICAgICAgMTc5NzY5MzEzNDg2MjMxNTcwODE0NTI3NDIzNzMxNzA0MzU2Nzk4MDcwNTY3NTI1ODQ0OTk2NTk4OTE3NDc2ODAzMTU3MjYwNzgwMDI4NTM4NzYwNTg5NTU4NjMyNzY2ODc4MTcxNTQwNDU4OTUzNTE0MzgyNDY0MjM0MzIxMzI2ODg5NDY0MTgyNzY4NDY3NTQ2NzAzNTM3NTE2OTg2MDQ5OTEwNTc2NTUxMjgyMDc2MjQ1NDkwMDkwMzg5MzI4OTQ0MDc1ODY4NTA4NDU1MTMzOTQyMzA0NTgzMjM2OTAzMjIyOTQ4MTY1ODA4NTU5MzMyMTIzMzQ4Mjc0Nzk3ODI2MjA0MTQ0NzIzMTY4NzM4MTc3MTgwOTE5Mjk5ODgxMjUwNDA0MDI2MTg0MTI0ODU4MzY4LjAKKyNkZWZpbmUgQ0xfREJMX01JTiAgICAgICAgICAyLjIyNTA3Mzg1ODUwNzIwMTM4MzA5MGUtMzA4CisjZGVmaW5lIENMX0RCTF9FUFNJTE9OICAgICAgMi4yMjA0NDYwNDkyNTAzMTMwODA4NDdlLTE2CisKKyNkZWZpbmUgQ0xfTV9FICAgICAgICAgICAgICAyLjcxODI4MTgyODQ1OTA0NTIzNTQKKyNkZWZpbmUgQ0xfTV9MT0cyRSAgICAgICAgICAxLjQ0MjY5NTA0MDg4ODk2MzQwNzQKKyNkZWZpbmUgQ0xfTV9MT0cxMEUgICAgICAgICAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1CisjZGVmaW5lIENMX01fTE4yICAgICAgICAgICAgMC42OTMxNDcxODA1NTk5NDUzMDk0MgorI2RlZmluZSBDTF9NX0xOMTAgICAgICAgICAgIDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDIKKyNkZWZpbmUgQ0xfTV9QSSAgICAgICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZGVmaW5lIENMX01fUElfMiAgICAgICAgICAgMS41NzA3OTYzMjY3OTQ4OTY2MTkyMworI2RlZmluZSBDTF9NX1BJXzQgICAgICAgICAgIDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjIKKyNkZWZpbmUgQ0xfTV8xX1BJICAgICAgICAgICAwLjMxODMwOTg4NjE4Mzc5MDY3MTU0CisjZGVmaW5lIENMX01fMl9QSSAgICAgICAgICAgMC42MzY2MTk3NzIzNjc1ODEzNDMwOAorI2RlZmluZSBDTF9NXzJfU1FSVFBJICAgICAgIDEuMTI4Mzc5MTY3MDk1NTEyNTczOTAKKyNkZWZpbmUgQ0xfTV9TUVJUMiAgICAgICAgICAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwCisjZGVmaW5lIENMX01fU1FSVDFfMiAgICAgICAgMC43MDcxMDY3ODExODY1NDc1MjQ0MAorCisjZGVmaW5lIENMX01fRV9GICAgICAgICAgICAgMi43MTgyODE4MjhmCisjZGVmaW5lIENMX01fTE9HMkVfRiAgICAgICAgMS40NDI2OTUwNDFmCisjZGVmaW5lIENMX01fTE9HMTBFX0YgICAgICAgMC40MzQyOTQ0ODJmCisjZGVmaW5lIENMX01fTE4yX0YgICAgICAgICAgMC42OTMxNDcxODFmCisjZGVmaW5lIENMX01fTE4xMF9GICAgICAgICAgMi4zMDI1ODUwOTNmCisjZGVmaW5lIENMX01fUElfRiAgICAgICAgICAgMy4xNDE1OTI2NTRmCisjZGVmaW5lIENMX01fUElfMl9GICAgICAgICAgMS41NzA3OTYzMjdmCisjZGVmaW5lIENMX01fUElfNF9GICAgICAgICAgMC43ODUzOTgxNjNmCisjZGVmaW5lIENMX01fMV9QSV9GICAgICAgICAgMC4zMTgzMDk4ODZmCisjZGVmaW5lIENMX01fMl9QSV9GICAgICAgICAgMC42MzY2MTk3NzJmCisjZGVmaW5lIENMX01fMl9TUVJUUElfRiAgICAgMS4xMjgzNzkxNjdmCisjZGVmaW5lIENMX01fU1FSVDJfRiAgICAgICAgMS40MTQyMTM1NjJmCisjZGVmaW5lIENMX01fU1FSVDFfMl9GICAgICAgMC43MDcxMDY3ODFmCisKKyNpZiBkZWZpbmVkKCBfX0dOVUNfXyApCisgICAjZGVmaW5lIENMX0hVR0VfVkFMRiAgICAgX19idWlsdGluX2h1Z2VfdmFsZigpCisgICAjZGVmaW5lIENMX0hVR0VfVkFMICAgICAgX19idWlsdGluX2h1Z2VfdmFsKCkKKyAgICNkZWZpbmUgQ0xfTkFOICAgICAgICAgICBfX2J1aWx0aW5fbmFuZiggIiIgKQorI2Vsc2UKKyAgICNkZWZpbmUgQ0xfSFVHRV9WQUxGICAgICAoKGNsX2Zsb2F0KSAxZTUwKQorICAgI2RlZmluZSBDTF9IVUdFX1ZBTCAgICAgICgoY2xfZG91YmxlKSAxZTUwMCkKKyAgIGZsb2F0IG5hbmYoIGNvbnN0IGNoYXIgKiApOworICAgI2RlZmluZSBDTF9OQU4gICAgICAgICAgIG5hbmYoICIiICkKKyNlbmRpZgorI2RlZmluZSBDTF9NQVhGTE9BVCAgICAgICAgIENMX0ZMVF9NQVgKKyNkZWZpbmUgQ0xfSU5GSU5JVFkgICAgICAgICBDTF9IVUdFX1ZBTEYKKworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogTWlycm9yIHR5cGVzIHRvIEdMIHR5cGVzLiBNaXJyb3IgdHlwZXMgYWxsb3cgdXMgdG8gYXZvaWQgZGVjaWRpbmcgd2hpY2ggODdzIHRvIGxvYWQgYmFzZWQgb24gd2hldGhlciB3ZSBhcmUgdXNpbmcgR0wgb3IgR0xFUyBoZXJlLiAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgY2xfR0x1aW50OwordHlwZWRlZiBpbnQgICAgICAgICAgY2xfR0xpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBjbF9HTGVudW07CisKKy8qCisgKiBWZWN0b3IgdHlwZXMKKyAqCisgKiAgTm90ZTogICBPcGVuQ0wgcmVxdWlyZXMgdGhhdCBhbGwgdHlwZXMgYmUgbmF0dXJhbGx5IGFsaWduZWQuCisgKiAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdmVjdG9yIHR5cGVzIG11c3QgYmUgbmF0dXJhbGx5IGFsaWduZWQuCisgKiAgICAgICAgICBGb3IgZXhhbXBsZSwgYSB2ZWN0b3Igb2YgZm91ciBmbG9hdHMgbXVzdCBiZSBhbGlnbmVkIHRvCisgKiAgICAgICAgICBhIDE2IGJ5dGUgYm91bmRhcnkgKGNhbGN1bGF0ZWQgYXMgNCAqIHRoZSBuYXR1cmFsIDQtYnl0ZQorICogICAgICAgICAgYWxpZ25tZW50IG9mIHRoZSBmbG9hdCkuICBUaGUgYWxpZ25tZW50IHF1YWxpZmllcnMgaGVyZQorICogICAgICAgICAgd2lsbCBvbmx5IGZ1bmN0aW9uIHByb3Blcmx5IGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgdGhlbQorICogICAgICAgICAgYW5kIGlmIHlvdSBkb24ndCBhY3RpdmVseSB3b3JrIHRvIGRlZmVhdCB0aGVtLiAgRm9yIGV4YW1wbGUsCisgKiAgICAgICAgICBpbiBvcmRlciBmb3IgYSBjbF9mbG9hdDQgdG8gYmUgMTYgYnl0ZSBhbGlnbmVkIGluIGEgc3RydWN0LAorICogICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBzdHJ1Y3QgbXVzdCBpdHNlbGYgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICoKKyAqICAgICAgICAgIE1haW50YWluaW5nIHByb3BlciBhbGlnbm1lbnQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAqLworCisvKiBEZWZpbmUgYmFzaWMgdmVjdG9yIHR5cGVzICovCisjaWYgZGVmaW5lZCggX19WRUNfXyApCisgICNpZiAhZGVmaW5lZChfX2NsYW5nX18pCisgICAgICNpbmNsdWRlIDxhbHRpdmVjLmg+ICAgLyogbWF5IGJlIG9taXR0ZWQgZGVwZW5kaW5nIG9uIGNvbXBpbGVyLiBBbHRpVmVjIHNwZWMgcHJvdmlkZXMgbm8gd2F5IHRvIGRldGVjdCB3aGV0aGVyIHRoZSBoZWFkZXIgaXMgcmVxdWlyZWQuICovCisgICNlbmRpZgorICAgdHlwZWRlZiBfX3ZlY3RvciB1bnNpZ25lZCBjaGFyICAgICBfX2NsX3VjaGFyMTY7CisgICB0eXBlZGVmIF9fdmVjdG9yIHNpZ25lZCBjaGFyICAgICAgIF9fY2xfY2hhcjE2OworICAgdHlwZWRlZiBfX3ZlY3RvciB1bnNpZ25lZCBzaG9ydCAgICBfX2NsX3VzaG9ydDg7CisgICB0eXBlZGVmIF9fdmVjdG9yIHNpZ25lZCBzaG9ydCAgICAgIF9fY2xfc2hvcnQ4OworICAgdHlwZWRlZiBfX3ZlY3RvciB1bnNpZ25lZCBpbnQgICAgICBfX2NsX3VpbnQ0OworICAgdHlwZWRlZiBfX3ZlY3RvciBzaWduZWQgaW50ICAgICAgICBfX2NsX2ludDQ7CisgICB0eXBlZGVmIF9fdmVjdG9yIGZsb2F0ICAgICAgICAgICAgIF9fY2xfZmxvYXQ0OworICAgI2RlZmluZSAgX19DTF9VQ0hBUjE2X18gIDEKKyAgICNkZWZpbmUgIF9fQ0xfQ0hBUjE2X18gICAxCisgICAjZGVmaW5lICBfX0NMX1VTSE9SVDhfXyAgMQorICAgI2RlZmluZSAgX19DTF9TSE9SVDhfXyAgIDEKKyAgICNkZWZpbmUgIF9fQ0xfVUlOVDRfXyAgICAxCisgICAjZGVmaW5lICBfX0NMX0lOVDRfXyAgICAgMQorICAgI2RlZmluZSAgX19DTF9GTE9BVDRfXyAgIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggX19TU0VfXyApCisgICAgI2lmIGRlZmluZWQoIF9fTUlOR1c2NF9fICkKKyAgICAgICAgI2luY2x1ZGUgPGludHJpbi5oPgorICAgICNlbHNlCisgICAgICAgICNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyAgICAjZW5kaWYKKyAgICAjaWYgZGVmaW5lZCggX19HTlVDX18gKQorICAgICAgICB0eXBlZGVmIGZsb2F0IF9fY2xfZmxvYXQ0ICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSk7CisgICAgI2Vsc2UKKyAgICAgICAgdHlwZWRlZiBfX20xMjggX19jbF9mbG9hdDQ7CisgICAgI2VuZGlmCisgICAgI2RlZmluZSBfX0NMX0ZMT0FUNF9fICAgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBfX1NTRTJfXyApCisgICAgI2lmIGRlZmluZWQoIF9fTUlOR1c2NF9fICkKKyAgICAgICAgI2luY2x1ZGUgPGludHJpbi5oPgorICAgICNlbHNlCisgICAgICAgICNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyAgICAjZW5kaWYKKyAgICAjaWYgZGVmaW5lZCggX19HTlVDX18gKQorICAgICAgICB0eXBlZGVmIGNsX3VjaGFyICAgIF9fY2xfdWNoYXIxNiAgICBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKTsKKyAgICAgICAgdHlwZWRlZiBjbF9jaGFyICAgICBfX2NsX2NoYXIxNiAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSk7CisgICAgICAgIHR5cGVkZWYgY2xfdXNob3J0ICAgX19jbF91c2hvcnQ4ICAgIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpOworICAgICAgICB0eXBlZGVmIGNsX3Nob3J0ICAgIF9fY2xfc2hvcnQ4ICAgICBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKTsKKyAgICAgICAgdHlwZWRlZiBjbF91aW50ICAgICBfX2NsX3VpbnQ0ICAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSk7CisgICAgICAgIHR5cGVkZWYgY2xfaW50ICAgICAgX19jbF9pbnQ0ICAgICAgIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpOworICAgICAgICB0eXBlZGVmIGNsX3Vsb25nICAgIF9fY2xfdWxvbmcyICAgICBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKTsKKyAgICAgICAgdHlwZWRlZiBjbF9sb25nICAgICBfX2NsX2xvbmcyICAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSk7CisgICAgICAgIHR5cGVkZWYgY2xfZG91YmxlICAgX19jbF9kb3VibGUyICAgIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpOworICAgICNlbHNlCisgICAgICAgIHR5cGVkZWYgX19tMTI4aSBfX2NsX3VjaGFyMTY7CisgICAgICAgIHR5cGVkZWYgX19tMTI4aSBfX2NsX2NoYXIxNjsKKyAgICAgICAgdHlwZWRlZiBfX20xMjhpIF9fY2xfdXNob3J0ODsKKyAgICAgICAgdHlwZWRlZiBfX20xMjhpIF9fY2xfc2hvcnQ4OworICAgICAgICB0eXBlZGVmIF9fbTEyOGkgX19jbF91aW50NDsKKyAgICAgICAgdHlwZWRlZiBfX20xMjhpIF9fY2xfaW50NDsKKyAgICAgICAgdHlwZWRlZiBfX20xMjhpIF9fY2xfdWxvbmcyOworICAgICAgICB0eXBlZGVmIF9fbTEyOGkgX19jbF9sb25nMjsKKyAgICAgICAgdHlwZWRlZiBfX20xMjhkIF9fY2xfZG91YmxlMjsKKyAgICAjZW5kaWYKKyAgICAjZGVmaW5lIF9fQ0xfVUNIQVIxNl9fICAxCisgICAgI2RlZmluZSBfX0NMX0NIQVIxNl9fICAgMQorICAgICNkZWZpbmUgX19DTF9VU0hPUlQ4X18gIDEKKyAgICAjZGVmaW5lIF9fQ0xfU0hPUlQ4X18gICAxCisgICAgI2RlZmluZSBfX0NMX0lOVDRfXyAgICAgMQorICAgICNkZWZpbmUgX19DTF9VSU5UNF9fICAgIDEKKyAgICAjZGVmaW5lIF9fQ0xfVUxPTkcyX18gICAxCisgICAgI2RlZmluZSBfX0NMX0xPTkcyX18gICAgMQorICAgICNkZWZpbmUgX19DTF9ET1VCTEUyX18gIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggX19NTVhfXyApCisgICAgI2luY2x1ZGUgPG1taW50cmluLmg+CisgICAgI2lmIGRlZmluZWQoIF9fR05VQ19fICkKKyAgICAgICAgdHlwZWRlZiBjbF91Y2hhciAgICBfX2NsX3VjaGFyOCAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAgICAgdHlwZWRlZiBjbF9jaGFyICAgICBfX2NsX2NoYXI4ICAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAgICAgdHlwZWRlZiBjbF91c2hvcnQgICBfX2NsX3VzaG9ydDQgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAgICAgdHlwZWRlZiBjbF9zaG9ydCAgICBfX2NsX3Nob3J0NCAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAgICAgdHlwZWRlZiBjbF91aW50ICAgICBfX2NsX3VpbnQyICAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAgICAgdHlwZWRlZiBjbF9pbnQgICAgICBfX2NsX2ludDIgICAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAgICAgdHlwZWRlZiBjbF91bG9uZyAgICBfX2NsX3Vsb25nMSAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAgICAgdHlwZWRlZiBjbF9sb25nICAgICBfX2NsX2xvbmcxICAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAgICAgdHlwZWRlZiBjbF9mbG9hdCAgICBfX2NsX2Zsb2F0MiAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoOCkpKTsKKyAgICAjZWxzZQorICAgICAgICB0eXBlZGVmIF9fbTY0ICAgICAgIF9fY2xfdWNoYXI4OworICAgICAgICB0eXBlZGVmIF9fbTY0ICAgICAgIF9fY2xfY2hhcjg7CisgICAgICAgIHR5cGVkZWYgX19tNjQgICAgICAgX19jbF91c2hvcnQ0OworICAgICAgICB0eXBlZGVmIF9fbTY0ICAgICAgIF9fY2xfc2hvcnQ0OworICAgICAgICB0eXBlZGVmIF9fbTY0ICAgICAgIF9fY2xfdWludDI7CisgICAgICAgIHR5cGVkZWYgX19tNjQgICAgICAgX19jbF9pbnQyOworICAgICAgICB0eXBlZGVmIF9fbTY0ICAgICAgIF9fY2xfdWxvbmcxOworICAgICAgICB0eXBlZGVmIF9fbTY0ICAgICAgIF9fY2xfbG9uZzE7CisgICAgICAgIHR5cGVkZWYgX19tNjQgICAgICAgX19jbF9mbG9hdDI7CisgICAgI2VuZGlmCisgICAgI2RlZmluZSBfX0NMX1VDSEFSOF9fICAgMQorICAgICNkZWZpbmUgX19DTF9DSEFSOF9fICAgIDEKKyAgICAjZGVmaW5lIF9fQ0xfVVNIT1JUNF9fICAxCisgICAgI2RlZmluZSBfX0NMX1NIT1JUNF9fICAgMQorICAgICNkZWZpbmUgX19DTF9JTlQyX18gICAgIDEKKyAgICAjZGVmaW5lIF9fQ0xfVUlOVDJfXyAgICAxCisgICAgI2RlZmluZSBfX0NMX1VMT05HMV9fICAgMQorICAgICNkZWZpbmUgX19DTF9MT05HMV9fICAgIDEKKyAgICAjZGVmaW5lIF9fQ0xfRkxPQVQyX18gICAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoIF9fQVZYX18gKQorICAgICNpZiBkZWZpbmVkKCBfX01JTkdXNjRfXyApCisgICAgICAgICNpbmNsdWRlIDxpbnRyaW4uaD4KKyAgICAjZWxzZQorICAgICAgICAjaW5jbHVkZSA8aW1taW50cmluLmg+CisgICAgI2VuZGlmCisgICAgI2lmIGRlZmluZWQoIF9fR05VQ19fICkKKyAgICAgICAgdHlwZWRlZiBjbF9mbG9hdCAgICBfX2NsX2Zsb2F0OCAgICAgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMzIpKSk7CisgICAgICAgIHR5cGVkZWYgY2xfZG91YmxlICAgX19jbF9kb3VibGU0ICAgIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDMyKSkpOworICAgICNlbHNlCisgICAgICAgIHR5cGVkZWYgX19tMjU2ICAgICAgX19jbF9mbG9hdDg7CisgICAgICAgIHR5cGVkZWYgX19tMjU2ZCAgICAgX19jbF9kb3VibGU0OworICAgICNlbmRpZgorICAgICNkZWZpbmUgX19DTF9GTE9BVDhfXyAgIDEKKyAgICAjZGVmaW5lIF9fQ0xfRE9VQkxFNF9fICAxCisjZW5kaWYKKworLyogRGVmaW5lIGNhcGFiaWxpdGllcyBmb3IgYW5vbnltb3VzIHN0cnVjdCBtZW1iZXJzLiAqLworI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTAorI2RlZmluZSAgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXyAxCisjZGVmaW5lICBfX0NMX0FOT05fU1RSVUNUX18KKyNlbGlmIGRlZmluZWQoIF9fR05VQ19fKSAmJiAhIGRlZmluZWQoIF9fU1RSSUNUX0FOU0lfXyApCisjZGVmaW5lICBfX0NMX0hBU19BTk9OX1NUUlVDVF9fIDEKKyNkZWZpbmUgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBfX2V4dGVuc2lvbl9fCisjZWxpZiBkZWZpbmVkKCBfV0lOMzIpICYmIGRlZmluZWQoX01TQ19WRVIpICYmICEgZGVmaW5lZChfX1NURENfXykKKyAgICAjaWYgX01TQ19WRVIgPj0gMTUwMAorICAgLyogTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gMjAwOCBzdXBwb3J0cyBhbm9ueW1vdXMgc3RydWN0cywgYnV0CisgICAgKiBjb21wbGFpbnMgYnkgZGVmYXVsdC4gKi8KKyAgICAjZGVmaW5lICBfX0NMX0hBU19BTk9OX1NUUlVDVF9fIDEKKyAgICAjZGVmaW5lICBfX0NMX0FOT05fU1RSVUNUX18KKyAgIC8qIERpc2FibGUgd2FybmluZyBDNDIwMTogbm9uc3RhbmRhcmQgZXh0ZW5zaW9uIHVzZWQgOiBuYW1lbGVzcworICAgICogc3RydWN0L3VuaW9uICovCisgICAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjAxICkKKyAgICAjZW5kaWYKKyNlbHNlCisjZGVmaW5lICBfX0NMX0hBU19BTk9OX1NUUlVDVF9fIDAKKyNkZWZpbmUgIF9fQ0xfQU5PTl9TVFJVQ1RfXworI2VuZGlmCisKKy8qIERlZmluZSBhbGlnbm1lbnQga2V5cyAqLworI2lmIGRlZmluZWQoIF9fR05VQ19fICkgfHwgZGVmaW5lZChfX0lOVEVHUklUWSkKKyAgICAjZGVmaW5lIENMX0FMSUdORUQoX3gpICAgICAgICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKF94KSkpCisjZWxpZiBkZWZpbmVkKCBfV0lOMzIpICYmIChfTVNDX1ZFUikKKyAgICAvKiBBbGlnbm1lbnQga2V5cyBuZXV0ZXJlZCBvbiB3aW5kb3dzIGJlY2F1c2UgTVNWQyBjYW4ndCBzd2FsbG93IGZ1bmN0aW9uIGFyZ3VtZW50cyB3aXRoIGFsaWdubWVudCByZXF1aXJlbWVudHMgICAgICovCisgICAgLyogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzM3M2FrMnkxJTI4VlMuNzElMjkuYXNweCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICNpbmNsdWRlIDxjcnRkZWZzLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAjZGVmaW5lIENMX0FMSUdORUQoX3gpICAgICAgICAgIF9DUlRfQUxJR04oX3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgI2RlZmluZSBDTF9BTElHTkVEKF94KQorI2Vsc2UKKyAgICN3YXJuaW5nICBOZWVkIHRvIGltcGxlbWVudCBzb21lIG1ldGhvZCB0byBhbGlnbiBkYXRhIGhlcmUKKyAgICNkZWZpbmUgIENMX0FMSUdORUQoX3gpCisjZW5kaWYKKworLyogSW5kaWNhdGUgd2hldGhlciAueHl6dywgLnMwMTIzIGFuZCAuaGkubG8gYXJlIHN1cHBvcnRlZCAqLworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgICAvKiAueHl6dyBhbmQgLnMwMTIzLi4ue2Z8Rn0gYXJlIHN1cHBvcnRlZCAqLworICAgICNkZWZpbmUgQ0xfSEFTX05BTUVEX1ZFQ1RPUl9GSUVMRFMgMQorICAgIC8qIC5oaSBhbmQgLmxvIGFyZSBzdXBwb3J0ZWQgKi8KKyAgICAjZGVmaW5lIENMX0hBU19ISV9MT19WRUNUT1JfRklFTERTIDEKKyNlbmRpZgorCisvKiBEZWZpbmUgY2xfdmVjdG9yIHR5cGVzICovCisKKy8qIC0tLS0gY2xfY2hhcm4gLS0tLSAqLwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX2NoYXIgIENMX0FMSUdORUQoMikgc1syXTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9jaGFyICB4LCB5OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfY2hhciAgczAsIHMxOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfY2hhciAgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9DSEFSMl9fKQorICAgIF9fY2xfY2hhcjIgICAgIHYyOworI2VuZGlmCit9Y2xfY2hhcjI7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9jaGFyICBDTF9BTElHTkVEKDQpIHNbNF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfY2hhciAgeCwgeSwgeiwgdzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2NoYXIgIHMwLCBzMSwgczIsIHMzOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfY2hhcjIgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9DSEFSMl9fKQorICAgIF9fY2xfY2hhcjIgICAgIHYyWzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9DSEFSNF9fKQorICAgIF9fY2xfY2hhcjQgICAgIHY0OworI2VuZGlmCit9Y2xfY2hhcjQ7CisKKy8qIGNsX2NoYXIzIGlzIGlkZW50aWNhbCBpbiBzaXplLCBhbGlnbm1lbnQgYW5kIGJlaGF2aW9yIHRvIGNsX2NoYXI0LiBTZWUgc2VjdGlvbiA2LjEuNS4gKi8KK3R5cGVkZWYgIGNsX2NoYXI0ICBjbF9jaGFyMzsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX2NoYXIgICBDTF9BTElHTkVEKDgpIHNbOF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfY2hhciAgeCwgeSwgeiwgdzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2NoYXIgIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2NoYXI0IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfQ0hBUjJfXykKKyAgICBfX2NsX2NoYXIyICAgICB2Mls0XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfQ0hBUjRfXykKKyAgICBfX2NsX2NoYXI0ICAgICB2NFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfQ0hBUjhfXyApCisgICAgX19jbF9jaGFyOCAgICAgdjg7CisjZW5kaWYKK31jbF9jaGFyODsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX2NoYXIgIENMX0FMSUdORUQoMTYpIHNbMTZdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2NoYXIgIHgsIHksIHosIHcsIF9fc3BhY2VyNCwgX19zcGFjZXI1LCBfX3NwYWNlcjYsIF9fc3BhY2VyNywgX19zcGFjZXI4LCBfX3NwYWNlcjksIHNhLCBzYiwgc2MsIHNkLCBzZSwgc2Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9jaGFyICBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRjsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2NoYXI4IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfQ0hBUjJfXykKKyAgICBfX2NsX2NoYXIyICAgICB2Mls4XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfQ0hBUjRfXykKKyAgICBfX2NsX2NoYXI0ICAgICB2NFs0XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfQ0hBUjhfXyApCisgICAgX19jbF9jaGFyOCAgICAgdjhbMl07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0NIQVIxNl9fICkKKyAgICBfX2NsX2NoYXIxNiAgICB2MTY7CisjZW5kaWYKK31jbF9jaGFyMTY7CisKKworLyogLS0tLSBjbF91Y2hhcm4gLS0tLSAqLwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX3VjaGFyICBDTF9BTElHTkVEKDIpIHNbMl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWNoYXIgIHgsIHk7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91Y2hhciAgczAsIHMxOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWNoYXIgIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fY2xfdWNoYXIyX18pCisgICAgX19jbF91Y2hhcjIgICAgIHYyOworI2VuZGlmCit9Y2xfdWNoYXIyOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfdWNoYXIgIENMX0FMSUdORUQoNCkgc1s0XTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91Y2hhciAgeCwgeSwgeiwgdzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VjaGFyICBzMCwgczEsIHMyLCBzMzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VjaGFyMiBsbywgaGk7IH07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VDSEFSMl9fKQorICAgIF9fY2xfdWNoYXIyICAgICB2MlsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUNIQVI0X18pCisgICAgX19jbF91Y2hhcjQgICAgIHY0OworI2VuZGlmCit9Y2xfdWNoYXI0OworCisvKiBjbF91Y2hhcjMgaXMgaWRlbnRpY2FsIGluIHNpemUsIGFsaWdubWVudCBhbmQgYmVoYXZpb3IgdG8gY2xfdWNoYXI0LiBTZWUgc2VjdGlvbiA2LjEuNS4gKi8KK3R5cGVkZWYgIGNsX3VjaGFyNCAgY2xfdWNoYXIzOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfdWNoYXIgICBDTF9BTElHTkVEKDgpIHNbOF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWNoYXIgIHgsIHksIHosIHc7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91Y2hhciAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWNoYXI0IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUNIQVIyX18pCisgICAgX19jbF91Y2hhcjIgICAgIHYyWzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VQ0hBUjRfXykKKyAgICBfX2NsX3VjaGFyNCAgICAgdjRbMl07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VDSEFSOF9fICkKKyAgICBfX2NsX3VjaGFyOCAgICAgdjg7CisjZW5kaWYKK31jbF91Y2hhcjg7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF91Y2hhciAgQ0xfQUxJR05FRCgxNikgc1sxNl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWNoYXIgIHgsIHksIHosIHcsIF9fc3BhY2VyNCwgX19zcGFjZXI1LCBfX3NwYWNlcjYsIF9fc3BhY2VyNywgX19zcGFjZXI4LCBfX3NwYWNlcjksIHNhLCBzYiwgc2MsIHNkLCBzZSwgc2Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91Y2hhciAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzOCwgczksIHNBLCBzQiwgc0MsIHNELCBzRSwgc0Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91Y2hhcjggbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VQ0hBUjJfXykKKyAgICBfX2NsX3VjaGFyMiAgICAgdjJbOF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VDSEFSNF9fKQorICAgIF9fY2xfdWNoYXI0ICAgICB2NFs0XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUNIQVI4X18gKQorICAgIF9fY2xfdWNoYXI4ICAgICB2OFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUNIQVIxNl9fICkKKyAgICBfX2NsX3VjaGFyMTYgICAgdjE2OworI2VuZGlmCit9Y2xfdWNoYXIxNjsKKworCisvKiAtLS0tIGNsX3Nob3J0biAtLS0tICovCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfc2hvcnQgIENMX0FMSUdORUQoNCkgc1syXTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9zaG9ydCAgeCwgeTsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3Nob3J0ICBzMCwgczE7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9zaG9ydCAgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9TSE9SVDJfXykKKyAgICBfX2NsX3Nob3J0MiAgICAgdjI7CisjZW5kaWYKK31jbF9zaG9ydDI7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9zaG9ydCAgQ0xfQUxJR05FRCg4KSBzWzRdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3Nob3J0ICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfc2hvcnQgIHMwLCBzMSwgczIsIHMzOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfc2hvcnQyIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfU0hPUlQyX18pCisgICAgX19jbF9zaG9ydDIgICAgIHYyWzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9TSE9SVDRfXykKKyAgICBfX2NsX3Nob3J0NCAgICAgdjQ7CisjZW5kaWYKK31jbF9zaG9ydDQ7CisKKy8qIGNsX3Nob3J0MyBpcyBpZGVudGljYWwgaW4gc2l6ZSwgYWxpZ25tZW50IGFuZCBiZWhhdmlvciB0byBjbF9zaG9ydDQuIFNlZSBzZWN0aW9uIDYuMS41LiAqLwordHlwZWRlZiAgY2xfc2hvcnQ0ICBjbF9zaG9ydDM7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9zaG9ydCAgIENMX0FMSUdORUQoMTYpIHNbOF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfc2hvcnQgIHgsIHksIHosIHc7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9zaG9ydCAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfc2hvcnQ0IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfU0hPUlQyX18pCisgICAgX19jbF9zaG9ydDIgICAgIHYyWzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9TSE9SVDRfXykKKyAgICBfX2NsX3Nob3J0NCAgICAgdjRbMl07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1NIT1JUOF9fICkKKyAgICBfX2NsX3Nob3J0OCAgICAgdjg7CisjZW5kaWYKK31jbF9zaG9ydDg7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9zaG9ydCAgQ0xfQUxJR05FRCgzMikgc1sxNl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfc2hvcnQgIHgsIHksIHosIHcsIF9fc3BhY2VyNCwgX19zcGFjZXI1LCBfX3NwYWNlcjYsIF9fc3BhY2VyNywgX19zcGFjZXI4LCBfX3NwYWNlcjksIHNhLCBzYiwgc2MsIHNkLCBzZSwgc2Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9zaG9ydCAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzOCwgczksIHNBLCBzQiwgc0MsIHNELCBzRSwgc0Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9zaG9ydDggbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9TSE9SVDJfXykKKyAgICBfX2NsX3Nob3J0MiAgICAgdjJbOF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1NIT1JUNF9fKQorICAgIF9fY2xfc2hvcnQ0ICAgICB2NFs0XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfU0hPUlQ4X18gKQorICAgIF9fY2xfc2hvcnQ4ICAgICB2OFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfU0hPUlQxNl9fICkKKyAgICBfX2NsX3Nob3J0MTYgICAgdjE2OworI2VuZGlmCit9Y2xfc2hvcnQxNjsKKworCisvKiAtLS0tIGNsX3VzaG9ydG4gLS0tLSAqLwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX3VzaG9ydCAgQ0xfQUxJR05FRCg0KSBzWzJdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VzaG9ydCAgeCwgeTsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VzaG9ydCAgczAsIHMxOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdXNob3J0ICBsbywgaGk7IH07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VTSE9SVDJfXykKKyAgICBfX2NsX3VzaG9ydDIgICAgIHYyOworI2VuZGlmCit9Y2xfdXNob3J0MjsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX3VzaG9ydCAgQ0xfQUxJR05FRCg4KSBzWzRdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VzaG9ydCAgeCwgeSwgeiwgdzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VzaG9ydCAgczAsIHMxLCBzMiwgczM7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91c2hvcnQyIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVVNIT1JUMl9fKQorICAgIF9fY2xfdXNob3J0MiAgICAgdjJbMl07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VTSE9SVDRfXykKKyAgICBfX2NsX3VzaG9ydDQgICAgIHY0OworI2VuZGlmCit9Y2xfdXNob3J0NDsKKworLyogY2xfdXNob3J0MyBpcyBpZGVudGljYWwgaW4gc2l6ZSwgYWxpZ25tZW50IGFuZCBiZWhhdmlvciB0byBjbF91c2hvcnQ0LiBTZWUgc2VjdGlvbiA2LjEuNS4gKi8KK3R5cGVkZWYgIGNsX3VzaG9ydDQgIGNsX3VzaG9ydDM7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF91c2hvcnQgICBDTF9BTElHTkVEKDE2KSBzWzhdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VzaG9ydCAgeCwgeSwgeiwgdzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VzaG9ydCAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdXNob3J0NCBsbywgaGk7IH07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VTSE9SVDJfXykKKyAgICBfX2NsX3VzaG9ydDIgICAgIHYyWzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VU0hPUlQ0X18pCisgICAgX19jbF91c2hvcnQ0ICAgICB2NFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVVNIT1JUOF9fICkKKyAgICBfX2NsX3VzaG9ydDggICAgIHY4OworI2VuZGlmCit9Y2xfdXNob3J0ODsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX3VzaG9ydCAgQ0xfQUxJR05FRCgzMikgc1sxNl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdXNob3J0ICB4LCB5LCB6LCB3LCBfX3NwYWNlcjQsIF9fc3BhY2VyNSwgX19zcGFjZXI2LCBfX3NwYWNlcjcsIF9fc3BhY2VyOCwgX19zcGFjZXI5LCBzYSwgc2IsIHNjLCBzZCwgc2UsIHNmOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdXNob3J0ICBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRjsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VzaG9ydDggbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VU0hPUlQyX18pCisgICAgX19jbF91c2hvcnQyICAgICB2Mls4XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVVNIT1JUNF9fKQorICAgIF9fY2xfdXNob3J0NCAgICAgdjRbNF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VTSE9SVDhfXyApCisgICAgX19jbF91c2hvcnQ4ICAgICB2OFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVVNIT1JUMTZfXyApCisgICAgX19jbF91c2hvcnQxNiAgICB2MTY7CisjZW5kaWYKK31jbF91c2hvcnQxNjsKKworCisvKiAtLS0tIGNsX2hhbGZuIC0tLS0gKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9oYWxmICBDTF9BTElHTkVEKDQpIHNbMl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2hhbGYgIHgsIHk7IH07CisgICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaGFsZiAgczAsIHMxOyB9OworICAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2hhbGYgIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfSEFMRjJfXykKKyAgICBfX2NsX2hhbGYyICAgICB2MjsKKyNlbmRpZgorfWNsX2hhbGYyOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfaGFsZiAgQ0xfQUxJR05FRCg4KSBzWzRdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9oYWxmICB4LCB5LCB6LCB3OyB9OworICAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2hhbGYgIHMwLCBzMSwgczIsIHMzOyB9OworICAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2hhbGYyIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfSEFMRjJfXykKKyAgICBfX2NsX2hhbGYyICAgICB2MlsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfSEFMRjRfXykKKyAgICBfX2NsX2hhbGY0ICAgICB2NDsKKyNlbmRpZgorfWNsX2hhbGY0OworCisvKiBjbF9oYWxmMyBpcyBpZGVudGljYWwgaW4gc2l6ZSwgYWxpZ25tZW50IGFuZCBiZWhhdmlvciB0byBjbF9oYWxmNC4gU2VlIHNlY3Rpb24gNi4xLjUuICovCit0eXBlZGVmICBjbF9oYWxmNCAgY2xfaGFsZjM7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9oYWxmICAgQ0xfQUxJR05FRCgxNikgc1s4XTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaGFsZiAgeCwgeSwgeiwgdzsgfTsKKyAgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9oYWxmICBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7IH07CisgICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaGFsZjQgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9IQUxGMl9fKQorICAgIF9fY2xfaGFsZjIgICAgIHYyWzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9IQUxGNF9fKQorICAgIF9fY2xfaGFsZjQgICAgIHY0WzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9IQUxGOF9fICkKKyAgICBfX2NsX2hhbGY4ICAgICB2ODsKKyNlbmRpZgorfWNsX2hhbGY4OworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfaGFsZiAgQ0xfQUxJR05FRCgzMikgc1sxNl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2hhbGYgIHgsIHksIHosIHcsIF9fc3BhY2VyNCwgX19zcGFjZXI1LCBfX3NwYWNlcjYsIF9fc3BhY2VyNywgX19zcGFjZXI4LCBfX3NwYWNlcjksIHNhLCBzYiwgc2MsIHNkLCBzZSwgc2Y7IH07CisgICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaGFsZiAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzOCwgczksIHNBLCBzQiwgc0MsIHNELCBzRSwgc0Y7IH07CisgICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaGFsZjggbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9IQUxGMl9fKQorICAgIF9fY2xfaGFsZjIgICAgIHYyWzhdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9IQUxGNF9fKQorICAgIF9fY2xfaGFsZjQgICAgIHY0WzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9IQUxGOF9fICkKKyAgICBfX2NsX2hhbGY4ICAgICB2OFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfSEFMRjE2X18gKQorICAgIF9fY2xfaGFsZjE2ICAgIHYxNjsKKyNlbmRpZgorfWNsX2hhbGYxNjsKKworLyogLS0tLSBjbF9pbnRuIC0tLS0gKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9pbnQgIENMX0FMSUdORUQoOCkgc1syXTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9pbnQgIHgsIHk7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9pbnQgIHMwLCBzMTsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2ludCAgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9JTlQyX18pCisgICAgX19jbF9pbnQyICAgICB2MjsKKyNlbmRpZgorfWNsX2ludDI7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9pbnQgIENMX0FMSUdORUQoMTYpIHNbNF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaW50ICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaW50ICBzMCwgczEsIHMyLCBzMzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2ludDIgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9JTlQyX18pCisgICAgX19jbF9pbnQyICAgICB2MlsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfSU5UNF9fKQorICAgIF9fY2xfaW50NCAgICAgdjQ7CisjZW5kaWYKK31jbF9pbnQ0OworCisvKiBjbF9pbnQzIGlzIGlkZW50aWNhbCBpbiBzaXplLCBhbGlnbm1lbnQgYW5kIGJlaGF2aW9yIHRvIGNsX2ludDQuIFNlZSBzZWN0aW9uIDYuMS41LiAqLwordHlwZWRlZiAgY2xfaW50NCAgY2xfaW50MzsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX2ludCAgIENMX0FMSUdORUQoMzIpIHNbOF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaW50ICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaW50ICBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9pbnQ0IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfSU5UMl9fKQorICAgIF9fY2xfaW50MiAgICAgdjJbNF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0lOVDRfXykKKyAgICBfX2NsX2ludDQgICAgIHY0WzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9JTlQ4X18gKQorICAgIF9fY2xfaW50OCAgICAgdjg7CisjZW5kaWYKK31jbF9pbnQ4OworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfaW50ICBDTF9BTElHTkVEKDY0KSBzWzE2XTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9pbnQgIHgsIHksIHosIHcsIF9fc3BhY2VyNCwgX19zcGFjZXI1LCBfX3NwYWNlcjYsIF9fc3BhY2VyNywgX19zcGFjZXI4LCBfX3NwYWNlcjksIHNhLCBzYiwgc2MsIHNkLCBzZSwgc2Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9pbnQgIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywgczgsIHM5LCBzQSwgc0IsIHNDLCBzRCwgc0UsIHNGOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfaW50OCBsbywgaGk7IH07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0lOVDJfXykKKyAgICBfX2NsX2ludDIgICAgIHYyWzhdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9JTlQ0X18pCisgICAgX19jbF9pbnQ0ICAgICB2NFs0XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfSU5UOF9fICkKKyAgICBfX2NsX2ludDggICAgIHY4WzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9JTlQxNl9fICkKKyAgICBfX2NsX2ludDE2ICAgIHYxNjsKKyNlbmRpZgorfWNsX2ludDE2OworCisKKy8qIC0tLS0gY2xfdWludG4gLS0tLSAqLwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX3VpbnQgIENMX0FMSUdORUQoOCkgc1syXTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91aW50ICB4LCB5OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWludCAgczAsIHMxOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWludCAgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VSU5UMl9fKQorICAgIF9fY2xfdWludDIgICAgIHYyOworI2VuZGlmCit9Y2xfdWludDI7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF91aW50ICBDTF9BTElHTkVEKDE2KSBzWzRdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VpbnQgIHgsIHksIHosIHc7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91aW50ICBzMCwgczEsIHMyLCBzMzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VpbnQyIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUlOVDJfXykKKyAgICBfX2NsX3VpbnQyICAgICB2MlsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUlOVDRfXykKKyAgICBfX2NsX3VpbnQ0ICAgICB2NDsKKyNlbmRpZgorfWNsX3VpbnQ0OworCisvKiBjbF91aW50MyBpcyBpZGVudGljYWwgaW4gc2l6ZSwgYWxpZ25tZW50IGFuZCBiZWhhdmlvciB0byBjbF91aW50NC4gU2VlIHNlY3Rpb24gNi4xLjUuICovCit0eXBlZGVmICBjbF91aW50NCAgY2xfdWludDM7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF91aW50ICAgQ0xfQUxJR05FRCgzMikgc1s4XTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91aW50ICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWludCAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWludDQgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VSU5UMl9fKQorICAgIF9fY2xfdWludDIgICAgIHYyWzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VSU5UNF9fKQorICAgIF9fY2xfdWludDQgICAgIHY0WzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VSU5UOF9fICkKKyAgICBfX2NsX3VpbnQ4ICAgICB2ODsKKyNlbmRpZgorfWNsX3VpbnQ4OworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfdWludCAgQ0xfQUxJR05FRCg2NCkgc1sxNl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWludCAgeCwgeSwgeiwgdywgX19zcGFjZXI0LCBfX3NwYWNlcjUsIF9fc3BhY2VyNiwgX19zcGFjZXI3LCBfX3NwYWNlcjgsIF9fc3BhY2VyOSwgc2EsIHNiLCBzYywgc2QsIHNlLCBzZjsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3VpbnQgIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywgczgsIHM5LCBzQSwgc0IsIHNDLCBzRCwgc0UsIHNGOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWludDggbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VSU5UMl9fKQorICAgIF9fY2xfdWludDIgICAgIHYyWzhdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VSU5UNF9fKQorICAgIF9fY2xfdWludDQgICAgIHY0WzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VSU5UOF9fICkKKyAgICBfX2NsX3VpbnQ4ICAgICB2OFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUlOVDE2X18gKQorICAgIF9fY2xfdWludDE2ICAgIHYxNjsKKyNlbmRpZgorfWNsX3VpbnQxNjsKKworLyogLS0tLSBjbF9sb25nbiAtLS0tICovCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfbG9uZyAgQ0xfQUxJR05FRCgxNikgc1syXTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9sb25nICB4LCB5OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfbG9uZyAgczAsIHMxOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfbG9uZyAgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9MT05HMl9fKQorICAgIF9fY2xfbG9uZzIgICAgIHYyOworI2VuZGlmCit9Y2xfbG9uZzI7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9sb25nICBDTF9BTElHTkVEKDMyKSBzWzRdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2xvbmcgIHgsIHksIHosIHc7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9sb25nICBzMCwgczEsIHMyLCBzMzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2xvbmcyIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfTE9ORzJfXykKKyAgICBfX2NsX2xvbmcyICAgICB2MlsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfTE9ORzRfXykKKyAgICBfX2NsX2xvbmc0ICAgICB2NDsKKyNlbmRpZgorfWNsX2xvbmc0OworCisvKiBjbF9sb25nMyBpcyBpZGVudGljYWwgaW4gc2l6ZSwgYWxpZ25tZW50IGFuZCBiZWhhdmlvciB0byBjbF9sb25nNC4gU2VlIHNlY3Rpb24gNi4xLjUuICovCit0eXBlZGVmICBjbF9sb25nNCAgY2xfbG9uZzM7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9sb25nICAgQ0xfQUxJR05FRCg2NCkgc1s4XTsKKyNpZiBfX0NMX0hBU19BTk9OX1NUUlVDVF9fCisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9sb25nICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfbG9uZyAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfbG9uZzQgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9MT05HMl9fKQorICAgIF9fY2xfbG9uZzIgICAgIHYyWzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9MT05HNF9fKQorICAgIF9fY2xfbG9uZzQgICAgIHY0WzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9MT05HOF9fICkKKyAgICBfX2NsX2xvbmc4ICAgICB2ODsKKyNlbmRpZgorfWNsX2xvbmc4OworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfbG9uZyAgQ0xfQUxJR05FRCgxMjgpIHNbMTZdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2xvbmcgIHgsIHksIHosIHcsIF9fc3BhY2VyNCwgX19zcGFjZXI1LCBfX3NwYWNlcjYsIF9fc3BhY2VyNywgX19zcGFjZXI4LCBfX3NwYWNlcjksIHNhLCBzYiwgc2MsIHNkLCBzZSwgc2Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9sb25nICBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRjsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2xvbmc4IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfTE9ORzJfXykKKyAgICBfX2NsX2xvbmcyICAgICB2Mls4XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfTE9ORzRfXykKKyAgICBfX2NsX2xvbmc0ICAgICB2NFs0XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfTE9ORzhfXyApCisgICAgX19jbF9sb25nOCAgICAgdjhbMl07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0xPTkcxNl9fICkKKyAgICBfX2NsX2xvbmcxNiAgICB2MTY7CisjZW5kaWYKK31jbF9sb25nMTY7CisKKworLyogLS0tLSBjbF91bG9uZ24gLS0tLSAqLwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX3Vsb25nICBDTF9BTElHTkVEKDE2KSBzWzJdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3Vsb25nICB4LCB5OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWxvbmcgIHMwLCBzMTsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3Vsb25nICBsbywgaGk7IH07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VMT05HMl9fKQorICAgIF9fY2xfdWxvbmcyICAgICB2MjsKKyNlbmRpZgorfWNsX3Vsb25nMjsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX3Vsb25nICBDTF9BTElHTkVEKDMyKSBzWzRdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3Vsb25nICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWxvbmcgIHMwLCBzMSwgczIsIHMzOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWxvbmcyIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUxPTkcyX18pCisgICAgX19jbF91bG9uZzIgICAgIHYyWzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VTE9ORzRfXykKKyAgICBfX2NsX3Vsb25nNCAgICAgdjQ7CisjZW5kaWYKK31jbF91bG9uZzQ7CisKKy8qIGNsX3Vsb25nMyBpcyBpZGVudGljYWwgaW4gc2l6ZSwgYWxpZ25tZW50IGFuZCBiZWhhdmlvciB0byBjbF91bG9uZzQuIFNlZSBzZWN0aW9uIDYuMS41LiAqLwordHlwZWRlZiAgY2xfdWxvbmc0ICBjbF91bG9uZzM7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF91bG9uZyAgIENMX0FMSUdORUQoNjQpIHNbOF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWxvbmcgIHgsIHksIHosIHc7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF91bG9uZyAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWxvbmc0IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUxPTkcyX18pCisgICAgX19jbF91bG9uZzIgICAgIHYyWzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VTE9ORzRfXykKKyAgICBfX2NsX3Vsb25nNCAgICAgdjRbMl07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VMT05HOF9fICkKKyAgICBfX2NsX3Vsb25nOCAgICAgdjg7CisjZW5kaWYKK31jbF91bG9uZzg7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF91bG9uZyAgQ0xfQUxJR05FRCgxMjgpIHNbMTZdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX3Vsb25nICB4LCB5LCB6LCB3LCBfX3NwYWNlcjQsIF9fc3BhY2VyNSwgX19zcGFjZXI2LCBfX3NwYWNlcjcsIF9fc3BhY2VyOCwgX19zcGFjZXI5LCBzYSwgc2IsIHNjLCBzZCwgc2UsIHNmOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWxvbmcgIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywgczgsIHM5LCBzQSwgc0IsIHNDLCBzRCwgc0UsIHNGOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfdWxvbmc4IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfVUxPTkcyX18pCisgICAgX19jbF91bG9uZzIgICAgIHYyWzhdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9VTE9ORzRfXykKKyAgICBfX2NsX3Vsb25nNCAgICAgdjRbNF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VMT05HOF9fICkKKyAgICBfX2NsX3Vsb25nOCAgICAgdjhbMl07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX1VMT05HMTZfXyApCisgICAgX19jbF91bG9uZzE2ICAgIHYxNjsKKyNlbmRpZgorfWNsX3Vsb25nMTY7CisKKworLyogLS0tIGNsX2Zsb2F0biAtLS0tICovCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9mbG9hdCAgQ0xfQUxJR05FRCg4KSBzWzJdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2Zsb2F0ICB4LCB5OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZmxvYXQgIHMwLCBzMTsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2Zsb2F0ICBsbywgaGk7IH07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0ZMT0FUMl9fKQorICAgIF9fY2xfZmxvYXQyICAgICB2MjsKKyNlbmRpZgorfWNsX2Zsb2F0MjsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX2Zsb2F0ICBDTF9BTElHTkVEKDE2KSBzWzRdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2Zsb2F0ICAgeCwgeSwgeiwgdzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2Zsb2F0ICAgczAsIHMxLCBzMiwgczM7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9mbG9hdDIgIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfRkxPQVQyX18pCisgICAgX19jbF9mbG9hdDIgICAgIHYyWzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9GTE9BVDRfXykKKyAgICBfX2NsX2Zsb2F0NCAgICAgdjQ7CisjZW5kaWYKK31jbF9mbG9hdDQ7CisKKy8qIGNsX2Zsb2F0MyBpcyBpZGVudGljYWwgaW4gc2l6ZSwgYWxpZ25tZW50IGFuZCBiZWhhdmlvciB0byBjbF9mbG9hdDQuIFNlZSBzZWN0aW9uIDYuMS41LiAqLwordHlwZWRlZiAgY2xfZmxvYXQ0ICBjbF9mbG9hdDM7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9mbG9hdCAgIENMX0FMSUdORUQoMzIpIHNbOF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZmxvYXQgICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZmxvYXQgICBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9mbG9hdDQgIGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfRkxPQVQyX18pCisgICAgX19jbF9mbG9hdDIgICAgIHYyWzRdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9GTE9BVDRfXykKKyAgICBfX2NsX2Zsb2F0NCAgICAgdjRbMl07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0ZMT0FUOF9fICkKKyAgICBfX2NsX2Zsb2F0OCAgICAgdjg7CisjZW5kaWYKK31jbF9mbG9hdDg7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9mbG9hdCAgQ0xfQUxJR05FRCg2NCkgc1sxNl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZmxvYXQgIHgsIHksIHosIHcsIF9fc3BhY2VyNCwgX19zcGFjZXI1LCBfX3NwYWNlcjYsIF9fc3BhY2VyNywgX19zcGFjZXI4LCBfX3NwYWNlcjksIHNhLCBzYiwgc2MsIHNkLCBzZSwgc2Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9mbG9hdCAgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzOCwgczksIHNBLCBzQiwgc0MsIHNELCBzRSwgc0Y7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9mbG9hdDggbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9GTE9BVDJfXykKKyAgICBfX2NsX2Zsb2F0MiAgICAgdjJbOF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0ZMT0FUNF9fKQorICAgIF9fY2xfZmxvYXQ0ICAgICB2NFs0XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfRkxPQVQ4X18gKQorICAgIF9fY2xfZmxvYXQ4ICAgICB2OFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfRkxPQVQxNl9fICkKKyAgICBfX2NsX2Zsb2F0MTYgICAgdjE2OworI2VuZGlmCit9Y2xfZmxvYXQxNjsKKworLyogLS0tIGNsX2RvdWJsZW4gLS0tLSAqLworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfZG91YmxlICBDTF9BTElHTkVEKDE2KSBzWzJdOworI2lmIF9fQ0xfSEFTX0FOT05fU1RSVUNUX18KKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2RvdWJsZSAgeCwgeTsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2RvdWJsZSBzMCwgczE7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9kb3VibGUgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9ET1VCTEUyX18pCisgICAgX19jbF9kb3VibGUyICAgICB2MjsKKyNlbmRpZgorfWNsX2RvdWJsZTI7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBjbF9kb3VibGUgIENMX0FMSUdORUQoMzIpIHNbNF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZG91YmxlICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZG91YmxlICBzMCwgczEsIHMyLCBzMzsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2RvdWJsZTIgbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9ET1VCTEUyX18pCisgICAgX19jbF9kb3VibGUyICAgICB2MlsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfRE9VQkxFNF9fKQorICAgIF9fY2xfZG91YmxlNCAgICAgdjQ7CisjZW5kaWYKK31jbF9kb3VibGU0OworCisvKiBjbF9kb3VibGUzIGlzIGlkZW50aWNhbCBpbiBzaXplLCBhbGlnbm1lbnQgYW5kIGJlaGF2aW9yIHRvIGNsX2RvdWJsZTQuIFNlZSBzZWN0aW9uIDYuMS41LiAqLwordHlwZWRlZiAgY2xfZG91YmxlNCAgY2xfZG91YmxlMzsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGNsX2RvdWJsZSAgIENMX0FMSUdORUQoNjQpIHNbOF07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZG91YmxlICB4LCB5LCB6LCB3OyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZG91YmxlICBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7IH07CisgICBfX0NMX0FOT05fU1RSVUNUX18gc3RydWN0eyBjbF9kb3VibGU0IGxvLCBoaTsgfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfRE9VQkxFMl9fKQorICAgIF9fY2xfZG91YmxlMiAgICAgdjJbNF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0RPVUJMRTRfXykKKyAgICBfX2NsX2RvdWJsZTQgICAgIHY0WzJdOworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9ET1VCTEU4X18gKQorICAgIF9fY2xfZG91YmxlOCAgICAgdjg7CisjZW5kaWYKK31jbF9kb3VibGU4OworCit0eXBlZGVmIHVuaW9uCit7CisgICAgY2xfZG91YmxlICBDTF9BTElHTkVEKDEyOCkgc1sxNl07CisjaWYgX19DTF9IQVNfQU5PTl9TVFJVQ1RfXworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZG91YmxlICB4LCB5LCB6LCB3LCBfX3NwYWNlcjQsIF9fc3BhY2VyNSwgX19zcGFjZXI2LCBfX3NwYWNlcjcsIF9fc3BhY2VyOCwgX19zcGFjZXI5LCBzYSwgc2IsIHNjLCBzZCwgc2UsIHNmOyB9OworICAgX19DTF9BTk9OX1NUUlVDVF9fIHN0cnVjdHsgY2xfZG91YmxlICBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSwgc0EsIHNCLCBzQywgc0QsIHNFLCBzRjsgfTsKKyAgIF9fQ0xfQU5PTl9TVFJVQ1RfXyBzdHJ1Y3R7IGNsX2RvdWJsZTggbG8sIGhpOyB9OworI2VuZGlmCisjaWYgZGVmaW5lZCggX19DTF9ET1VCTEUyX18pCisgICAgX19jbF9kb3VibGUyICAgICB2Mls4XTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfRE9VQkxFNF9fKQorICAgIF9fY2xfZG91YmxlNCAgICAgdjRbNF07CisjZW5kaWYKKyNpZiBkZWZpbmVkKCBfX0NMX0RPVUJMRThfXyApCisgICAgX19jbF9kb3VibGU4ICAgICB2OFsyXTsKKyNlbmRpZgorI2lmIGRlZmluZWQoIF9fQ0xfRE9VQkxFMTZfXyApCisgICAgX19jbF9kb3VibGUxNiAgICB2MTY7CisjZW5kaWYKK31jbF9kb3VibGUxNjsKKworLyogTWFjcm8gdG8gZmFjaWxpdGF0ZSBkZWJ1Z2dpbmcKKyAqIFVzYWdlOgorICogICBQbGFjZSBDTF9QUk9HUkFNX1NUUklOR19ERUJVR19JTkZPIG9uIHRoZSBsaW5lIGJlZm9yZSB0aGUgZmlyc3QgbGluZSBvZiB5b3VyIHNvdXJjZS4KKyAqICAgVGhlIGZpcnN0IGxpbmUgZW5kcyB3aXRoOiAgIENMX1BST0dSQU1fU1RSSU5HX0RFQlVHX0lORk8gXCIKKyAqICAgRWFjaCBsaW5lIHRoZXJlYWZ0ZXIgb2YgT3BlbkNMIEMgc291cmNlIG11c3QgZW5kIHdpdGg6IFxuXAorICogICBUaGUgbGFzdCBsaW5lIGVuZHMgaW4gIjsKKyAqCisgKiAgIEV4YW1wbGU6CisgKgorICogICBjb25zdCBjaGFyICpteV9wcm9ncmFtID0gQ0xfUFJPR1JBTV9TVFJJTkdfREVCVUdfSU5GTyAiXAorICogICBrZXJuZWwgdm9pZCBmb28oIGludCBhLCBmbG9hdCAqIGIgKSAgICAgICAgICAgICBcblwKKyAqICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cCisgKiAgICAgIC8vIG15IGNvbW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAorICogICAgICAqYlsgZ2V0X2dsb2JhbF9pZCgwKV0gPSBhOyAgICAgICAgICAgICAgICAgICBcblwKKyAqICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cCisgKiAgICI7CisgKgorICogVGhpcyBzaG91bGQgY29ycmVjdGx5IHNldCB1cCB0aGUgbGluZSwgKGNvbHVtbikgYW5kIGZpbGUgaW5mb3JtYXRpb24gZm9yIHlvdXIgc291cmNlCisgKiBzdHJpbmcgc28geW91IGNhbiBkbyBzb3VyY2UgbGV2ZWwgZGVidWdnaW5nLgorICovCisjZGVmaW5lICBfX0NMX1NUUklOR0lGWSggX3ggKSAgICAgICAgICAgICAgICMgX3gKKyNkZWZpbmUgIF9DTF9TVFJJTkdJRlkoIF94ICkgICAgICAgICAgICAgICAgX19DTF9TVFJJTkdJRlkoIF94ICkKKyNkZWZpbmUgIENMX1BST0dSQU1fU1RSSU5HX0RFQlVHX0lORk8gICAgICAgIiNsaW5lICIgIF9DTF9TVFJJTkdJRlkoX19MSU5FX18pICIgXCIiIF9fRklMRV9fICJcIiBcblxuIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCggX1dJTjMyKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhIGRlZmluZWQoX19TVERDX18pCisgICAgI2lmIF9NU0NfVkVSID49MTUwMAorICAgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyAgICAjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fQ0xfUExBVEZPUk1fSCAgKi8KZGlmZiAtLWdpdCBhL09wZW5DTC9DTC9jbF92YV9hcGlfbWVkaWFfc2hhcmluZ19pbnRlbC5oIGIvT3BlbkNML0NML2NsX3ZhX2FwaV9tZWRpYV9zaGFyaW5nX2ludGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMmVjOAotLS0gL2Rldi9udWxsCisrKyBiL09wZW5DTC9DTC9jbF92YV9hcGlfbWVkaWFfc2hhcmluZ19pbnRlbC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMjAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fT1BFTkNMX0NMX1ZBX0FQSV9NRURJQV9TSEFSSU5HX0lOVEVMX0gKKyNkZWZpbmUgX19PUEVOQ0xfQ0xfVkFfQVBJX01FRElBX1NIQVJJTkdfSU5URUxfSAorCisjaW5jbHVkZSA8Q0wvY2wuaD4KKyNpbmNsdWRlIDxDTC9jbF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHZhL3ZhLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbF9pbnRlbF92YV9hcGlfbWVkaWFfc2hhcmluZyBleHRlbnNpb24gKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBjbF9pbnRlbF92YV9hcGlfbWVkaWFfc2hhcmluZyAxCisKKy8qIGVycm9yIGNvZGVzICovCisjZGVmaW5lIENMX0lOVkFMSURfVkFfQVBJX01FRElBX0FEQVBURVJfSU5URUwgICAgICAgICAgICAgICAtMTA5OAorI2RlZmluZSBDTF9JTlZBTElEX1ZBX0FQSV9NRURJQV9TVVJGQUNFX0lOVEVMICAgICAgICAgICAgICAgLTEwOTkKKyNkZWZpbmUgQ0xfVkFfQVBJX01FRElBX1NVUkZBQ0VfQUxSRUFEWV9BQ1FVSVJFRF9JTlRFTCAgICAgIC0xMTAwCisjZGVmaW5lIENMX1ZBX0FQSV9NRURJQV9TVVJGQUNFX05PVF9BQ1FVSVJFRF9JTlRFTCAgICAgICAgICAtMTEwMQorCisvKiBjbF92YV9hcGlfZGV2aWNlX3NvdXJjZV9pbnRlbCAqLworI2RlZmluZSBDTF9WQV9BUElfRElTUExBWV9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDk0CisKKy8qIGNsX3ZhX2FwaV9kZXZpY2Vfc2V0X2ludGVsICovCisjZGVmaW5lIENMX1BSRUZFUlJFRF9ERVZJQ0VTX0ZPUl9WQV9BUElfSU5URUwgICAgICAgICAgICAgICAweDQwOTUKKyNkZWZpbmUgQ0xfQUxMX0RFVklDRVNfRk9SX1ZBX0FQSV9JTlRFTCAgICAgICAgICAgICAgICAgICAgIDB4NDA5NgorCisvKiBjbF9jb250ZXh0X2luZm8gKi8KKyNkZWZpbmUgQ0xfQ09OVEVYVF9WQV9BUElfRElTUExBWV9JTlRFTCAgICAgICAgICAgICAgICAgICAgIDB4NDA5NworCisvKiBjbF9tZW1faW5mbyAqLworI2RlZmluZSBDTF9NRU1fVkFfQVBJX01FRElBX1NVUkZBQ0VfSU5URUwgICAgICAgICAgICAgICAgICAgMHg0MDk4CisKKy8qIGNsX2ltYWdlX2luZm8gKi8KKyNkZWZpbmUgQ0xfSU1BR0VfVkFfQVBJX1BMQU5FX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDA5OQorCisvKiBjbF9jb21tYW5kX3R5cGUgKi8KKyNkZWZpbmUgQ0xfQ09NTUFORF9BQ1FVSVJFX1ZBX0FQSV9NRURJQV9TVVJGQUNFU19JTlRFTCAgICAgIDB4NDA5QQorI2RlZmluZSBDTF9DT01NQU5EX1JFTEVBU0VfVkFfQVBJX01FRElBX1NVUkZBQ0VTX0lOVEVMICAgICAgMHg0MDlCCisKK3R5cGVkZWYgY2xfdWludCBjbF92YV9hcGlfZGV2aWNlX3NvdXJjZV9pbnRlbDsKK3R5cGVkZWYgY2xfdWludCBjbF92YV9hcGlfZGV2aWNlX3NldF9pbnRlbDsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsR2V0RGV2aWNlSURzRnJvbVZBX0FQSU1lZGlhQWRhcHRlcklOVEVMKAorICAgIGNsX3BsYXRmb3JtX2lkICAgICAgICAgICAgICAgIHBsYXRmb3JtLAorICAgIGNsX3ZhX2FwaV9kZXZpY2Vfc291cmNlX2ludGVsIG1lZGlhX2FkYXB0ZXJfdHlwZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9hZGFwdGVyLAorICAgIGNsX3ZhX2FwaV9kZXZpY2Vfc2V0X2ludGVsICAgIG1lZGlhX2FkYXB0ZXJfc2V0LAorICAgIGNsX3VpbnQgICAgICAgICAgICAgICAgICAgICAgIG51bV9lbnRyaWVzLAorICAgIGNsX2RldmljZV9pZCogICAgICAgICAgICAgICAgIGRldmljZXMsCisgICAgY2xfdWludCogICAgICAgICAgICAgICAgICAgICAgbnVtX2RldmljZXMpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKiBjbEdldERldmljZUlEc0Zyb21WQV9BUElNZWRpYUFkYXB0ZXJJTlRFTF9mbikoCisgICAgY2xfcGxhdGZvcm1faWQgICAgICAgICAgICAgICAgcGxhdGZvcm0sCisgICAgY2xfdmFfYXBpX2RldmljZV9zb3VyY2VfaW50ZWwgbWVkaWFfYWRhcHRlcl90eXBlLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX2FkYXB0ZXIsCisgICAgY2xfdmFfYXBpX2RldmljZV9zZXRfaW50ZWwgICAgbWVkaWFfYWRhcHRlcl9zZXQsCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgbnVtX2VudHJpZXMsCisgICAgY2xfZGV2aWNlX2lkKiAgICAgICAgICAgICAgICAgZGV2aWNlcywKKyAgICBjbF91aW50KiAgICAgICAgICAgICAgICAgICAgICBudW1fZGV2aWNlcykgQ0xfQVBJX1NVRkZJWF9fVkVSU0lPTl8xXzI7CisKK2V4dGVybiBDTF9BUElfRU5UUlkgY2xfbWVtIENMX0FQSV9DQUxMCitjbENyZWF0ZUZyb21WQV9BUElNZWRpYVN1cmZhY2VJTlRFTCgKKyAgICBjbF9jb250ZXh0ICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAorICAgIGNsX21lbV9mbGFncyAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZBU3VyZmFjZUlEKiAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUsCisgICAgY2xfaW50KiAgICAgICAgICAgICAgICAgICAgICAgZXJyY29kZV9yZXQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX21lbSAoQ0xfQVBJX0NBTEwgKiBjbENyZWF0ZUZyb21WQV9BUElNZWRpYVN1cmZhY2VJTlRFTF9mbikoCisgICAgY2xfY29udGV4dCAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKKyAgICBjbF9tZW1fZmxhZ3MgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICBWQVN1cmZhY2VJRCogICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIGNsX3VpbnQgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lLAorICAgIGNsX2ludCogICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGVfcmV0KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZUFjcXVpcmVWQV9BUElNZWRpYVN1cmZhY2VzSU5URUwoCisgICAgY2xfY29tbWFuZF9xdWV1ZSAgICAgICAgICAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgICBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0qICAgICAgICAgICAgICAgICBtZW1fb2JqZWN0cywKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCogICAgICAgICAgICAgICBldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQqICAgICAgICAgICAgICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKmNsRW5xdWV1ZUFjcXVpcmVWQV9BUElNZWRpYVN1cmZhY2VzSU5URUxfZm4pKAorICAgIGNsX2NvbW1hbmRfcXVldWUgICAgICAgICAgICAgIGNvbW1hbmRfcXVldWUsCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtKiAgICAgICAgICAgICAgICAgbWVtX29iamVjdHMsCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQqICAgICAgICAgICAgICAgZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50KiAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworZXh0ZXJuIENMX0FQSV9FTlRSWSBjbF9pbnQgQ0xfQVBJX0NBTEwKK2NsRW5xdWV1ZVJlbGVhc2VWQV9BUElNZWRpYVN1cmZhY2VzSU5URUwoCisgICAgY2xfY29tbWFuZF9xdWV1ZSAgICAgICAgICAgICAgY29tbWFuZF9xdWV1ZSwKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgICBudW1fb2JqZWN0cywKKyAgICBjb25zdCBjbF9tZW0qICAgICAgICAgICAgICAgICBtZW1fb2JqZWN0cywKKyAgICBjbF91aW50ICAgICAgICAgICAgICAgICAgICAgICBudW1fZXZlbnRzX2luX3dhaXRfbGlzdCwKKyAgICBjb25zdCBjbF9ldmVudCogICAgICAgICAgICAgICBldmVudF93YWl0X2xpc3QsCisgICAgY2xfZXZlbnQqICAgICAgICAgICAgICAgICAgICAgZXZlbnQpIENMX0FQSV9TVUZGSVhfX1ZFUlNJT05fMV8yOworCit0eXBlZGVmIGNsX2ludCAoQ0xfQVBJX0NBTEwgKmNsRW5xdWV1ZVJlbGVhc2VWQV9BUElNZWRpYVN1cmZhY2VzSU5URUxfZm4pKAorICAgIGNsX2NvbW1hbmRfcXVldWUgICAgICAgICAgICAgIGNvbW1hbmRfcXVldWUsCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgbnVtX29iamVjdHMsCisgICAgY29uc3QgY2xfbWVtKiAgICAgICAgICAgICAgICAgbWVtX29iamVjdHMsCisgICAgY2xfdWludCAgICAgICAgICAgICAgICAgICAgICAgbnVtX2V2ZW50c19pbl93YWl0X2xpc3QsCisgICAgY29uc3QgY2xfZXZlbnQqICAgICAgICAgICAgICAgZXZlbnRfd2FpdF9saXN0LAorICAgIGNsX2V2ZW50KiAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSBDTF9BUElfU1VGRklYX19WRVJTSU9OXzFfMjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvKiBfX09QRU5DTF9DTF9WQV9BUElfTUVESUFfU0hBUklOR19JTlRFTF9IICovCisKZGlmZiAtLWdpdCBhL09wZW5DTC9DTC9jbF92ZXJzaW9uLmggYi9PcGVuQ0wvQ0wvY2xfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDQ5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuQ0wvQ0wvY2xfdmVyc2lvbi5oCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DTF9WRVJTSU9OX0gKKyNkZWZpbmUgX19DTF9WRVJTSU9OX0gKKworLyogRGV0ZWN0IHdoaWNoIHZlcnNpb24gdG8gdGFyZ2V0ICovCisjaWYgIWRlZmluZWQoQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OKQorI3ByYWdtYSBtZXNzYWdlKCJjbF92ZXJzaW9uLmg6IENMX1RBUkdFVF9PUEVOQ0xfVkVSU0lPTiBpcyBub3QgZGVmaW5lZC4gRGVmYXVsdGluZyB0byAzMDAgKE9wZW5DTCAzLjApIikKKyNkZWZpbmUgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OIDMwMAorI2VuZGlmCisjaWYgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OICE9IDEwMCAmJiBcCisgICAgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OICE9IDExMCAmJiBcCisgICAgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OICE9IDEyMCAmJiBcCisgICAgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OICE9IDIwMCAmJiBcCisgICAgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OICE9IDIxMCAmJiBcCisgICAgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OICE9IDIyMCAmJiBcCisgICAgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OICE9IDMwMAorI3ByYWdtYSBtZXNzYWdlKCJjbF92ZXJzaW9uOiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gaXMgbm90IGEgdmFsaWQgdmFsdWUgKDEwMCwgMTEwLCAxMjAsIDIwMCwgMjEwLCAyMjAsIDMwMCkuIERlZmF1bHRpbmcgdG8gMzAwIChPcGVuQ0wgMy4wKSIpCisjdW5kZWYgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OCisjZGVmaW5lIENMX1RBUkdFVF9PUEVOQ0xfVkVSU0lPTiAzMDAKKyNlbmRpZgorCisKKy8qIE9wZW5DTCBWZXJzaW9uICovCisjaWYgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OID49IDMwMCAmJiAhZGVmaW5lZChDTF9WRVJTSU9OXzNfMCkKKyNkZWZpbmUgQ0xfVkVSU0lPTl8zXzAgIDEKKyNlbmRpZgorI2lmIENMX1RBUkdFVF9PUEVOQ0xfVkVSU0lPTiA+PSAyMjAgJiYgIWRlZmluZWQoQ0xfVkVSU0lPTl8yXzIpCisjZGVmaW5lIENMX1ZFUlNJT05fMl8yICAxCisjZW5kaWYKKyNpZiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gPj0gMjEwICYmICFkZWZpbmVkKENMX1ZFUlNJT05fMl8xKQorI2RlZmluZSBDTF9WRVJTSU9OXzJfMSAgMQorI2VuZGlmCisjaWYgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OID49IDIwMCAmJiAhZGVmaW5lZChDTF9WRVJTSU9OXzJfMCkKKyNkZWZpbmUgQ0xfVkVSU0lPTl8yXzAgIDEKKyNlbmRpZgorI2lmIENMX1RBUkdFVF9PUEVOQ0xfVkVSU0lPTiA+PSAxMjAgJiYgIWRlZmluZWQoQ0xfVkVSU0lPTl8xXzIpCisjZGVmaW5lIENMX1ZFUlNJT05fMV8yICAxCisjZW5kaWYKKyNpZiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gPj0gMTEwICYmICFkZWZpbmVkKENMX1ZFUlNJT05fMV8xKQorI2RlZmluZSBDTF9WRVJTSU9OXzFfMSAgMQorI2VuZGlmCisjaWYgQ0xfVEFSR0VUX09QRU5DTF9WRVJTSU9OID49IDEwMCAmJiAhZGVmaW5lZChDTF9WRVJTSU9OXzFfMCkKKyNkZWZpbmUgQ0xfVkVSU0lPTl8xXzAgIDEKKyNlbmRpZgorCisvKiBBbGxvdyBkZXByZWNhdGVkIEFQSXMgZm9yIG9sZGVyIE9wZW5DTCB2ZXJzaW9ucy4gKi8KKyNpZiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gPD0gMjIwICYmICFkZWZpbmVkKENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8yXzJfQVBJUykKKyNkZWZpbmUgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzJfMl9BUElTCisjZW5kaWYKKyNpZiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gPD0gMjEwICYmICFkZWZpbmVkKENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8yXzFfQVBJUykKKyNkZWZpbmUgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzJfMV9BUElTCisjZW5kaWYKKyNpZiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gPD0gMjAwICYmICFkZWZpbmVkKENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8yXzBfQVBJUykKKyNkZWZpbmUgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzJfMF9BUElTCisjZW5kaWYKKyNpZiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gPD0gMTIwICYmICFkZWZpbmVkKENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8xXzJfQVBJUykKKyNkZWZpbmUgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzFfMl9BUElTCisjZW5kaWYKKyNpZiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gPD0gMTEwICYmICFkZWZpbmVkKENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8xXzFfQVBJUykKKyNkZWZpbmUgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzFfMV9BUElTCisjZW5kaWYKKyNpZiBDTF9UQVJHRVRfT1BFTkNMX1ZFUlNJT04gPD0gMTAwICYmICFkZWZpbmVkKENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8xXzBfQVBJUykKKyNkZWZpbmUgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzFfMF9BUElTCisjZW5kaWYKKworI2VuZGlmICAvKiBfX0NMX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvT3BlbkNML0NML29wZW5jbC5oIGIvT3BlbkNML0NML29wZW5jbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOGRkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuQ0wvQ0wvb3BlbmNsLmgKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDIxIFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX09QRU5DTF9ICisjZGVmaW5lIF9fT1BFTkNMX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8Q0wvY2wuaD4KKyNpbmNsdWRlIDxDTC9jbF9nbC5oPgorI2luY2x1ZGUgPENML2NsX2V4dC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fT1BFTkNMX0ggICAqLwpkaWZmIC0tZ2l0IGEvT3BlbkNML2xpYi9PcGVuQ0wubGliIGIvT3BlbkNML2xpYi9PcGVuQ0wubGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDE5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuQ0wvbGliL09wZW5DTC5saWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlbkNML2xpYi9PcGVuQ0w2NC5saWIgYi9PcGVuQ0wvbGliL09wZW5DTDY0LmxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzBlYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvT3BlbkNML2xpYi9PcGVuQ0w2NC5saWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvT3BlbkNML2xpY2Vuc2UudHh0IGIvT3BlbkNML2xpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjljZmMKLS0tIC9kZXYvbnVsbAorKysgYi9PcGVuQ0wvbGljZW5zZS50eHQKQEAgLTAsMCArMSw0IEBACitUaGVzZSBvcHRpb25hbCBmaWxlcyAod2hpY2ggYXJlIG9ubHkgbmVlZGVkIHdoZW4gY29tcGlsaW5nIHdpdGggT3BlbkNMIHN1cHBvcnQgZW5hYmxlZCBpbiB0aGUgZW5jb2RlcikgYXJlIGZyb20gdGhlIAorS2hyb25vcyBHcm91cCBPcGVuQ0wgaGVhZGVycyBnaXRodWIgcmVwby4gVGhleSBhcmUgQ29weXJpZ2h0IChjKSAyMDA4LTIwMjAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgoraHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9PcGVuQ0wtSGVhZGVycworCmRpZmYgLS1naXQgYS9SRUFETUUubWQgYi9SRUFETUUubWQKaW5kZXggNDY0Njk5NS4uYTk2Y2RkOCAxMDA2NDQKLS0tIGEvUkVBRE1FLm1kCisrKyBiL1JFQURNRS5tZApAQCAtMSw2ICsxLDE3IEBACiAjIGJhc2lzX3VuaXZlcnNhbAogQmFzaXMgVW5pdmVyc2FsIFN1cGVyY29tcHJlc3NlZCBHUFUgVGV4dHVyZSBDb2RlYwogCis8c3ViPihUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB1bmRlciBhIGZyZWUgYW5kIHBlcm1pc3NpdmUgbGljZW5zZSAoQXBhY2hlIDIuMCksIGJ1dCBsaWtlIG1hbnkgb3RoZXIgbGFyZ2Ugb3BlbiBzb3VyY2UgcHJvamVjdHMgaXQgbmVlZHMgZmluYW5jaWFsIHN1cHBvcnQgdG8gc3VzdGFpbiBpdHMgY29udGludWVkIHNlY3VyaXR5LCBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4gSW4gYWRkaXRpb24gdG8gbWFpbnRlbmFuY2UgYW5kIHN0YWJpbGl0eSB0aGVyZSBhcmUgbWFueSBkZXNpcmFibGUgZmVhdHVyZXMgYW5kIG5ldyBpbnRlcmNoYW5nZSBmb3JtYXRzIHdlIHdvdWxkIGxpa2UgdG8gYWRkLiBJZiB5b3VyIGNvbXBhbnkgaXMgdXNpbmcgQmFzaXMgVW5pdmVyc2FsIGluIGEgcHJvZHVjdCwgcGxlYXNlIGNvbnNpZGVyIHJlYWNoaW5nIG91dC4pPC9zdWI+CisKK0J1c2luZXNzZXM6IHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSB2aWEgaW52b2ljZWQgdGVjaG5pY2FsIHN1cHBvcnQsIG1haW50ZW5hbmNlLCBvciBzcG9uc29yaW5nIGNvbnRyYWN0czoKKzxicj4mbmJzcDsmbmJzcDtfRS1tYWlsOiBpbmZvIEAgYmlub21pYWwgZG90IGluZm9fIG9yIGNvbnRhY3QgdXMgb24gW1R3aXR0ZXJdKGh0dHBzOi8vdHdpdHRlci5jb20vX2Jpbm9taWFsKQorCitBbHNvIHNlZSB0aGUgW1Nwb25zb3JzXShodHRwczovL2dpdGh1Yi5jb20vQmlub21pYWxMTEMvYmFzaXNfdW5pdmVyc2FsL3dpa2kvU3BvbnNvcnMtYW5kLVN1cHBvcnRlcnMpIHdpa2kgcGFnZS4KKworLS0tLQorCitbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvODdlYjBvOTZwamhvNHNoMD9zdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvQmlub21pYWxMTEMvYmFzaXMtdW5pdmVyc2FsKQorCiBCYXNpcyBVbml2ZXJzYWwgaXMgYSBbInN1cGVyY29tcHJlc3NlZCJdKGh0dHA6Ly9nYW1tYS5jcy51bmMuZWR1L0dTVC9nc3QucGRmKSBHUFUgdGV4dHVyZSBkYXRhIGludGVyY2hhbmdlIHN5c3RlbSB0aGF0IHN1cHBvcnRzIHR3byBoaWdobHkgY29tcHJlc3NlZCBpbnRlcm1lZGlhdGUgZmlsZSBmb3JtYXRzICguYmFzaXMgb3IgdGhlIFsuS1RYMiBvcGVuIHN0YW5kYXJkIGZyb20gdGhlIEtocm9ub3MgR3JvdXBdKGh0dHBzOi8vZ2l0aHViLmtocm9ub3Mub3JnL0tUWC1TcGVjaWZpY2F0aW9uLykpIHRoYXQgY2FuIGJlIHF1aWNrbHkgdHJhbnNjb2RlZCB0byBhIFt2ZXJ5IHdpZGUgdmFyaWV0eV0oaHR0cHM6Ly9naXRodWIuY29tL0Jpbm9taWFsTExDL2Jhc2lzX3VuaXZlcnNhbC93aWtpL09wZW5HTC10ZXh0dXJlLWZvcm1hdC1lbnVtcy10YWJsZSkgb2YgR1BVIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBwaXhlbCBmb3JtYXRzOiBBU1RDIDR4NCBML0xBL1JHQi9SR0JBLCBQVlJUQzEgNGJwcCBSR0IvUkdCQSwgUFZSVEMyIFJHQi9SR0JBLCBCQzcgbW9kZSA2IFJHQiwgQkM3IG1vZGUgNSBSR0IvUkdCQSwgQkMxLTUgUkdCL1JHQkEvWC9YWSwgRVRDMSBSR0IsIEVUQzIgUkdCQSwgQVRDIFJHQi9SR0JBLCBFVEMyIEVBQyBSMTEgYW5kIFJHMTEsIEZYVDEgUkdCLCBhbmQgdW5jb21wcmVzc2VkIHJhc3RlciBpbWFnZSBmb3JtYXRzIDg4ODgvNTY1LzQ0NDQuIAogCiBUaGUgc3lzdGVtIG5vdyBzdXBwb3J0cyB0d28gbW9kZXM6IGEgaGlnaCBxdWFsaXR5IG1vZGUgd2hpY2ggaXMgaW50ZXJuYWxseSBiYXNlZCBvZmYgdGhlIFtVQVNUQyBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0XShodHRwczovL3JpY2hnNDIuYmxvZ3Nwb3QuY29tLzIwMjAvMDEvdWFzdGMtYmxvY2stZm9ybWF0LWVuY29kaW5nLmh0bWwpLCBhbmQgdGhlIG9yaWdpbmFsIGxvd2VyIHF1YWxpdHkgbW9kZSB3aGljaCBpcyBiYXNlZCBvZmYgYSBzdWJzZXQgb2YgRVRDMSBjYWxsZWQgIkVUQzFTIi4gVUFTVEMgaXMgZm9yIGV4dHJlbWVseSBoaWdoIHF1YWxpdHkgKHNpbWlsYXIgdG8gQkM3IHF1YWxpdHkpIHRleHR1cmVzLCBhbmQgRVRDMVMgaXMgZm9yIHZlcnkgc21hbGwgZmlsZXMuIFRoZSBFVEMxUyBzeXN0ZW0gaW5jbHVkZXMgYnVpbHQtaW4gZGF0YSBjb21wcmVzc2lvbiwgd2hpbGUgdGhlIFVBU1RDIHN5c3RlbSBpbmNsdWRlcyBhbiBvcHRpb25hbCBSYXRlIERpc3RvcnRpb24gT3B0aW1pemF0aW9uIChSRE8pIHBvc3QtcHJvY2VzcyBzdGFnZSB0aGF0IGNvbmRpdGlvbnMgdGhlIGVuY29kZWQgVUFTVEMgdGV4dHVyZSBkYXRhIGluIHRoZSAuYmFzaXMgZmlsZSBzbyBpdCBjYW4gYmUgbW9yZSBlZmZlY3RpdmVseSBMWiBjb21wcmVzc2VkIGJ5IHRoZSBlbmQgdXNlci4gTW9yZSB0ZWNobmljYWwgZGV0YWlscyBhYm91dCBVQVNUQyBpbnRlZ3JhdGlvbiBhcmUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9CaW5vbWlhbExMQy9iYXNpc191bml2ZXJzYWwvd2lraS9VQVNUQy1pbXBsZW1lbnRhdGlvbi1kZXRhaWxzKS4KQEAgLTQwLDE3ICs1MSwxMSBAQAogCiAjIyMgTGljZW5zZSBhbmQgM3JkIHBhcnR5IGNvZGUgZGVwZW5kZW5jaWVzCiAKLURldGFpbGVkIGxlZ2FsLCBsaWNlbnNlLCBhbmQgSVAgaW5mb3JtYXRpb24gaXMgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9CaW5vbWlhbExMQy9iYXNpc191bml2ZXJzYWwvd2lraS9MZWdhbC1JUC1MaWNlbnNlLUluZm9ybWF0aW9uKS4gQmFzaXMgVW5pdmVyc2FsIGl0c2VsZiB1c2VzIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2VzLCBidXQgaXQgdXRpbGl6ZXMgc29tZSB6bGliIGFuZCBvcHRpb25hbCBCU0QgY29kZSAoWnN0YW5kYXJkKS4gVGhlIHN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdHMgYXJlIFtvcGVuIEtocm9ub3MgR3JvdXAgc3RhbmRhcmRzXShodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9EYXRhRm9ybWF0L3NwZWNzLzEuMS9kYXRhZm9ybWF0LjEuMS5odG1sKS4KK0RldGFpbGVkIGxlZ2FsLCBsaWNlbnNlLCBhbmQgSVAgaW5mb3JtYXRpb24gaXMgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9CaW5vbWlhbExMQy9iYXNpc191bml2ZXJzYWwvd2lraS9MZWdhbC1JUC1MaWNlbnNlLUluZm9ybWF0aW9uKS4gQmFzaXMgVW5pdmVyc2FsIGl0c2VsZiB1c2VzIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2VzLCBidXQgaXQgYWxzbyB1dGlsaXplcyBzb21lIG9wdGlvbmFsIEJTRCBjb2RlIChac3RhbmRhcmQpLiBUaGUgc3VwcG9ydGVkIHRleHR1cmUgZm9ybWF0cyBhcmUgW29wZW4gS2hyb25vcyBHcm91cCBzdGFuZGFyZHNdKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L0RhdGFGb3JtYXQvc3BlY3MvMS4xL2RhdGFmb3JtYXQuMS4xLmh0bWwpLgogCiBBbGwgQy9DKysgY29kZSBkZXBlbmRlbmNpZXMgYXJlIHByZXNlbnQgaW5zaWRlIHRoZSBCYXNpcyBVbml2ZXJzYWwgcmVwbyBpdHNlbGYgdG8gc2ltcGxpZnkgYnVpbGRpbmcuCiAKLVRoZSBzdGFuZC1hbG9uZSB0cmFuc2NvZGVyIChpbiB0aGUgInRyYW5zY29kZXIiIGRpcmVjdG9yeSkgaXMgYSBzaW5nbGUgLmNwcCBzb3VyY2UgZmlsZSBsaWJyYXJ5IHdoaWNoIGhhcyBubyAzcmQgcGFydHkgY29kZSBkZXBlbmRlbmNpZXMgYXBhcnQgZnJvbSB6c3RkL3pzdGRkZWNsaWIuYywgd2hpY2ggaXMgb3B0aW9uYWwuIChJdCdzIG9ubHkgdXNlZCBmb3IgZGVjb21wcmVzc2luZyBVQVNUQyBLVFgyIGZpbGVzIHRoYXQgdXNlIFpzdGFuZGFyZC4pCi0KLVRoZSBlbmNvZGVyIHVzZXMgW2xvZGVwbmddKGh0dHBzOi8vbG9kZXYub3JnL2xvZGVwbmcvKSBmb3IgbG9hZGluZyBhbmQgc2F2aW5nIFBORyBpbWFnZXMsIHdoaWNoIGlzIENvcHlyaWdodCAoYykgMjAwNS0yMDE5IExvZGUgVmFuZGV2ZW5uZS4gSXQgdXNlcyB0aGUgemxpYiBsaWNlbnNlLiBJdCBhbHNvIHVzZXMgW2FwZ19ibXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9jYXBucmFtc2VzL2FwZy90cmVlL21hc3Rlci9hcGdfYm1wKSBmb3IgbG9hZGluZyBCTVAgaW1hZ2VzLCB3aGljaCBpcyBDb3B5cmlnaHQgMjAxOSBBbnRvbiBHZXJkZWxhbi4gSXQgdXNlcyB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLgotCi1UaGUgZW5jb2RlciB1c2VzIFt0Y3VBc3RjVXRpbC5jcHBdKGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9leHRlcm5hbC9kZXFwLysvcmVmcy9oZWFkcy9tYXN0ZXIvZnJhbWV3b3JrL2NvbW1vbi90Y3VBc3RjVXRpbC5jcHApLCBmcm9tIHRoZSBbQW5kcm9pZCBkcmF3RWxlbWVudHMgUXVhbGl0eSBQcm9ncmFtIChkZXFwKSBUZXN0aW5nIFN1aXRlXShodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2dyYXBoaWNzL2RlcXAtdGVzdGluZyksIGZvciB1bnBhY2tpbmcgdGhlIHRyYW5zY29kZXIncyBBU1RDIG91dHB1dCBmb3IgdGVzdGluZy92YWxpZGF0aW9uIHB1cnBvc2VzLiBUaGlzIGNvZGUgaXMgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCwgYW5kIHVzZXMgdGhlIEFwYWNoZSAyLjAgbGljZW5zZS4gV2UgaGF2ZSBtb2RpZmllZCB0aGUgY29kZSBzbyBpdCBoYXMgbm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLCBhbmQgZGlzYWJsZWQgSERSIHN1cHBvcnQuCi0KLVRoZSBlbmNvZGVyIG9wdGlvbmFsbHkgdXNlcyBac3RhbmRhcmQncyBzaW5nbGUgc291cmNlIGZpbGUgY29tcHJlc3NvciAoaW4genN0ZC96c3RkLmMpIHRvIHN1cHBvcnQgY29tcHJlc3Npbmcgc3VwZXJjb21wcmVzc2VkIEtUWDIgZmlsZXMuCitUaGUgZW5jb2RlciBvcHRpb25hbGx5IHVzZXMgWnN0YW5kYXJkJ3Mgc2luZ2xlIHNvdXJjZSBmaWxlIGNvbXByZXNzb3IgKGluIHpzdGQvenN0ZC5jKSB0byBzdXBwb3J0IGNvbXByZXNzaW5nIHN1cGVyY29tcHJlc3NlZCBLVFgyIGZpbGVzLiBUaGUgc3RhbmQtYWxvbmUgdHJhbnNjb2RlciAoaW4gdGhlICJ0cmFuc2NvZGVyIiBkaXJlY3RvcnkpIGlzIGEgc2luZ2xlIC5jcHAgc291cmNlIGZpbGUgbGlicmFyeSB3aGljaCBoYXMgbm8gM3JkIHBhcnR5IGNvZGUgZGVwZW5kZW5jaWVzIGFwYXJ0IGZyb20genN0ZC96c3RkZGVjbGliLmMsIHdoaWNoIGlzIGFsc28gdGVjaG5pY2FsbHkgb3B0aW9uYWwuIEl0J3Mgb25seSB1c2VkIGZvciBkZWNvbXByZXNzaW5nIFVBU1RDIEtUWDIgZmlsZXMgdGhhdCB1c2UgWnN0YW5kYXJkLgogCiAjIyMgQ29tbWFuZCBMaW5lIENvbXByZXNzaW9uIFRvb2wKIApAQCAtMzExLDQ4ICszMTYsMyBAQAogYSBjbGVhbiwgY2hlY2tlZC1vdXQgcmVwb3NpdG9yeSBwZXJpb2RpY2FsbHksIG9yIHJ1biBpdCBkdXJpbmcgQ0kgdGVzdHMKIGJlZm9yZSBhbnkgYnVpbGQgYXJ0aWZhY3RzIGhhdmUgYmVlbiBjcmVhdGVkLgogCi0jIyMgU3BlY2lhbCBUaGFua3MKLUEgaHVnZSB0aGFua3MgdG8gR29vZ2xlIGZvciBwYXJ0bmVyaW5nIHdpdGggdXMgYW5kIGVuYWJsaW5nIHRoaXMgc3lzdGVtIHRvIGJlIG9wZW4gc291cmNlZC4gCi0KLVRoYW5rIHlvdSB0byBbRXNyaSAtIEVudmlyb25tZW50YWwgU3lzdGVtcyBSZXNlYXJjaCBJbnN0aXR1dGVdKGh0dHBzOi8vd3d3LmVzcmkuY29tLykgZm9yIHNwb25zb3JpbmcgdGhlIGVuY29kZXIgb3B0aW1pemF0aW9uIHdvcmsgaW4gdGhlIHYxLjEzIHJlbGVhc2UsIGFuZCB0aGUgS1RYMiB3b3JrIGluIHRoZSB2MS4xNSByZWxlYXNlLgotCi1UaGFua3MgdG8gdGhlIEtocm9ub3MgR3JvdXAgZm9yIGJ1aWxkaW5nIGFuIG9wZW4gZWNvc3lzdGVtIHRoYXQgc3VwcG9ydHMgRVRDMVMvVUFTVEMuCi0KLVRoYW5rcyB0byBhIG51bWJlciBvZiBjb21wYW5pZXMgb3IgZ3JvdXBzIHdobyBoYXZlIHN1cHBvcnRlZCBvciBoZWxwZWQgb3V0IEJpbm9taWFsIG92ZXIgdGhlIHllYXJzOiBJbnRlbCwgU3BhY2VYLCBOZXRmbGl4LCBGb3Jnb3R0ZW4gRW1waXJlcywgTWljcm9zb2Z0LCBQb2x5c3RyZWFtLCBIb3RoZWFkIEdhbWVzLCBCaW9EaWdpdGFsLCBNYWdpYyBMZWFwLCBCbGl6emFyZCBFbnRlcnRhaW5tZW50LCBJbnNvbW5pYWMgR2FtZXMsIFJvY2tzdGFyIEdhbWVzLCBGYWNlYm9vaywgQWN0aXZpc2lvbiwgdGhlIEtocm9ub3MgR3JvdXAsIGFuZCB0aGUgb3JnYW5pemVycyBhdCBDcHBDb24uCi0KLVRoYW5rcyB0byBEYXZlIFdpbGtpbnNvbiAoQU1EL0tocm9ub3MpIGZvciBzdXBwb3J0aW5nIHVzIGFuZCBnaXZpbmcgdXMgdmVyeSB2YWx1YWJsZSBmZWVkYmFjayB3aGlsZSB3ZSBkZXZlbG9wZWQgQmFzaXMgVW5pdmVyc2FsLgotCi1UaGFua3MgdG8gQ2hyaXMgV2VpbiAoTmV0ZmxpeCksIHdobyBzaG93ZWQgdXMgdGhlIHBhdGggdG8gVGV4dHVyZSBWaWRlby4KLQotVGhhbmtzIHRvIE1pa2UgRHVzc2F1bHQgKFNwYWNlWCkgYW5kIEVsb24gTXVzayBmb3Igc3VwcG9ydGluZyBCaW5vbWlhbCBpbiB0aGUgZWFybHkgZGF5cy4KLQotVGhhbmtzIHRvIEdyYWVtZSBEZXZpbmUgYXQgTWFnaWMgTGVhcC4KLQotVGhhbmtzIHRvIE1hdHQgUHJpdGNoYXJkLCBmb3JtZXJseSBvZiBWYWx2ZSBTb2Z0d2FyZSBhbmQgTWljcm9zb2Z0LCBmb3IgaGVscGluZyBtZSB3aXRoIHRoZSBjb21wdXRlciBoYXJkd2FyZSBJIHVzZWQgd2hpbGUgYnVpbGRpbmcgdGhpcyBzeXN0ZW0gYW5kIGl0cyBwcmVkZWNlc3Nvci4gCi0KLVRoYW5rcyB0byBKb2huIEJyb29rcyBhdCBCbHVlIFNoaWZ0LCBJbmMuIGZvciBpbnNwaXJpbmcgdGhpcyB3b3JrIGJ5IHNob3dpbmcgbWUgaGlzIERyZWFtY2FzdCB0ZXh0dXJlIGNvbXByZXNzaW9uIHN5c3RlbSBhcm91bmQgMjAwMiwgYW5kIGZvciByZWxlYXNpbmcgZXRjMmNvbXAuIEkgZmlyc3Qgc2F3IHRoZSBzdWJibG9jayBmbGlwIGVzdGltYXRpb24gYXBwcm9hY2ggKHVzZWQgaW4gYmFzaXN1X2V0Yy5jcHApIGluIGV0YzJjb21wLgotCi1UaGFua3MgdG8gQ29sdCBNY0FubGlzLCBmb3IgYWR2ZXJ0aXNpbmcgb25lIG9mIG15IGVhcmxpZXIgb3BlbiBzb3VyY2UgdGV4dHVyZSBjb21wcmVzc2lvbiBsaWJyYXJpZXMgYXQgR0RDLCBhbmQgV29uIENodW4sIHdobyBvcmlnaW5hbGx5IHN1Z2dlc3RlZCBtYWtpbmcgYSB1bml2ZXJzYWwgc3lzdGVtLgotCi1UaGFua3MgdG8gQ2hhcyBCb3lkIChNaWNyb3NvZnQpLCBmb3IgaW5zcGlyaW5nIHVzIHRvIHdvcmsgb24gdGV4dHVyZSBjb21wcmVzc2lvbiBmdWxsLXRpbWUuIENoYXMgYWxzbyBnYXZlIHVzIGdyZWF0IGZlZWRiYWNrIGFib3V0IFVBU1RDIGJlZm9yZSBpdCB3YXMgcmVsZWFzZWQuCi0KLVRoYW5rcyB0byBNYXJrIENhbGxvdyBhdCBFZGdld2lzZSBDb25zdWx0aW5nIGZvciBoaXMgd29yayBvbiBnbFRGIGFuZCB0aGUgS1RYMiBmaWxlIGZvcm1hdC4KLQotSSBmaXJzdCBzYXcgdXNpbmcgcHJlY29tcHV0ZWQgdGFibGVzIGZvciBxdWlja2x5IGNvbXB1dGluZyBvcHRpbWFsIGVuY29kaW5ncyBvZiBzb2xpZCBjb2xvciBibG9ja3MgaW4gcnlnX2R4dC4gVGhlIG1ldGhvZCB0aGF0IGxpbWl0cyB0aGUgY2Fub25pY2FsIEh1ZmZtYW4gY29kZWxlbmd0aHMgdG8gYSBtYXhpbXVtIGNvZGVzaXplIHdhcyB1c2VkIGluIFlvc2hpemFraSdzIGxoYXJjLiBUaGUgY2Fub25pY2FsIEh1ZmZtYW4gY29kZWxlbmd0aCBjb21wcmVzc2lvbiBzeXN0ZW0gaXMgc2ltaWxhciB0byBLYXR6J3MgRGVmbGF0ZSBtZXRob2QuCi0KLSMjIyBQb3NzaWJsZSBpbXByb3ZlbWVudHMKLVRoZSBjb2RlYm9vayBnZW5lcmF0aW9uIHByb2Nlc3MgaXMgYmFzaWNhbGx5IGEgaGlnaCBxdWFsaXR5LCBidXQgc2xvdyBhbmQgYnJ1dGUgZm9yY2UgcmVmZXJlbmNlLiBJdCdzIHBvc3NpYmxlIHRvIG1hc3NpdmVseSBzcGVlZCB1cCBjb2RlYm9vayBnZW4gaW4gc2V2ZXJhbCB3YXlzLiBPbmUgd2F5IGlzIHRvIG5vdCB0aHJvdyBhd2F5IHRoZSB0cmVlIHN0cnVjdHVyZXMgY29uc3RydWN0ZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgaW5pdGlhbCBjb2RlYm9va3MuIAotCi1UaGUgd2F5IHRoZSAtcSAocXVhbGl0eSkgb3B0aW9uIGlzIGNvbnZlcnRlZCB0byBjb2RlYm9vayBzaXplcyBpcyB2ZXJ5IHNpbXBsZSAoZml4ZWQgZm9ybXVsYXMpLCBhbmQgY291bGQgYmUgaW1wcm92ZWQuIEl0IGhhcyBhIHRlbmRlbmN5IHRvIHBsYXRlYXUgb24gc29tZSBmaWxlcy4KLQotVGhlIHZhcmlvdXMgSHVmZm1hbiBjb2RlcyBjb3VsZCBiZSBkaXZpZGVkIHVwIGludG8gZ3JvdXBzIChsaWtlIFpzdGQpLCBmb3IgbXVjaCBmYXN0ZXIgSHVmZm1hbiBkZWNvZGluZyBpbiB0aGUgdHJhbnNjb2Rlci4gQWxzbywgbGFyZ2VyIHNsaWNlcyBjb3VsZCBiZSBkaXZpZGVkIHVwIGludG8gbXVsdGlwbGUgc2VnbWVudHMsIGFuZCBlYWNoIHNlZ21lbnQgdHJhbnNjb2RlZCB1c2luZyBhIGRpZmZlcmVudCB0aHJlYWQuIEJvdGggb2YgdGhlc2UgY2hhbmdlcyB3b3VsZCBtb2RpZnkgdGhlIGZvcm1hdC4KLQotUFZSVEMxIG1vZHVsYXRpb24gdmFsdWVzIGNvdWxkIGJlIGRldGVybWluZWQgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcyBhbmQvb3IgU0lNRCBjb2RlLgotCi1QVlJUQzEgMmJwcCBzdXBwb3J0IHdvdWxkbid0IGJlIGhhcmQgdG8gYWRkLgotCi1UaGUgdHJhbnNjb2RlcidzIEJDNyB0YWJsZXMgYXJlIGEgYml0IGxhcmdlLCBhbmQgY2FuIGJlIHJlZHVjZWQsIHdoaWNoIHdvdWxkIGFsbG93IHRoZSB0cmFuc2NvZGVyIHRvIGJlIGRvd25sb2FkZWQgbW9yZSBxdWlja2x5LgotCi0zLWJpdCBzZWxlY3RvcnMgZm9yIGFscGhhIHdvdWxkIGdyZWF0bHkgaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiB0aGUgYWxwaGEsIGJ1dCB3b3VsZCBicmVhayB0aGUgZmlsZSBmb3JtYXQgYW5kIHJlcXVpcmUgZXh0ZW5zaXZlIGFkZGl0aW9ucyB0byB0aGUgY29tcHJlc3Nvci90cmFuc2NvZGVyLgotCi1GYXN0IDZ4NiBBU1RDIHN1cHBvcnQgbWF5IGJlIHBvc3NpYmxlLgpkaWZmIC0tZ2l0IGEvYmFzaXN1LnZjeHByb2ogYi9iYXNpc3UudmN4cHJvagppbmRleCBjZDg4OWIxLi4xODJlZDMwIDEwMDY0NAotLS0gYS9iYXNpc3UudmN4cHJvagorKysgYi9iYXNpc3UudmN4cHJvagpAQCAtMjcsMjYgKzI3LDI2IEBACiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CiAgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KICAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+Ci0gICAgPFBsYXRmb3JtVG9vbHNldD52MTQyPC9QbGF0Zm9ybVRvb2xzZXQ+CisgICAgPFBsYXRmb3JtVG9vbHNldD52MTQzPC9QbGF0Zm9ybVRvb2xzZXQ+CiAgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CiAgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KICAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgotICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djE0MjwvUGxhdGZvcm1Ub29sc2V0PgorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djE0MzwvUGxhdGZvcm1Ub29sc2V0PgogICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgogICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CiAgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KICAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+Ci0gICAgPFBsYXRmb3JtVG9vbHNldD52MTQyPC9QbGF0Zm9ybVRvb2xzZXQ+CisgICAgPFBsYXRmb3JtVG9vbHNldD52MTQzPC9QbGF0Zm9ybVRvb2xzZXQ+CiAgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgogICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CiAgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxNDI8L1BsYXRmb3JtVG9vbHNldD4KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxNDM8L1BsYXRmb3JtVG9vbHNldD4KICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KICAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgogICA8L1Byb3BlcnR5R3JvdXA+CkBAIC04NywxMyArODcsMTQgQEAKICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxTRExDaGVjaz50cnVlPC9TRExDaGVjaz4KICAgICAgIDxPcGVuTVBTdXBwb3J0PnRydWU8L09wZW5NUFN1cHBvcnQ+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fTUJDUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTtCQVNJU1VfU1VQUE9SVF9TU0U9MTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz5PcGVuQ0w8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X01CQ1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk7QkFTSVNVX1NVUFBPUlRfU1NFPTE7QkFTSVNVX1NVUFBPUlRfT1BFTkNMPTE8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPEVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ+U3RyZWFtaW5nU0lNREV4dGVuc2lvbnM8L0VuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CiAgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPk9wZW5DTFxsaWI8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5vcGVuY2wubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CiAgICAgPC9MaW5rPgogICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CiAgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CkBAIC0xMDEsMTMgKzEwMiwxNSBAQAogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDQ8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxTRExDaGVjaz50cnVlPC9TRExDaGVjaz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPmlzcGNfdGV4Y29tcDwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPk9wZW5DTDwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KICAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+CiAgICAgICA8T3Blbk1QU3VwcG9ydD50cnVlPC9PcGVuTVBTdXBwb3J0PgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9NQkNTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO0JBU0lTVV9TVVBQT1JUX1NTRT0xOzwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X01CQ1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk7QkFTSVNVX1NVUFBPUlRfU1NFPTE7QkFTSVNVX1NVUFBPUlRfT1BFTkNMPTE8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz5PcGVuQ0xcbGliPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+b3BlbmNsNjQubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CiAgICAgPC9MaW5rPgogICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CiAgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgpAQCAtMTE3LDkgKzEyMCw4IEBACiAgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CiAgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KICAgICAgIDxPcGVuTVBTdXBwb3J0PnRydWU8L09wZW5NUFN1cHBvcnQ+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk7QkFTSVNVX1NVUFBPUlRfU1NFPTE8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+T3BlbkNMPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRztfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTtCQVNJU1VfU1VQUE9SVF9TU0U9MTtCQVNJU1VfU1VQUE9SVF9PUEVOQ0w9MTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CiAgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4KICAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+CiAgICAgICA8RW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD5TdHJlYW1pbmdTSU1ERXh0ZW5zaW9uczwvRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD4KQEAgLTEzMSw2ICsxMzMsOCBAQAogICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KICAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgogICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz5PcGVuQ0xcbGliPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+b3BlbmNsLmxpYjtrZXJuZWwzMi5saWI7dXNlcjMyLmxpYjtnZGkzMi5saWI7d2luc3Bvb2wubGliO2NvbWRsZzMyLmxpYjthZHZhcGkzMi5saWI7c2hlbGwzMi5saWI7b2xlMzIubGliO29sZWF1dDMyLmxpYjt1dWlkLmxpYjtvZGJjMzIubGliO29kYmNjcDMyLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgogICAgIDwvTGluaz4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CkBAIC0xMzksOCArMTQzLDggQEAKICAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPgogICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz5pc3BjX3RleGNvbXA8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO0JBU0lTVV9TVVBQT1JUX1NTRT0xOzwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz5PcGVuQ0w8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHO19IQVNfRVhDRVBUSU9OUz0wOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO0JBU0lTVV9TVVBQT1JUX1NTRT0xO0JBU0lTVV9TVVBQT1JUX09QRU5DTD0xPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KICAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPgogICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4KICAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+CkBAIC0xNTMsMTEgKzE1NywxMSBAQAogICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KICAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgogICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz5PcGVuQ0xcbGliPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+b3BlbmNsNjQubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CiAgICAgPC9MaW5rPgogICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGFwZ19ibXAuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2FzdGNfZGVjb21wLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2JhY2tlbmQuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfYmFzaXNfZmlsZS5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9iYzdlbmMuY3BwIiAvPgpAQCAtMTY1LDIxICsxNjksMjIgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2VuYy5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9ldGMuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfZnJvbnRlbmQuY3BwIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfaGVscGVycy5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9ncHVfdGV4dHVyZS5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9rZXJuZWxzX3NzZS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9vcGVuY2wuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfcHZydGMxXzQuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfcmVzYW1wbGVyLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X3Jlc2FtcGxlX2ZpbHRlcnMuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3Vfc3NpbS5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV91YXN0Y19lbmMuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxqcGdkLmNwcCIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcbG9kZXBuZy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXHB2cG5ncmVhZGVyLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InpzdGRcenN0ZC5jIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3Vfb2NsX2tlcm5lbHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X29wZW5jbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iZW5jb2RlclxwdnBuZ3JlYWRlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idHJhbnNjb2RlclxiYXNpc3VfY29udGFpbmVyc19pbXBsLmgiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdV90cmFuc2NvZGVyLmNwcCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYXBnX2JtcC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfYXN0Y19kZWNvbXAuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2JhY2tlbmQuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2Jhc2lzX2ZpbGUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2JjN2VuYy5oIiAvPgpAQCAtMTg3LDcgKzE5Miw2IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9lbmMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2V0Yy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfZnJvbnRlbmQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2dwdV90ZXh0dXJlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9rZXJuZWxzX2RlY2xhcmVzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9rZXJuZWxzX2ltcC5oIiAvPgpAQCAtMjAzLDE5ICsyMDcsMTggQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcY3Bwc3BtZF9zc2UuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcY3Bwc3BtZF90eXBlX2FsaWFzZXMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcanBnZC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iZW5jb2Rlclxsb2RlcG5nLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idHJhbnNjb2RlclxiYXNpc3VfY29udGFpbmVycy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idHJhbnNjb2RlclxiYXNpc3VfZmlsZV9oZWFkZXJzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdV90cmFuc2NvZGVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdV90cmFuc2NvZGVyX2ludGVybmFsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdV9nbG9iYWxfc2VsZWN0b3JfcGFsZXR0ZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idHJhbnNjb2RlclxiYXNpc3VfdHJhbnNjb2Rlcl91YXN0Yy5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImJhc2lzdV90b29sLmNwcCIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iYmluXG9jbF9rZXJuZWxzLmNsIiAvPgogICAgIDxOb25lIEluY2x1ZGU9InRyYW5zY29kZXJcYmFzaXN1X3RyYW5zY29kZXJfdGFibGVzX2FzdGMuaW5jIiAvPgogICAgIDxOb25lIEluY2x1ZGU9InRyYW5zY29kZXJcYmFzaXN1X3RyYW5zY29kZXJfdGFibGVzX2FzdGNfMF8yNTUuaW5jIiAvPgogICAgIDxOb25lIEluY2x1ZGU9InRyYW5zY29kZXJcYmFzaXN1X3RyYW5zY29kZXJfdGFibGVzX2F0Y181NS5pbmMiIC8+CmRpZmYgLS1naXQgYS9iYXNpc3UudmN4cHJvai5maWx0ZXJzIGIvYmFzaXN1LnZjeHByb2ouZmlsdGVycwppbmRleCA0OThjODU5Li5lZTM0ZGNlIDEwMDY0NAotLS0gYS9iYXNpc3UudmN4cHJvai5maWx0ZXJzCisrKyBiL2Jhc2lzdS52Y3hwcm9qLmZpbHRlcnMKQEAgLTUsMTIgKzUsNiBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0idHJhbnNjb2RlclxiYXNpc3VfdHJhbnNjb2Rlci5jcHAiPgogICAgICAgPEZpbHRlcj50cmFuc2NvZGVyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGFwZ19ibXAuYyI+Ci0gICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2FzdGNfZGVjb21wLmNwcCI+Ci0gICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2JhY2tlbmQuY3BwIj4KICAgICAgIDxGaWx0ZXI+ZW5jb2RlcjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMzIsOSArMjYsNiBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfZnJvbnRlbmQuY3BwIj4KICAgICAgIDxGaWx0ZXI+ZW5jb2RlcjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfaGVscGVycy5jcHAiPgotICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+Ci0gICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9ncHVfdGV4dHVyZS5jcHAiPgogICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC01MCw5ICs0MSw2IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXGpwZ2QuY3BwIj4KICAgICAgIDxGaWx0ZXI+ZW5jb2RlcjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iZW5jb2Rlclxsb2RlcG5nLmNwcCI+Ci0gICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X3Jlc2FtcGxlX2ZpbHRlcnMuY3BwIj4KICAgICAgIDxGaWx0ZXI+ZW5jb2RlcjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtNjUsMTEgKzUzLDE0IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJ6c3RkXHpzdGQuYyI+CiAgICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X29wZW5jbC5jcHAiPgorICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJlbmNvZGVyXHB2cG5ncmVhZGVyLmNwcCI+CisgICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdV9nbG9iYWxfc2VsZWN0b3JfcGFsZXR0ZS5oIj4KLSAgICAgIDxGaWx0ZXI+dHJhbnNjb2RlcjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idHJhbnNjb2RlclxiYXNpc3UuaCI+CiAgICAgICA8RmlsdGVyPnRyYW5zY29kZXI8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTgyLDEyICs3Myw2IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdV90cmFuc2NvZGVyX3Vhc3RjLmgiPgogICAgICAgPEZpbHRlcj50cmFuc2NvZGVyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJlbmNvZGVyXGFwZ19ibXAuaCI+Ci0gICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2FzdGNfZGVjb21wLmgiPgotICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9iYWNrZW5kLmgiPgogICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC0xMDksOSArOTQsNiBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3VfZnJvbnRlbmQuaCI+CiAgICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuaCI+Ci0gICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X2dwdV90ZXh0dXJlLmgiPgogICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC0xMzAsOSArMTEyLDYgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcanBnZC5oIj4KICAgICAgIDxGaWx0ZXI+ZW5jb2RlcjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iZW5jb2Rlclxsb2RlcG5nLmgiPgotICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJlbmNvZGVyXGJhc2lzdV9zc2ltLmgiPgogICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC0xNjksNiArMTQ4LDE1IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdV9maWxlX2hlYWRlcnMuaCI+CiAgICAgICA8RmlsdGVyPnRyYW5zY29kZXI8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJcYmFzaXN1X29wZW5jbC5oIj4KKyAgICAgIDxGaWx0ZXI+ZW5jb2RlcjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iZW5jb2RlclxiYXNpc3Vfb2NsX2tlcm5lbHMuaCI+CisgICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9ImVuY29kZXJccHZwbmdyZWFkZXIuaCI+CisgICAgICA8RmlsdGVyPmVuY29kZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPE5vbmUgSW5jbHVkZT0idHJhbnNjb2RlclxiYXNpc3VfdHJhbnNjb2Rlcl90YWJsZXNfZHh0MV82LmluYyI+CkBAIC0xOTUsNiArMTgzLDkgQEAKICAgICA8Tm9uZSBJbmNsdWRlPSJ0cmFuc2NvZGVyXGJhc2lzdV90cmFuc2NvZGVyX3RhYmxlc19hdGNfNTYuaW5jIj4KICAgICAgIDxGaWx0ZXI+dHJhbnNjb2RlcjwvRmlsdGVyPgogICAgIDwvTm9uZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSJiaW5cb2NsX2tlcm5lbHMuY2wiPgorICAgICAgPEZpbHRlcj5lbmNvZGVyPC9GaWx0ZXI+CisgICAgPC9Ob25lPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8RmlsdGVyIEluY2x1ZGU9InRyYW5zY29kZXIiPgpkaWZmIC0tZ2l0IGEvYmFzaXN1X3Rvb2wuY3BwIGIvYmFzaXN1X3Rvb2wuY3BwCmluZGV4IDI0NDc5NDMuLjEzZWQzNDAgMTAwNjQ0Ci0tLSBhL2Jhc2lzdV90b29sLmNwcAorKysgYi9iYXNpc3VfdG9vbC5jcHAKQEAgLTEsNSArMSw1IEBACiAvLyBiYXNpc3VfdG9vbC5jcHAKLS8vIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEJpbm9taWFsIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAoQykgMjAxOS0yMDIyIEJpbm9taWFsIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CkBAIC0yMywxMCArMjMsMTAgQEAKICNpbmNsdWRlICJlbmNvZGVyL2Jhc2lzdV9ncHVfdGV4dHVyZS5oIgogI2luY2x1ZGUgImVuY29kZXIvYmFzaXN1X2Zyb250ZW5kLmgiCiAjaW5jbHVkZSAiZW5jb2Rlci9iYXNpc3VfYmFja2VuZC5oIgotI2luY2x1ZGUgInRyYW5zY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlLmgiCiAjaW5jbHVkZSAiZW5jb2Rlci9iYXNpc3VfY29tcC5oIgogI2luY2x1ZGUgInRyYW5zY29kZXIvYmFzaXN1X3RyYW5zY29kZXIuaCIKICNpbmNsdWRlICJlbmNvZGVyL2Jhc2lzdV9zc2ltLmgiCisjaW5jbHVkZSAiZW5jb2Rlci9iYXNpc3Vfb3BlbmNsLmgiCiAKICNkZWZpbmUgTUlOSVpfSEVBREVSX0ZJTEVfT05MWQogI2RlZmluZSBNSU5JWl9OT19aTElCX0NPTVBBVElCTEVfTkFNRVMKQEAgLTQwLDcgKzQwLDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBiYXNpc3U7CiB1c2luZyBuYW1lc3BhY2UgYnVtaW5pejsKIAotI2RlZmluZSBCQVNJU1VfVE9PTF9WRVJTSU9OICIxLjE1IgorI2RlZmluZSBCQVNJU1VfVE9PTF9WRVJTSU9OICIxLjE2LjMiCiAKIGVudW0gdG9vbF9tb2RlCiB7CkBAIC01Miw3ICs1MiwxMCBAQAogCWNDb21wYXJlLAogCWNWZXJzaW9uLAogCWNCZW5jaCwKLQljQ29tcFNpemUKKwljQ29tcFNpemUsCisJY1Rlc3QsCisJY1NwbGl0SW1hZ2UsCisJY0NvbWJpbmVJbWFnZXMKIH07CiAKIHN0YXRpYyB2b2lkIHByaW50X3VzYWdlKCkKQEAgLTc0LDE0ICs3NywxNyBAQAogCQkiRmlsZW5hbWVzIHByZWZpeGVkIHdpdGggYSBAIHN5bWJvbCBhcmUgcmVhZCBhcyBmaWxlbmFtZSBsaXN0aW5nIGZpbGVzLiBMaXN0aW5nIHRleHQgZmlsZXMgc3BlY2lmeSB3aGljaCBhY3R1YWwgZmlsZW5hbWVzIHRvIHByb2Nlc3MgKG9uZSBmaWxlbmFtZSBwZXIgbGluZSkuXG4iCiAJCSJcbiIKIAkJIk9wdGlvbnM6XG4iCisJCSIgLW9wZW5jbDogRW5hYmxlIE9wZW5DTCB1c2FnZVxuIgorCQkiIC1vcGVuY2xfc2VyaWFsaXplOiBTZXJpYWxpemUgYWxsIGNhbGxzIHRvIHRoZSBPcGVuQ0wgZHJpdmVyICh0byB3b3JrIGFyb3VuZCBidWdneSBkcml2ZXJzLCBvbmx5IHVzZWZ1bCB3aXRoIC1wYXJhbGxlbClcbiIKKwkJIiAtcGFyYWxsZWw6IENvbXByZXNzIG11bHRpcGxlIHRleHR1cmVzIHNpbXVtdGFub3VzbHkgKG9uZSBwZXIgdGhyZWFkKSwgaW5zdGVhZCBvZiBvbmUgYXQgYSB0aW1lLiBDb21wYXRpYmxlIHdpdGggT3BlbkNMIG1vZGUuIFRoaXMgaXMgbXVjaCBmYXN0ZXIsIGJ1dCBpbiBPcGVuQ0wgbW9kZSB0aGUgZHJpdmVyIGlzIHB1c2hlZCBoYXJkZXIsIGFuZCB0aGUgQ0xJIG91dHB1dCB3aWxsIGJlIGp1bWJsZWQuXG4iCiAJCSIgLWt0eDI6IFdyaXRlIC5LVFgyIEVUQzFTL1VBU1RDIGZpbGVzIGluc3RlYWQgb2YgLmJhc2lzIGZpbGVzLiBCeSBkZWZhdWx0LCBVQVNUQyBmaWxlcyB3aWxsIGJlIGNvbXByZXNzZWQgdXNpbmcgWnN0YW5kYXJkIHVubGVzcyAta3R4Ml9ub196c3RhbmRhcmQgaXMgc3BlY2lmaWVkLlxuIgogCQkiIC1rdHgyX25vX3pzdGFuZGFyZDogRG9uJ3QgY29tcHJlc3MgVUFTVEMgdGV4dHVyZSBkYXRhIHVzaW5nIFpzdGFuZGFyZCwgc3RvcmUgaXQgdW5jb21wcmVzc2VkIGluc3RlYWQuXG4iCiAJCSIgLWt0eDJfenN0YW5kYXJkX2xldmVsIFg6IFNldCBaU3RhbmRhcmQgY29tcHJlc3Npb24gbGV2ZWwgdG8gWCAoc2VlIFpzdGFuZGFyZCBkb2N1bWVudGF0aW9uLCBkZWZhdWx0IGxldmVsIGlzIDYpXG4iCiAJCSIgLWt0eDJfYW5pbWRhdGFfZHVyYXRpb24gWDogU2V0IEtUWDJhbmltRGF0YSBkdXJhdGlvbiBmaWVsZCB0byBpbnRlZ2VyIHZhbHVlIFggKG9ubHkgdmFsaWQvdXNlZnVsIGZvciAtdGV4X3R5cGUgdmlkZW8sIGRlZmF1bHQgaXMgMSlcbiIKIAkJIiAta3R4Ml9hbmltZGF0YV90aW1lc2NhbGUgWDogU2V0IEtUWDJhbmltRGF0YSB0aW1lc2NhbGUgZmllbGQgdG8gaW50ZWdlciB2YWx1ZSBYIChvbmx5IHZhbGlkL3VzZWZ1bCBmb3IgLXRleF90eXBlIHZpZGVvLCBkZWZhdWx0IGlzIDE1KVxuIgogCQkiIC1rdHgyX2FuaW1kYXRhX2xvb3Bjb3VudCBYOiBTZXQgS1RYMmFuaW1EYXRhIGxvb3Bjb3VudCBmaWVsZCB0byBpbnRlZ2VyIHZhbHVlIFggKG9ubHkgdmFsaWQvdXNlZnVsIGZvciAtdGV4X3R5cGUgdmlkZW8sIGRlZmF1bHQgaXMgMClcbiIKLQkJIiAtZmlsZSBmaWxlbmFtZS5wbmcvYm1wL3RnYS9qcGc6IElucHV0IGltYWdlIGZpbGVuYW1lLCBtdWx0aXBsZSBpbWFnZXMgYXJlIE9LLCB1c2UgLWZpbGUgWCBmb3IgZWFjaCBpbnB1dCBmaWxlbmFtZSAocHJlZml4aW5nIGlucHV0IGZpbGVuYW1lcyB3aXRoIC1maWxlIGlzIG9wdGlvbmFsKVxuIgotCQkiIC1hbHBoYV9maWxlIGZpbGVuYW1lLnBuZy9ibXAvdGdhL2pwZzogSW5wdXQgYWxwaGEgaW1hZ2UgZmlsZW5hbWUsIG11bHRpcGxlIGltYWdlcyBhcmUgT0ssIHVzZSAtZmlsZSBYIGZvciBlYWNoIGlucHV0IGZpbGVuYW1lIChtdXN0IGJlIHBhaXJlZCB3aXRoIC1maWxlKSwgaW1hZ2VzIGNvbnZlcnRlZCB0byBSRUM3MDkgZ3JheXNjYWxlIGFuZCB1c2VkIGFzIGlucHV0IGFscGhhXG4iCisJCSIgLWZpbGUgZmlsZW5hbWUucG5nL2JtcC90Z2EvanBnL3FvaTogSW5wdXQgaW1hZ2UgZmlsZW5hbWUsIG11bHRpcGxlIGltYWdlcyBhcmUgT0ssIHVzZSAtZmlsZSBYIGZvciBlYWNoIGlucHV0IGZpbGVuYW1lIChwcmVmaXhpbmcgaW5wdXQgZmlsZW5hbWVzIHdpdGggLWZpbGUgaXMgb3B0aW9uYWwpXG4iCisJCSIgLWFscGhhX2ZpbGUgZmlsZW5hbWUucG5nL2JtcC90Z2EvanBnL3FvaTogSW5wdXQgYWxwaGEgaW1hZ2UgZmlsZW5hbWUsIG11bHRpcGxlIGltYWdlcyBhcmUgT0ssIHVzZSAtZmlsZSBYIGZvciBlYWNoIGlucHV0IGZpbGVuYW1lIChtdXN0IGJlIHBhaXJlZCB3aXRoIC1maWxlKSwgaW1hZ2VzIGNvbnZlcnRlZCB0byBSRUM3MDkgZ3JheXNjYWxlIGFuZCB1c2VkIGFzIGlucHV0IGFscGhhXG4iCiAJCSIgLW11bHRpZmlsZV9wcmludGY6IHByaW50ZigpIGZvcm1hdCBzdHJpbnQgdG8gdXNlIHRvIGNvbXBvc2UgbXVsdGlwbGUgZmlsZW5hbWVzXG4iCiAJCSIgLW11bHRpZmlsZV9maXJzdDogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBmaWxlIHRvIHByb2Nlc3MsIGRlZmF1bHQgaXMgMCAobXVzdCBzcGVjaWZ5IC1tdWx0aWZpbGVfcHJpbnRmIGFuZCAtbXVsdGlmaWxlX251bSlcbiIKIAkJIiAtbXVsdGlmaWxlX251bTogVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0byBwcm9jZXNzLlxuIgpAQCAtOTAsMTMgKzk2LDE1IEBACiAJCSIgLW91dHB1dF9maWxlIGZpbGVuYW1lOiBPdXRwdXQgLmJhc2lzLy5rdHggZmlsZW5hbWVcbiIKIAkJIiAtb3V0cHV0X3BhdGg6IE91dHB1dCAuYmFzaXMvLmt0eCBmaWxlcyB0byBzcGVjaWZpZWQgZGlyZWN0b3J5LlxuIgogCQkiIC1kZWJ1ZzogRW5hYmxlIGNvZGVjIGRlYnVnIHByaW50IHRvIHN0ZG91dCAoc2xpZ2h0bHkgc2xvd2VyKS5cbiIKKwkJIiAtdmVyYm9zZTogU2FtZSBhcyAtZGVidWcgKGRlYnVnIG91dHB1dCB0byBzdGRvdXQpLlxuIgogCQkiIC1kZWJ1Z19pbWFnZXM6IEVuYWJsZSBjb2RlYyBkZWJ1ZyBpbWFnZXMgKG11Y2ggc2xvd2VyKS5cbiIKIAkJIiAtc3RhdHM6IENvbXB1dGUgYW5kIGRpc3BsYXkgaW1hZ2UgcXVhbGl0eSBtZXRyaWNzIChzbGlnaHRseSBzbG93ZXIpLlxuIgogCQkiIC10ZXhfdHlwZSA8MmQsIDJkYXJyYXksIDNkLCB2aWRlbywgY3ViZW1hcD46IFNldCBCYXNpcyBmaWxlIGhlYWRlcidzIHRleHR1cmUgdHlwZSBmaWVsZC4gQ3ViZW1hcCBhcnJheXMgcmVxdWlyZSBtdWx0aXBsZXMgb2YgNiBpbWFnZXMsIGluIFgrLCBYLSwgWSssIFktLCBaKywgWi0gb3JkZXIsIGVhY2ggaW1hZ2UgbXVzdCBiZSB0aGUgc2FtZSByZXNvbHV0aW9ucy5cbiIKIAkJIiAgMmQ9YXJiaXRyYXJ5IDJEIGltYWdlcywgMmRhcnJheT0yRCBhcnJheSwgM0Q9dm9sdW1lIHRleHR1cmUgc2xpY2VzLCB2aWRlbz12aWRlbyBmcmFtZXMsIGN1YmVtYXA9YXJyYXkgb2YgZmFjZXMuIEZvciAyZGFycmF5LzNkL2N1YmVtYXBzL3ZpZGVvLCBlYWNoIHNvdXJjZSBpbWFnZSdzIGRpbWVuc2lvbnMgYW5kICMgb2YgbWlwbWFwIGxldmVscyBtdXN0IGJlIHRoZSBzYW1lLlxuIgogCQkiIEZvciB2aWRlbywgdGhlIC5iYXNpcyBmaWxlIHdpbGwgYmUgd3JpdHRlbiB3aXRoIHRoZSBmaXJzdCBmcmFtZSBiZWluZyBhbiBJLUZyYW1lLCBhbmQgc3Vic2VxdWVudCBmcmFtZXMgYmVpbmcgUC1GcmFtZXMgKHVzaW5nIGNvbmRpdGlvbmFsIHJlcGxlbmlzaG1lbnQpLiBQbGF5YmFjayBtdXN0IGFsd2F5cyBvY2N1ciBpbiBvcmRlciBmcm9tIGZpcnN0IHRvIGxhc3QgaW1hZ2UuXG4iCiAJCSIgLWZyYW1lcmF0ZSBYOiBTZXQgZnJhbWVyYXRlIGluIC5iYXNpcyBoZWFkZXIgdG8gWC9mcmFtZXMgc2VjLlxuIgotCQkiIC1pbmRpdmlkdWFsOiBQcm9jZXNzIGlucHV0IGltYWdlcyBpbmRpdmlkdWFsbHkgYW5kIG91dHB1dCBtdWx0aXBsZSAuYmFzaXMgZmlsZXMgKG5vdCBhcyBhIHRleHR1cmUgYXJyYXkpXG4iCisJCSIgLWluZGl2aWR1YWw6IFByb2Nlc3MgaW5wdXQgaW1hZ2VzIGluZGl2aWR1YWxseSBhbmQgb3V0cHV0IG11bHRpcGxlIC5iYXNpcy8ua3R4MiBmaWxlcyAobm90IGFzIGEgdGV4dHVyZSBhcnJheSAtIHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0IGFzIG9mIHYxLjE2KVxuIgorCQkiIC10ZXhfYXJyYXk6IFByb2Nlc3MgaW5wdXQgaW1hZ2VzIGFzIGEgc2luZ2xlIHRleHR1cmUgYXJyYXkgYW5kIHdyaXRlIGEgc2luZ2xlIC5iYXNpcy8ua3R4MiBmaWxlICh0aGUgZm9ybWVyIGRlZmF1bHQgYmVmb3JlIHYxLjE2KVxuIgogCQkiIC1jb21wX2xldmVsIFg6IFNldCBFVEMxUyBlbmNvZGluZyBzcGVlZCB2cy4gcXVhbGl0eSB0cmFkZW9mZi4gUmFuZ2UgaXMgMC02LCBkZWZhdWx0IGlzIDEuIEhpZ2hlciB2YWx1ZXM9TVVDSCBzbG93ZXIsIGJ1dCBzbGlnaHRseSBoaWdoZXIgcXVhbGl0eS4gSGlnaGVyIGxldmVscyBpbnRlbmRlZCBmb3IgdmlkZW9zLiBVc2UgLXEgZmlyc3QhXG4iCiAJCSIgLWZ1enpfdGVzdGluZzogVXNlIHdpdGggLXZhbGlkYXRlOiBEaXNhYmxlcyBDUkMxNiB2YWxpZGF0aW9uIG9mIGZpbGUgY29udGVudHMgYmVmb3JlIHRyYW5zY29kaW5nXG4iCiAJCSJcblVBU1RDIG9wdGlvbnM6XG4iCkBAIC0xMTIsNiArMTIwLDggQEAKIAkJIiAtdWFzdGNfcmRvX206IERpc2FibGUgUkRPIG11bHRpdGhyZWFkaW5nIChzbGlnaHRseSBoaWdoZXIgY29tcHJlc3Npb24sIGRldGVybWluaXN0aWMpLlxuIgogCQkiXG4iCiAJCSJNb3JlIG9wdGlvbnM6XG4iCisJCSIgLXRlc3Q6IFJ1biBhbiBhdXRvbWF0ZWQgRVRDMVMvVUFTVEMgZW5jb2RpbmcgYW5kIHRyYW5zY29kaW5nIHRlc3QuIFJldHVybnMgRVhJVF9GQUlMVVJFIGlmIGFueSBmYWlsdXJlc1xuIgorCQkiIC10ZXN0X2RpcjogT3B0aW9uYWwgZGlyZWN0b3J5IG9mIHRlc3QgZmlsZXMuIERlZmF1bHRzIHRvIFwiLi4vdGVzdF9maWxlc1wiLlxuIgogCQkiIC1tYXhfZW5kcG9pbnRzIFg6IE1hbnVhbGx5IHNldCB0aGUgbWF4IG51bWJlciBvZiBjb2xvciBlbmRwb2ludCBjbHVzdGVycyBmcm9tIDEtMTYxMjgsIHVzZSBpbnN0ZWFkIG9mIC1xXG4iCiAJCSIgLW1heF9zZWxlY3RvcnMgWDogTWFudWFsbHkgc2V0IHRoZSBtYXggbnVtYmVyIG9mIGNvbG9yIHNlbGVjdG9yIGNsdXN0ZXJzIGZyb20gMS0xNjEyOCwgdXNlIGluc3RlYWQgb2YgLXFcbiIKIAkJIiAteV9mbGlwOiBGbGlwIGlucHV0IGltYWdlcyB2ZXJ0aWNhbGx5IGJlZm9yZSBjb21wcmVzc2lvblxuIgpAQCAtMTIyLDcgKzEzMiwxMCBAQAogCQkiIC1zd2l6emxlIHJnYmE6IFNwZWNpZnkgc3dpenpsZSBmb3IgdGhlIDQgaW5wdXQgY29sb3IgY2hhbm5lbHMgdXNpbmcgciwgZywgYiBhbmQgYSAodGhlIC1zZXBhcmF0ZV9yZ190b19jb2xvcl9hbHBoYSBmbGFnIGlzIGVxdWl2YWxlbnQgdG8gcnJyZylcbiIKIAkJIiAtcmVub3JtOiBSZW5vcm1hbGl6ZSBlYWNoIGlucHV0IGltYWdlIGJlZm9yZSBhbnkgZnVydGhlciBwcm9jZXNzaW5nL2NvbXByZXNzaW9uXG4iCiAJCSIgLW5vX211bHRpdGhyZWFkaW5nOiBEaXNhYmxlIG11bHRpdGhyZWFkaW5nXG4iCi0JCSIgLW5vX2t0eDogRGlzYWJsZSBLVFggd3JpdGluZyB3aGVuIHVucGFja2luZyAoZmFzdGVyKVxuIgorCQkiIC1tYXhfdGhyZWFkcyBYOiBVc2UgYXQgbW9zdCBYIHRocmVhZHMgdG90YWwgd2hlbiBtdWx0aXRocmVhZGluZyBpcyBlbmFibGVkICh0aGlzIGluY2x1ZGVzIHRoZSBtYWluIHRocmVhZClcbiIKKwkJIiAtbm9fa3R4OiBEaXNhYmxlIEtUWCB3cml0aW5nIHdoZW4gdW5wYWNraW5nIChmYXN0ZXIsIGxlc3Mgb3V0cHV0IGZpbGVzKVxuIgorCQkiIC1rdHhfb25seTogT25seSB3cml0ZSBLVFggZmlsZXMgd2hlbiB1bnBhY2tpbmcgKGZhc3RlciwgbGVzcyBvdXRwdXQgZmlsZXMpXG4iCisJCSIgLXdyaXRlX291dDogV3JpdGUgM2RmeCBPVVQgZmlsZXMgd2hlbiB1bnBhY2tpbmcgRlhUMSB0ZXh0dXJlc1xuIgogCQkiIC1ldGMxX29ubHk6IE9ubHkgdW5wYWNrIHRvIEVUQzEsIHNraXBwaW5nIHRoZSBvdGhlciB0ZXh0dXJlIGZvcm1hdHMgZHVyaW5nIC11bnBhY2tcbiIKIAkJIiAtZGlzYWJsZV9oaWVyYXJjaGljYWxfZW5kcG9pbnRfY29kZWJvb2tzOiBEaXNhYmxlIGhpZXJhcmNoaWNhbCBlbmRwb2ludCBjb2RlYm9vayB1c2FnZSwgc2xvd2VyIGJ1dCBoaWdoZXIgcXVhbGl0eSBvbiBzb21lIGNvbXByZXNzaW9uIGxldmVsc1xuIgogCQkiIC1jb21wYXJlX3NzaW06IENvbXB1dGUgYW5kIGRpc3BsYXkgU1NJTSBvZiBpbWFnZSBjb21wYXJpc29uIChzbG93KVxuIgpAQCAtMTU3LDcgKzE3MCw3IEBACiAJCSIgLXVzZXJkYXRhMSBYOiBTZXQgMzItYml0IHVzZXJkYXRhMSBmaWVsZCBpbiBCYXNpcyBmaWxlIGhlYWRlciB0byBYIChYIGlzIGEgc2lnbmVkIDMyLWJpdCBpbnQpXG4iCiAJCSJcbiIKIAkJIlZhcmlvdXMgY29tbWFuZCBsaW5lIGV4YW1wbGVzOlxuIgotCQkiIGJhc2lzdSB4LnBuZyA6IENvbXByZXNzIHNSR0IgaW1hZ2UgeC5wbmcgdG8geC5iYXNpcyB1c2luZyBkZWZhdWx0IHNldHRpbmdzIChtdWx0aXBsZSBmaWxlbmFtZXMgT0ssIHVzZSAtaW5kaXZpZHVhbCBpZiB5b3UgZG9uJ3Qgd2FudCBhIHRleCBhcnJheSlcbiIKKwkJIiBiYXNpc3UgeC5wbmcgOiBDb21wcmVzcyBzUkdCIGltYWdlIHgucG5nIHRvIHguYmFzaXMgdXNpbmcgZGVmYXVsdCBzZXR0aW5ncyAobXVsdGlwbGUgZmlsZW5hbWVzIE9LLCB1c2UgLXRleF9hcnJheSBpZiB5b3Ugd2FudCBhIHRleCBhcnJheSB2cy4gbXVsdGlwbGUgb3V0cHV0IGZpbGVzKVxuIgogCQkiIGJhc2lzdSB4LmJhc2lzIDogVW5wYWNrIHguYmFzaXMgdG8gUE5HL0tUWCBmaWxlcyAobXVsdGlwbGUgZmlsZW5hbWVzIE9LKVxuIgogCQkiIGJhc2lzdSAtZmlsZSB4LnBuZyAtbWlwbWFwIC15X2ZsaXAgOiBDb21wcmVzcyBhIG1pcG1hcHBlZCB4LmJhc2lzIGZpbGUgZnJvbSBhbiBzUkdCIGltYWdlIG5hbWVkIHgucG5nLCBZIGZsaXAgZWFjaCBzb3VyY2UgaW1hZ2VcbiIKIAkJIiBiYXNpc3UgLXZhbGlkYXRlIC1maWxlIHguYmFzaXMgOiBWYWxpZGF0ZSB4LmJhc2lzIChjaGVjayBoZWFkZXIsIGNoZWNrIGZpbGUgQ1JDJ3MsIGF0dGVtcHQgdG8gdHJhbnNjb2RlIGFsbCBzbGljZXMpXG4iCkBAIC0yNjgsMTQgKzI4MSwxOSBAQAogCQltX2t0eDJfYW5pbWRhdGFfbG9vcGNvdW50KDApLAogCQltX211bHRpZmlsZV9maXJzdCgwKSwKIAkJbV9tdWx0aWZpbGVfbnVtKDApLAotCQltX2luZGl2aWR1YWwoZmFsc2UpLAorCQltX21heF90aHJlYWRzKDEwMjQpLCAvLyBzdXJlbHkgdGhpcyBpcyBoaWdoIGVub3VnaAorCQltX2luZGl2aWR1YWwodHJ1ZSksCiAJCW1fbm9fa3R4KGZhbHNlKSwKKwkJbV9rdHhfb25seShmYWxzZSksCisJCW1fd3JpdGVfb3V0KGZhbHNlKSwKIAkJbV9ldGMxX29ubHkoZmFsc2UpLAogCQltX2Z1enpfdGVzdGluZyhmYWxzZSksCiAJCW1fY29tcGFyZV9zc2ltKGZhbHNlKSwKLQkJbV9iZW5jaChmYWxzZSkKKwkJbV9iZW5jaChmYWxzZSksCisJCW1fcGFyYWxsZWxfY29tcHJlc3Npb24oZmFsc2UpCiAJewogCQltX2NvbXBfcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPSBiYXNpc3U6Om1heGltdW08aW50PigwLCBCQVNJU1VfREVGQVVMVF9DT01QUkVTU0lPTl9MRVZFTCAtIDEpOworCQltX3Rlc3RfZmlsZV9kaXIgPSAiLi4vdGVzdF9maWxlcyI7CiAJfQogCiAJYm9vbCBwYXJzZShpbnQgYXJnX2MsIGNvbnN0IGNoYXIgKiphcmdfdikKQEAgLTMyNSw2ICszNDMsMTAgQEAKIAkJCQltX21vZGUgPSBjQ29tcHJlc3M7CiAJCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItY29tcGFyZSIpID09IDApCiAJCQkJbV9tb2RlID0gY0NvbXBhcmU7CisJCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItc3BsaXQiKSA9PSAwKQorCQkJCW1fbW9kZSA9IGNTcGxpdEltYWdlOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLWNvbWJpbmUiKSA9PSAwKQorCQkJCW1fbW9kZSA9IGNDb21iaW5lSW1hZ2VzOwogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLXVucGFjayIpID09IDApCiAJCQkJbV9tb2RlID0gY1VucGFjazsKIAkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi12YWxpZGF0ZSIpID09IDApCkBAIC0zMzksMTIgKzM2MSwyNCBAQAogCQkJCW1fbW9kZSA9IGNCZW5jaDsKIAkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi1jb21wX3NpemUiKSA9PSAwKQogCQkJCW1fbW9kZSA9IGNDb21wU2l6ZTsKKwkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi10ZXN0IikgPT0gMCkKKwkJCQltX21vZGUgPSBjVGVzdDsKKwkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi10ZXN0X2RpciIpID09IDApCisJCQl7CisJCQkJUkVNQUlOSU5HX0FSR1NfQ0hFQ0soMSk7CisJCQkJbV90ZXN0X2ZpbGVfZGlyID0gc3RkOjpzdHJpbmcoYXJnX3ZbYXJnX2luZGV4ICsgMV0pOworCQkJCWFyZ19jb3VudCsrOworCQkJfQogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLW5vX3NzZSIpID09IDApCiAJCQl7CiAjaWYgQkFTSVNVX1NVUFBPUlRfU1NFCiAJCQkJZ19jcHVfc3VwcG9ydHNfc3NlNDEgPSBmYWxzZTsKICNlbmRpZgogCQkJfQorCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLW5vX3N0YXR1c19vdXRwdXQiKSA9PSAwKQorCQkJeworCQkJCW1fY29tcF9wYXJhbXMubV9zdGF0dXNfb3V0cHV0ID0gZmFsc2U7CisJCQl9CiAJCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItZmlsZSIpID09IDApCiAJCQl7CiAJCQkJUkVNQUlOSU5HX0FSR1NfQ0hFQ0soMSk7CkBAIC00NTcsMTQgKzQ5MSwxOCBAQAogCQkJCW1fb3V0cHV0X3BhdGggPSBhcmdfdlthcmdfaW5kZXggKyAxXTsKIAkJCQlhcmdfY291bnQrKzsKIAkJCX0KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi1kZWJ1ZyIpID09IDApCisJCQllbHNlIGlmICgoc3RyY2FzZWNtcChwQXJnLCAiLWRlYnVnIikgPT0gMCkgfHwgKHN0cmNhc2VjbXAocEFyZywgIi12ZXJib3NlIikgPT0gMCkpCiAJCQl7CiAJCQkJbV9jb21wX3BhcmFtcy5tX2RlYnVnID0gdHJ1ZTsKIAkJCQllbmFibGVfZGVidWdfcHJpbnRmKHRydWUpOwogCQkJfQogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLXZhbGlkYXRlX2V0YzFzIikgPT0gMCkKIAkJCXsKLQkJCQltX2NvbXBfcGFyYW1zLm1fdmFsaWRhdGUgPSB0cnVlOworCQkJCW1fY29tcF9wYXJhbXMubV92YWxpZGF0ZV9ldGMxcyA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItdmFsaWRhdGVfb3V0cHV0IikgPT0gMCkKKwkJCXsKKwkJCQltX2NvbXBfcGFyYW1zLm1fdmFsaWRhdGVfb3V0cHV0X2RhdGEgPSB0cnVlOwogCQkJfQogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLWRlYnVnX2ltYWdlcyIpID09IDApCiAJCQkJbV9jb21wX3BhcmFtcy5tX2RlYnVnX2ltYWdlcyA9IHRydWU7CkBAIC01NTcsMTQgKzU5NSwzNSBAQAogCQkJewogCQkJCW1fY29tcF9wYXJhbXMubV9tdWx0aXRocmVhZGluZyA9IGZhbHNlOwogCQkJfQorCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLXBhcmFsbGVsIikgPT0gMCkKKwkJCXsKKwkJCQltX3BhcmFsbGVsX2NvbXByZXNzaW9uID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi1tYXhfdGhyZWFkcyIpID09IDApCisJCQl7CisJCQkJUkVNQUlOSU5HX0FSR1NfQ0hFQ0soMSk7CisJCQkJbV9tYXhfdGhyZWFkcyA9IGF0b2koYXJnX3ZbYXJnX2luZGV4ICsgMV0pOworCQkJCWFyZ19jb3VudCsrOworCQkJfQogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLW1pcG1hcCIpID09IDApCiAJCQkJbV9jb21wX3BhcmFtcy5tX21pcF9nZW4gPSB0cnVlOwogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLW5vX2t0eCIpID09IDApCiAJCQkJbV9ub19rdHggPSB0cnVlOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLWt0eF9vbmx5IikgPT0gMCkKKwkJCQltX2t0eF9vbmx5ID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi13cml0ZV9vdXQiKSA9PSAwKQorCQkJCW1fd3JpdGVfb3V0ID0gdHJ1ZTsKIAkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi1ldGMxX29ubHkiKSA9PSAwKQogCQkJCW1fZXRjMV9vbmx5ID0gdHJ1ZTsKIAkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi1kaXNhYmxlX2hpZXJhcmNoaWNhbF9lbmRwb2ludF9jb2RlYm9va3MiKSA9PSAwKQogCQkJCW1fY29tcF9wYXJhbXMubV9kaXNhYmxlX2hpZXJhcmNoaWNhbF9lbmRwb2ludF9jb2RlYm9va3MgPSB0cnVlOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLW9wZW5jbCIpID09IDApCisJCQl7CisJCQkJbV9jb21wX3BhcmFtcy5tX3VzZV9vcGVuY2wgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLW9wZW5jbF9zZXJpYWxpemUiKSA9PSAwKQorCQkJeworCQkJfQogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLW1pcF9zY2FsZSIpID09IDApCiAJCQl7CiAJCQkJUkVNQUlOSU5HX0FSR1NfQ0hFQ0soMSk7CkBAIC02MTIsMzIgKzY3MSw2IEBACiAJCQkJbV9jb21wX3BhcmFtcy5tX2VuZHBvaW50X3Jkb190aHJlc2ggPSAoZmxvYXQpYXRvZihhcmdfdlthcmdfaW5kZXggKyAxXSk7CiAJCQkJYXJnX2NvdW50Kys7CiAJCQl9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItZ2xvYmFsX3NlbF9wYWwiKSA9PSAwKQotCQkJCW1fY29tcF9wYXJhbXMubV9nbG9iYWxfc2VsX3BhbCA9IHRydWU7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItbm9fYXV0b19nbG9iYWxfc2VsX3BhbCIpID09IDApCi0JCQkJbV9jb21wX3BhcmFtcy5tX2F1dG9fZ2xvYmFsX3NlbF9wYWwgPSBmYWxzZTsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi1hdXRvX2dsb2JhbF9zZWxfcGFsIikgPT0gMCkKLQkJCQltX2NvbXBfcGFyYW1zLm1fYXV0b19nbG9iYWxfc2VsX3BhbCA9IHRydWU7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItZ2xvYmFsX3BhbF9iaXRzIikgPT0gMCkKLQkJCXsKLQkJCQlSRU1BSU5JTkdfQVJHU19DSEVDSygxKTsKLQkJCQltX2NvbXBfcGFyYW1zLm1fZ2xvYmFsX3BhbF9iaXRzID0gYXRvaShhcmdfdlthcmdfaW5kZXggKyAxXSk7Ci0JCQkJYXJnX2NvdW50Kys7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItZ2xvYmFsX21vZF9iaXRzIikgPT0gMCkKLQkJCXsKLQkJCQlSRU1BSU5JTkdfQVJHU19DSEVDSygxKTsKLQkJCQltX2NvbXBfcGFyYW1zLm1fZ2xvYmFsX21vZF9iaXRzID0gYXRvaShhcmdfdlthcmdfaW5kZXggKyAxXSk7Ci0JCQkJYXJnX2NvdW50Kys7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItbm9faHlicmlkX3NlbF9jYiIpID09IDApCi0JCQkJbV9jb21wX3BhcmFtcy5tX25vX2h5YnJpZF9zZWxfY2IgPSB0cnVlOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLWh5YnJpZF9zZWxfY2JfcXVhbGl0eV90aHJlc2giKSA9PSAwKQotCQkJewotCQkJCVJFTUFJTklOR19BUkdTX0NIRUNLKDEpOwotCQkJCW1fY29tcF9wYXJhbXMubV9oeWJyaWRfc2VsX2NiX3F1YWxpdHlfdGhyZXNoID0gKGZsb2F0KWF0b2YoYXJnX3ZbYXJnX2luZGV4ICsgMV0pOwotCQkJCWFyZ19jb3VudCsrOwotCQkJfQogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLXVzZXJkYXRhMCIpID09IDApCiAJCQl7CiAJCQkJUkVNQUlOSU5HX0FSR1NfQ0hFQ0soMSk7CkBAIC02NjQsMTcgKzY5NywyOSBAQAogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLXRleF90eXBlIikgPT0gMCkKIAkJCXsKIAkJCQlSRU1BSU5JTkdfQVJHU19DSEVDSygxKTsKLQkJCQljb25zdCBjaGFyICpwVHlwZSA9IGFyZ192W2FyZ19pbmRleCArIDFdOworCQkJCWNvbnN0IGNoYXIqIHBUeXBlID0gYXJnX3ZbYXJnX2luZGV4ICsgMV07CiAJCQkJaWYgKHN0cmNhc2VjbXAocFR5cGUsICIyZCIpID09IDApCiAJCQkJCW1fY29tcF9wYXJhbXMubV90ZXhfdHlwZSA9IGJhc2lzdDo6Y0JBU0lTVGV4VHlwZTJEOwogCQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocFR5cGUsICIyZGFycmF5IikgPT0gMCkKKwkJCQl7CiAJCQkJCW1fY29tcF9wYXJhbXMubV90ZXhfdHlwZSA9IGJhc2lzdDo6Y0JBU0lTVGV4VHlwZTJEQXJyYXk7CisJCQkJCW1faW5kaXZpZHVhbCA9IGZhbHNlOworCQkJCX0KIAkJCQllbHNlIGlmIChzdHJjYXNlY21wKHBUeXBlLCAiM2QiKSA9PSAwKQorCQkJCXsKIAkJCQkJbV9jb21wX3BhcmFtcy5tX3RleF90eXBlID0gYmFzaXN0OjpjQkFTSVNUZXhUeXBlVm9sdW1lOworCQkJCQltX2luZGl2aWR1YWwgPSBmYWxzZTsKKwkJCQl9CiAJCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwVHlwZSwgImN1YmVtYXAiKSA9PSAwKQorCQkJCXsKIAkJCQkJbV9jb21wX3BhcmFtcy5tX3RleF90eXBlID0gYmFzaXN0OjpjQkFTSVNUZXhUeXBlQ3ViZW1hcEFycmF5OworCQkJCQltX2luZGl2aWR1YWwgPSBmYWxzZTsKKwkJCQl9CiAJCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwVHlwZSwgInZpZGVvIikgPT0gMCkKKwkJCQl7CiAJCQkJCW1fY29tcF9wYXJhbXMubV90ZXhfdHlwZSA9IGJhc2lzdDo6Y0JBU0lTVGV4VHlwZVZpZGVvRnJhbWVzOworCQkJCQltX2luZGl2aWR1YWwgPSBmYWxzZTsKKwkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJZXJyb3JfcHJpbnRmKCJJbnZhbGlkIHRleHR1cmUgdHlwZTogJXNcbiIsIHBUeXBlKTsKQEAgLTY4NCw2ICs3MjksOCBAQAogCQkJfQogCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChwQXJnLCAiLWluZGl2aWR1YWwiKSA9PSAwKQogCQkJCW1faW5kaXZpZHVhbCA9IHRydWU7CisJCQllbHNlIGlmIChzdHJjYXNlY21wKHBBcmcsICItdGV4X2FycmF5IikgPT0gMCkKKwkJCQltX2luZGl2aWR1YWwgPSBmYWxzZTsKIAkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi1mdXp6X3Rlc3RpbmciKSA9PSAwKQogCQkJCW1fZnV6el90ZXN0aW5nID0gdHJ1ZTsKIAkJCWVsc2UgaWYgKHN0cmNhc2VjbXAocEFyZywgIi1jc3ZfZmlsZSIpID09IDApCkBAIC03ODksMTIgKzgzNiwyMCBAQAogCXN0ZDo6c3RyaW5nIG1fY3N2X2ZpbGU7CiAKIAlzdGQ6OnN0cmluZyBtX2V0YzFzX3VzZV9nbG9iYWxfY29kZWJvb2tzX2ZpbGU7CisKKwlzdGQ6OnN0cmluZyBtX3Rlc3RfZmlsZV9kaXI7CisJCisJdWludDMyX3QgbV9tYXhfdGhyZWFkczsKKwkJCiAJYm9vbCBtX2luZGl2aWR1YWw7CiAJYm9vbCBtX25vX2t0eDsKKwlib29sIG1fa3R4X29ubHk7CisJYm9vbCBtX3dyaXRlX291dDsKIAlib29sIG1fZXRjMV9vbmx5OwogCWJvb2wgbV9mdXp6X3Rlc3Rpbmc7CiAJYm9vbCBtX2NvbXBhcmVfc3NpbTsKIAlib29sIG1fYmVuY2g7CisJYm9vbCBtX3BhcmFsbGVsX2NvbXByZXNzaW9uOwogfTsKIAogc3RhdGljIGJvb2wgZXhwYW5kX211bHRpZmlsZShjb21tYW5kX2xpbmVfcGFyYW1zICZvcHRzKQpAQCAtODM4LDE3ICs4OTMsMTcgQEAKIAogc3RydWN0IGJhc2lzX2RhdGEKIHsKLQliYXNpc19kYXRhKGJhc2lzdDo6ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2smIHNlbF9jb2RlYm9vaykgOiAKLQkJbV90cmFuc2NvZGVyKCZzZWxfY29kZWJvb2spIAorCWJhc2lzX2RhdGEoKSA6IAorCQltX3RyYW5zY29kZXIoKSAKIAl7CiAJfQogCXVpbnQ4X3ZlYyBtX2ZpbGVfZGF0YTsKIAliYXNpc3Q6OmJhc2lzdV90cmFuc2NvZGVyIG1fdHJhbnNjb2RlcjsKIH07CiAKLXN0YXRpYyBiYXNpc19kYXRhICpsb2FkX2Jhc2lzX2ZpbGUoY29uc3QgY2hhciAqcElucHV0X2ZpbGVuYW1lLCBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rICZzZWxfY29kZWJvb2ssIGJvb2wgZm9yY2VfZXRjMXMpCitzdGF0aWMgYmFzaXNfZGF0YSAqbG9hZF9iYXNpc19maWxlKGNvbnN0IGNoYXIgKnBJbnB1dF9maWxlbmFtZSwgYm9vbCBmb3JjZV9ldGMxcykKIHsKLQliYXNpc19kYXRhKiBwID0gbmV3IGJhc2lzX2RhdGEoc2VsX2NvZGVib29rKTsKKwliYXNpc19kYXRhKiBwID0gbmV3IGJhc2lzX2RhdGE7CiAJdWludDhfdmVjICZiYXNpc19kYXRhID0gcC0+bV9maWxlX2RhdGE7CiAJaWYgKCFiYXNpc3U6OnJlYWRfZmlsZV90b192ZWMocElucHV0X2ZpbGVuYW1lLCBiYXNpc19kYXRhKSkKIAl7CkBAIC04ODksMTkgKzk0NCwyMSBAQAogCiBzdGF0aWMgYm9vbCBjb21wcmVzc19tb2RlKGNvbW1hbmRfbGluZV9wYXJhbXMgJm9wdHMpCiB7Ci0JYmFzaXN0OjpldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayBzZWxfY29kZWJvb2soYmFzaXN0OjpnX2dsb2JhbF9zZWxlY3Rvcl9jYl9zaXplLCBiYXNpc3Q6OmdfZ2xvYmFsX3NlbGVjdG9yX2NiKTsKLQogCXVpbnQzMl90IG51bV90aHJlYWRzID0gMTsKIAogCWlmIChvcHRzLm1fY29tcF9wYXJhbXMubV9tdWx0aXRocmVhZGluZykKIAl7CisJCS8vIFdlIHVzZSBzdGQ6OnRocmVhZDo6aGFyZHdhcmVfY29uY3VycmVuY3koKSBhcyBhIGhpbnQgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0ICMgb2YgdGhyZWFkcyB0byBwdXQgaW50byBhIHBvb2wuCiAJCW51bV90aHJlYWRzID0gc3RkOjp0aHJlYWQ6OmhhcmR3YXJlX2NvbmN1cnJlbmN5KCk7CiAJCWlmIChudW1fdGhyZWFkcyA8IDEpCiAJCQludW1fdGhyZWFkcyA9IDE7CisJCWlmIChudW1fdGhyZWFkcyA+IG9wdHMubV9tYXhfdGhyZWFkcykKKwkJCW51bV90aHJlYWRzID0gb3B0cy5tX21heF90aHJlYWRzOwogCX0KIAotCWpvYl9wb29sIGpwb29sKG51bV90aHJlYWRzKTsKLQlvcHRzLm1fY29tcF9wYXJhbXMubV9wSm9iX3Bvb2wgPSAmanBvb2w7CisJam9iX3Bvb2wgY29tcHJlc3Nvcl9qcG9vbChvcHRzLm1fcGFyYWxsZWxfY29tcHJlc3Npb24gPyAxIDogbnVtX3RocmVhZHMpOworCWlmICghb3B0cy5tX3BhcmFsbGVsX2NvbXByZXNzaW9uKQorCQlvcHRzLm1fY29tcF9wYXJhbXMubV9wSm9iX3Bvb2wgPSAmY29tcHJlc3Nvcl9qcG9vbDsKIAkJCiAJaWYgKCFleHBhbmRfbXVsdGlmaWxlKG9wdHMpKQogCXsKQEAgLTkxOCw3ICs5NzUsNyBAQAogCWJhc2lzX2RhdGEqIHBHbG9iYWxfY29kZWJvb2tfZGF0YSA9IG51bGxwdHI7CiAJaWYgKG9wdHMubV9ldGMxc191c2VfZ2xvYmFsX2NvZGVib29rc19maWxlLnNpemUoKSkKIAl7Ci0JCXBHbG9iYWxfY29kZWJvb2tfZGF0YSA9IGxvYWRfYmFzaXNfZmlsZShvcHRzLm1fZXRjMXNfdXNlX2dsb2JhbF9jb2RlYm9va3NfZmlsZS5jX3N0cigpLCBzZWxfY29kZWJvb2ssIHRydWUpOworCQlwR2xvYmFsX2NvZGVib29rX2RhdGEgPSBsb2FkX2Jhc2lzX2ZpbGUob3B0cy5tX2V0YzFzX3VzZV9nbG9iYWxfY29kZWJvb2tzX2ZpbGUuY19zdHIoKSwgdHJ1ZSk7CiAJCWlmICghcEdsb2JhbF9jb2RlYm9va19kYXRhKQogCQkJcmV0dXJuIGZhbHNlOwogCkBAIC05OTgsNyArMTA1NSw2IEBACiAKIAlwYXJhbXMubV9yZWFkX3NvdXJjZV9pbWFnZXMgPSB0cnVlOwogCXBhcmFtcy5tX3dyaXRlX291dHB1dF9iYXNpc19maWxlcyA9IHRydWU7Ci0JcGFyYW1zLm1fcFNlbF9jb2RlYm9vayA9ICZzZWxfY29kZWJvb2s7CiAJcGFyYW1zLm1fcEdsb2JhbF9jb2RlYm9va3MgPSBwR2xvYmFsX2NvZGVib29rX2RhdGEgPyAmcEdsb2JhbF9jb2RlYm9va19kYXRhLT5tX3RyYW5zY29kZXIuZ2V0X2xvd2xldmVsX2V0YzFzX2RlY29kZXIoKSA6IG51bGxwdHI7IAogCUZJTEUgKnBDU1ZfZmlsZSA9IG51bGxwdHI7CiAJaWYgKG9wdHMubV9jc3ZfZmlsZS5zaXplKCkpCkBAIC0xMDE5LDcgKzEwNzUsMjEgQEAKIAlpbnRlcnZhbF90aW1lciBhbGxfdG07CiAJYWxsX3RtLnN0YXJ0KCk7CiAKKwliYXNpc3U6OnZlY3RvcjxiYXNpc19jb21wcmVzc29yX3BhcmFtcz4gY29tcF9wYXJhbXNfdmVjOworCiAJY29uc3Qgc2l6ZV90IHRvdGFsX2ZpbGVzID0gKG9wdHMubV9pbmRpdmlkdWFsID8gb3B0cy5tX2lucHV0X2ZpbGVuYW1lcy5zaXplKCkgOiAxVSk7CisJYm9vbCByZXN1bHQgPSB0cnVlOworCisJaWYgKChvcHRzLm1faW5kaXZpZHVhbCkgJiYgKG9wdHMubV9vdXRwdXRfZmlsZW5hbWUuc2l6ZSgpKSkKKwl7CisJCWlmICh0b3RhbF9maWxlcyA+IDEpCisJCXsKKwkJCWVycm9yX3ByaW50ZigiLW91dHB1dF9maWxlIHNwZWNpZmllZCBpbiBpbmRpdmlkdWFsIG1vZGUsIGJ1dCBtdWx0aXBsZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc3BlY2lmaWVkIHdoaWNoIHdvdWxkIGNhdXNlIHRoZSBvdXRwdXQgZmlsZSB0byBiZSB3cml0dGVuIG11bHRpcGxlIHRpbWVzLlxuIik7CisJCQlkZWxldGUgcEdsb2JhbF9jb2RlYm9va19kYXRhOyBwR2xvYmFsX2NvZGVib29rX2RhdGEgPSBudWxscHRyOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCiAJZm9yIChzaXplX3QgZmlsZV9pbmRleCA9IDA7IGZpbGVfaW5kZXggPCB0b3RhbF9maWxlczsgZmlsZV9pbmRleCsrKQogCXsKIAkJaWYgKG9wdHMubV9pbmRpdmlkdWFsKQpAQCAtMTAyNywxOCArMTA5NywyMCBAQAogCQkJcGFyYW1zLm1fc291cmNlX2ZpbGVuYW1lcy5yZXNpemUoMSk7CiAJCQlwYXJhbXMubV9zb3VyY2VfZmlsZW5hbWVzWzBdID0gb3B0cy5tX2lucHV0X2ZpbGVuYW1lc1tmaWxlX2luZGV4XTsKIAotCQkJaWYgKGZpbGVfaW5kZXggPCBvcHRzLm1faW5wdXRfYWxwaGFfZmlsZW5hbWVzLnNpemUoKSkgCisJCQlpZiAoZmlsZV9pbmRleCA8IG9wdHMubV9pbnB1dF9hbHBoYV9maWxlbmFtZXMuc2l6ZSgpKQogCQkJewogCQkJCXBhcmFtcy5tX3NvdXJjZV9hbHBoYV9maWxlbmFtZXMucmVzaXplKDEpOwogCQkJCXBhcmFtcy5tX3NvdXJjZV9hbHBoYV9maWxlbmFtZXNbMF0gPSBvcHRzLm1faW5wdXRfYWxwaGFfZmlsZW5hbWVzW2ZpbGVfaW5kZXhdOwotCQkJCQotCQkJCXByaW50ZigiUHJvY2Vzc2luZyBzb3VyY2UgZmlsZSBcIiVzXCIsIGFscGhhIGZpbGUgXCIlc1wiXG4iLCBwYXJhbXMubV9zb3VyY2VfZmlsZW5hbWVzWzBdLmNfc3RyKCksIHBhcmFtcy5tX3NvdXJjZV9hbHBoYV9maWxlbmFtZXNbMF0uY19zdHIoKSk7CisKKwkJCQlpZiAocGFyYW1zLm1fc3RhdHVzX291dHB1dCkKKwkJCQkJcHJpbnRmKCJQcm9jZXNzaW5nIHNvdXJjZSBmaWxlIFwiJXNcIiwgYWxwaGEgZmlsZSBcIiVzXCJcbiIsIHBhcmFtcy5tX3NvdXJjZV9maWxlbmFtZXNbMF0uY19zdHIoKSwgcGFyYW1zLm1fc291cmNlX2FscGhhX2ZpbGVuYW1lc1swXS5jX3N0cigpKTsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKIAkJCQlwYXJhbXMubV9zb3VyY2VfYWxwaGFfZmlsZW5hbWVzLnJlc2l6ZSgwKTsKLQkJCQkKLQkJCQlwcmludGYoIlByb2Nlc3Npbmcgc291cmNlIGZpbGUgXCIlc1wiXG4iLCBwYXJhbXMubV9zb3VyY2VfZmlsZW5hbWVzWzBdLmNfc3RyKCkpOworCisJCQkJaWYgKHBhcmFtcy5tX3N0YXR1c19vdXRwdXQpCisJCQkJCXByaW50ZigiUHJvY2Vzc2luZyBzb3VyY2UgZmlsZSBcIiVzXCJcbiIsIHBhcmFtcy5tX3NvdXJjZV9maWxlbmFtZXNbMF0uY19zdHIoKSk7CiAJCQl9CiAJCX0KIAkJZWxzZQpAQCAtMTA0NywxNSArMTExOSwxNSBAQAogCQkJcGFyYW1zLm1fc291cmNlX2FscGhhX2ZpbGVuYW1lcyA9IG9wdHMubV9pbnB1dF9hbHBoYV9maWxlbmFtZXM7CiAJCX0KIAkJCQkKLQkJaWYgKChvcHRzLm1fb3V0cHV0X2ZpbGVuYW1lLnNpemUoKSkgJiYgKCFvcHRzLm1faW5kaXZpZHVhbCkpCisJCWlmIChvcHRzLm1fb3V0cHV0X2ZpbGVuYW1lLnNpemUoKSkKIAkJCXBhcmFtcy5tX291dF9maWxlbmFtZSA9IG9wdHMubV9vdXRwdXRfZmlsZW5hbWU7Ci0JCWVsc2UgCisJCWVsc2UKIAkJewogCQkJc3RkOjpzdHJpbmcgZmlsZW5hbWU7Ci0JCQorCiAJCQlzdHJpbmdfZ2V0X2ZpbGVuYW1lKG9wdHMubV9pbnB1dF9maWxlbmFtZXNbZmlsZV9pbmRleF0uY19zdHIoKSwgZmlsZW5hbWUpOwogCQkJc3RyaW5nX3JlbW92ZV9leHRlbnNpb24oZmlsZW5hbWUpOwotCQkJCisKIAkJCWlmIChvcHRzLm1fa3R4Ml9tb2RlKQogCQkJCWZpbGVuYW1lICs9ICIua3R4MiI7CiAJCQllbHNlCkBAIC0xMDYzLDQ5ICsxMTM1LDY1IEBACiAKIAkJCWlmIChvcHRzLm1fb3V0cHV0X3BhdGguc2l6ZSgpKQogCQkJCXN0cmluZ19jb21iaW5lX3BhdGgoZmlsZW5hbWUsIG9wdHMubV9vdXRwdXRfcGF0aC5jX3N0cigpLCBmaWxlbmFtZS5jX3N0cigpKTsKLQkJCisKIAkJCXBhcmFtcy5tX291dF9maWxlbmFtZSA9IGZpbGVuYW1lOwogCQl9Ci0JCQotCQliYXNpc19jb21wcmVzc29yIGM7CiAKLQkJaWYgKCFjLmluaXQob3B0cy5tX2NvbXBfcGFyYW1zKSkKKwkJaWYgKG9wdHMubV9wYXJhbGxlbF9jb21wcmVzc2lvbikKIAkJewotCQkJZXJyb3JfcHJpbnRmKCJiYXNpc19jb21wcmVzc29yOjppbml0KCkgZmFpbGVkIVxuIik7Ci0KLQkJCWlmIChwQ1NWX2ZpbGUpCi0JCQl7Ci0JCQkJZmNsb3NlKHBDU1ZfZmlsZSk7Ci0JCQkJcENTVl9maWxlID0gbnVsbHB0cjsKLQkJCX0KLQotCQkJZGVsZXRlIHBHbG9iYWxfY29kZWJvb2tfZGF0YTsgcEdsb2JhbF9jb2RlYm9va19kYXRhID0gbnVsbHB0cjsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWludGVydmFsX3RpbWVyIHRtOwotCQl0bS5zdGFydCgpOwotCi0JCWJhc2lzX2NvbXByZXNzb3I6OmVycm9yX2NvZGUgZWMgPSBjLnByb2Nlc3MoKTsKLQotCQl0bS5zdG9wKCk7Ci0KLQkJaWYgKGVjID09IGJhc2lzX2NvbXByZXNzb3I6OmNFQ1N1Y2Nlc3MpCi0JCXsKLQkJCXByaW50ZigiQ29tcHJlc3Npb24gc3VjY2VlZGVkIHRvIGZpbGUgXCIlc1wiIHNpemUgJXUgYnl0ZXMgaW4gJTMuM2Ygc2Vjc1xuIiwgcGFyYW1zLm1fb3V0X2ZpbGVuYW1lLmNfc3RyKCksIAotCQkJCW9wdHMubV9rdHgyX21vZGUgPyBjLmdldF9vdXRwdXRfa3R4Ml9maWxlKCkuc2l6ZSgpIDogYy5nZXRfb3V0cHV0X2Jhc2lzX2ZpbGUoKS5zaXplKCksIAotCQkJCXRtLmdldF9lbGFwc2VkX3NlY3MoKSk7CisJCQljb21wX3BhcmFtc192ZWMucHVzaF9iYWNrKHBhcmFtcyk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlib29sIGV4aXRfZmxhZyA9IHRydWU7CisJCQliYXNpc19jb21wcmVzc29yIGM7CiAKLQkJCXN3aXRjaCAoZWMpCisJCQlpZiAoIWMuaW5pdChvcHRzLm1fY29tcF9wYXJhbXMpKQogCQkJeworCQkJCWVycm9yX3ByaW50ZigiYmFzaXNfY29tcHJlc3Nvcjo6aW5pdCgpIGZhaWxlZCFcbiIpOworCisJCQkJaWYgKHBDU1ZfZmlsZSkKKwkJCQl7CisJCQkJCWZjbG9zZShwQ1NWX2ZpbGUpOworCQkJCQlwQ1NWX2ZpbGUgPSBudWxscHRyOworCQkJCX0KKworCQkJCWRlbGV0ZSBwR2xvYmFsX2NvZGVib29rX2RhdGE7IHBHbG9iYWxfY29kZWJvb2tfZGF0YSA9IG51bGxwdHI7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJCXRtLnN0YXJ0KCk7CisKKwkJCWJhc2lzX2NvbXByZXNzb3I6OmVycm9yX2NvZGUgZWMgPSBjLnByb2Nlc3MoKTsKKworCQkJdG0uc3RvcCgpOworCisJCQlpZiAoZWMgPT0gYmFzaXNfY29tcHJlc3Nvcjo6Y0VDU3VjY2VzcykKKwkJCXsKKwkJCQlpZiAocGFyYW1zLm1fc3RhdHVzX291dHB1dCkKKwkJCQl7CisJCQkJCXByaW50ZigiQ29tcHJlc3Npb24gc3VjY2VlZGVkIHRvIGZpbGUgXCIlc1wiIHNpemUgJXUgYnl0ZXMgaW4gJTMuM2Ygc2Vjc1xuIiwgcGFyYW1zLm1fb3V0X2ZpbGVuYW1lLmNfc3RyKCksCisJCQkJCQlvcHRzLm1fa3R4Ml9tb2RlID8gYy5nZXRfb3V0cHV0X2t0eDJfZmlsZSgpLnNpemUoKSA6IGMuZ2V0X291dHB1dF9iYXNpc19maWxlKCkuc2l6ZSgpLAorCQkJCQkJdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmVzdWx0ID0gZmFsc2U7CisKKwkJCQlpZiAoIXBhcmFtcy5tX3N0YXR1c19vdXRwdXQpCisJCQkJeworCQkJCQllcnJvcl9wcmludGYoIkNvbXByZXNzaW9uIGZhaWxlZCBvbiBmaWxlIFwiJXNcIlxuIiwgcGFyYW1zLm1fb3V0X2ZpbGVuYW1lLmNfc3RyKCkpOworCQkJCX0KKworCQkJCWJvb2wgZXhpdF9mbGFnID0gdHJ1ZTsKKworCQkJCXN3aXRjaCAoZWMpCisJCQkJewogCQkJCWNhc2UgYmFzaXNfY29tcHJlc3Nvcjo6Y0VDRmFpbGVkUmVhZGluZ1NvdXJjZUltYWdlczoKIAkJCQl7CiAJCQkJCWVycm9yX3ByaW50ZigiQ29tcHJlc3NvciBmYWlsZWQgcmVhZGluZyBhIHNvdXJjZSBpbWFnZSFcbiIpOwotCQkJCQkKKwogCQkJCQlpZiAob3B0cy5tX2luZGl2aWR1YWwpCiAJCQkJCQlleGl0X2ZsYWcgPSBmYWxzZTsKIApAQCAtMTE0MSw4NSArMTIyOSwxMDQgQEAKIAkJCQlkZWZhdWx0OgogCQkJCQllcnJvcl9wcmludGYoImJhc2lzX2NvbXByZXNzOjpwcm9jZXNzKCkgZmFpbGVkIVxuIik7CiAJCQkJCWJyZWFrOwotCQkJfQotCQkKLQkJCWlmIChleGl0X2ZsYWcpCi0JCQl7Ci0JCQkJaWYgKHBDU1ZfZmlsZSkKLQkJCQl7Ci0JCQkJCWZjbG9zZShwQ1NWX2ZpbGUpOwotCQkJCQlwQ1NWX2ZpbGUgPSBudWxscHRyOwogCQkJCX0KIAotCQkJCWRlbGV0ZSBwR2xvYmFsX2NvZGVib29rX2RhdGE7IHBHbG9iYWxfY29kZWJvb2tfZGF0YSA9IG51bGxwdHI7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKChwQ1NWX2ZpbGUpICYmIChjLmdldF9zdGF0cygpLnNpemUoKSkpCi0JCXsKLSNpZiAwCi0JCQlmb3IgKHNpemVfdCBzbGljZV9pbmRleCA9IDA7IHNsaWNlX2luZGV4IDwgYy5nZXRfc3RhdHMoKS5zaXplKCk7IHNsaWNlX2luZGV4KyspCi0JCQl7Ci0JCQkJZnByaW50ZihwQ1NWX2ZpbGUsICJcIiVzXCIsICV1LCAldSwgJXUsICV1LCAldSwgJWYsICVmLCAlZiwgJWYsICVmLCAldSwgJXUsICVmXG4iLAotCQkJCQlwYXJhbXMubV9vdXRfZmlsZW5hbWUuY19zdHIoKSwKLQkJCQkJKHVpbnQzMl90KXNsaWNlX2luZGV4LCAodWludDMyX3QpYy5nZXRfc3RhdHMoKS5zaXplKCksCi0JCQkJCWMuZ2V0X3N0YXRzKClbc2xpY2VfaW5kZXhdLm1fd2lkdGgsIGMuZ2V0X3N0YXRzKClbc2xpY2VfaW5kZXhdLm1faGVpZ2h0LCAodWludDMyX3QpYy5nZXRfYW55X3NvdXJjZV9pbWFnZV9oYXNfYWxwaGEoKSwKLQkJCQkJYy5nZXRfYmFzaXNfYml0c19wZXJfdGV4ZWwoKSwKLQkJCQkJYy5nZXRfc3RhdHMoKVtzbGljZV9pbmRleF0ubV9iYXNpc19yZ2JfYXZnX3BzbnIsCi0JCQkJCWMuZ2V0X3N0YXRzKClbc2xpY2VfaW5kZXhdLm1fYmFzaXNfcmdiYV9hdmdfcHNuciwKLQkJCQkJYy5nZXRfc3RhdHMoKVtzbGljZV9pbmRleF0ubV9iYXNpc19sdW1hXzcwOV9wc25yLAotCQkJCQljLmdldF9zdGF0cygpW3NsaWNlX2luZGV4XS5tX2Jlc3RfZXRjMXNfbHVtYV83MDlfcHNuciwKLQkJCQkJcGFyYW1zLm1fcXVhbGl0eV9sZXZlbCwgKGludClwYXJhbXMubV9jb21wcmVzc2lvbl9sZXZlbCwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKLQkJCQlmZmx1c2gocENTVl9maWxlKTsKLQkJCX0KLSNlbHNlCi0JCQlpZiAoYy5nZXRfc3RhdHMoKS5zaXplKCkpCi0JCQl7Ci0JCQkJZmxvYXQgcmdiX2F2Z19wc25yX21pbiA9IDFlKzlmLCByZ2JfYXZnX3BzbnJfYXZnID0gMC4wZjsKLQkJCQlmbG9hdCBhX2F2Z19wc25yX21pbiA9IDFlKzlmLCBhX2F2Z19wc25yX2F2ZyA9IDAuMGY7Ci0JCQkJZmxvYXQgbHVtYV83MDlfcHNucl9taW4gPSAxZSs5ZiwgbHVtYV83MDlfcHNucl9hdmcgPSAwLjBmOwotCi0JCQkJZm9yIChzaXplX3Qgc2xpY2VfaW5kZXggPSAwOyBzbGljZV9pbmRleCA8IGMuZ2V0X3N0YXRzKCkuc2l6ZSgpOyBzbGljZV9pbmRleCsrKQorCQkJCWlmIChleGl0X2ZsYWcpCiAJCQkJewotCQkJCQlyZ2JfYXZnX3BzbnJfbWluID0gYmFzaXN1OjptaW5pbXVtKHJnYl9hdmdfcHNucl9taW4sIGMuZ2V0X3N0YXRzKClbc2xpY2VfaW5kZXhdLm1fYmFzaXNfcmdiX2F2Z19wc25yKTsKLQkJCQkJcmdiX2F2Z19wc25yX2F2ZyArPSBjLmdldF9zdGF0cygpW3NsaWNlX2luZGV4XS5tX2Jhc2lzX3JnYl9hdmdfcHNucjsKKwkJCQkJaWYgKHBDU1ZfZmlsZSkKKwkJCQkJeworCQkJCQkJZmNsb3NlKHBDU1ZfZmlsZSk7CisJCQkJCQlwQ1NWX2ZpbGUgPSBudWxscHRyOworCQkJCQl9CiAKLQkJCQkJYV9hdmdfcHNucl9taW4gPSBiYXNpc3U6Om1pbmltdW0oYV9hdmdfcHNucl9taW4sIGMuZ2V0X3N0YXRzKClbc2xpY2VfaW5kZXhdLm1fYmFzaXNfYV9hdmdfcHNucik7Ci0JCQkJCWFfYXZnX3BzbnJfYXZnICs9IGMuZ2V0X3N0YXRzKClbc2xpY2VfaW5kZXhdLm1fYmFzaXNfYV9hdmdfcHNucjsKLQotCQkJCQlsdW1hXzcwOV9wc25yX21pbiA9IGJhc2lzdTo6bWluaW11bShsdW1hXzcwOV9wc25yX21pbiwgYy5nZXRfc3RhdHMoKVtzbGljZV9pbmRleF0ubV9iYXNpc19sdW1hXzcwOV9wc25yKTsKLQkJCQkJbHVtYV83MDlfcHNucl9hdmcgKz0gYy5nZXRfc3RhdHMoKVtzbGljZV9pbmRleF0ubV9iYXNpc19sdW1hXzcwOV9wc25yOworCQkJCQlkZWxldGUgcEdsb2JhbF9jb2RlYm9va19kYXRhOyBwR2xvYmFsX2NvZGVib29rX2RhdGEgPSBudWxscHRyOworCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJfQotCi0JCQkJcmdiX2F2Z19wc25yX2F2ZyAvPSBjLmdldF9zdGF0cygpLnNpemUoKTsKLQkJCQlhX2F2Z19wc25yX2F2ZyAvPSBjLmdldF9zdGF0cygpLnNpemUoKTsKLQkJCQlsdW1hXzcwOV9wc25yX2F2ZyAvPSBjLmdldF9zdGF0cygpLnNpemUoKTsKLQkJCQkKLQkJCQlmcHJpbnRmKHBDU1ZfZmlsZSwgIlwiJXNcIiwgJXUsICV1LCAldSwgJXUsICV1LCAlZiwgJWYsICVmLCAlZiwgJWYsICV1LCAldSwgJWYsICVmLCAlZiwgJWYsICVmLCAlZiwgJWZcbiIsCi0JCQkJCXBhcmFtcy5tX291dF9maWxlbmFtZS5jX3N0cigpLAotCQkJCQljLmdldF9iYXNpc19maWxlX3NpemUoKSwKLQkJCQkJKHVpbnQzMl90KWMuZ2V0X3N0YXRzKCkuc2l6ZSgpLAotCQkJCQljLmdldF9zdGF0cygpWzBdLm1fd2lkdGgsIGMuZ2V0X3N0YXRzKClbMF0ubV9oZWlnaHQsICh1aW50MzJfdCljLmdldF9hbnlfc291cmNlX2ltYWdlX2hhc19hbHBoYSgpLAotCQkJCQljLmdldF9iYXNpc19iaXRzX3Blcl90ZXhlbCgpLAotCQkJCQljLmdldF9zdGF0cygpWzBdLm1fYmFzaXNfcmdiX2F2Z19wc25yLAotCQkJCQljLmdldF9zdGF0cygpWzBdLm1fYmFzaXNfcmdiYV9hdmdfcHNuciwKLQkJCQkJYy5nZXRfc3RhdHMoKVswXS5tX2Jhc2lzX2x1bWFfNzA5X3BzbnIsCi0JCQkJCWMuZ2V0X3N0YXRzKClbMF0ubV9iZXN0X2V0YzFzX2x1bWFfNzA5X3BzbnIsCi0JCQkJCXBhcmFtcy5tX3F1YWxpdHlfbGV2ZWwsIChpbnQpcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwsIHRtLmdldF9lbGFwc2VkX3NlY3MoKSwKLQkJCQkJcmdiX2F2Z19wc25yX21pbiwgcmdiX2F2Z19wc25yX2F2ZywKLQkJCQkJYV9hdmdfcHNucl9taW4sIGFfYXZnX3BzbnJfYXZnLAotCQkJCQlsdW1hXzcwOV9wc25yX21pbiwgbHVtYV83MDlfcHNucl9hdmcpOwotCQkJCWZmbHVzaChwQ1NWX2ZpbGUpOwogCQkJfQotI2VuZGlmCi0JCX0KLQkJCQkKLQkJaWYgKG9wdHMubV9pbmRpdmlkdWFsKQotCQkJcHJpbnRmKCJcbiIpOworCisJCQlpZiAoKHBDU1ZfZmlsZSkgJiYgKGMuZ2V0X3N0YXRzKCkuc2l6ZSgpKSkKKwkJCXsKKwkJCQlpZiAoYy5nZXRfc3RhdHMoKS5zaXplKCkpCisJCQkJeworCQkJCQlmbG9hdCByZ2JfYXZnX3BzbnJfbWluID0gMWUrOWYsIHJnYl9hdmdfcHNucl9hdmcgPSAwLjBmOworCQkJCQlmbG9hdCBhX2F2Z19wc25yX21pbiA9IDFlKzlmLCBhX2F2Z19wc25yX2F2ZyA9IDAuMGY7CisJCQkJCWZsb2F0IGx1bWFfNzA5X3BzbnJfbWluID0gMWUrOWYsIGx1bWFfNzA5X3BzbnJfYXZnID0gMC4wZjsKKworCQkJCQlmb3IgKHNpemVfdCBzbGljZV9pbmRleCA9IDA7IHNsaWNlX2luZGV4IDwgYy5nZXRfc3RhdHMoKS5zaXplKCk7IHNsaWNlX2luZGV4KyspCisJCQkJCXsKKwkJCQkJCXJnYl9hdmdfcHNucl9taW4gPSBiYXNpc3U6Om1pbmltdW0ocmdiX2F2Z19wc25yX21pbiwgYy5nZXRfc3RhdHMoKVtzbGljZV9pbmRleF0ubV9iYXNpc19yZ2JfYXZnX3BzbnIpOworCQkJCQkJcmdiX2F2Z19wc25yX2F2ZyArPSBjLmdldF9zdGF0cygpW3NsaWNlX2luZGV4XS5tX2Jhc2lzX3JnYl9hdmdfcHNucjsKKworCQkJCQkJYV9hdmdfcHNucl9taW4gPSBiYXNpc3U6Om1pbmltdW0oYV9hdmdfcHNucl9taW4sIGMuZ2V0X3N0YXRzKClbc2xpY2VfaW5kZXhdLm1fYmFzaXNfYV9hdmdfcHNucik7CisJCQkJCQlhX2F2Z19wc25yX2F2ZyArPSBjLmdldF9zdGF0cygpW3NsaWNlX2luZGV4XS5tX2Jhc2lzX2FfYXZnX3BzbnI7CisKKwkJCQkJCWx1bWFfNzA5X3BzbnJfbWluID0gYmFzaXN1OjptaW5pbXVtKGx1bWFfNzA5X3BzbnJfbWluLCBjLmdldF9zdGF0cygpW3NsaWNlX2luZGV4XS5tX2Jhc2lzX2x1bWFfNzA5X3BzbnIpOworCQkJCQkJbHVtYV83MDlfcHNucl9hdmcgKz0gYy5nZXRfc3RhdHMoKVtzbGljZV9pbmRleF0ubV9iYXNpc19sdW1hXzcwOV9wc25yOworCQkJCQl9CisKKwkJCQkJcmdiX2F2Z19wc25yX2F2ZyAvPSBjLmdldF9zdGF0cygpLnNpemUoKTsKKwkJCQkJYV9hdmdfcHNucl9hdmcgLz0gYy5nZXRfc3RhdHMoKS5zaXplKCk7CisJCQkJCWx1bWFfNzA5X3BzbnJfYXZnIC89IGMuZ2V0X3N0YXRzKCkuc2l6ZSgpOworCisJCQkJCWZwcmludGYocENTVl9maWxlLCAiXCIlc1wiLCAldSwgJXUsICV1LCAldSwgJXUsICVmLCAlZiwgJWYsICVmLCAlZiwgJXUsICV1LCAlZiwgJWYsICVmLCAlZiwgJWYsICVmLCAlZlxuIiwKKwkJCQkJCXBhcmFtcy5tX291dF9maWxlbmFtZS5jX3N0cigpLAorCQkJCQkJYy5nZXRfYmFzaXNfZmlsZV9zaXplKCksCisJCQkJCQkodWludDMyX3QpYy5nZXRfc3RhdHMoKS5zaXplKCksCisJCQkJCQljLmdldF9zdGF0cygpWzBdLm1fd2lkdGgsIGMuZ2V0X3N0YXRzKClbMF0ubV9oZWlnaHQsICh1aW50MzJfdCljLmdldF9hbnlfc291cmNlX2ltYWdlX2hhc19hbHBoYSgpLAorCQkJCQkJYy5nZXRfYmFzaXNfYml0c19wZXJfdGV4ZWwoKSwKKwkJCQkJCWMuZ2V0X3N0YXRzKClbMF0ubV9iYXNpc19yZ2JfYXZnX3BzbnIsCisJCQkJCQljLmdldF9zdGF0cygpWzBdLm1fYmFzaXNfcmdiYV9hdmdfcHNuciwKKwkJCQkJCWMuZ2V0X3N0YXRzKClbMF0ubV9iYXNpc19sdW1hXzcwOV9wc25yLAorCQkJCQkJYy5nZXRfc3RhdHMoKVswXS5tX2Jlc3RfZXRjMXNfbHVtYV83MDlfcHNuciwKKwkJCQkJCXBhcmFtcy5tX3F1YWxpdHlfbGV2ZWwsIChpbnQpcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwsIHRtLmdldF9lbGFwc2VkX3NlY3MoKSwKKwkJCQkJCXJnYl9hdmdfcHNucl9taW4sIHJnYl9hdmdfcHNucl9hdmcsCisJCQkJCQlhX2F2Z19wc25yX21pbiwgYV9hdmdfcHNucl9hdmcsCisJCQkJCQlsdW1hXzcwOV9wc25yX21pbiwgbHVtYV83MDlfcHNucl9hdmcpOworCQkJCQlmZmx1c2gocENTVl9maWxlKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vaWYgKChvcHRzLm1faW5kaXZpZHVhbCkgJiYgKHBhcmFtcy5tX3N0YXR1c19vdXRwdXQpKQorCQkJLy8JcHJpbnRmKCJcbiIpOworCisJCX0gLy8gaWYgKG9wdHMubV9wYXJhbGxlbF9jb21wcmVzc2lvbikKIAogCX0gLy8gZmlsZV9pbmRleAogCisJaWYgKG9wdHMubV9wYXJhbGxlbF9jb21wcmVzc2lvbikKKwl7CisJCWJhc2lzdTo6dmVjdG9yPHBhcmFsbGVsX3Jlc3VsdHM+IHJlc3VsdHM7CisKKwkJYm9vbCBhbnlfZmFpbGVkID0gYmFzaXNfcGFyYWxsZWxfY29tcHJlc3MoCisJCQludW1fdGhyZWFkcywKKwkJCWNvbXBfcGFyYW1zX3ZlYywKKwkJCXJlc3VsdHMpOworCQlCQVNJU1VfTk9URV9VTlVTRUQoYW55X2ZhaWxlZCk7CisKKwkJdWludDMyX3QgdG90YWxfc3VjY2Vzc2VzID0gMCwgdG90YWxfZmFpbHVyZXMgPSAwOworCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29tcF9wYXJhbXNfdmVjLnNpemUoKTsgaSsrKQorCQl7CisJCQlpZiAocmVzdWx0c1tpXS5tX2Vycm9yX2NvZGUgIT0gYmFzaXNfY29tcHJlc3Nvcjo6Y0VDU3VjY2VzcykKKwkJCXsKKwkJCQlyZXN1bHQgPSBmYWxzZTsKKworCQkJCXRvdGFsX2ZhaWx1cmVzKys7CisKKwkJCQllcnJvcl9wcmludGYoIkZpbGUgJXUgKGZpcnN0IHNvdXJjZSBpbWFnZTogXCIlc1wiLCBvdXRwdXQgZmlsZTogXCIlc1wiKSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVpIVxuIiwgaSwgCisJCQkJCWNvbXBfcGFyYW1zX3ZlY1tpXS5tX3NvdXJjZV9maWxlbmFtZXNbMF0uY19zdHIoKSwgCisJCQkJCWNvbXBfcGFyYW1zX3ZlY1tpXS5tX291dF9maWxlbmFtZS5jX3N0cigpLAorCQkJCQkoaW50KXJlc3VsdHNbaV0ubV9lcnJvcl9jb2RlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0b3RhbF9zdWNjZXNzZXMrKzsKKwkJCX0KKwkJfQorCisJCXByaW50ZigiVG90YWwgc3VjY2Vzc2VzOiAldSBmYWlsdXJlczogJXVcbiIsIHRvdGFsX3N1Y2Nlc3NlcywgdG90YWxfZmFpbHVyZXMpOworCisJfSAvLyBpZiAob3B0cy5tX3BhcmFsbGVsX2NvbXByZXNzaW9uKQorCQkKIAlhbGxfdG0uc3RvcCgpOwogCiAJaWYgKHRvdGFsX2ZpbGVzID4gMSkKQEAgLTEyMzMsNyArMTM0MCw3IEBACiAJZGVsZXRlIHBHbG9iYWxfY29kZWJvb2tfZGF0YTsgCiAJcEdsb2JhbF9jb2RlYm9va19kYXRhID0gbnVsbHB0cjsKIAkJCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGJvb2wgdW5wYWNrX2FuZF92YWxpZGF0ZV9rdHgyX2ZpbGUoCkBAIC0xMjQzLDcgKzEzNTAsNiBAQAogCWNvbW1hbmRfbGluZV9wYXJhbXMmIG9wdHMsCiAJRklMRSogcENTVl9maWxlLAogCWJhc2lzX2RhdGEqIHBHbG9iYWxfY29kZWJvb2tfZGF0YSwKLQliYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rJiBzZWxfY29kZWJvb2ssCiAJdWludDMyX3QmIHRvdGFsX3VucGFja193YXJuaW5ncywKIAl1aW50MzJfdCYgdG90YWxfcHZydGNfbm9ucG93Ml93YXJuaW5ncykKIHsKQEAgLTEyNTMsNyArMTM1OSw3IEBACiAKIAljb25zdCBib29sIHZhbGlkYXRlX2ZsYWcgPSAob3B0cy5tX21vZGUgPT0gY1ZhbGlkYXRlKTsKIAotCWJhc2lzdDo6a3R4Ml90cmFuc2NvZGVyIGRlYygmc2VsX2NvZGVib29rKTsKKwliYXNpc3Q6Omt0eDJfdHJhbnNjb2RlciBkZWM7CiAKIAlpZiAoIWRlYy5pbml0KGt0eDJfZmlsZV9kYXRhLmRhdGEoKSwga3R4Ml9maWxlX2RhdGEuc2l6ZSgpKSkKIAl7CkBAIC0xNTczLDIwICsxNjc5LDMwIEBACiAJCQkJCQl9CiAJCQkJCQkvL3UuY3JvcChsZXZlbF9pbmZvLm1fb3JpZ193aWR0aCwgbGV2ZWxfaW5mby5tX29yaWdfaGVpZ2h0KTsKIAotCQkJCQkJc3RkOjpzdHJpbmcgcmdiX2ZpbGVuYW1lOwotCQkJCQkJaWYgKGdpLnNpemUoKSA+IDEpCi0JCQkJCQkJcmdiX2ZpbGVuYW1lID0gYmFzZV9maWxlbmFtZSArIHN0cmluZ19mb3JtYXQoIl91bnBhY2tlZF9yZ2JfJXNfJXVfJXVfJTA0dS5wbmciLCBiYXNpc3Q6OmJhc2lzX2dldF9mb3JtYXRfbmFtZSh0cmFuc2NvZGVyX3RleF9mbXQpLCBsZXZlbF9pbmRleCwgZmFjZV9pbmRleCwgbGF5ZXJfaW5kZXgpOwotCQkJCQkJZWxzZQotCQkJCQkJCXJnYl9maWxlbmFtZSA9IGJhc2VfZmlsZW5hbWUgKyBzdHJpbmdfZm9ybWF0KCJfdW5wYWNrZWRfcmdiXyVzXyV1XyUwNHUucG5nIiwgYmFzaXN0OjpiYXNpc19nZXRfZm9ybWF0X25hbWUodHJhbnNjb2Rlcl90ZXhfZm10KSwgZmFjZV9pbmRleCwgbGF5ZXJfaW5kZXgpOwotCQkJCQkJaWYgKCFzYXZlX3BuZyhyZ2JfZmlsZW5hbWUsIHUsIGNJbWFnZVNhdmVJZ25vcmVBbHBoYSkpCi0JCQkJCQl7Ci0JCQkJCQkJZXJyb3JfcHJpbnRmKCJGYWlsZWQgd3JpdGluZyB0byBQTkcgZmlsZSBcIiVzXCJcbiIsIHJnYl9maWxlbmFtZS5jX3N0cigpKTsKLQkJCQkJCQlkZWxldGUgcEdsb2JhbF9jb2RlYm9va19kYXRhOyBwR2xvYmFsX2NvZGVib29rX2RhdGEgPSBudWxscHRyOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCXByaW50ZigiV3JvdGUgUE5HIGZpbGUgXCIlc1wiXG4iLCByZ2JfZmlsZW5hbWUuY19zdHIoKSk7CisJCQkJCQlib29sIGlzX2FzdGMgPSAodHJhbnNjb2Rlcl90ZXhfZm10ID09IGJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQVNUQ180eDRfUkdCQSk7CisJCQkJCQlib29sIHdyaXRlX3BuZyA9IHRydWU7CisjaWYgIUJBU0lTVV9VU0VfQVNUQ19ERUNPTVBSRVNTCisJCQkJCQlpZiAoaXNfYXN0YykKKwkJCQkJCQl3cml0ZV9wbmcgPSBmYWxzZTsKKyNlbmRpZgogCi0JCQkJCQlpZiAodHJhbnNjb2Rlcl90ZXhfZm10ID09IGJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRlhUMV9SR0IpCisJCQkJCQlpZiAoKCFvcHRzLm1fa3R4X29ubHkpICYmICh3cml0ZV9wbmcpKQorCQkJCQkJeworCQkJCQkJCXN0ZDo6c3RyaW5nIHJnYl9maWxlbmFtZTsKKwkJCQkJCQlpZiAoZ2kuc2l6ZSgpID4gMSkKKwkJCQkJCQkJcmdiX2ZpbGVuYW1lID0gYmFzZV9maWxlbmFtZSArIHN0cmluZ19mb3JtYXQoIl91bnBhY2tlZF9yZ2JfJXNfJXVfJXVfJTA0dS5wbmciLCBiYXNpc3Q6OmJhc2lzX2dldF9mb3JtYXRfbmFtZSh0cmFuc2NvZGVyX3RleF9mbXQpLCBsZXZlbF9pbmRleCwgZmFjZV9pbmRleCwgbGF5ZXJfaW5kZXgpOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcmdiX2ZpbGVuYW1lID0gYmFzZV9maWxlbmFtZSArIHN0cmluZ19mb3JtYXQoIl91bnBhY2tlZF9yZ2JfJXNfJXVfJTA0dS5wbmciLCBiYXNpc3Q6OmJhc2lzX2dldF9mb3JtYXRfbmFtZSh0cmFuc2NvZGVyX3RleF9mbXQpLCBmYWNlX2luZGV4LCBsYXllcl9pbmRleCk7CisJCQkJCQkJaWYgKCFzYXZlX3BuZyhyZ2JfZmlsZW5hbWUsIHUsIGNJbWFnZVNhdmVJZ25vcmVBbHBoYSkpCisJCQkJCQkJeworCQkJCQkJCQllcnJvcl9wcmludGYoIkZhaWxlZCB3cml0aW5nIHRvIFBORyBmaWxlIFwiJXNcIlxuIiwgcmdiX2ZpbGVuYW1lLmNfc3RyKCkpOworCQkJCQkJCQlkZWxldGUgcEdsb2JhbF9jb2RlYm9va19kYXRhOyBwR2xvYmFsX2NvZGVib29rX2RhdGEgPSBudWxscHRyOworCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJfQorCQkJCQkJCXByaW50ZigiV3JvdGUgUE5HIGZpbGUgXCIlc1wiXG4iLCByZ2JfZmlsZW5hbWUuY19zdHIoKSk7CisJCQkJCQl9CisKKwkJCQkJCWlmICgodHJhbnNjb2Rlcl90ZXhfZm10ID09IGJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRlhUMV9SR0IpICYmIChvcHRzLm1fd3JpdGVfb3V0KSkKIAkJCQkJCXsKIAkJCQkJCQlzdGQ6OnN0cmluZyBvdXRfZmlsZW5hbWU7CiAJCQkJCQkJaWYgKGdpLnNpemUoKSA+IDEpCkBAIC0xNjAxLDcgKzE3MTcsNyBAQAogCQkJCQkJCXByaW50ZigiV3JvdGUgLk9VVCBmaWxlIFwiJXNcIlxuIiwgb3V0X2ZpbGVuYW1lLmNfc3RyKCkpOwogCQkJCQkJfQogCi0JCQkJCQlpZiAoYmFzaXNfdHJhbnNjb2Rlcl9mb3JtYXRfaGFzX2FscGhhKHRyYW5zY29kZXJfdGV4X2ZtdCkpCisJCQkJCQlpZiAoYmFzaXNfdHJhbnNjb2Rlcl9mb3JtYXRfaGFzX2FscGhhKHRyYW5zY29kZXJfdGV4X2ZtdCkgJiYgKCFvcHRzLm1fa3R4X29ubHkpICYmICh3cml0ZV9wbmcpKQogCQkJCQkJewogCQkJCQkJCXN0ZDo6c3RyaW5nIGFfZmlsZW5hbWU7CiAJCQkJCQkJaWYgKGdpLnNpemUoKSA+IDEpCkBAIC0xNjQ4LDEzICsxNzY0LDEyIEBACiAJY29tbWFuZF9saW5lX3BhcmFtcyYgb3B0cywgCiAJRklMRSAqcENTVl9maWxlLAogCWJhc2lzX2RhdGEqIHBHbG9iYWxfY29kZWJvb2tfZGF0YSwKLQliYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rICZzZWxfY29kZWJvb2ssCiAJdWludDMyX3QgJnRvdGFsX3VucGFja193YXJuaW5ncywKIAl1aW50MzJfdCAmdG90YWxfcHZydGNfbm9ucG93Ml93YXJuaW5ncykKIHsKIAljb25zdCBib29sIHZhbGlkYXRlX2ZsYWcgPSAob3B0cy5tX21vZGUgPT0gY1ZhbGlkYXRlKTsKIAotCWJhc2lzdDo6YmFzaXN1X3RyYW5zY29kZXIgZGVjKCZzZWxfY29kZWJvb2spOworCWJhc2lzdDo6YmFzaXN1X3RyYW5zY29kZXIgZGVjOwogCiAJaWYgKHBHbG9iYWxfY29kZWJvb2tfZGF0YSkKIAl7CkBAIC0xNzg4LDcgKzE5MDMsNyBAQAogCXByaW50Zigic3RhcnRfdHJhbnNjb2RpbmcgdGltZTogJTMuM2YgbXNcbiIsIHN0YXJ0X3RyYW5zY29kaW5nX3RpbWVfbXMpOwogCiAJYmFzaXN1Ojp2ZWN0b3I8IGdwdV9pbWFnZV92ZWMgPiBncHVfaW1hZ2VzWyhpbnQpYmFzaXN0Ojp0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZUb3RhbFRleHR1cmVGb3JtYXRzXTsKLQorCQogCWRvdWJsZSB0b3RhbF9mb3JtYXRfdHJhbnNjb2RpbmdfdGltZV9tc1soaW50KWJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGVG90YWxUZXh0dXJlRm9ybWF0c107CiAJY2xlYXJfb2JqKHRvdGFsX2Zvcm1hdF90cmFuc2NvZGluZ190aW1lX21zKTsKIApAQCAtMTkwNyw2ICsyMDIyLDg2IEBACiAKIAl9IC8vIGltYWdlX2luZm8KIAorCS8vIFVwYWNrIFVBU1RDIGZpbGVzIHNlcGFyYXJlbHksIHRvIHZhbGlkYXRlIHdlIGNhbiB0cmFuc2NvZGUgc2xpY2VzIHRvIFVBU1RDIGFuZCB1bnBhY2sgdGhlbSB0byBwaXhlbHMuCisJLy8gVGhpcyBpcyBhIHNwZWNpYWwgcGF0aCBiZWNhdXNlIFVBU1RDIGlzIG5vdCB5ZXQgYSB2YWxpZCB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0LCBidXQgYSBsb3dlci1sZXZlbCBibG9ja19mb3JtYXQuCisJaWYgKGZpbGVpbmZvLm1fdGV4X2Zvcm1hdCA9PSBiYXNpc3Q6OmJhc2lzX3RleF9mb3JtYXQ6OmNVQVNUQzR4NCkKKwl7CisJCWZvciAodWludDMyX3QgaW1hZ2VfaW5kZXggPSAwOyBpbWFnZV9pbmRleCA8IGZpbGVpbmZvLm1fdG90YWxfaW1hZ2VzOyBpbWFnZV9pbmRleCsrKQorCQl7CisJCQlmb3IgKHVpbnQzMl90IGxldmVsX2luZGV4ID0gMDsgbGV2ZWxfaW5kZXggPCBmaWxlaW5mby5tX2ltYWdlX21pcG1hcF9sZXZlbHNbaW1hZ2VfaW5kZXhdOyBsZXZlbF9pbmRleCsrKQorCQkJeworCQkJCWJhc2lzdDo6YmFzaXN1X2ltYWdlX2xldmVsX2luZm8gbGV2ZWxfaW5mbzsKKworCQkJCWlmICghZGVjLmdldF9pbWFnZV9sZXZlbF9pbmZvKCZiYXNpc19maWxlX2RhdGFbMF0sICh1aW50MzJfdCliYXNpc19maWxlX2RhdGEuc2l6ZSgpLCBsZXZlbF9pbmZvLCBpbWFnZV9pbmRleCwgbGV2ZWxfaW5kZXgpKQorCQkJCXsKKwkJCQkJZXJyb3JfcHJpbnRmKCJGYWlsZWQgcmV0cmlldmluZyBpbWFnZSBsZXZlbCBpbmZvcm1hdGlvbiAoJXUgJXUpIVxuIiwgaW1hZ2VfaW5kZXgsIGxldmVsX2luZGV4KTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJCWdwdV9pbWFnZSBnaTsKKwkJCQlnaS5pbml0KGJhc2lzdTo6dGV4dHVyZV9mb3JtYXQ6OmNVQVNUQzR4NCwgbGV2ZWxfaW5mby5tX29yaWdfd2lkdGgsIGxldmVsX2luZm8ubV9vcmlnX2hlaWdodCk7CisKKwkJCQkvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCBwc3VlZG8tcmFuZG9tIGJ5dGVzLCB0byBoZWxwIG1vcmUgdmlzaWJseSBkZXRlY3QgY2FzZXMgd2hlcmUgdGhlIHRyYW5zY29kZXIgZmFpbHMgdG8gd3JpdGUgdG8gcGFydCBvZiB0aGUgb3V0cHV0LgorCQkJCWZpbGxfYnVmZmVyX3dpdGhfcmFuZG9tX2J5dGVzKGdpLmdldF9wdHIoKSwgZ2kuZ2V0X3NpemVfaW5fYnl0ZXMoKSk7CisKKwkJCQkvL3VpbnQzMl90IGRlY29kZV9mbGFncyA9IDA7CisKKwkJCQl0bS5zdGFydCgpOworCisJCQkJaWYgKCFkZWMudHJhbnNjb2RlX3NsaWNlKAorCQkJCQkmYmFzaXNfZmlsZV9kYXRhWzBdLCAodWludDMyX3QpYmFzaXNfZmlsZV9kYXRhLnNpemUoKSwgCisJCQkJCWxldmVsX2luZm8ubV9maXJzdF9zbGljZV9pbmRleCwgZ2kuZ2V0X3B0cigpLCBnaS5nZXRfdG90YWxfYmxvY2tzKCksIGJhc2lzdDo6YmxvY2tfZm9ybWF0OjpjVUFTVENfNHg0LCBnaS5nZXRfYnl0ZXNfcGVyX2Jsb2NrKCkpKQorCQkJCXsKKwkJCQkJZXJyb3JfcHJpbnRmKCJGYWlsZWQgdHJhbnNjb2RpbmcgaW1hZ2UgbGV2ZWwgKCV1ICV1KSB0byBVQVNUQyFcbiIsIGltYWdlX2luZGV4LCBsZXZlbF9pbmRleCk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCQlkb3VibGUgdG90YWxfdHJhbnNjb2RlX3RpbWUgPSB0bS5nZXRfZWxhcHNlZF9tcygpOworCisJCQkJcHJpbnRmKCJUcmFuc2NvZGUgb2YgaW1hZ2UgJXUgbGV2ZWwgJXUgcmVzICV1eCV1IGZvcm1hdCBVQVNUQ180eDQgc3VjY2VlZGVkIGluICUzLjNmIG1zXG4iLCBpbWFnZV9pbmRleCwgbGV2ZWxfaW5kZXgsIGxldmVsX2luZm8ubV9vcmlnX3dpZHRoLCBsZXZlbF9pbmZvLm1fb3JpZ19oZWlnaHQsIHRvdGFsX3RyYW5zY29kZV90aW1lKTsKKworCQkJCWlmICgoIXZhbGlkYXRlX2ZsYWcpICYmICghb3B0cy5tX2t0eF9vbmx5KSkKKwkJCQl7CisJCQkJCWltYWdlIHU7CisJCQkJCWlmICghZ2kudW5wYWNrKHUpKQorCQkJCQl7CisJCQkJCQllcnJvcl9wcmludGYoIldhcm5pbmc6IEZhaWxlZCB1bnBhY2tpbmcgR1BVIHRleHR1cmUgZGF0YSAoJXUgJXUpIHRvIFVBU1RDLiBcbiIsIGltYWdlX2luZGV4LCBsZXZlbF9pbmRleCk7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQkJLy91LmNyb3AobGV2ZWxfaW5mby5tX29yaWdfd2lkdGgsIGxldmVsX2luZm8ubV9vcmlnX2hlaWdodCk7CisKKwkJCQkJc3RkOjpzdHJpbmcgcmdiX2ZpbGVuYW1lOworCQkJCQlpZiAoZmlsZWluZm8ubV9pbWFnZV9taXBtYXBfbGV2ZWxzW2ltYWdlX2luZGV4XSA+IDEpCisJCQkJCQlyZ2JfZmlsZW5hbWUgPSBiYXNlX2ZpbGVuYW1lICsgc3RyaW5nX2Zvcm1hdCgiX3VucGFja2VkX3JnYl9VQVNUQ180eDRfJXVfJTA0dS5wbmciLCBsZXZlbF9pbmRleCwgaW1hZ2VfaW5kZXgpOworCQkJCQllbHNlCisJCQkJCQlyZ2JfZmlsZW5hbWUgPSBiYXNlX2ZpbGVuYW1lICsgc3RyaW5nX2Zvcm1hdCgiX3VucGFja2VkX3JnYl9VQVNUQ180eDRfJTA0dS5wbmciLCBpbWFnZV9pbmRleCk7CisKKwkJCQkJaWYgKCFzYXZlX3BuZyhyZ2JfZmlsZW5hbWUsIHUsIGNJbWFnZVNhdmVJZ25vcmVBbHBoYSkpCisJCQkJCXsKKwkJCQkJCWVycm9yX3ByaW50ZigiRmFpbGVkIHdyaXRpbmcgdG8gUE5HIGZpbGUgXCIlc1wiXG4iLCByZ2JfZmlsZW5hbWUuY19zdHIoKSk7CisJCQkJCQlkZWxldGUgcEdsb2JhbF9jb2RlYm9va19kYXRhOyBwR2xvYmFsX2NvZGVib29rX2RhdGEgPSBudWxscHRyOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCXByaW50ZigiV3JvdGUgUE5HIGZpbGUgXCIlc1wiXG4iLCByZ2JfZmlsZW5hbWUuY19zdHIoKSk7CisKKwkJCQkJc3RkOjpzdHJpbmcgYWxwaGFfZmlsZW5hbWU7CisJCQkJCWlmIChmaWxlaW5mby5tX2ltYWdlX21pcG1hcF9sZXZlbHNbaW1hZ2VfaW5kZXhdID4gMSkKKwkJCQkJCWFscGhhX2ZpbGVuYW1lID0gYmFzZV9maWxlbmFtZSArIHN0cmluZ19mb3JtYXQoIl91bnBhY2tlZF9hX1VBU1RDXzR4NF8ldV8lMDR1LnBuZyIsIGxldmVsX2luZGV4LCBpbWFnZV9pbmRleCk7CisJCQkJCWVsc2UKKwkJCQkJCWFscGhhX2ZpbGVuYW1lID0gYmFzZV9maWxlbmFtZSArIHN0cmluZ19mb3JtYXQoIl91bnBhY2tlZF9hX1VBU1RDXzR4NF8lMDR1LnBuZyIsIGltYWdlX2luZGV4KTsKKwkJCQkJaWYgKCFzYXZlX3BuZyhhbHBoYV9maWxlbmFtZSwgdSwgY0ltYWdlU2F2ZUdyYXlzY2FsZSwgMykpCisJCQkJCXsKKwkJCQkJCWVycm9yX3ByaW50ZigiRmFpbGVkIHdyaXRpbmcgdG8gUE5HIGZpbGUgXCIlc1wiXG4iLCByZ2JfZmlsZW5hbWUuY19zdHIoKSk7CisJCQkJCQlkZWxldGUgcEdsb2JhbF9jb2RlYm9va19kYXRhOyBwR2xvYmFsX2NvZGVib29rX2RhdGEgPSBudWxscHRyOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCXByaW50ZigiV3JvdGUgUE5HIGZpbGUgXCIlc1wiXG4iLCBhbHBoYV9maWxlbmFtZS5jX3N0cigpKTsKKworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwogCWlmICghdmFsaWRhdGVfZmxhZykKIAl7CiAJCS8vIE5vdyB3cml0ZSBLVFggZmlsZXMgYW5kIHVucGFjayB0aGVtIHRvIGluZGl2aWR1YWwgUE5HJ3MKQEAgLTE5ODUsMjAgKzIxODAsMzAgQEAKIAkJCQkJfQogCQkJCQkvL3UuY3JvcChsZXZlbF9pbmZvLm1fb3JpZ193aWR0aCwgbGV2ZWxfaW5mby5tX29yaWdfaGVpZ2h0KTsKIAotCQkJCQlzdGQ6OnN0cmluZyByZ2JfZmlsZW5hbWU7Ci0JCQkJCWlmIChnaS5zaXplKCkgPiAxKQotCQkJCQkJcmdiX2ZpbGVuYW1lID0gYmFzZV9maWxlbmFtZSArIHN0cmluZ19mb3JtYXQoIl91bnBhY2tlZF9yZ2JfJXNfJXVfJTA0dS5wbmciLCBiYXNpc3Q6OmJhc2lzX2dldF9mb3JtYXRfbmFtZSh0cmFuc2NvZGVyX3RleF9mbXQpLCBsZXZlbF9pbmRleCwgaW1hZ2VfaW5kZXgpOwotCQkJCQllbHNlCi0JCQkJCQlyZ2JfZmlsZW5hbWUgPSBiYXNlX2ZpbGVuYW1lICsgc3RyaW5nX2Zvcm1hdCgiX3VucGFja2VkX3JnYl8lc18lMDR1LnBuZyIsIGJhc2lzdDo6YmFzaXNfZ2V0X2Zvcm1hdF9uYW1lKHRyYW5zY29kZXJfdGV4X2ZtdCksIGltYWdlX2luZGV4KTsKLQkJCQkJaWYgKCFzYXZlX3BuZyhyZ2JfZmlsZW5hbWUsIHUsIGNJbWFnZVNhdmVJZ25vcmVBbHBoYSkpCi0JCQkJCXsKLQkJCQkJCWVycm9yX3ByaW50ZigiRmFpbGVkIHdyaXRpbmcgdG8gUE5HIGZpbGUgXCIlc1wiXG4iLCByZ2JfZmlsZW5hbWUuY19zdHIoKSk7Ci0JCQkJCQlkZWxldGUgcEdsb2JhbF9jb2RlYm9va19kYXRhOyBwR2xvYmFsX2NvZGVib29rX2RhdGEgPSBudWxscHRyOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXByaW50ZigiV3JvdGUgUE5HIGZpbGUgXCIlc1wiXG4iLCByZ2JfZmlsZW5hbWUuY19zdHIoKSk7CisJCQkJCWJvb2wgaXNfYXN0YyA9ICh0cmFuc2NvZGVyX3RleF9mbXQgPT0gYmFzaXN0Ojp0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZBU1RDXzR4NF9SR0JBKTsKKwkJCQkJYm9vbCB3cml0ZV9wbmcgPSB0cnVlOworI2lmICFCQVNJU1VfVVNFX0FTVENfREVDT01QUkVTUworCQkJCQlpZiAoaXNfYXN0YykKKwkJCQkJCXdyaXRlX3BuZyA9IGZhbHNlOworI2VuZGlmCiAKLQkJCQkJaWYgKHRyYW5zY29kZXJfdGV4X2ZtdCA9PSBiYXNpc3Q6OnRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkZYVDFfUkdCKQorCQkJCQlpZiAoKCFvcHRzLm1fa3R4X29ubHkpICYmICh3cml0ZV9wbmcpKQorCQkJCQl7CisJCQkJCQlzdGQ6OnN0cmluZyByZ2JfZmlsZW5hbWU7CisJCQkJCQlpZiAoZ2kuc2l6ZSgpID4gMSkKKwkJCQkJCQlyZ2JfZmlsZW5hbWUgPSBiYXNlX2ZpbGVuYW1lICsgc3RyaW5nX2Zvcm1hdCgiX3VucGFja2VkX3JnYl8lc18ldV8lMDR1LnBuZyIsIGJhc2lzdDo6YmFzaXNfZ2V0X2Zvcm1hdF9uYW1lKHRyYW5zY29kZXJfdGV4X2ZtdCksIGxldmVsX2luZGV4LCBpbWFnZV9pbmRleCk7CisJCQkJCQllbHNlCisJCQkJCQkJcmdiX2ZpbGVuYW1lID0gYmFzZV9maWxlbmFtZSArIHN0cmluZ19mb3JtYXQoIl91bnBhY2tlZF9yZ2JfJXNfJTA0dS5wbmciLCBiYXNpc3Q6OmJhc2lzX2dldF9mb3JtYXRfbmFtZSh0cmFuc2NvZGVyX3RleF9mbXQpLCBpbWFnZV9pbmRleCk7CisJCQkJCQlpZiAoIXNhdmVfcG5nKHJnYl9maWxlbmFtZSwgdSwgY0ltYWdlU2F2ZUlnbm9yZUFscGhhKSkKKwkJCQkJCXsKKwkJCQkJCQllcnJvcl9wcmludGYoIkZhaWxlZCB3cml0aW5nIHRvIFBORyBmaWxlIFwiJXNcIlxuIiwgcmdiX2ZpbGVuYW1lLmNfc3RyKCkpOworCQkJCQkJCWRlbGV0ZSBwR2xvYmFsX2NvZGVib29rX2RhdGE7IHBHbG9iYWxfY29kZWJvb2tfZGF0YSA9IG51bGxwdHI7CisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJfQorCQkJCQkJcHJpbnRmKCJXcm90ZSBQTkcgZmlsZSBcIiVzXCJcbiIsIHJnYl9maWxlbmFtZS5jX3N0cigpKTsKKwkJCQkJfQorCisJCQkJCWlmICgodHJhbnNjb2Rlcl90ZXhfZm10ID09IGJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRlhUMV9SR0IpICYmIChvcHRzLm1fd3JpdGVfb3V0KSkKIAkJCQkJewogCQkJCQkJc3RkOjpzdHJpbmcgb3V0X2ZpbGVuYW1lOwogCQkJCQkJaWYgKGdpLnNpemUoKSA+IDEpCkBAIC0yMDEzLDcgKzIyMTgsNyBAQAogCQkJCQkJcHJpbnRmKCJXcm90ZSAuT1VUIGZpbGUgXCIlc1wiXG4iLCBvdXRfZmlsZW5hbWUuY19zdHIoKSk7CiAJCQkJCX0KIAotCQkJCQlpZiAoYmFzaXNfdHJhbnNjb2Rlcl9mb3JtYXRfaGFzX2FscGhhKHRyYW5zY29kZXJfdGV4X2ZtdCkpCisJCQkJCWlmIChiYXNpc190cmFuc2NvZGVyX2Zvcm1hdF9oYXNfYWxwaGEodHJhbnNjb2Rlcl90ZXhfZm10KSAmJiAoIW9wdHMubV9rdHhfb25seSkgJiYgKHdyaXRlX3BuZykpCiAJCQkJCXsKIAkJCQkJCXN0ZDo6c3RyaW5nIGFfZmlsZW5hbWU7CiAJCQkJCQlpZiAoZ2kuc2l6ZSgpID4gMSkKQEAgLTIwODUsNyArMjI5MCw3IEBACiAKIAkJCQlwcmludGYoIlRyYW5zY29kZSBvZiBpbWFnZSAldSBsZXZlbCAldSByZXMgJXV4JXUgZm9ybWF0ICVzIHN1Y2NlZWRlZCBpbiAlMy4zZiBtc1xuIiwgaW1hZ2VfaW5kZXgsIGxldmVsX2luZGV4LCBsZXZlbF9pbmZvLm1fb3JpZ193aWR0aCwgbGV2ZWxfaW5mby5tX29yaWdfaGVpZ2h0LCBiYXNpc3Q6OmJhc2lzX2dldF9mb3JtYXRfbmFtZSh0cmFuc2NvZGVyX3RleF9mbXQpLCB0b3RhbF90cmFuc2NvZGVfdGltZSk7CiAKLQkJCQlpZiAoIXZhbGlkYXRlX2ZsYWcpCisJCQkJaWYgKCghdmFsaWRhdGVfZmxhZykgJiYgKCFvcHRzLm1fa3R4X29ubHkpKQogCQkJCXsKIAkJCQkJc3RkOjpzdHJpbmcgcmdiX2ZpbGVuYW1lKGJhc2VfZmlsZW5hbWUgKyBzdHJpbmdfZm9ybWF0KCJfdW5wYWNrZWRfcmdiXyVzXyV1XyUwNHUucG5nIiwgYmFzaXN0OjpiYXNpc19nZXRfZm9ybWF0X25hbWUodHJhbnNjb2Rlcl90ZXhfZm10KSwgbGV2ZWxfaW5kZXgsIGltYWdlX2luZGV4KSk7CiAJCQkJCWlmICghc2F2ZV9wbmcocmdiX2ZpbGVuYW1lLCBpbWcsIGNJbWFnZVNhdmVJZ25vcmVBbHBoYSkpCkBAIC0yMTU0LDcgKzIzNTksNyBAQAogCiAJCQkJcHJpbnRmKCJUcmFuc2NvZGUgb2YgaW1hZ2UgJXUgbGV2ZWwgJXUgcmVzICV1eCV1IGZvcm1hdCAlcyBzdWNjZWVkZWQgaW4gJTMuM2YgbXNcbiIsIGltYWdlX2luZGV4LCBsZXZlbF9pbmRleCwgbGV2ZWxfaW5mby5tX29yaWdfd2lkdGgsIGxldmVsX2luZm8ubV9vcmlnX2hlaWdodCwgYmFzaXN0OjpiYXNpc19nZXRfZm9ybWF0X25hbWUodHJhbnNjb2Rlcl90ZXhfZm10KSwgdG90YWxfdHJhbnNjb2RlX3RpbWUpOwogCi0JCQkJaWYgKCF2YWxpZGF0ZV9mbGFnKQorCQkJCWlmICgoIXZhbGlkYXRlX2ZsYWcpICYmICghb3B0cy5tX2t0eF9vbmx5KSkKIAkJCQl7CiAJCQkJCXN0ZDo6c3RyaW5nIHJnYl9maWxlbmFtZShiYXNlX2ZpbGVuYW1lICsgc3RyaW5nX2Zvcm1hdCgiX3VucGFja2VkX3JnYl8lc18ldV8lMDR1LnBuZyIsIGJhc2lzdDo6YmFzaXNfZ2V0X2Zvcm1hdF9uYW1lKHRyYW5zY29kZXJfdGV4X2ZtdCksIGxldmVsX2luZGV4LCBpbWFnZV9pbmRleCkpOwogCQkJCQlpZiAoIXNhdmVfcG5nKHJnYl9maWxlbmFtZSwgaW1nLCBjSW1hZ2VTYXZlSWdub3JlQWxwaGEpKQpAQCAtMjIxOCw3ICsyNDIzLDcgQEAKIAogCQkJCXByaW50ZigiVHJhbnNjb2RlIG9mIGltYWdlICV1IGxldmVsICV1IHJlcyAldXgldSBmb3JtYXQgJXMgc3VjY2VlZGVkIGluICUzLjNmIG1zXG4iLCBpbWFnZV9pbmRleCwgbGV2ZWxfaW5kZXgsIGxldmVsX2luZm8ubV9vcmlnX3dpZHRoLCBsZXZlbF9pbmZvLm1fb3JpZ19oZWlnaHQsIGJhc2lzdDo6YmFzaXNfZ2V0X2Zvcm1hdF9uYW1lKHRyYW5zY29kZXJfdGV4X2ZtdCksIHRvdGFsX3RyYW5zY29kZV90aW1lKTsKIAotCQkJCWlmICghdmFsaWRhdGVfZmxhZykKKwkJCQlpZiAoKCF2YWxpZGF0ZV9mbGFnKSAmJiAoIW9wdHMubV9rdHhfb25seSkpCiAJCQkJewogCQkJCQlzdGQ6OnN0cmluZyByZ2JfZmlsZW5hbWUoYmFzZV9maWxlbmFtZSArIHN0cmluZ19mb3JtYXQoIl91bnBhY2tlZF9yZ2JfJXNfJXVfJTA0dS5wbmciLCBiYXNpc3Q6OmJhc2lzX2dldF9mb3JtYXRfbmFtZSh0cmFuc2NvZGVyX3RleF9mbXQpLCBsZXZlbF9pbmRleCwgaW1hZ2VfaW5kZXgpKTsKIAkJCQkJaWYgKCFzYXZlX3BuZyhyZ2JfZmlsZW5hbWUsIGltZywgY0ltYWdlU2F2ZUlnbm9yZUFscGhhKSkKQEAgLTIyNzQsMTMgKzI0NzksMTUgQEAKIAogc3RhdGljIGJvb2wgdW5wYWNrX2FuZF92YWxpZGF0ZV9tb2RlKGNvbW1hbmRfbGluZV9wYXJhbXMgJm9wdHMpCiB7Ci0JY29uc3QgYm9vbCB2YWxpZGF0ZV9mbGFnID0gKG9wdHMubV9tb2RlID09IGNWYWxpZGF0ZSk7Ci0JYmFzaXN0OjpldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayBzZWxfY29kZWJvb2soYmFzaXN0OjpnX2dsb2JhbF9zZWxlY3Rvcl9jYl9zaXplLCBiYXNpc3Q6OmdfZ2xvYmFsX3NlbGVjdG9yX2NiKTsKKwlpbnRlcnZhbF90aW1lciB0bTsKKwl0bS5zdGFydCgpOwogCisJLy9jb25zdCBib29sIHZhbGlkYXRlX2ZsYWcgPSAob3B0cy5tX21vZGUgPT0gY1ZhbGlkYXRlKTsKKwkJCiAJYmFzaXNfZGF0YSogcEdsb2JhbF9jb2RlYm9va19kYXRhID0gbnVsbHB0cjsKIAlpZiAob3B0cy5tX2V0YzFzX3VzZV9nbG9iYWxfY29kZWJvb2tzX2ZpbGUuc2l6ZSgpKQogCXsKLQkJcEdsb2JhbF9jb2RlYm9va19kYXRhID0gbG9hZF9iYXNpc19maWxlKG9wdHMubV9ldGMxc191c2VfZ2xvYmFsX2NvZGVib29rc19maWxlLmNfc3RyKCksIHNlbF9jb2RlYm9vaywgdHJ1ZSk7CisJCXBHbG9iYWxfY29kZWJvb2tfZGF0YSA9IGxvYWRfYmFzaXNfZmlsZShvcHRzLm1fZXRjMXNfdXNlX2dsb2JhbF9jb2RlYm9va3NfZmlsZS5jX3N0cigpLCB0cnVlKTsKIAkJaWYgKCFwR2xvYmFsX2NvZGVib29rX2RhdGEpCiAJCXsKIAkJCWVycm9yX3ByaW50ZigiRmFpbGVkIGxvYWRpbmcgZ2xvYmFsIGNvZGVib29rIGRhdGEgZnJvbSBmaWxlIFwiJXNcIlxuIiwgb3B0cy5tX2V0YzFzX3VzZV9nbG9iYWxfY29kZWJvb2tzX2ZpbGUuY19zdHIoKSk7CkBAIC0yMzYyLDcgKzI1NjksNiBAQAogCQkJCW9wdHMsCiAJCQkJcENTVl9maWxlLAogCQkJCXBHbG9iYWxfY29kZWJvb2tfZGF0YSwKLQkJCQlzZWxfY29kZWJvb2ssCiAJCQkJdG90YWxfdW5wYWNrX3dhcm5pbmdzLAogCQkJCXRvdGFsX3B2cnRjX25vbnBvdzJfd2FybmluZ3MpOwogCQl9CkBAIC0yMzc1LDcgKzI1ODEsNiBAQAogCQkJCW9wdHMsCiAJCQkJcENTVl9maWxlLAogCQkJCXBHbG9iYWxfY29kZWJvb2tfZGF0YSwKLQkJCQlzZWxfY29kZWJvb2ssCiAJCQkJdG90YWxfdW5wYWNrX3dhcm5pbmdzLAogCQkJCXRvdGFsX3B2cnRjX25vbnBvdzJfd2FybmluZ3MpOwogCQl9CkBAIC0yNDAxLDYgKzI2MDYsOCBAQAogCWVsc2UKIAkJcHJpbnRmKCJTdWNjZXNzXG4iKTsKIAorCWRlYnVnX3ByaW50ZigiRWxhcHNlZCB0aW1lOiAlMy4zZiBzZWNzXG4iLCB0bS5nZXRfZWxhcHNlZF9zZWNzKCkpOworCiAJaWYgKHBDU1ZfZmlsZSkKIAl7CiAJCWZjbG9zZShwQ1NWX2ZpbGUpOwpAQCAtMjUyMCwxMSArMjcyNywyNzcgQEAKIAkKIAlzYXZlX3BuZygiZGVsdGFfaW1nX2EucG5nIiwgZGVsdGFfaW1nLCBjSW1hZ2VTYXZlR3JheXNjYWxlLCAzKTsKIAlwcmludGYoIldyb3RlIGRlbHRhX2ltZ19hLnBuZ1xuIik7CisKKwl1aW50MzJfdCBiaW5zWzVdWzUxMl07CisJY2xlYXJfb2JqKGJpbnMpOworCisJcnVubmluZ19zdGF0IGRlbHRhX3N0YXRzWzVdOworCWJhc2lzdTo6cmFuZCBybTsKKworCWRvdWJsZSBhdmdbNV07CisJY2xlYXJfb2JqKGF2Zyk7CisKKwlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgYS5nZXRfaGVpZ2h0KCk7IHkrKykKKwl7CisJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCBhLmdldF93aWR0aCgpOyB4KyspCisJCXsKKwkJCS8vY29sb3JfcmdiYSYgZCA9IGRlbHRhX2ltZyh4LCB5KTsKKworCQkJZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspCisJCQl7CisJCQkJaW50IGRlbHRhID0gYSh4LCB5KVtjXSAtIGIoeCwgeSlbY107CisJCQkJCisJCQkJLy9kZWx0YSA9IGNsYW1wPGludD4oKGludClzdGQ6OnJvdW5kKHJtLmdhdXNzaWFuKDcwLjBmLCAxMC4wZikpLCAtMjU1LCAyNTUpOworCQkJCQorCQkJCWJpbnNbY11bZGVsdGEgKyAyNTZdKys7CisJCQkJZGVsdGFfc3RhdHNbY10ucHVzaChkZWx0YSk7CisKKwkJCQlhdmdbY10gKz0gZGVsdGE7CisJCQl9CisJCQkKKwkJCWludCB5X2RlbHRhID0gYSh4LCB5KS5nZXRfNzA5X2x1bWEoKSAtIGIoeCwgeSkuZ2V0XzcwOV9sdW1hKCk7CisJCQliaW5zWzRdW3lfZGVsdGEgKyAyNTZdKys7CisJCQlkZWx0YV9zdGF0c1s0XS5wdXNoKHlfZGVsdGEpOworCQkJCisJCQlhdmdbNF0gKz0geV9kZWx0YTsKKworCQl9IC8vIHgKKwl9IC8vIHkKKworCWZvciAodWludDMyX3QgaSA9IDA7IGkgPD0gNDsgaSsrKQorCQlhdmdbaV0gLz0gYS5nZXRfdG90YWxfcGl4ZWxzKCk7CisKKwlwcmludGYoIlxuIik7CisKKwkvL2JpbnNbMl1bMjU2Ky0yNTVdID0gMTAwMDAwOworCS8vYmluc1syXVsyNTYtNTZdID0gNTAwMDA7CisKKwljb25zdCB1aW50MzJfdCBYX1NJWkUgPSAxMjgsIFlfU0laRSA9IDQwOworCisJZm9yICh1aW50MzJfdCBjID0gMDsgYyA8PSA0OyBjKyspCisJeworCQlzdGQ6OnZlY3Rvcjx1aW50OF90PiBwbG90W1lfU0laRSArIDFdOworCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgWV9TSVpFOyBpKyspCisJCXsKKwkJCXBsb3RbaV0ucmVzaXplKFhfU0laRSArIDIpOworCQkJbWVtc2V0KHBsb3RbaV0uZGF0YSgpLCAnICcsIFhfU0laRSArIDEpOworCQl9CisKKwkJdWludDMyX3QgbWF4X3ZhbCA9IDA7CisJCWludCBtYXhfdmFsX2Jpbl9pbmRleCA9IDA7CisJCWludCBsb3dlc3RfYmluX2luZGV4ID0gSU5UX01BWCwgaGlnaGVzdF9iaW5faW5kZXggPSBJTlRfTUlOOworCQlkb3VibGUgYXZnX3ZhbCA9IDA7CisJCWRvdWJsZSB0b3RhbF92YWwgPSAwOworCQlydW5uaW5nX3N0YXQgYmluX3N0YXRzOworCisJCWZvciAoaW50IHkgPSAtMjU1OyB5IDw9IDI1NTsgeSsrKQorCQl7CisJCQl1aW50MzJfdCB2YWwgPSBiaW5zW2NdWzI1NiArIHldOworCQkJaWYgKCF2YWwpCisJCQkJY29udGludWU7CisKKwkJCWJpbl9zdGF0cy5wdXNoKHkpOworCQkJCisJCQl0b3RhbF92YWwgKz0gKGRvdWJsZSl2YWw7CisKKwkJCWxvd2VzdF9iaW5faW5kZXggPSBtaW5pbXVtKGxvd2VzdF9iaW5faW5kZXgsIHkpOworCQkJaGlnaGVzdF9iaW5faW5kZXggPSBtYXhpbXVtKGhpZ2hlc3RfYmluX2luZGV4LCB5KTsKKworCQkJaWYgKHZhbCA+IG1heF92YWwpCisJCQl7CisJCQkJbWF4X3ZhbCA9IHZhbDsKKwkJCQltYXhfdmFsX2Jpbl9pbmRleCA9IHk7CisJCQl9CisJCQlhdmdfdmFsICs9IHkgKiAoZG91YmxlKXZhbDsKKwkJfQorCQlhdmdfdmFsIC89IHRvdGFsX3ZhbDsKKworCQlpbnQgbG9fbGltaXQgPSAtKGludClYX1NJWkUgLyAyOworCQlpbnQgaGlfbGltaXQgPSBYX1NJWkUgLyAyOworCQlmb3IgKGludCB4ID0gbG9fbGltaXQ7IHggPD0gaGlfbGltaXQ7IHgrKykKKwkJeworCQkJdWludDMyX3QgdG90YWwgPSAwOworCQkJaWYgKHggPT0gbG9fbGltaXQpCisJCQl7CisJCQkJZm9yIChpbnQgaSA9IC0yNTU7IGkgPD0gbG9fbGltaXQ7IGkrKykKKwkJCQkJdG90YWwgKz0gYmluc1tjXVsyNTYgKyBpXTsKKwkJCX0KKwkJCWVsc2UgaWYgKHggPT0gaGlfbGltaXQpCisJCQl7CisJCQkJZm9yIChpbnQgaSA9IGhpX2xpbWl0OyBpIDw9IDI1NTsgaSsrKQorCQkJCQl0b3RhbCArPSBiaW5zW2NdWzI1NiArIGldOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRvdGFsID0gYmluc1tjXVsyNTYgKyB4XTsKKwkJCX0KKworCQkJdWludDMyX3QgaGVpZ2h0ID0gbWF4X3ZhbCA/ICh0b3RhbCAqIFlfU0laRSArIG1heF92YWwgLSAxKSAvIG1heF92YWwgOiAwOworCQkJCisJCQlpZiAoaGVpZ2h0KQorCQkJeworCQkJCWZvciAodWludDMyX3QgeSA9IChZX1NJWkUgLSAxKSAtIChoZWlnaHQgLSAxKTsgeSA8PSAoWV9TSVpFIC0gMSk7IHkrKykKKwkJCQkJcGxvdFt5XVt4ICsgWF9TSVpFIC8gMl0gPSAnKic7CisJCQl9CisJCX0KKworCQlwcmludGYoIiVjIGRlbHRhIGhpc3RvZ3JhbTogdG90YWwgc2FtcGxlczogJTUuMGYsIG1heCBiaW4gdmFsdWU6ICV1IGluZGV4OiAlaSAoJTMuM2YlJSBvZiB0b3RhbCksIHJhbmdlICVpIFslaSwlaV0sIHdlaWdodGVkIG1lYW46ICVmXG4iLCAiUkdCQVkiW2NdLCB0b3RhbF92YWwsIG1heF92YWwsIG1heF92YWxfYmluX2luZGV4LCBtYXhfdmFsICogMTAwLjBmIC8gdG90YWxfdmFsLCBoaWdoZXN0X2Jpbl9pbmRleCAtIGxvd2VzdF9iaW5faW5kZXggKyAxLCBsb3dlc3RfYmluX2luZGV4LCBoaWdoZXN0X2Jpbl9pbmRleCwgYXZnX3ZhbCk7CisJCXByaW50ZigiYmluIG1lYW46ICVmLCBiaW4gc3RkIGRldmlhdGlvbjogJWYsIG5vbi16ZXJvIGJpbnM6ICV1XG4iLCBiaW5fc3RhdHMuZ2V0X21lYW4oKSwgYmluX3N0YXRzLmdldF9zdGRfZGV2KCksIGJpbl9zdGF0cy5nZXRfbnVtKCkpOworCQlwcmludGYoImRlbHRhIG1lYW46ICVmLCBkZWx0YSBzdGQgZGV2aWF0aW9uOiAlZlxuIiwgZGVsdGFfc3RhdHNbY10uZ2V0X21lYW4oKSwgZGVsdGFfc3RhdHNbY10uZ2V0X3N0ZF9kZXYoKSk7CisJCXByaW50ZigiXG4iKTsKKworCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgWV9TSVpFOyB5KyspCisJCQlwcmludGYoIiVzXG4iLCAoY2hhciopcGxvdFt5XS5kYXRhKCkpOworCisJCWNoYXIgdGljc1sxMDI0XTsKKwkJdGljc1swXSA9ICdcMCc7CisJCWNoYXIgdGljczJbMTAyNF07CisJCXRpY3MyWzBdID0gJ1wwJzsKKworCQlmb3IgKGludCB4ID0gMDsgeCA8PSAoaW50KVhfU0laRTsgeCsrKQorCQl7CisJCQljaGFyIGJ1Zls2NF07CisJCQlpZiAoeCA9PSBYX1NJWkUgLyAyKQorCQkJeworCQkJCXdoaWxlICgoaW50KXN0cmxlbih0aWNzKSA8IHgpCisJCQkJCXN0cmNhdCh0aWNzLCAiLiIpOworCQkJCQorCQkJCXdoaWxlICgoaW50KXN0cmxlbih0aWNzMikgPCB4KQorCQkJCQlzdHJjYXQodGljczIsICIgIik7CisKKwkJCQlzcHJpbnRmKGJ1ZiwgIjAiKTsKKwkJCQlzdHJjYXQodGljcywgYnVmKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCgoeCAmIDcpID09IDApIHx8ICh4ID09IFhfU0laRSkpCisJCQl7CisJCQkJd2hpbGUgKChpbnQpc3RybGVuKHRpY3MpIDwgeCkKKwkJCQkJc3RyY2F0KHRpY3MsICIuIik7CisJCQkJCisJCQkJd2hpbGUgKChpbnQpc3RybGVuKHRpY3MyKSA8IHgpCisJCQkJCXN0cmNhdCh0aWNzMiwgIiAiKTsKKworCQkJCWludCB2ID0gKHggLSAoaW50KVhfU0laRSAvIDIpOworCQkJCXNwcmludGYoYnVmLCAiJWkiLCB2IC8gMTApOworCQkJCXN0cmNhdCh0aWNzLCBidWYpOworCQkJCQorCQkJCWlmICh2IDwgMCkKKwkJCQl7CisJCQkJCWlmICgtdiA8IDEwKQorCQkJCQkJc3ByaW50ZihidWYsICIlaSIsIHYgJSAxMCk7CisJCQkJCWVsc2UKKwkJCQkJCXNwcmludGYoYnVmLCAiICVpIiwgLXYgJSAxMCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJc3ByaW50ZihidWYsICIlaSIsIHYgJSAxMCk7CisJCQkJc3RyY2F0KHRpY3MyLCBidWYpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXdoaWxlICgoaW50KXN0cmxlbih0aWNzKSA8IHgpCisJCQkJCXN0cmNhdCh0aWNzLCAiLiIpOworCQkJfQorCQl9CisJCXByaW50ZigiJXNcbiIsIHRpY3MpOworCQlwcmludGYoIiVzXG4iLCB0aWNzMik7CisKKwkJcHJpbnRmKCJcbiIpOworCX0KIAkKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotI2luY2x1ZGUgImVuY29kZXIvYmFzaXN1X2FzdGNfZGVjb21wLmgiCitzdGF0aWMgYm9vbCBzcGxpdF9pbWFnZV9tb2RlKGNvbW1hbmRfbGluZV9wYXJhbXMmIG9wdHMpCit7CisJaWYgKG9wdHMubV9pbnB1dF9maWxlbmFtZXMuc2l6ZSgpICE9IDEpCisJeworCQllcnJvcl9wcmludGYoIk11c3Qgc3BlY2lmeSBvbmUgaW1hZ2UgZmlsZW5hbWUgdXNpbmcgLWZpbGVcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaW1hZ2UgYTsKKwlpZiAoIWxvYWRfaW1hZ2Uob3B0cy5tX2lucHV0X2ZpbGVuYW1lc1swXS5jX3N0cigpLCBhKSkKKwl7CisJCWVycm9yX3ByaW50ZigiRmFpbGVkIGxvYWRpbmcgaW1hZ2UgZnJvbSBmaWxlIFwiJXNcIiFcbiIsIG9wdHMubV9pbnB1dF9maWxlbmFtZXNbMF0uY19zdHIoKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcmludGYoIkxvYWRlZCBcIiVzXCIsICV1eCV1LCBoYXMgYWxwaGE6ICV1XG4iLCBvcHRzLm1faW5wdXRfZmlsZW5hbWVzWzBdLmNfc3RyKCksIGEuZ2V0X3dpZHRoKCksIGEuZ2V0X2hlaWdodCgpLCBhLmhhc19hbHBoYSgpKTsKKworCWlmICghc2F2ZV9wbmcoInNwbGl0X3JnYi5wbmciLCBhLCBjSW1hZ2VTYXZlSWdub3JlQWxwaGEpKQorCXsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgd3JpdGluZyBmaWxlIHNwbGl0X3JnYi5wbmdcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXByaW50ZigiV3JvdGUgZmlsZSBzcGxpdF9yZ2IucG5nXG4iKTsKKworCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQljaGFyIGJ1ZlsyNTZdOworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAic3BsaXRfJWMucG5nIiwgIlJHQkEiW2ldKTsKKwkJaWYgKCFzYXZlX3BuZyhidWYsIGEsIGNJbWFnZVNhdmVHcmF5c2NhbGUsIGkpKQorCQl7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB3cml0aW5nIGZpbGUgJXNcbiIsIGJ1Zik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcHJpbnRmKCJXcm90ZSBmaWxlICVzXG4iLCBidWYpOworCX0KKwkKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY29tYmluZV9pbWFnZXNfbW9kZShjb21tYW5kX2xpbmVfcGFyYW1zJiBvcHRzKQoreworCWlmIChvcHRzLm1faW5wdXRfZmlsZW5hbWVzLnNpemUoKSAhPSAyKQorCXsKKwkJZXJyb3JfcHJpbnRmKCJNdXN0IHNwZWNpZnkgdHdvIGltYWdlIGZpbGVuYW1lIHVzaW5nIC1maWxlXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWltYWdlIGEsIGI7CisJaWYgKCFsb2FkX2ltYWdlKG9wdHMubV9pbnB1dF9maWxlbmFtZXNbMF0uY19zdHIoKSwgYSkpCisJeworCQllcnJvcl9wcmludGYoIkZhaWxlZCBsb2FkaW5nIGltYWdlIGZyb20gZmlsZSBcIiVzXCIhXG4iLCBvcHRzLm1faW5wdXRfZmlsZW5hbWVzWzBdLmNfc3RyKCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpbnRmKCJMb2FkZWQgXCIlc1wiLCAldXgldSwgaGFzIGFscGhhOiAldVxuIiwgb3B0cy5tX2lucHV0X2ZpbGVuYW1lc1swXS5jX3N0cigpLCBhLmdldF93aWR0aCgpLCBhLmdldF9oZWlnaHQoKSwgYS5oYXNfYWxwaGEoKSk7CisKKwlpZiAoIWxvYWRfaW1hZ2Uob3B0cy5tX2lucHV0X2ZpbGVuYW1lc1sxXS5jX3N0cigpLCBiKSkKKwl7CisJCWVycm9yX3ByaW50ZigiRmFpbGVkIGxvYWRpbmcgaW1hZ2UgZnJvbSBmaWxlIFwiJXNcIiFcbiIsIG9wdHMubV9pbnB1dF9maWxlbmFtZXNbMV0uY19zdHIoKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcmludGYoIkxvYWRlZCBcIiVzXCIsICV1eCV1LCBoYXMgYWxwaGE6ICV1XG4iLCBvcHRzLm1faW5wdXRfZmlsZW5hbWVzWzFdLmNfc3RyKCksIGIuZ2V0X3dpZHRoKCksIGIuZ2V0X2hlaWdodCgpLCBiLmhhc19hbHBoYSgpKTsKKworCWNvbnN0IHVpbnQzMl90IHdpZHRoID0gbWluaW11bShhLmdldF93aWR0aCgpLCBiLmdldF93aWR0aCgpKTsKKwljb25zdCB1aW50MzJfdCBoZWlnaHQgPSBtaW5pbXVtKGIuZ2V0X2hlaWdodCgpLCBiLmdldF9oZWlnaHQoKSk7CisKKwlpbWFnZSBjb21iaW5lZF9pbWcod2lkdGgsIGhlaWdodCk7CisJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCXsKKwkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisJCXsKKwkJCWNvbWJpbmVkX2ltZyh4LCB5KSA9IGEoeCwgeSk7CisJCQljb21iaW5lZF9pbWcoeCwgeSkuYSA9IGIoeCwgeSkuZzsKKwkJfQorCX0KKworCWNvbnN0IGNoYXIqIHBPdXRwdXRfZmlsZW5hbWUgPSAiY29tYmluZWQucG5nIjsKKwlpZiAob3B0cy5tX291dHB1dF9maWxlbmFtZS5zaXplKCkpCisJCXBPdXRwdXRfZmlsZW5hbWUgPSBvcHRzLm1fb3V0cHV0X2ZpbGVuYW1lLmNfc3RyKCk7CisJCQorCWlmICghc2F2ZV9wbmcocE91dHB1dF9maWxlbmFtZSwgY29tYmluZWRfaW1nKSkKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHdyaXRpbmcgZmlsZSAlc1xuIiwgcE91dHB1dF9maWxlbmFtZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcHJpbnRmKCJXcm90ZSBmaWxlICVzXG4iLCBwT3V0cHV0X2ZpbGVuYW1lKTsKKworCXJldHVybiB0cnVlOworfQorCisvLyNpbmNsdWRlICJlbmNvZGVyL2Jhc2lzdV9hc3RjX2RlY29tcC5oIgogI2luY2x1ZGUgImVuY29kZXIvYmFzaXN1X3B2cnRjMV80LmgiCiAKIHN0YXRpYyBib29sIGJlbmNoX21vZGUoY29tbWFuZF9saW5lX3BhcmFtcyYgb3B0cykKQEAgLTMwMzIsNyArMzUwNSw3IEBACiAJCQkJCQl0cmFuc2NvZGVfdWFzdGNfdG9fYXN0YyhlbmNvZGVkX3Vhc3RjX2JsaywgdGFzdGNfZGF0YSk7CiAKIAkJCQkJCWNvbG9yX3JnYmEgZGVjb2RlZF90YXN0Y19ibG9ja1s0XVs0XTsKLQkJCQkJCWJhc2lzdV9hc3RjOjphc3RjOjpkZWNvbXByZXNzKCh1aW50OF90KilkZWNvZGVkX3Rhc3RjX2Jsb2NrLCAodWludDhfdCopJnRhc3RjX2RhdGEsIGZhbHNlLCA0LCA0KTsKKwkJCQkJCS8vYmFzaXN1X2FzdGM6OmFzdGM6OmRlY29tcHJlc3MoKHVpbnQ4X3QqKWRlY29kZWRfdGFzdGNfYmxvY2ssICh1aW50OF90KikmdGFzdGNfZGF0YSwgZmFsc2UsIDQsIDQpOwogCiAJCQkJCQl1YXN0YzJfaW1nLnNldF9ibG9ja19jbGlwcGVkKCZkZWNvZGVkX3Rhc3RjX2Jsb2NrWzBdWzBdLCBibG9ja194ICogNCwgYmxvY2tfeSAqIDQsIDQsIDQpOwogCkBAIC0zNzA2LDE0ICs0MTc5LDIwMSBAQAogCXJldHVybiB0cnVlOwogfQogCitjb25zdCBzdHJ1Y3QgdGVzdF9maWxlCit7CisJY29uc3QgY2hhciogbV9wRmlsZW5hbWU7CisJdWludDMyX3QgbV9ldGMxc19zaXplOworCWZsb2F0IG1fZXRjMXNfcHNucjsKKwlmbG9hdCBtX3Vhc3RjX3BzbnI7Cit9IGdfdGVzdF9maWxlc1tdID0gCit7CisJeyAiYmxhY2tfMXgxLnBuZyIsIDE4OSwgMTAwLjBmLCAxMDAuMGYgfSwKKwl7ICJrb2RpbTAxLnBuZyIsIDMwOTkzLCAyNy40MGYsIDQ0LjE0ZiB9LAorCXsgImtvZGltMDIucG5nIiwgMjg1MjksIDMyLjIwZiwgNDEuMDZmIH0sCisJeyAia29kaW0wMy5wbmciLCAyMzQxMSwgMzIuNTdmLCA0NC44N2YgfSwKKwl7ICJrb2RpbTA0LnBuZyIsIDI4MjU2LCAzMS43NmYsIDQzLjAyZiB9LAorCXsgImtvZGltMDUucG5nIiwgMzI2NDYsIDI1Ljk0ZiwgNDAuMjhmIH0sCisJeyAia29kaW0wNi5wbmciLCAyNzMzNiwgMjguNjZmLCA0NC41N2YgfSwKKwl7ICJrb2RpbTA3LnBuZyIsIDI2NjE4LCAzMS41MWYsIDQzLjk0ZiB9LAorCXsgImtvZGltMDgucG5nIiwgMzExMzMsIDI1LjI4ZiwgNDEuMTVmIH0sCisJeyAia29kaW0wOS5wbmciLCAyNDc3NywgMzIuMDVmLCA0NS44NWYgfSwKKwl7ICJrb2RpbTEwLnBuZyIsIDI3MjQ3LCAzMi4yMGYsIDQ1Ljc3ZiB9LAorCXsgImtvZGltMTEucG5nIiwgMjY1NzksIDI5LjIyZiwgNDMuNjhmIH0sCisJeyAia29kaW0xMi5wbmciLCAyNTEwMiwgMzIuOTZmLCA0Ni43N2YgfSwKKwl7ICJrb2RpbTEzLnBuZyIsIDMxNjA0LCAyNC4yNWYsIDQxLjI1ZiB9LAorCXsgImtvZGltMTQucG5nIiwgMzExNjIsIDI3LjgxZiwgMzkuNjVmIH0sCisJeyAia29kaW0xNS5wbmciLCAyNTUyOCwgMzEuMjZmLCA0Mi44N2YgfSwKKwl7ICJrb2RpbTE2LnBuZyIsIDI2ODk0LCAzMi4yMWYsIDQ3Ljc4ZiB9LAorCXsgImtvZGltMTcucG5nIiwgMjkzMzQsIDMxLjQwZiwgNDUuNjZmIH0sCisJeyAia29kaW0xOC5wbmciLCAzMDkyOSwgMjcuNDZmLCA0MS41NGYgfSwKKwl7ICJrb2RpbTE5LnBuZyIsIDI3ODg5LCAyOS42OWYsIDQ0Ljk1ZiB9LAorCXsgImtvZGltMjAucG5nIiwgMjExMDQsIDMxLjMwZiwgNDUuMzFmIH0sCisJeyAia29kaW0yMS5wbmciLCAyNTk0MywgMjguNTNmLCA0NC40NWYgfSwKKwl7ICJrb2RpbTIyLnBuZyIsIDI5Mjc3LCAyOS44NWYsIDQyLjYzZiB9LAorCXsgImtvZGltMjMucG5nIiwgMjM1NTAsIDMxLjY5ZiwgNDUuMTFmIH0sCisJeyAia29kaW0yNC5wbmciLCAyOTYxMywgMjYuNzVmLCA0MC42MWYgfSwKKwl7ICJ3aGl0ZV8xeDEucG5nIiwgMTg5LCAxMDAuMGYsIDEwMC4wZiB9LAorCXsgIndpa2lwZWRpYS5wbmciLCAzODk2MSwgMjQuMTBmLCAzMC40N2YgfSwKKwl7ICJhbHBoYTAucG5nIiwgNzY2LCAxMDAuMGYsIDU2LjE2ZiB9Cit9OworY29uc3QgdWludDMyX3QgVE9UQUxfVEVTVF9GSUxFUyA9IHNpemVvZihnX3Rlc3RfZmlsZXMpIC8gc2l6ZW9mKGdfdGVzdF9maWxlc1swXSk7CisKK3N0YXRpYyBib29sIHRlc3RfbW9kZShjb21tYW5kX2xpbmVfcGFyYW1zJiBvcHRzKQoreworCXVpbnQzMl90IHRvdGFsX21pc21hdGNoZXMgPSAwOworCisJLy8gVE9ETzogUmVjb3JkIG1pbi9tYXgvYXZncworCS8vIFRPRE86IEFkZCBhbm90aGVyIEVUQzFTIHF1YWxpdHkgbGV2ZWwKKworCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBUT1RBTF9URVNUX0ZJTEVTOyBpKyspCisJeworCQlzdGQ6OnN0cmluZyBmaWxlbmFtZShvcHRzLm1fdGVzdF9maWxlX2Rpcik7CisJCWlmIChmaWxlbmFtZS5zaXplKCkpCisJCXsKKwkJCWZpbGVuYW1lLnB1c2hfYmFjaygnLycpOworCQl9CisJCWZpbGVuYW1lICs9IHN0ZDo6c3RyaW5nKGdfdGVzdF9maWxlc1tpXS5tX3BGaWxlbmFtZSk7CisKKwkJYmFzaXN1Ojp2ZWN0b3I8aW1hZ2U+IHNvdXJjZV9pbWFnZXMoMSk7CisKKwkJaW1hZ2UmIHNvdXJjZV9pbWFnZSA9IHNvdXJjZV9pbWFnZXNbMF07CisJCWlmICghbG9hZF9wbmcoZmlsZW5hbWUuY19zdHIoKSwgc291cmNlX2ltYWdlKSkKKwkJeworCQkJZXJyb3JfcHJpbnRmKCJGYWlsZWQgbG9hZGluZyB0ZXN0IGltYWdlIFwiJXNcIlxuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlwcmludGYoIkxvYWRlZCBmaWxlIFwiJXNcIiwgZGltZW1zaW9ucyAldXgldSBoYXMgYWxwaGE6ICV1XG4iLCBmaWxlbmFtZS5jX3N0cigpLCBzb3VyY2VfaW1hZ2UuZ2V0X3dpZHRoKCksIHNvdXJjZV9pbWFnZS5nZXRfaGVpZ2h0KCksIHNvdXJjZV9pbWFnZS5oYXNfYWxwaGEoKSk7CisKKwkJaW1hZ2Vfc3RhdHMgc3RhdHM7CisKKwkJdWludDMyX3QgZmxhZ3NfYW5kX3F1YWxpdHk7CisJCWZsb2F0IHVhc3RjX3Jkb19xdWFsaXR5ID0gMC4wZjsKKwkJc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisKKwkJLy8gVGVzdCBFVEMxUworCQlmbGFnc19hbmRfcXVhbGl0eSA9IChvcHRzLm1fY29tcF9wYXJhbXMubV9tdWx0aXRocmVhZGluZyA/IGNGbGFnVGhyZWFkZWQgOiAwKTsKKworCQl2b2lkKiBwRGF0YSA9IGJhc2lzX2NvbXByZXNzKHNvdXJjZV9pbWFnZXMsIGZsYWdzX2FuZF9xdWFsaXR5LCB1YXN0Y19yZG9fcXVhbGl0eSwgJmRhdGFfc2l6ZSwgJnN0YXRzKTsKKwkJaWYgKCFwRGF0YSkKKwkJeworCQkJZXJyb3JfcHJpbnRmKCJiYXNpc19jb21wcmVzcygpIGZhaWxlZCFcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJhc2lzX2ZyZWVfZGF0YShwRGF0YSk7CisKKwkJcHJpbnRmKCJFVEMxUyBTaXplOiAldSwgUFNOUjogJWZcbiIsICh1aW50MzJfdClkYXRhX3NpemUsIHN0YXRzLm1fYmFzaXNfcmdiYV9hdmdfcHNucik7CisKKwkJZmxvYXQgZmlsZV9zaXplX3JhdGlvID0gZmFicygoZGF0YV9zaXplIC8gKGZsb2F0KWdfdGVzdF9maWxlc1tpXS5tX2V0YzFzX3NpemUpIC0gMS4wZik7CisJCWlmIChmaWxlX3NpemVfcmF0aW8gPiAuMDE1ZikKKwkJeworCQkJZXJyb3JfcHJpbnRmKCJFeHBlY3RlZCBFVEMxUyBmaWxlIHNpemUgd2FzICV1LCBidXQgZ290ICV1IGluc3RlYWQhXG4iLCBnX3Rlc3RfZmlsZXNbaV0ubV9ldGMxc19zaXplLCAodWludDMyX3QpZGF0YV9zaXplKTsKKwkJCXRvdGFsX21pc21hdGNoZXMrKzsKKwkJfQorCisJCWlmIChmYWJzKHN0YXRzLm1fYmFzaXNfcmdiYV9hdmdfcHNuciAtIGdfdGVzdF9maWxlc1tpXS5tX2V0YzFzX3BzbnIpID4gLjAyZikKKwkJeworCQkJZXJyb3JfcHJpbnRmKCJFeHBlY3RlZCBFVEMxUyBSR0JBIEF2ZyBQU05SIHdhcyAlZiwgYnV0IGdvdCAlZiBpbnN0ZWFkIVxuIiwgZ190ZXN0X2ZpbGVzW2ldLm1fZXRjMXNfcHNuciwgc3RhdHMubV9iYXNpc19yZ2JhX2F2Z19wc25yKTsKKwkJCXRvdGFsX21pc21hdGNoZXMrKzsKKwkJfQorCisJCWlmIChvcGVuY2xfaXNfYXZhaWxhYmxlKCkpCisJCXsKKwkJCWZsYWdzX2FuZF9xdWFsaXR5ID0gKG9wdHMubV9jb21wX3BhcmFtcy5tX211bHRpdGhyZWFkaW5nID8gY0ZsYWdUaHJlYWRlZCA6IDApIHwgY0ZsYWdVc2VPcGVuQ0w7CisKKwkJCXBEYXRhID0gYmFzaXNfY29tcHJlc3Moc291cmNlX2ltYWdlcywgZmxhZ3NfYW5kX3F1YWxpdHksIHVhc3RjX3Jkb19xdWFsaXR5LCAmZGF0YV9zaXplLCAmc3RhdHMpOworCQkJaWYgKCFwRGF0YSkKKwkJCXsKKwkJCQllcnJvcl9wcmludGYoImJhc2lzX2NvbXByZXNzKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJYmFzaXNfZnJlZV9kYXRhKHBEYXRhKTsKKworCQkJcHJpbnRmKCJFVEMxUytPcGVuQ0wgU2l6ZTogJXUsIFBTTlI6ICVmXG4iLCAodWludDMyX3QpZGF0YV9zaXplLCBzdGF0cy5tX2Jhc2lzX3JnYmFfYXZnX3BzbnIpOworCisJCQlmaWxlX3NpemVfcmF0aW8gPSBmYWJzKChkYXRhX3NpemUgLyAoZmxvYXQpZ190ZXN0X2ZpbGVzW2ldLm1fZXRjMXNfc2l6ZSkgLSAxLjBmKTsKKwkJCWlmIChmaWxlX3NpemVfcmF0aW8gPiAuMDRmKQorCQkJeworCQkJCWVycm9yX3ByaW50ZigiRXhwZWN0ZWQgRVRDMVMrT3BlbkNMIGZpbGUgc2l6ZSB3YXMgJXUsIGJ1dCBnb3QgJXUgaW5zdGVhZCFcbiIsIGdfdGVzdF9maWxlc1tpXS5tX2V0YzFzX3NpemUsICh1aW50MzJfdClkYXRhX3NpemUpOworCQkJCXRvdGFsX21pc21hdGNoZXMrKzsKKwkJCX0KKworCQkJaWYgKGdfdGVzdF9maWxlc1tpXS5tX2V0YzFzX3BzbnIgPT0gMTAwLjBmKQorCQkJeworCQkJCS8vIFRPRE8KKwkJCQlpZiAoc3RhdHMubV9iYXNpc19yZ2JhX2F2Z19wc25yIDwgNjkuMGYpCisJCQkJeworCQkJCQllcnJvcl9wcmludGYoIkV4cGVjdGVkIEVUQzFTK09wZW5DTCBSR0JBIEF2ZyBQU05SIHdhcyAlZiwgYnV0IGdvdCAlZiBpbnN0ZWFkIVxuIiwgZ190ZXN0X2ZpbGVzW2ldLm1fZXRjMXNfcHNuciwgc3RhdHMubV9iYXNpc19yZ2JhX2F2Z19wc25yKTsKKwkJCQkJdG90YWxfbWlzbWF0Y2hlcysrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGZhYnMoc3RhdHMubV9iYXNpc19yZ2JhX2F2Z19wc25yIC0gZ190ZXN0X2ZpbGVzW2ldLm1fZXRjMXNfcHNucikgPiAuMmYpCisJCQl7CisJCQkJZXJyb3JfcHJpbnRmKCJFeHBlY3RlZCBFVEMxUytPcGVuQ0wgUkdCQSBBdmcgUFNOUiB3YXMgJWYsIGJ1dCBnb3QgJWYgaW5zdGVhZCFcbiIsIGdfdGVzdF9maWxlc1tpXS5tX2V0YzFzX3BzbnIsIHN0YXRzLm1fYmFzaXNfcmdiYV9hdmdfcHNucik7CisJCQkJdG90YWxfbWlzbWF0Y2hlcysrOworCQkJfQorCQl9CisKKwkJLy8gVGVzdCBVQVNUQworCQlmbGFnc19hbmRfcXVhbGl0eSA9IChvcHRzLm1fY29tcF9wYXJhbXMubV9tdWx0aXRocmVhZGluZyA/IGNGbGFnVGhyZWFkZWQgOiAwKSB8IGNGbGFnVUFTVEM7CisKKwkJcERhdGEgPSBiYXNpc19jb21wcmVzcyhzb3VyY2VfaW1hZ2VzLCBmbGFnc19hbmRfcXVhbGl0eSwgdWFzdGNfcmRvX3F1YWxpdHksICZkYXRhX3NpemUsICZzdGF0cyk7CisJCWlmICghcERhdGEpCisJCXsKKwkJCWVycm9yX3ByaW50ZigiYmFzaXNfY29tcHJlc3MoKSBmYWlsZWQhXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQliYXNpc19mcmVlX2RhdGEocERhdGEpOworCisJCXByaW50ZigiVUFTVEMgU2l6ZTogJXUsIFBTTlI6ICVmXG4iLCAodWludDMyX3QpZGF0YV9zaXplLCBzdGF0cy5tX2Jhc2lzX3JnYmFfYXZnX3BzbnIpOworCisJCWlmIChmYWJzKHN0YXRzLm1fYmFzaXNfcmdiYV9hdmdfcHNuciAtIGdfdGVzdF9maWxlc1tpXS5tX3Vhc3RjX3BzbnIpID4gLjAwNWYpCisJCXsKKwkJCWVycm9yX3ByaW50ZigiRXhwZWN0ZWQgVUFTVEMgUkdCQSBBdmcgUFNOUiB3YXMgJWYsIGJ1dCBnb3QgJWYgaW5zdGVhZCFcbiIsIGdfdGVzdF9maWxlc1tpXS5tX2V0YzFzX3BzbnIsIHN0YXRzLm1fYmFzaXNfcmdiYV9hdmdfcHNucik7CisJCQl0b3RhbF9taXNtYXRjaGVzKys7CisJCX0KKwl9CisKKwlwcmludGYoIlRvdGFsIG1pc21hdGNoZXM6ICV1XG4iLCB0b3RhbF9taXNtYXRjaGVzKTsKKworCWJvb2wgcmVzdWx0ID0gdHJ1ZTsKKwlpZiAodG90YWxfbWlzbWF0Y2hlcykKKwl7CisJCWVycm9yX3ByaW50ZigiVGVzdCBGQUlMRURcbiIpOworCQlyZXN1bHQgPSBmYWxzZTsKKwl9CisJZWxzZQorCQlwcmludGYoIlRlc3Qgc3VjY2VlZGVkXG4iKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKIHN0YXRpYyBpbnQgbWFpbl9pbnRlcm5hbChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCiB7Ci0JcHJpbnRmKCJCYXNpcyBVbml2ZXJzYWwgR1BVIFRleHR1cmUgQ29tcHJlc3NvciB2IiBCQVNJU1VfVE9PTF9WRVJTSU9OICJcbkNvcHlyaWdodCAoQykgMjAxOS0yMDIxIEJpbm9taWFsIExMQywgQWxsIHJpZ2h0cyByZXNlcnZlZFxuIik7CisJcHJpbnRmKCJCYXNpcyBVbml2ZXJzYWwgR1BVIFRleHR1cmUgQ29tcHJlc3NvciB2IiBCQVNJU1VfVE9PTF9WRVJTSU9OICJcbkNvcHlyaWdodCAoQykgMjAxOS0yMDIyIEJpbm9taWFsIExMQywgQWxsIHJpZ2h0cyByZXNlcnZlZFxuIik7CiAKIAkvL2ludGVydmFsX3RpbWVyIHRtOwogCS8vdG0uc3RhcnQoKTsKIAotCWJhc2lzdV9lbmNvZGVyX2luaXQoKTsKKwkvLyBTZWUgaWYgT3BlbkNMIHN1cHBvcnQgaGFzIGJlZW4gZGlzYWJsZWQuIFdlIGRvbid0IHdhbnQgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSB1bnRpbCB0aGUgbGliIGlzIGluaXRpYWxpemVkCisJYm9vbCB1c2Vfb3BlbmNsID0gZmFsc2U7CisJYm9vbCBvcGVuY2xfZm9yY2Vfc2VyaWFsaXphdGlvbiA9IGZhbHNlOworCWZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorCXsKKwkJaWYgKHN0cmNtcChhcmd2W2ldLCAiLW9wZW5jbCIpID09IDApCisJCQl1c2Vfb3BlbmNsID0gdHJ1ZTsKKwkJaWYgKHN0cmNtcChhcmd2W2ldLCAiLW9wZW5jbF9zZXJpYWxpemUiKSA9PSAwKQorCQkJb3BlbmNsX2ZvcmNlX3NlcmlhbGl6YXRpb24gPSB0cnVlOworCX0KKworI2lmbmRlZiBCQVNJU1VfU1VQUE9SVF9PUEVOQ0wKKwlpZiAodXNlX29wZW5jbCkKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogLW9wZW5jbCBzcGVjaWZpZWQsIGJ1dCBPcGVuQ0wgc3VwcG9ydCB3YXMgbm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lISBXaXRoIGNtYWtlLCB1c2UgLUQgT1BFTkNMPTEuIEZhbGxpbmcgYmFjayB0byBDUFUgY29tcHJlc3Npb24uXG4iKTsKKwl9CisjZW5kaWYKKworCWJhc2lzdV9lbmNvZGVyX2luaXQodXNlX29wZW5jbCwgb3BlbmNsX2ZvcmNlX3NlcmlhbGl6YXRpb24pOwogCQkKIAkvL3ByaW50ZigiRW5jb2RlciBhbmQgdHJhbnNjb2RlciBsaWJyYXJpZXMgaW5pdGlhbGl6ZWQgaW4gJTMuM2YgbXNcbiIsIHRtLmdldF9lbGFwc2VkX21zKCkpOwogCkBAIC0zNzM1LDkgKzQzOTUsOSBAQAogCX0KIAogI2lmIEJBU0lTVV9TVVBQT1JUX1NTRQotCXByaW50ZigiVXNpbmcgU1NFIDQuMTogJXUsIE11bHRpdGhyZWFkaW5nOiAldSwgWnN0YW5kYXJkIHN1cHBvcnQ6ICV1XG4iLCBnX2NwdV9zdXBwb3J0c19zc2U0MSwgKHVpbnQzMl90KW9wdHMubV9jb21wX3BhcmFtcy5tX211bHRpdGhyZWFkaW5nLCBiYXNpc3Q6OmJhc2lzdV90cmFuc2NvZGVyX3N1cHBvcnRzX2t0eDJfenN0ZCgpKTsKKwlwcmludGYoIlVzaW5nIFNTRSA0LjE6ICV1LCBNdWx0aXRocmVhZGluZzogJXUsIFpzdGFuZGFyZCBzdXBwb3J0OiAldSwgT3BlbkNMOiAldVxuIiwgZ19jcHVfc3VwcG9ydHNfc3NlNDEsICh1aW50MzJfdClvcHRzLm1fY29tcF9wYXJhbXMubV9tdWx0aXRocmVhZGluZywgYmFzaXN0OjpiYXNpc3VfdHJhbnNjb2Rlcl9zdXBwb3J0c19rdHgyX3pzdGQoKSwgb3BlbmNsX2lzX2F2YWlsYWJsZSgpKTsKICNlbHNlCi0JcHJpbnRmKCJNdWx0aXRocmVhZGluZzogJXUsIFpzdGFuZGFyZCBzdXBwb3J0OiAldVxuIiwgKHVpbnQzMl90KW9wdHMubV9jb21wX3BhcmFtcy5tX211bHRpdGhyZWFkaW5nLCBiYXNpc3Q6OmJhc2lzdV90cmFuc2NvZGVyX3N1cHBvcnRzX2t0eDJfenN0ZCgpKTsKKwlwcmludGYoIk11bHRpdGhyZWFkaW5nOiAldSwgWnN0YW5kYXJkIHN1cHBvcnQ6ICV1LCBPcGVuQ0w6ICV1XG4iLCAodWludDMyX3Qpb3B0cy5tX2NvbXBfcGFyYW1zLm1fbXVsdGl0aHJlYWRpbmcsIGJhc2lzdDo6YmFzaXN1X3RyYW5zY29kZXJfc3VwcG9ydHNfa3R4Ml96c3RkKCksIG9wZW5jbF9pc19hdmFpbGFibGUoKSk7CiAjZW5kaWYKIAogCWlmICghb3B0cy5wcm9jZXNzX2xpc3RpbmdfZmlsZXMoKSkKQEAgLTM3ODIsNiArNDQ0MiwxNSBAQAogCWNhc2UgY0NvbXBTaXplOgogCQlzdGF0dXMgPSBjb21wc2l6ZV9tb2RlKG9wdHMpOwogCQlicmVhazsKKwljYXNlIGNUZXN0OgorCQlzdGF0dXMgPSB0ZXN0X21vZGUob3B0cyk7CisJCWJyZWFrOworCWNhc2UgY1NwbGl0SW1hZ2U6CisJCXN0YXR1cyA9IHNwbGl0X2ltYWdlX21vZGUob3B0cyk7CisJCWJyZWFrOworCWNhc2UgY0NvbWJpbmVJbWFnZXM6CisJCXN0YXR1cyA9IGNvbWJpbmVfaW1hZ2VzX21vZGUob3B0cyk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWFzc2VydCgwKTsKIAkJYnJlYWs7CkBAIC0zNzk1LDcgKzQ0NjQsNyBAQAogI2lmZGVmIF9ERUJVRwogCXByaW50ZigiREVCVUdcbiIpOwogI2VuZGlmCi0KKwkJCiAJaW50IHN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKIAogI2lmIEJBU0lTVV9DQVRDSF9FWENFUFRJT05TCkBAIC0zODE3LDMgKzQ0ODYsNCBAQAogCiAJcmV0dXJuIHN0YXR1czsKIH0KKwpkaWZmIC0tZ2l0IGEvYmluL29jbF9rZXJuZWxzLmNsIGIvYmluL29jbF9rZXJuZWxzLmNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGEyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vb2NsX2tlcm5lbHMuY2wKQEAgLTAsMCArMSwxMjkwIEBACisvLyNkZWZpbmUgX0RFQlVHCisKKyNpZm5kZWYgTlVMTAorCSNkZWZpbmUgTlVMTCAwTAorI2VuZGlmCisKK3R5cGVkZWYgY2hhciBpbnQ4X3Q7Cit0eXBlZGVmIHVjaGFyIHVpbnQ4X3Q7CisKK3R5cGVkZWYgc2hvcnQgaW50MTZfdDsKK3R5cGVkZWYgdXNob3J0IHVpbnQxNl90OworCit0eXBlZGVmIGludCBpbnQzMl90OwordHlwZWRlZiB1aW50IHVpbnQzMl90OworCit0eXBlZGVmIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgdWxvbmcgdWludDY0X3Q7CisKK3R5cGVkZWYgdWNoYXI0IGNvbG9yX3JnYmE7CisKKyNkZWZpbmUgVUlOVDMyX01BWCAweEZGRkZGRkZGVUwKKyNkZWZpbmUgSU5UNjRfTUFYIExPTkdfTUFYCisjZGVmaW5lIFVJTlQ2NF9NQVggVUxPTkdfTUFYCisKK2ludCBzcXVhcmVpKGludCBhKSB7IHJldHVybiBhICogYTsgfQorCisjaWZkZWYgX0RFQlVHCisJaW5saW5lIHZvaWQgaW50ZXJuYWxfYXNzZXJ0KGJvb2wgeCwgY29uc3RhbnQgY2hhciAqcE1zZywgaW50IGxpbmUpCisJeworCQlpZiAoIXgpCisJCQlwcmludGYoImFzc2VydCgpIGZhaWxlZCBvbiBsaW5lICVpOiAlc1xuIiwgbGluZSwgcE1zZyk7CisJfQorCSNkZWZpbmUgYXNzZXJ0KHgpIGludGVybmFsX2Fzc2VydCh4LCAjeCwgX19MSU5FX18pCisjZWxzZQorCSNkZWZpbmUgYXNzZXJ0KHgpCisjZW5kaWYKKworaW5saW5lIHVpbnQ4X3QgY2xhbXAyNTUoaW50IHgpCit7CisJcmV0dXJuIGNsYW1wKHgsIDAsIDI1NSk7Cit9CisKK2lubGluZSB1aW50OF90IGNsYW1wMjU1X2ZsYWcoaW50IHgsIGJvb2wgKnBEaWRfY2xhbXApCit7CisJaWYgKHggPCAwKQorCXsKKwkJKnBEaWRfY2xhbXAgPSB0cnVlOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAoeCA+IDI1NSkKKwl7CisJCSpwRGlkX2NsYW1wID0gdHJ1ZTsKKwkJcmV0dXJuIDI1NTsKKwl9CisKKwlyZXR1cm4gKHVpbnQ4X3QpKHgpOworfQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZW5jb2RlX2V0YzFzX3BhcmFtX3N0cnVjdF90YWcKK3sKKwl1aW50MzJfdCBtX3RvdGFsX2Jsb2NrczsKKwlpbnQgbV9wZXJjZXB0dWFsOworCWludCBtX3RvdGFsX3Blcm1zOworfSBlbmNvZGVfZXRjMXNfcGFyYW1fc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcGl4ZWxfYmxvY2tfdGFnCit7CisJY29sb3JfcmdiYSBtX3BpeGVsc1sxNl07IC8vIFt5KjQreF0KK30gcGl4ZWxfYmxvY2s7CisKK3VpbnQgY29sb3JfZGlzdGFuY2UoYm9vbCBwZXJjZXB0dWFsLCBjb2xvcl9yZ2JhIGUxLCBjb2xvcl9yZ2JhIGUyLCBib29sIGFscGhhKQoreworCWlmIChwZXJjZXB0dWFsKQorCXsKKyNpZiAwCisJCWZsb2F0MyBkZWx0YV9yZ2IgPSAoZmxvYXQzKShlMS54IC0gZTIueCwgZTEueSAtIGUyLnksIGUxLnogLSBlMi56KTsKKworCQlmbG9hdDMgZGVsdGFfeWNiY3I7CisJCWRlbHRhX3ljYmNyLnggPSBkb3QoZGVsdGFfcmdiLCAoZmxvYXQzKSguMjEyNmYsIC43MTUyZiwgLjA3MjJmKSk7IC8vIHkKKwkJZGVsdGFfeWNiY3IueSA9IGRlbHRhX3JnYi54IC0gZGVsdGFfeWNiY3IueDsgLy8gY3IKKwkJZGVsdGFfeWNiY3IueiA9IGRlbHRhX3JnYi56IC0gZGVsdGFfeWNiY3IueDsgLy8gY2IKKworCQlkZWx0YV95Y2JjciAqPSBkZWx0YV95Y2JjcjsKKworCQlmbG9hdCBkID0gZG90KGRlbHRhX3ljYmNyLCAoZmxvYXQzKSgxLjBmLCAwLjIwMzEyNWYsIDAuMDIzNDM3NWYpKTsKKworCQlpZiAoYWxwaGEpCisJCXsKKwkJCWludCBkZWx0YV9hID0gZTEudyAtIGUyLnc7CisJCQlkICs9IGRlbHRhX2EgKiBkZWx0YV9hOworCQl9CisKKwkJZCA9IGNsYW1wKGQgKiAyNTYuMGYgKyAuNWYsIDAuMGYsIChmbG9hdClVSU5UMzJfTUFYKTsKKworCQlyZXR1cm4gKHVpbnQpKGQpOworI2Vsc2UKKwkJLy8gVGhpcyBtYXRjaGVzIHRoZSBDUFUgY29kZSwgd2hpY2ggaXMgdXNlZnVsIGZvciB0ZXN0aW5nLgorCQlpbnQgZHIgPSBlMS54IC0gZTIueDsKKwkJaW50IGRnID0gZTEueSAtIGUyLnk7CisJCWludCBkYiA9IGUxLnogLSBlMi56OworCisJCWludCBkZWx0YV9sID0gZHIgKiAyNyArIGRnICogOTIgKyBkYiAqIDk7CisJCWludCBkZWx0YV9jciA9IGRyICogMTI4IC0gZGVsdGFfbDsKKwkJaW50IGRlbHRhX2NiID0gZGIgKiAxMjggLSBkZWx0YV9sOworCisJCXVpbnQgaWQgPSAoKHVpbnQpKGRlbHRhX2wgKiBkZWx0YV9sKSA+PiA3VSkgKworCQkJKCgoKHVpbnQpKGRlbHRhX2NyICogZGVsdGFfY3IpID4+IDdVKSAqIDI2VSkgPj4gN1UpICsKKwkJCSgoKCh1aW50KShkZWx0YV9jYiAqIGRlbHRhX2NiKSA+PiA3VSkgKiAzVSkgPj4gN1UpOworCisJCWlmIChhbHBoYSkKKwkJeworCQkJaW50IGRhID0gKGUxLncgLSBlMi53KSA8PCA3OworCQkJaWQgKz0gKCh1aW50KShkYSAqIGRhKSA+PiA3VSk7CisJCX0KKwkJCisJCXJldHVybiBpZDsKKyNlbmRpZgorCX0KKwllbHNlIGlmIChhbHBoYSkKKwl7CisJCWludCBkciA9IGUxLnggLSBlMi54OworCQlpbnQgZGcgPSBlMS55IC0gZTIueTsKKwkJaW50IGRiID0gZTEueiAtIGUyLno7CQorCQlpbnQgZGEgPSBlMS53IC0gZTIudzsKKwkJcmV0dXJuIGRyICogZHIgKyBkZyAqIGRnICsgZGIgKiBkYiArIGRhICogZGE7CisJfQorCWVsc2UKKwl7CisJCWludCBkciA9IGUxLnggLSBlMi54OworCQlpbnQgZGcgPSBlMS55IC0gZTIueTsKKwkJaW50IGRiID0gZTEueiAtIGUyLno7CQorCQlyZXR1cm4gZHIgKiBkciArIGRnICogZGcgKyBkYiAqIGRiOworCX0KK30KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGV0Y19ibG9ja190YWcKK3sKKwkvLyBiaWcgZW5kaWFuIHVpbnQ2NDoKKwkvLyBiaXQgb2ZzOiAgNTYgIDQ4ICA0MCAgMzIgIDI0ICAxNiAgIDggICAwCisJLy8gYnl0ZSBvZnM6IGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNyAKKwl1bmlvbgorCXsKKwkJdWludDY0X3QgbV91aW50NjQ7CisJCXVpbnQ4X3QgbV9ieXRlc1s4XTsKKwl9OworCit9IGV0Y19ibG9jazsKKworZW51bSBldGNfY29uc3RhbnRzCit7CisJY0VUQzFCeXRlc1BlckJsb2NrID0gOFUsCisKKwljRVRDMVNlbGVjdG9yQml0cyA9IDJVLAorCWNFVEMxU2VsZWN0b3JWYWx1ZXMgPSAxVSA8PCBjRVRDMVNlbGVjdG9yQml0cywKKwljRVRDMVNlbGVjdG9yTWFzayA9IGNFVEMxU2VsZWN0b3JWYWx1ZXMgLSAxVSwKKworCWNFVEMxQmxvY2tTaGlmdCA9IDJVLAorCWNFVEMxQmxvY2tTaXplID0gMVUgPDwgY0VUQzFCbG9ja1NoaWZ0LAorCisJY0VUQzFMU0JTZWxlY3RvckluZGljZXNCaXRPZmZzZXQgPSAwLAorCWNFVEMxTVNCU2VsZWN0b3JJbmRpY2VzQml0T2Zmc2V0ID0gMTYsCisKKwljRVRDMUZsaXBCaXRPZmZzZXQgPSAzMiwKKwljRVRDMURpZmZCaXRPZmZzZXQgPSAzMywKKworCWNFVEMxSW50ZW5Nb2RpZmllck51bUJpdHMgPSAzLAorCWNFVEMxSW50ZW5Nb2RpZmllclZhbHVlcyA9IDEgPDwgY0VUQzFJbnRlbk1vZGlmaWVyTnVtQml0cywKKwljRVRDMVJpZ2h0SW50ZW5Nb2RpZmllclRhYmxlQml0T2Zmc2V0ID0gMzQsCisJY0VUQzFMZWZ0SW50ZW5Nb2RpZmllclRhYmxlQml0T2Zmc2V0ID0gMzcsCisKKwkvLyBCYXNlK0RlbHRhIGVuY29kaW5nICg1IGJpdCBiYXNlcywgMyBiaXQgZGVsdGEpCisJY0VUQzFCYXNlQ29sb3JDb21wTnVtQml0cyA9IDUsCisJY0VUQzFCYXNlQ29sb3JDb21wTWF4ID0gMSA8PCBjRVRDMUJhc2VDb2xvckNvbXBOdW1CaXRzLAorCisJY0VUQzFEZWx0YUNvbG9yQ29tcE51bUJpdHMgPSAzLAorCWNFVEMxRGVsdGFDb2xvckNvbXAgPSAxIDw8IGNFVEMxRGVsdGFDb2xvckNvbXBOdW1CaXRzLAorCWNFVEMxRGVsdGFDb2xvckNvbXBNYXggPSAxIDw8IGNFVEMxRGVsdGFDb2xvckNvbXBOdW1CaXRzLAorCisJY0VUQzFCYXNlQ29sb3I1UkJpdE9mZnNldCA9IDU5LAorCWNFVEMxQmFzZUNvbG9yNUdCaXRPZmZzZXQgPSA1MSwKKwljRVRDMUJhc2VDb2xvcjVCQml0T2Zmc2V0ID0gNDMsCisKKwljRVRDMURlbHRhQ29sb3IzUkJpdE9mZnNldCA9IDU2LAorCWNFVEMxRGVsdGFDb2xvcjNHQml0T2Zmc2V0ID0gNDgsCisJY0VUQzFEZWx0YUNvbG9yM0JCaXRPZmZzZXQgPSA0MCwKKworCS8vIEFic29sdXRlIChub24tZGVsdGEpIGVuY29kaW5nICh0d28gNC1iaXQgcGVyIGNvbXBvbmVudCBiYXNlcykKKwljRVRDMUFic0NvbG9yQ29tcE51bUJpdHMgPSA0LAorCWNFVEMxQWJzQ29sb3JDb21wTWF4ID0gMSA8PCBjRVRDMUFic0NvbG9yQ29tcE51bUJpdHMsCisKKwljRVRDMUFic0NvbG9yNFIxQml0T2Zmc2V0ID0gNjAsCisJY0VUQzFBYnNDb2xvcjRHMUJpdE9mZnNldCA9IDUyLAorCWNFVEMxQWJzQ29sb3I0QjFCaXRPZmZzZXQgPSA0NCwKKworCWNFVEMxQWJzQ29sb3I0UjJCaXRPZmZzZXQgPSA1NiwKKwljRVRDMUFic0NvbG9yNEcyQml0T2Zmc2V0ID0gNDgsCisJY0VUQzFBYnNDb2xvcjRCMkJpdE9mZnNldCA9IDQwLAorCisJY0VUQzFDb2xvckRlbHRhTWluID0gLTQsCisJY0VUQzFDb2xvckRlbHRhTWF4ID0gMywKKworCS8vIERlbHRhMzoKKwkvLyAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNworCS8vIDAwMCAwMDEgMDEwIDAxMSAxMDAgMTAxIDExMCAxMTEKKwkvLyAwICAgMSAgIDIgICAzICAgLTQgIC0zICAtMiAgLTEKK307CisKKyNkZWZpbmUgQkFTSVNVX0VUQzFfQ0xVU1RFUl9GSVRfT1JERVJfVEFCTEVfU0laRSAoMTY1KQorY29uc3RhbnQgc3RydWN0IHsgdWludDhfdCBtX3ZbNF07IH0gZ19jbHVzdGVyX2ZpdF9vcmRlcl90YWJbQkFTSVNVX0VUQzFfQ0xVU1RFUl9GSVRfT1JERVJfVEFCTEVfU0laRV0gPQoreworCXsgeyAwLCAwLCAwLCA4IH0gfSx7IHsgMCwgNSwgMiwgMSB9IH0seyB7IDAsIDYsIDEsIDEgfSB9LHsgeyAwLCA3LCAwLCAxIH0gfSx7IHsgMCwgNywgMSwgMCB9IH0sCisJeyB7IDAsIDAsIDgsIDAgfSB9LHsgeyAwLCAwLCAzLCA1IH0gfSx7IHsgMCwgMSwgNywgMCB9IH0seyB7IDAsIDAsIDQsIDQgfSB9LHsgeyAwLCAwLCAyLCA2IH0gfSwKKwl7IHsgMCwgMCwgNywgMSB9IH0seyB7IDAsIDAsIDEsIDcgfSB9LHsgeyAwLCAwLCA1LCAzIH0gfSx7IHsgMSwgNiwgMCwgMSB9IH0seyB7IDAsIDAsIDYsIDIgfSB9LAorCXsgeyAwLCAyLCA2LCAwIH0gfSx7IHsgMiwgNCwgMiwgMCB9IH0seyB7IDAsIDMsIDUsIDAgfSB9LHsgeyAzLCAzLCAxLCAxIH0gfSx7IHsgNCwgMiwgMCwgMiB9IH0sCisJeyB7IDEsIDUsIDIsIDAgfSB9LHsgeyAwLCA1LCAzLCAwIH0gfSx7IHsgMCwgNiwgMiwgMCB9IH0seyB7IDIsIDQsIDEsIDEgfSB9LHsgeyA1LCAxLCAwLCAyIH0gfSwKKwl7IHsgNiwgMSwgMSwgMCB9IH0seyB7IDMsIDMsIDAsIDIgfSB9LHsgeyA2LCAwLCAwLCAyIH0gfSx7IHsgMCwgOCwgMCwgMCB9IH0seyB7IDYsIDEsIDAsIDEgfSB9LAorCXsgeyAwLCAxLCA2LCAxIH0gfSx7IHsgMSwgNiwgMSwgMCB9IH0seyB7IDQsIDEsIDMsIDAgfSB9LHsgeyAwLCAyLCA1LCAxIH0gfSx7IHsgNSwgMCwgMywgMCB9IH0sCisJeyB7IDUsIDMsIDAsIDAgfSB9LHsgeyAwLCAxLCA1LCAyIH0gfSx7IHsgMCwgMywgNCwgMSB9IH0seyB7IDIsIDUsIDEsIDAgfSB9LHsgeyAxLCA3LCAwLCAwIH0gfSwKKwl7IHsgMCwgMSwgNCwgMyB9IH0seyB7IDYsIDAsIDIsIDAgfSB9LHsgeyAwLCA0LCA0LCAwIH0gfSx7IHsgMiwgNiwgMCwgMCB9IH0seyB7IDAsIDIsIDQsIDIgfSB9LAorCXsgeyAwLCA1LCAxLCAyIH0gfSx7IHsgMCwgNiwgMCwgMiB9IH0seyB7IDMsIDUsIDAsIDAgfSB9LHsgeyAwLCA0LCAzLCAxIH0gfSx7IHsgMywgNCwgMSwgMCB9IH0sCisJeyB7IDQsIDMsIDEsIDAgfSB9LHsgeyAxLCA1LCAwLCAyIH0gfSx7IHsgMCwgMywgMywgMiB9IH0seyB7IDEsIDQsIDEsIDIgfSB9LHsgeyAwLCA0LCAyLCAyIH0gfSwKKwl7IHsgMiwgMywgMywgMCB9IH0seyB7IDQsIDQsIDAsIDAgfSB9LHsgeyAxLCAyLCA0LCAxIH0gfSx7IHsgMCwgNSwgMCwgMyB9IH0seyB7IDAsIDEsIDMsIDQgfSB9LAorCXsgeyAxLCA1LCAxLCAxIH0gfSx7IHsgMSwgNCwgMiwgMSB9IH0seyB7IDEsIDMsIDIsIDIgfSB9LHsgeyA1LCAyLCAxLCAwIH0gfSx7IHsgMSwgMywgMywgMSB9IH0sCisJeyB7IDAsIDEsIDIsIDUgfSB9LHsgeyAxLCAxLCA1LCAxIH0gfSx7IHsgMCwgMywgMiwgMyB9IH0seyB7IDIsIDUsIDAsIDEgfSB9LHsgeyAzLCAyLCAyLCAxIH0gfSwKKwl7IHsgMiwgMywgMCwgMyB9IH0seyB7IDEsIDQsIDMsIDAgfSB9LHsgeyAyLCAyLCAxLCAzIH0gfSx7IHsgNiwgMiwgMCwgMCB9IH0seyB7IDEsIDAsIDYsIDEgfSB9LAorCXsgeyAzLCAzLCAyLCAwIH0gfSx7IHsgNywgMSwgMCwgMCB9IH0seyB7IDMsIDEsIDQsIDAgfSB9LHsgeyAwLCAyLCAzLCAzIH0gfSx7IHsgMCwgNCwgMSwgMyB9IH0sCisJeyB7IDAsIDQsIDAsIDQgfSB9LHsgeyAwLCAxLCAwLCA3IH0gfSx7IHsgMiwgMCwgNSwgMSB9IH0seyB7IDIsIDAsIDQsIDIgfSB9LHsgeyAzLCAwLCAyLCAzIH0gfSwKKwl7IHsgMiwgMiwgNCwgMCB9IH0seyB7IDIsIDIsIDMsIDEgfSB9LHsgeyA0LCAwLCAzLCAxIH0gfSx7IHsgMywgMiwgMywgMCB9IH0seyB7IDIsIDMsIDIsIDEgfSB9LAorCXsgeyAxLCAzLCA0LCAwIH0gfSx7IHsgNywgMCwgMSwgMCB9IH0seyB7IDMsIDAsIDQsIDEgfSB9LHsgeyAxLCAwLCA1LCAyIH0gfSx7IHsgOCwgMCwgMCwgMCB9IH0sCisJeyB7IDMsIDAsIDEsIDQgfSB9LHsgeyA0LCAxLCAxLCAyIH0gfSx7IHsgNCwgMCwgMiwgMiB9IH0seyB7IDEsIDIsIDUsIDAgfSB9LHsgeyA0LCAyLCAxLCAxIH0gfSwKKwl7IHsgMywgNCwgMCwgMSB9IH0seyB7IDIsIDAsIDMsIDMgfSB9LHsgeyA1LCAwLCAxLCAyIH0gfSx7IHsgNSwgMCwgMCwgMyB9IH0seyB7IDIsIDQsIDAsIDIgfSB9LAorCXsgeyAyLCAxLCA0LCAxIH0gfSx7IHsgNCwgMCwgMSwgMyB9IH0seyB7IDIsIDEsIDUsIDAgfSB9LHsgeyA0LCAyLCAyLCAwIH0gfSx7IHsgNCwgMCwgNCwgMCB9IH0sCisJeyB7IDEsIDAsIDQsIDMgfSB9LHsgeyAxLCA0LCAwLCAzIH0gfSx7IHsgMywgMCwgMywgMiB9IH0seyB7IDQsIDMsIDAsIDEgfSB9LHsgeyAwLCAxLCAxLCA2IH0gfSwKKwl7IHsgMSwgMywgMSwgMyB9IH0seyB7IDAsIDIsIDIsIDQgfSB9LHsgeyAyLCAwLCAyLCA0IH0gfSx7IHsgNSwgMSwgMSwgMSB9IH0seyB7IDMsIDAsIDUsIDAgfSB9LAorCXsgeyAyLCAzLCAxLCAyIH0gfSx7IHsgMywgMCwgMCwgNSB9IH0seyB7IDAsIDMsIDEsIDQgfSB9LHsgeyA1LCAwLCAyLCAxIH0gfSx7IHsgMiwgMSwgMywgMiB9IH0sCisJeyB7IDIsIDAsIDYsIDAgfSB9LHsgeyAzLCAxLCAzLCAxIH0gfSx7IHsgNSwgMSwgMiwgMCB9IH0seyB7IDEsIDAsIDMsIDQgfSB9LHsgeyAxLCAxLCA2LCAwIH0gfSwKKwl7IHsgNCwgMCwgMCwgNCB9IH0seyB7IDIsIDAsIDEsIDUgfSB9LHsgeyAwLCAzLCAwLCA1IH0gfSx7IHsgMSwgMywgMCwgNCB9IH0seyB7IDQsIDEsIDIsIDEgfSB9LAorCXsgeyAxLCAyLCAzLCAyIH0gfSx7IHsgMywgMSwgMCwgNCB9IH0seyB7IDUsIDIsIDAsIDEgfSB9LHsgeyAxLCAyLCAyLCAzIH0gfSx7IHsgMywgMiwgMSwgMiB9IH0sCisJeyB7IDIsIDIsIDIsIDIgfSB9LHsgeyA2LCAwLCAxLCAxIH0gfSx7IHsgMSwgMiwgMSwgNCB9IH0seyB7IDEsIDEsIDQsIDIgfSB9LHsgeyAzLCAyLCAwLCAzIH0gfSwKKwl7IHsgMSwgMiwgMCwgNSB9IH0seyB7IDEsIDAsIDcsIDAgfSB9LHsgeyAzLCAxLCAyLCAyIH0gfSx7IHsgMSwgMCwgMiwgNSB9IH0seyB7IDIsIDAsIDAsIDYgfSB9LAorCXsgeyAyLCAxLCAxLCA0IH0gfSx7IHsgMiwgMiwgMCwgNCB9IH0seyB7IDEsIDEsIDMsIDMgfSB9LHsgeyA3LCAwLCAwLCAxIH0gfSx7IHsgMSwgMCwgMCwgNyB9IH0sCisJeyB7IDIsIDEsIDIsIDMgfSB9LHsgeyA0LCAxLCAwLCAzIH0gfSx7IHsgMywgMSwgMSwgMyB9IH0seyB7IDEsIDEsIDIsIDQgfSB9LHsgeyAyLCAxLCAwLCA1IH0gfSwKKwl7IHsgMSwgMCwgMSwgNiB9IH0seyB7IDAsIDIsIDEsIDUgfSB9LHsgeyAwLCAyLCAwLCA2IH0gfSx7IHsgMSwgMSwgMSwgNSB9IH0seyB7IDEsIDEsIDAsIDYgfSB9Cit9OworCitjb25zdGFudCBpbnQgZ19ldGMxX2ludGVuX3RhYmxlc1tjRVRDMUludGVuTW9kaWZpZXJWYWx1ZXNdW2NFVEMxU2VsZWN0b3JWYWx1ZXNdID0KK3sKKwl7IC04LCAgLTIsICAgMiwgICA4IH0sIHsgLTE3LCAgLTUsICA1LCAgMTcgfSwgeyAtMjksICAtOSwgICA5LCAgMjkgfSwgeyAgLTQyLCAtMTMsIDEzLCAgNDIgfSwKKwl7IC02MCwgLTE4LCAxOCwgIDYwIH0sIHsgLTgwLCAtMjQsIDI0LCAgODAgfSwgeyAtMTA2LCAtMzMsIDMzLCAxMDYgfSwgeyAtMTgzLCAtNDcsIDQ3LCAxODMgfQorfTsKKworY29uc3RhbnQgdWludDhfdCBnX2V0YzFfdG9fc2VsZWN0b3JfaW5kZXhbY0VUQzFTZWxlY3RvclZhbHVlc10gPSB7IDIsIDMsIDEsIDAgfTsKK2NvbnN0YW50IHVpbnQ4X3QgZ19zZWxlY3Rvcl9pbmRleF90b19ldGMxW2NFVEMxU2VsZWN0b3JWYWx1ZXNdID0geyAzLCAyLCAwLCAxIH07CisKK3VpbnQzMl90IGV0Y19ibG9ja19nZXRfYnl0ZV9iaXRzKGNvbnN0IGV0Y19ibG9jayAqcCwgdWludDMyX3Qgb2ZzLCB1aW50MzJfdCBudW0pIAoreworCWFzc2VydCgob2ZzICsgbnVtKSA8PSA2NFUpOworCWFzc2VydChudW0gJiYgKG51bSA8PSA4VSkpOworCWFzc2VydCgob2ZzID4+IDMpID09ICgob2ZzICsgbnVtIC0gMSkgPj4gMykpOworCWNvbnN0IHVpbnQzMl90IGJ5dGVfb2ZzID0gNyAtIChvZnMgPj4gMyk7CisJY29uc3QgdWludDMyX3QgYnl0ZV9iaXRfb2ZzID0gb2ZzICYgNzsKKwlyZXR1cm4gKHAtPm1fYnl0ZXNbYnl0ZV9vZnNdID4+IGJ5dGVfYml0X29mcykgJiAoKDEgPDwgbnVtKSAtIDEpOworfQorCit2b2lkIGV0Y19ibG9ja19zZXRfYnl0ZV9iaXRzKGV0Y19ibG9jayAqcCwgdWludDMyX3Qgb2ZzLCB1aW50MzJfdCBudW0sIHVpbnQzMl90IGJpdHMpCit7CisJYXNzZXJ0KChvZnMgKyBudW0pIDw9IDY0VSk7CisJYXNzZXJ0KG51bSAmJiAobnVtIDwgMzJVKSk7CisJYXNzZXJ0KChvZnMgPj4gMykgPT0gKChvZnMgKyBudW0gLSAxKSA+PiAzKSk7CisJYXNzZXJ0KGJpdHMgPCAoMVUgPDwgbnVtKSk7CisJY29uc3QgdWludDMyX3QgYnl0ZV9vZnMgPSA3IC0gKG9mcyA+PiAzKTsKKwljb25zdCB1aW50MzJfdCBieXRlX2JpdF9vZnMgPSBvZnMgJiA3OworCWNvbnN0IHVpbnQzMl90IG1hc2sgPSAoMSA8PCBudW0pIC0gMTsKKwlwLT5tX2J5dGVzW2J5dGVfb2ZzXSAmPSB+KG1hc2sgPDwgYnl0ZV9iaXRfb2ZzKTsKKwlwLT5tX2J5dGVzW2J5dGVfb2ZzXSB8PSAoYml0cyA8PCBieXRlX2JpdF9vZnMpOworfQorCitib29sIGV0Y19ibG9ja19nZXRfZmxpcF9iaXQoY29uc3QgZXRjX2Jsb2NrICpwKSAKK3sKKwlyZXR1cm4gKHAtPm1fYnl0ZXNbM10gJiAxKSAhPSAwOworfQorCit2b2lkIGV0Y19ibG9ja19zZXRfZmxpcF9iaXQoZXRjX2Jsb2NrICpwLCBib29sIGZsaXApCit7CisJcC0+bV9ieXRlc1szXSAmPSB+MTsKKwlwLT5tX2J5dGVzWzNdIHw9ICh1aW50OF90KShmbGlwKTsKK30KKworYm9vbCBldGNfYmxvY2tfZ2V0X2RpZmZfYml0KGNvbnN0IGV0Y19ibG9jayAqcCkgCit7CisJcmV0dXJuIChwLT5tX2J5dGVzWzNdICYgMikgIT0gMDsKK30KKwordm9pZCBldGNfYmxvY2tfc2V0X2RpZmZfYml0KGV0Y19ibG9jayAqcCwgYm9vbCBkaWZmKQoreworCXAtPm1fYnl0ZXNbM10gJj0gfjI7CisJcC0+bV9ieXRlc1szXSB8PSAoKHVpbnQzMl90KShkaWZmKSA8PCAxKTsKK30KKworLy8gUmV0dXJucyBpbnRlbnNpdHkgbW9kaWZpZXIgdGFibGUgKDAtNykgdXNlZCBieSBzdWJibG9jayBzdWJibG9ja19pZC4KKy8vIHN1YmJsb2NrX2lkPTAgbGVmdC90b3AgKENXIDEpLCAxPXJpZ2h0L2JvdHRvbSAoQ1cgMikKK3VpbnQzMl90IGV0Y19ibG9ja19nZXRfaW50ZW5fdGFibGUoY29uc3QgZXRjX2Jsb2NrICpwLCB1aW50MzJfdCBzdWJibG9ja19pZCkgCit7CisJYXNzZXJ0KHN1YmJsb2NrX2lkIDwgMik7CisJY29uc3QgdWludDMyX3Qgb2ZzID0gc3ViYmxvY2tfaWQgPyAyIDogNTsKKwlyZXR1cm4gKHAtPm1fYnl0ZXNbM10gPj4gb2ZzKSAmIDc7Cit9CisKKy8vIFNldHMgaW50ZW5zaXR5IG1vZGlmaWVyIHRhYmxlICgwLTcpIHVzZWQgYnkgc3ViYmxvY2sgc3ViYmxvY2tfaWQgKDAgb3IgMSkKK3ZvaWQgZXRjX2Jsb2NrX3NldF9pbnRlbl90YWJsZShldGNfYmxvY2sgKnAsIHVpbnQzMl90IHN1YmJsb2NrX2lkLCB1aW50MzJfdCB0KQoreworCWFzc2VydChzdWJibG9ja19pZCA8IDIpOworCWFzc2VydCh0IDwgOCk7CisJY29uc3QgdWludDMyX3Qgb2ZzID0gc3ViYmxvY2tfaWQgPyAyIDogNTsKKwlwLT5tX2J5dGVzWzNdICY9IH4oNyA8PCBvZnMpOworCXAtPm1fYnl0ZXNbM10gfD0gKHQgPDwgb2ZzKTsKK30KKwordm9pZCBldGNfYmxvY2tfc2V0X2ludGVuX3RhYmxlc19ldGMxcyhldGNfYmxvY2sgKnAsIHVpbnQzMl90IHQpCit7CisJZXRjX2Jsb2NrX3NldF9pbnRlbl90YWJsZShwLCAwLCB0KTsKKwlldGNfYmxvY2tfc2V0X2ludGVuX3RhYmxlKHAsIDEsIHQpOworfQorCit1aW50MzJfdCBldGNfYmxvY2tfZ2V0X3Jhd19zZWxlY3Rvcihjb25zdCBldGNfYmxvY2sgKnBCbG9jaywgdWludDMyX3QgeCwgdWludDMyX3QgeSkgCit7CisJYXNzZXJ0KCh4IHwgeSkgPCA0KTsKKworCWNvbnN0IHVpbnQzMl90IGJpdF9pbmRleCA9IHggKiA0ICsgeTsKKwljb25zdCB1aW50MzJfdCBieXRlX2JpdF9vZnMgPSBiaXRfaW5kZXggJiA3OworCWNvbnN0IHVpbnQ4X3QgKnAgPSAmcEJsb2NrLT5tX2J5dGVzWzcgLSAoYml0X2luZGV4ID4+IDMpXTsKKwljb25zdCB1aW50MzJfdCBsc2IgPSAocFswXSA+PiBieXRlX2JpdF9vZnMpICYgMTsKKwljb25zdCB1aW50MzJfdCBtc2IgPSAocFstMl0gPj4gYnl0ZV9iaXRfb2ZzKSAmIDE7CisJY29uc3QgdWludDMyX3QgdmFsID0gbHNiIHwgKG1zYiA8PCAxKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8vIFJldHVybmVkIHNlbGVjdG9yIHZhbHVlIHJhbmdlcyBmcm9tIDAtMyBhbmQgaXMgYSBkaXJlY3QgaW5kZXggaW50byBnX2V0YzFfaW50ZW5fdGFibGVzLgordWludDMyX3QgZXRjX2Jsb2NrX2dldF9zZWxlY3Rvcihjb25zdCBldGNfYmxvY2sgKnBCbG9jaywgdWludDMyX3QgeCwgdWludDMyX3QgeSkgCit7CisJcmV0dXJuIGdfZXRjMV90b19zZWxlY3Rvcl9pbmRleFtldGNfYmxvY2tfZ2V0X3Jhd19zZWxlY3RvcihwQmxvY2ssIHgsIHkpXTsKK30KKworLy8gU2VsZWN0b3IgInZhbCIgcmFuZ2VzIGZyb20gMC0zIGFuZCBpcyBhIGRpcmVjdCBpbmRleCBpbnRvIGdfZXRjMV9pbnRlbl90YWJsZXMuCit2b2lkIGV0Y19ibG9ja19zZXRfc2VsZWN0b3IoZXRjX2Jsb2NrICpwQmxvY2ssIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHZhbCkKK3sKKwlhc3NlcnQoKHggfCB5IHwgdmFsKSA8IDQpOworCWNvbnN0IHVpbnQzMl90IGJpdF9pbmRleCA9IHggKiA0ICsgeTsKKworCXVpbnQ4X3QgKnAgPSAmcEJsb2NrLT5tX2J5dGVzWzcgLSAoYml0X2luZGV4ID4+IDMpXTsKKworCWNvbnN0IHVpbnQzMl90IGJ5dGVfYml0X29mcyA9IGJpdF9pbmRleCAmIDc7CisJY29uc3QgdWludDMyX3QgbWFzayA9IDEgPDwgYnl0ZV9iaXRfb2ZzOworCisJY29uc3QgdWludDMyX3QgZXRjMV92YWwgPSBnX3NlbGVjdG9yX2luZGV4X3RvX2V0YzFbdmFsXTsKKwkKKwljb25zdCB1aW50MzJfdCBsc2IgPSBldGMxX3ZhbCAmIDE7CisJY29uc3QgdWludDMyX3QgbXNiID0gZXRjMV92YWwgPj4gMTsKKworCXBbMF0gJj0gfm1hc2s7CisJcFswXSB8PSAobHNiIDw8IGJ5dGVfYml0X29mcyk7CisKKwlwWy0yXSAmPSB+bWFzazsKKwlwWy0yXSB8PSAobXNiIDw8IGJ5dGVfYml0X29mcyk7Cit9CisKK3ZvaWQgZXRjX2Jsb2NrX3NldF9iYXNlNF9jb2xvcihldGNfYmxvY2sgKnBCbG9jaywgdWludDMyX3QgaWR4LCB1aW50MTZfdCBjKQoreworCWlmIChpZHgpCisJeworCQlldGNfYmxvY2tfc2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxQWJzQ29sb3I0UjJCaXRPZmZzZXQsIDQsIChjID4+IDgpICYgMTUpOworCQlldGNfYmxvY2tfc2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxQWJzQ29sb3I0RzJCaXRPZmZzZXQsIDQsIChjID4+IDQpICYgMTUpOworCQlldGNfYmxvY2tfc2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxQWJzQ29sb3I0QjJCaXRPZmZzZXQsIDQsIGMgJiAxNSk7CisJfQorCWVsc2UKKwl7CisJCWV0Y19ibG9ja19zZXRfYnl0ZV9iaXRzKHBCbG9jaywgY0VUQzFBYnNDb2xvcjRSMUJpdE9mZnNldCwgNCwgKGMgPj4gOCkgJiAxNSk7CisJCWV0Y19ibG9ja19zZXRfYnl0ZV9iaXRzKHBCbG9jaywgY0VUQzFBYnNDb2xvcjRHMUJpdE9mZnNldCwgNCwgKGMgPj4gNCkgJiAxNSk7CisJCWV0Y19ibG9ja19zZXRfYnl0ZV9iaXRzKHBCbG9jaywgY0VUQzFBYnNDb2xvcjRCMUJpdE9mZnNldCwgNCwgYyAmIDE1KTsKKwl9Cit9CisKK3VpbnQxNl90IGV0Y19ibG9ja19nZXRfYmFzZTRfY29sb3IoY29uc3QgZXRjX2Jsb2NrICpwQmxvY2ssIHVpbnQzMl90IGlkeCkgCit7CisJdWludDMyX3QgciwgZywgYjsKKwlpZiAoaWR4KQorCXsKKwkJciA9IGV0Y19ibG9ja19nZXRfYnl0ZV9iaXRzKHBCbG9jaywgY0VUQzFBYnNDb2xvcjRSMkJpdE9mZnNldCwgNCk7CisJCWcgPSBldGNfYmxvY2tfZ2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxQWJzQ29sb3I0RzJCaXRPZmZzZXQsIDQpOworCQliID0gZXRjX2Jsb2NrX2dldF9ieXRlX2JpdHMocEJsb2NrLCBjRVRDMUFic0NvbG9yNEIyQml0T2Zmc2V0LCA0KTsKKwl9CisJZWxzZQorCXsKKwkJciA9IGV0Y19ibG9ja19nZXRfYnl0ZV9iaXRzKHBCbG9jaywgY0VUQzFBYnNDb2xvcjRSMUJpdE9mZnNldCwgNCk7CisJCWcgPSBldGNfYmxvY2tfZ2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxQWJzQ29sb3I0RzFCaXRPZmZzZXQsIDQpOworCQliID0gZXRjX2Jsb2NrX2dldF9ieXRlX2JpdHMocEJsb2NrLCBjRVRDMUFic0NvbG9yNEIxQml0T2Zmc2V0LCA0KTsKKwl9CisJcmV0dXJuICh1aW50MTZfdCkoYiB8IChnIDw8IDRVKSB8IChyIDw8IDhVKSk7Cit9CisKK3ZvaWQgZXRjX2Jsb2NrX3NldF9iYXNlNV9jb2xvcihldGNfYmxvY2sgKnBCbG9jaywgdWludDE2X3QgYykKK3sKKwlldGNfYmxvY2tfc2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxQmFzZUNvbG9yNVJCaXRPZmZzZXQsIDUsIChjID4+IDEwKSAmIDMxKTsKKwlldGNfYmxvY2tfc2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxQmFzZUNvbG9yNUdCaXRPZmZzZXQsIDUsIChjID4+IDUpICYgMzEpOworCWV0Y19ibG9ja19zZXRfYnl0ZV9iaXRzKHBCbG9jaywgY0VUQzFCYXNlQ29sb3I1QkJpdE9mZnNldCwgNSwgYyAmIDMxKTsKK30KKwordWludDE2X3QgZXRjX2Jsb2NrX2dldF9iYXNlNV9jb2xvcihjb25zdCBldGNfYmxvY2sgKnBCbG9jaykKK3sKKwljb25zdCB1aW50MzJfdCByID0gZXRjX2Jsb2NrX2dldF9ieXRlX2JpdHMocEJsb2NrLCBjRVRDMUJhc2VDb2xvcjVSQml0T2Zmc2V0LCA1KTsKKwljb25zdCB1aW50MzJfdCBnID0gZXRjX2Jsb2NrX2dldF9ieXRlX2JpdHMocEJsb2NrLCBjRVRDMUJhc2VDb2xvcjVHQml0T2Zmc2V0LCA1KTsKKwljb25zdCB1aW50MzJfdCBiID0gZXRjX2Jsb2NrX2dldF9ieXRlX2JpdHMocEJsb2NrLCBjRVRDMUJhc2VDb2xvcjVCQml0T2Zmc2V0LCA1KTsKKwlyZXR1cm4gKHVpbnQxNl90KShiIHwgKGcgPDwgNVUpIHwgKHIgPDwgMTBVKSk7Cit9CisKK3ZvaWQgZXRjX2Jsb2NrX3NldF9kZWx0YTNfY29sb3IoZXRjX2Jsb2NrICpwQmxvY2ssIHVpbnQxNl90IGMpCit7CisJZXRjX2Jsb2NrX3NldF9ieXRlX2JpdHMocEJsb2NrLCBjRVRDMURlbHRhQ29sb3IzUkJpdE9mZnNldCwgMywgKGMgPj4gNikgJiA3KTsKKwlldGNfYmxvY2tfc2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxRGVsdGFDb2xvcjNHQml0T2Zmc2V0LCAzLCAoYyA+PiAzKSAmIDcpOworCWV0Y19ibG9ja19zZXRfYnl0ZV9iaXRzKHBCbG9jaywgY0VUQzFEZWx0YUNvbG9yM0JCaXRPZmZzZXQsIDMsIGMgJiA3KTsKK30KKwordWludDE2X3QgZXRjX2Jsb2NrX2dldF9kZWx0YTNfY29sb3IoY29uc3QgZXRjX2Jsb2NrICpwQmxvY2spIAoreworCWNvbnN0IHVpbnQzMl90IHIgPSBldGNfYmxvY2tfZ2V0X2J5dGVfYml0cyhwQmxvY2ssIGNFVEMxRGVsdGFDb2xvcjNSQml0T2Zmc2V0LCAzKTsKKwljb25zdCB1aW50MzJfdCBnID0gZXRjX2Jsb2NrX2dldF9ieXRlX2JpdHMocEJsb2NrLCBjRVRDMURlbHRhQ29sb3IzR0JpdE9mZnNldCwgMyk7CisJY29uc3QgdWludDMyX3QgYiA9IGV0Y19ibG9ja19nZXRfYnl0ZV9iaXRzKHBCbG9jaywgY0VUQzFEZWx0YUNvbG9yM0JCaXRPZmZzZXQsIDMpOworCXJldHVybiAodWludDE2X3QpKGIgfCAoZyA8PCAzVSkgfCAociA8PCA2VSkpOworfQorCit2b2lkIGV0Y19ibG9ja191bnBhY2tfZGVsdGEzKGludCAqcFIsIGludCAqcEcsIGludCAqcEIsIHVpbnQxNl90IHBhY2tlZF9kZWx0YTMpCit7CisJaW50IHIgPSAocGFja2VkX2RlbHRhMyA+PiA2KSAmIDc7CisJaW50IGcgPSAocGFja2VkX2RlbHRhMyA+PiAzKSAmIDc7CisJaW50IGIgPSBwYWNrZWRfZGVsdGEzICYgNzsKKwlpZiAociA+PSA0KSByIC09IDg7CisJaWYgKGcgPj0gNCkgZyAtPSA4OworCWlmIChiID49IDQpIGIgLT0gODsKKwkqcFIgPSByOworCSpwRyA9IGc7CisJKnBCID0gYjsKK30KKworYm9vbCBldGNfYmxvY2tfdW5wYWNrX2NvbG9yNV9kZWx0YTMoY29sb3JfcmdiYSAqcFJlc3VsdCwgdWludDE2X3QgcGFja2VkX2NvbG9yNSwgdWludDE2X3QgcGFja2VkX2RlbHRhMywgYm9vbCBzY2FsZWQsIHVpbnQzMl90IGFscGhhKQoreworCWludCBkciwgZGcsIGRiOworCWV0Y19ibG9ja191bnBhY2tfZGVsdGEzKCZkciwgJmRnLCAmZGIsIHBhY2tlZF9kZWx0YTMpOworCisJaW50IGIgPSAocGFja2VkX2NvbG9yNSAmIDMxVSkgKyBkYjsKKwlpbnQgZyA9ICgocGFja2VkX2NvbG9yNSA+PiA1VSkgJiAzMVUpICsgZGc7CisJaW50IHIgPSAoKHBhY2tlZF9jb2xvcjUgPj4gMTBVKSAmIDMxVSkgKyBkcjsKKworCWJvb2wgc3VjY2VzcyA9IHRydWU7CisJaWYgKCh1aW50MzJfdCkociB8IGcgfCBiKSA+IDMxVSkKKwl7CisJCXN1Y2Nlc3MgPSBmYWxzZTsKKwkJciA9IGNsYW1wKHIsIDAsIDMxKTsKKwkJZyA9IGNsYW1wKGcsIDAsIDMxKTsKKwkJYiA9IGNsYW1wKGIsIDAsIDMxKTsKKwl9CisKKwlpZiAoc2NhbGVkKQorCXsKKwkJYiA9IChiIDw8IDNVKSB8IChiID4+IDJVKTsKKwkJZyA9IChnIDw8IDNVKSB8IChnID4+IDJVKTsKKwkJciA9IChyIDw8IDNVKSB8IChyID4+IDJVKTsKKwl9CisKKwkqcFJlc3VsdCA9IChjb2xvcl9yZ2JhKShyLCBnLCBiLCBtaW4oYWxwaGEsIDI1NVUpKTsKKwlyZXR1cm4gc3VjY2VzczsKK30KKworY29sb3JfcmdiYSBldGNfYmxvY2tfdW5wYWNrX2NvbG9yNSh1aW50MTZfdCBwYWNrZWRfY29sb3I1LCBib29sIHNjYWxlZCwgdWludDMyX3QgYWxwaGEpCit7CisJdWludDMyX3QgYiA9IHBhY2tlZF9jb2xvcjUgJiAzMVU7CisJdWludDMyX3QgZyA9IChwYWNrZWRfY29sb3I1ID4+IDVVKSAmIDMxVTsKKwl1aW50MzJfdCByID0gKHBhY2tlZF9jb2xvcjUgPj4gMTBVKSAmIDMxVTsKKworCWlmIChzY2FsZWQpCisJeworCQliID0gKGIgPDwgM1UpIHwgKGIgPj4gMlUpOworCQlnID0gKGcgPDwgM1UpIHwgKGcgPj4gMlUpOworCQlyID0gKHIgPDwgM1UpIHwgKHIgPj4gMlUpOworCX0KKworCXJldHVybiAoY29sb3JfcmdiYSkociwgZywgYiwgbWluKGFscGhhLCAyNTVVKSk7Cit9CisKK2NvbG9yX3JnYmEgZXRjX2Jsb2NrX3VucGFja19jb2xvcjQodWludDE2X3QgcGFja2VkX2NvbG9yNCwgYm9vbCBzY2FsZWQsIHVpbnQzMl90IGFscGhhKQoreworCXVpbnQzMl90IGIgPSBwYWNrZWRfY29sb3I0ICYgMTVVOworCXVpbnQzMl90IGcgPSAocGFja2VkX2NvbG9yNCA+PiA0VSkgJiAxNVU7CisJdWludDMyX3QgciA9IChwYWNrZWRfY29sb3I0ID4+IDhVKSAmIDE1VTsKKworCWlmIChzY2FsZWQpCisJeworCQliID0gKGIgPDwgNFUpIHwgYjsKKwkJZyA9IChnIDw8IDRVKSB8IGc7CisJCXIgPSAociA8PCA0VSkgfCByOworCX0KKworCXJldHVybiAoY29sb3JfcmdiYSkociwgZywgYiwgbWluKGFscGhhLCAyNTVVKSk7Cit9CisKKy8vIGZhbHNlIGlmIGRpZG4ndCBjbGFtcCwgdHJ1ZSBpZiBhbnkgY29tcG9uZW50IGNsYW1wZWQKK2Jvb2wgZXRjX2Jsb2NrX2dldF9ibG9ja19jb2xvcnMoY29uc3QgZXRjX2Jsb2NrICpwQmxvY2ssIGNvbG9yX3JnYmEqIHBCbG9ja19jb2xvcnMsIHVpbnQzMl90IHN1YmJsb2NrX2luZGV4KSAKK3sKKwljb2xvcl9yZ2JhIGI7CisKKwlpZiAoZXRjX2Jsb2NrX2dldF9kaWZmX2JpdChwQmxvY2spKQorCXsKKwkJaWYgKHN1YmJsb2NrX2luZGV4KQorCQkJZXRjX2Jsb2NrX3VucGFja19jb2xvcjVfZGVsdGEzKCZiLCBldGNfYmxvY2tfZ2V0X2Jhc2U1X2NvbG9yKHBCbG9jayksIGV0Y19ibG9ja19nZXRfZGVsdGEzX2NvbG9yKHBCbG9jayksIHRydWUsIDI1NSk7CisJCWVsc2UKKwkJCWIgPSBldGNfYmxvY2tfdW5wYWNrX2NvbG9yNShldGNfYmxvY2tfZ2V0X2Jhc2U1X2NvbG9yKHBCbG9jayksIHRydWUsIDI1NSk7CisJfQorCWVsc2UKKwl7CisJCWIgPSBldGNfYmxvY2tfdW5wYWNrX2NvbG9yNChldGNfYmxvY2tfZ2V0X2Jhc2U0X2NvbG9yKHBCbG9jaywgc3ViYmxvY2tfaW5kZXgpLCB0cnVlLCAyNTUpOworCX0KKworCWNvbnN0YW50IGludCogcEludGVuX3RhYmxlID0gZ19ldGMxX2ludGVuX3RhYmxlc1tldGNfYmxvY2tfZ2V0X2ludGVuX3RhYmxlKHBCbG9jaywgc3ViYmxvY2tfaW5kZXgpXTsKKworCWJvb2wgZGMgPSBmYWxzZTsKKwlwQmxvY2tfY29sb3JzWzBdID0gKGNvbG9yX3JnYmEpKGNsYW1wMjU1X2ZsYWcoYi54ICsgcEludGVuX3RhYmxlWzBdLCAmZGMpLCBjbGFtcDI1NV9mbGFnKGIueSArIHBJbnRlbl90YWJsZVswXSwgJmRjKSwgY2xhbXAyNTVfZmxhZyhiLnogKyBwSW50ZW5fdGFibGVbMF0sICZkYyksIDI1NSk7CisJcEJsb2NrX2NvbG9yc1sxXSA9IChjb2xvcl9yZ2JhKShjbGFtcDI1NV9mbGFnKGIueCArIHBJbnRlbl90YWJsZVsxXSwgJmRjKSwgY2xhbXAyNTVfZmxhZyhiLnkgKyBwSW50ZW5fdGFibGVbMV0sICZkYyksIGNsYW1wMjU1X2ZsYWcoYi56ICsgcEludGVuX3RhYmxlWzFdLCAmZGMpLCAyNTUpOworCXBCbG9ja19jb2xvcnNbMl0gPSAoY29sb3JfcmdiYSkoY2xhbXAyNTVfZmxhZyhiLnggKyBwSW50ZW5fdGFibGVbMl0sICZkYyksIGNsYW1wMjU1X2ZsYWcoYi55ICsgcEludGVuX3RhYmxlWzJdLCAmZGMpLCBjbGFtcDI1NV9mbGFnKGIueiArIHBJbnRlbl90YWJsZVsyXSwgJmRjKSwgMjU1KTsKKwlwQmxvY2tfY29sb3JzWzNdID0gKGNvbG9yX3JnYmEpKGNsYW1wMjU1X2ZsYWcoYi54ICsgcEludGVuX3RhYmxlWzNdLCAmZGMpLCBjbGFtcDI1NV9mbGFnKGIueSArIHBJbnRlbl90YWJsZVszXSwgJmRjKSwgY2xhbXAyNTVfZmxhZyhiLnogKyBwSW50ZW5fdGFibGVbM10sICZkYyksIDI1NSk7CisJcmV0dXJuIGRjOworfQorCit2b2lkIGdldF9ibG9ja19jb2xvcnM1KGNvbG9yX3JnYmEgKnBCbG9ja19jb2xvcnMsIGNvbnN0IGNvbG9yX3JnYmEgKnBCYXNlX2NvbG9yNSwgdWludDMyX3QgaW50ZW5fdGFibGUsIGJvb2wgc2NhbGVkIC8qIGZhbHNlICovKSAKK3sKKwljb2xvcl9yZ2JhIGIgPSAqcEJhc2VfY29sb3I1OworCisJaWYgKCFzY2FsZWQpCisJeworCQliLnggPSAoYi54IDw8IDMpIHwgKGIueCA+PiAyKTsKKwkJYi55ID0gKGIueSA8PCAzKSB8IChiLnkgPj4gMik7CisJCWIueiA9IChiLnogPDwgMykgfCAoYi56ID4+IDIpOworCX0KKworCWNvbnN0YW50IGludCogcEludGVuX3RhYmxlID0gZ19ldGMxX2ludGVuX3RhYmxlc1tpbnRlbl90YWJsZV07CisKKwlwQmxvY2tfY29sb3JzWzBdID0gKGNvbG9yX3JnYmEpKGNsYW1wMjU1KGIueCArIHBJbnRlbl90YWJsZVswXSksIGNsYW1wMjU1KGIueSArIHBJbnRlbl90YWJsZVswXSksIGNsYW1wMjU1KGIueiArIHBJbnRlbl90YWJsZVswXSksIDI1NSk7CisJcEJsb2NrX2NvbG9yc1sxXSA9IChjb2xvcl9yZ2JhKShjbGFtcDI1NShiLnggKyBwSW50ZW5fdGFibGVbMV0pLCBjbGFtcDI1NShiLnkgKyBwSW50ZW5fdGFibGVbMV0pLCBjbGFtcDI1NShiLnogKyBwSW50ZW5fdGFibGVbMV0pLCAyNTUpOworCXBCbG9ja19jb2xvcnNbMl0gPSAoY29sb3JfcmdiYSkoY2xhbXAyNTUoYi54ICsgcEludGVuX3RhYmxlWzJdKSwgY2xhbXAyNTUoYi55ICsgcEludGVuX3RhYmxlWzJdKSwgY2xhbXAyNTUoYi56ICsgcEludGVuX3RhYmxlWzJdKSwgMjU1KTsKKwlwQmxvY2tfY29sb3JzWzNdID0gKGNvbG9yX3JnYmEpKGNsYW1wMjU1KGIueCArIHBJbnRlbl90YWJsZVszXSksIGNsYW1wMjU1KGIueSArIHBJbnRlbl90YWJsZVszXSksIGNsYW1wMjU1KGIueiArIHBJbnRlbl90YWJsZVszXSksIDI1NSk7Cit9CisKK3VpbnQ2NF90IGV0Y19ibG9ja19kZXRlcm1pbmVfc2VsZWN0b3JzKGV0Y19ibG9jayAqcEJsb2NrLCBjb25zdCBjb2xvcl9yZ2JhKiBwU291cmNlX3BpeGVscywgYm9vbCBwZXJjZXB0dWFsLCB1aW50MzJfdCBiZWdpbl9zdWJibG9jayAvKj0gMCovLCB1aW50MzJfdCBlbmRfc3ViYmxvY2sgLyo9IDIqLykKK3sKKwl1aW50NjRfdCB0b3RhbF9lcnJvciA9IDA7CisKKwlmb3IgKHVpbnQzMl90IHN1YmJsb2NrID0gYmVnaW5fc3ViYmxvY2s7IHN1YmJsb2NrIDwgZW5kX3N1YmJsb2NrOyBzdWJibG9jaysrKQorCXsKKwkJY29sb3JfcmdiYSBibG9ja19jb2xvcnNbNF07CisJCWV0Y19ibG9ja19nZXRfYmxvY2tfY29sb3JzKHBCbG9jaywgYmxvY2tfY29sb3JzLCBzdWJibG9jayk7CisKKwkJaWYgKGV0Y19ibG9ja19nZXRfZmxpcF9iaXQocEJsb2NrKSkKKwkJeworCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDI7IHkrKykKKwkJCXsKKwkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQorCQkJCXsKKwkJCQkJdWludDMyX3QgYmVzdF9zZWxlY3RvciA9IDA7CisJCQkJCXVpbnQ2NF90IGJlc3RfZXJyb3IgPSBVSU5UNjRfTUFYOworCisJCQkJCWZvciAodWludDMyX3QgcyA9IDA7IHMgPCA0OyBzKyspCisJCQkJCXsKKwkJCQkJCXVpbnQ2NF90IGVyciA9IGNvbG9yX2Rpc3RhbmNlKHBlcmNlcHR1YWwsIGJsb2NrX2NvbG9yc1tzXSwgcFNvdXJjZV9waXhlbHNbeCArIChzdWJibG9jayAqIDIgKyB5KSAqIDRdLCBmYWxzZSk7CisJCQkJCQlpZiAoZXJyIDwgYmVzdF9lcnJvcikKKwkJCQkJCXsKKwkJCQkJCQliZXN0X2Vycm9yID0gZXJyOworCQkJCQkJCWJlc3Rfc2VsZWN0b3IgPSBzOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZXRjX2Jsb2NrX3NldF9zZWxlY3RvcihwQmxvY2ssIHgsIHN1YmJsb2NrICogMiArIHksIGJlc3Rfc2VsZWN0b3IpOworCisJCQkJCXRvdGFsX2Vycm9yICs9IGJlc3RfZXJyb3I7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKKwkJCXsKKwkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgMjsgeCsrKQorCQkJCXsKKwkJCQkJdWludDMyX3QgYmVzdF9zZWxlY3RvciA9IDA7CisJCQkJCXVpbnQ2NF90IGJlc3RfZXJyb3IgPSBVSU5UNjRfTUFYOworCisJCQkJCWZvciAodWludDMyX3QgcyA9IDA7IHMgPCA0OyBzKyspCisJCQkJCXsKKwkJCQkJCXVpbnQ2NF90IGVyciA9IGNvbG9yX2Rpc3RhbmNlKHBlcmNlcHR1YWwsIGJsb2NrX2NvbG9yc1tzXSwgcFNvdXJjZV9waXhlbHNbKHN1YmJsb2NrICogMikgKyB4ICsgeSAqIDRdLCBmYWxzZSk7CisJCQkJCQlpZiAoZXJyIDwgYmVzdF9lcnJvcikKKwkJCQkJCXsKKwkJCQkJCQliZXN0X2Vycm9yID0gZXJyOworCQkJCQkJCWJlc3Rfc2VsZWN0b3IgPSBzOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZXRjX2Jsb2NrX3NldF9zZWxlY3RvcihwQmxvY2ssIHN1YmJsb2NrICogMiArIHgsIHksIGJlc3Rfc2VsZWN0b3IpOworCisJCQkJCXRvdGFsX2Vycm9yICs9IGJlc3RfZXJyb3I7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHRvdGFsX2Vycm9yOworfQorCit1aW50MTZfdCBldGNfYmxvY2tfcGFja19jb2xvcjRfcmdiKHVpbnQzMl90IHIsIHVpbnQzMl90IGcsIHVpbnQzMl90IGIsIGJvb2wgc2NhbGVkKQoreworCXVpbnQzMl90IGJpYXMgPSAxMjc7CisKKwlpZiAoc2NhbGVkKQorCXsKKwkJciA9IChyICogMTVVICsgYmlhcykgLyAyNTVVOworCQlnID0gKGcgKiAxNVUgKyBiaWFzKSAvIDI1NVU7CisJCWIgPSAoYiAqIDE1VSArIGJpYXMpIC8gMjU1VTsKKwl9CisKKwlyID0gbWluKHIsIDE1VSk7CisJZyA9IG1pbihnLCAxNVUpOworCWIgPSBtaW4oYiwgMTVVKTsKKworCXJldHVybiAodWludDE2X3QpKGIgfCAoZyA8PCA0VSkgfCAociA8PCA4VSkpOworfQorCit1aW50MTZfdCBldGNfYmxvY2tfcGFja19jb2xvcjQoY29sb3JfcmdiYSBjb2xvciwgYm9vbCBzY2FsZWQpCit7CisJdWludDMyX3QgYmlhcyA9IDEyNzsKKwlyZXR1cm4gZXRjX2Jsb2NrX3BhY2tfY29sb3I0X3JnYihjb2xvci54LCBjb2xvci55LCBjb2xvci56LCBzY2FsZWQpOworfQorCit1aW50MTZfdCBldGNfYmxvY2tfcGFja19kZWx0YTMoaW50IHIsIGludCBnLCBpbnQgYikKK3sKKwlhc3NlcnQoKHIgPj0gY0VUQzFDb2xvckRlbHRhTWluKSAmJiAociA8PSBjRVRDMUNvbG9yRGVsdGFNYXgpKTsKKwlhc3NlcnQoKGcgPj0gY0VUQzFDb2xvckRlbHRhTWluKSAmJiAoZyA8PSBjRVRDMUNvbG9yRGVsdGFNYXgpKTsKKwlhc3NlcnQoKGIgPj0gY0VUQzFDb2xvckRlbHRhTWluKSAmJiAoYiA8PSBjRVRDMUNvbG9yRGVsdGFNYXgpKTsKKwlpZiAociA8IDApIHIgKz0gODsKKwlpZiAoZyA8IDApIGcgKz0gODsKKwlpZiAoYiA8IDApIGIgKz0gODsKKwlyZXR1cm4gKHVpbnQxNl90KShiIHwgKGcgPDwgMykgfCAociA8PCA2KSk7Cit9CisKK3ZvaWQgZXRjX2Jsb2NrX3NldF9ibG9ja19jb2xvcjQoZXRjX2Jsb2NrICpwQmxvY2ssIGNvbG9yX3JnYmEgYzBfdW5zY2FsZWQsIGNvbG9yX3JnYmEgYzFfdW5zY2FsZWQpCit7CisJZXRjX2Jsb2NrX3NldF9kaWZmX2JpdChwQmxvY2ssIGZhbHNlKTsKKworCWV0Y19ibG9ja19zZXRfYmFzZTRfY29sb3IocEJsb2NrLCAwLCBldGNfYmxvY2tfcGFja19jb2xvcjQoYzBfdW5zY2FsZWQsIGZhbHNlKSk7CisJZXRjX2Jsb2NrX3NldF9iYXNlNF9jb2xvcihwQmxvY2ssIDEsIGV0Y19ibG9ja19wYWNrX2NvbG9yNChjMV91bnNjYWxlZCwgZmFsc2UpKTsKK30KKwordWludDE2X3QgZXRjX2Jsb2NrX3BhY2tfY29sb3I1X3JnYih1aW50MzJfdCByLCB1aW50MzJfdCBnLCB1aW50MzJfdCBiLCBib29sIHNjYWxlZCkKK3sKKwl1aW50MzJfdCBiaWFzID0gMTI3OworCisJaWYgKHNjYWxlZCkKKwl7CisJCXIgPSAociAqIDMxVSArIGJpYXMpIC8gMjU1VTsKKwkJZyA9IChnICogMzFVICsgYmlhcykgLyAyNTVVOworCQliID0gKGIgKiAzMVUgKyBiaWFzKSAvIDI1NVU7CisJfQorCisJciA9IG1pbihyLCAzMVUpOworCWcgPSBtaW4oZywgMzFVKTsKKwliID0gbWluKGIsIDMxVSk7CisKKwlyZXR1cm4gKHVpbnQxNl90KShiIHwgKGcgPDwgNVUpIHwgKHIgPDwgMTBVKSk7Cit9CisKK3VpbnQxNl90IGV0Y19ibG9ja19wYWNrX2NvbG9yNShjb2xvcl9yZ2JhIGMsIGJvb2wgc2NhbGVkKQoreworCXJldHVybiBldGNfYmxvY2tfcGFja19jb2xvcjVfcmdiKGMueCwgYy55LCBjLnosIHNjYWxlZCk7Cit9CisKK3ZvaWQgZXRjX2Jsb2NrX3NldF9ibG9ja19jb2xvcjUoZXRjX2Jsb2NrICpwQmxvY2ssIGNvbG9yX3JnYmEgYzBfdW5zY2FsZWQsIGNvbG9yX3JnYmEgYzFfdW5zY2FsZWQpCit7CisJZXRjX2Jsb2NrX3NldF9kaWZmX2JpdChwQmxvY2ssIHRydWUpOworCisJZXRjX2Jsb2NrX3NldF9iYXNlNV9jb2xvcihwQmxvY2ssIGV0Y19ibG9ja19wYWNrX2NvbG9yNShjMF91bnNjYWxlZCwgZmFsc2UpKTsKKworCWludCBkciA9IGMxX3Vuc2NhbGVkLnggLSBjMF91bnNjYWxlZC54OworCWludCBkZyA9IGMxX3Vuc2NhbGVkLnkgLSBjMF91bnNjYWxlZC55OworCWludCBkYiA9IGMxX3Vuc2NhbGVkLnogLSBjMF91bnNjYWxlZC56OworCisJZXRjX2Jsb2NrX3NldF9kZWx0YTNfY29sb3IocEJsb2NrLCBldGNfYmxvY2tfcGFja19kZWx0YTMoZHIsIGRnLCBkYikpOworfQorCit2b2lkIGV0Y19ibG9ja19zZXRfYmxvY2tfY29sb3I1X2V0YzFzKGV0Y19ibG9jayAqcEJsb2NrLCBjb2xvcl9yZ2JhIGNfdW5zY2FsZWQpCit7CisJZXRjX2Jsb2NrX3NldF9kaWZmX2JpdChwQmxvY2ssIHRydWUpOworCQkJCisJZXRjX2Jsb2NrX3NldF9iYXNlNV9jb2xvcihwQmxvY2ssIGV0Y19ibG9ja19wYWNrX2NvbG9yNShjX3Vuc2NhbGVkLCBmYWxzZSkpOworCWV0Y19ibG9ja19zZXRfZGVsdGEzX2NvbG9yKHBCbG9jaywgZXRjX2Jsb2NrX3BhY2tfZGVsdGEzKDAsIDAsIDApKTsKK30KKworYm9vbCBldGNfYmxvY2tfc2V0X2Jsb2NrX2NvbG9yNV9jaGVjayhldGNfYmxvY2sgKnBCbG9jaywgY29sb3JfcmdiYSBjMF91bnNjYWxlZCwgY29sb3JfcmdiYSBjMV91bnNjYWxlZCkKK3sKKwlldGNfYmxvY2tfc2V0X2RpZmZfYml0KHBCbG9jaywgdHJ1ZSk7CisKKwlldGNfYmxvY2tfc2V0X2Jhc2U1X2NvbG9yKHBCbG9jaywgZXRjX2Jsb2NrX3BhY2tfY29sb3I1KGMwX3Vuc2NhbGVkLCBmYWxzZSkpOworCisJaW50IGRyID0gYzFfdW5zY2FsZWQueCAtIGMwX3Vuc2NhbGVkLng7CisJaW50IGRnID0gYzFfdW5zY2FsZWQueSAtIGMwX3Vuc2NhbGVkLnk7CisJaW50IGRiID0gYzFfdW5zY2FsZWQueiAtIGMwX3Vuc2NhbGVkLno7CisKKwlpZiAoKChkciA8IGNFVEMxQ29sb3JEZWx0YU1pbikgfHwgKGRyID4gY0VUQzFDb2xvckRlbHRhTWF4KSkgfHwKKwkJKChkZyA8IGNFVEMxQ29sb3JEZWx0YU1pbikgfHwgKGRnID4gY0VUQzFDb2xvckRlbHRhTWF4KSkgfHwKKwkJKChkYiA8IGNFVEMxQ29sb3JEZWx0YU1pbikgfHwgKGRiID4gY0VUQzFDb2xvckRlbHRhTWF4KSkpCisJCXJldHVybiBmYWxzZTsKKworCWV0Y19ibG9ja19zZXRfZGVsdGEzX2NvbG9yKHBCbG9jaywgZXRjX2Jsb2NrX3BhY2tfZGVsdGEzKGRyLCBkZywgZGIpKTsKKworCXJldHVybiB0cnVlOworfQorCit2b2lkIGV0Y19ibG9ja19wYWNrX3Jhd19zZWxlY3RvcnMoZXRjX2Jsb2NrICpwQmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBTZWxlY3RvcnMpCit7CisJdWludDMyX3Qgd29yZDMgPSAwLCB3b3JkMiA9IDA7CisJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKKwl7CisJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCisJCXsKKwkJCWNvbnN0IHVpbnQzMl90IGJpdF9pbmRleCA9IHggKiA0ICsgeTsKKwkJCWNvbnN0IHVpbnQzMl90IHMgPSBwU2VsZWN0b3JzW3ggKyB5ICogNF07CisJCQorCQkJY29uc3QgdWludDMyX3QgbHNiID0gcyAmIDEsIG1zYiA9IHMgPj4gMTsKKwkJCisJCQl3b3JkMyB8PSAobHNiIDw8IGJpdF9pbmRleCk7CisJCQl3b3JkMiB8PSAobXNiIDw8IGJpdF9pbmRleCk7CisJCX0KKwl9CisKKwlwQmxvY2stPm1fYnl0ZXNbN10gPSAodWludDhfdCkod29yZDMpOworCXBCbG9jay0+bV9ieXRlc1s2XSA9ICh1aW50OF90KSh3b3JkMyA+PiA4KTsKKwlwQmxvY2stPm1fYnl0ZXNbNV0gPSAodWludDhfdCkod29yZDIpOworCXBCbG9jay0+bV9ieXRlc1s0XSA9ICh1aW50OF90KSh3b3JkMiA+PiA4KTsKK30KKworLy8gLS0tLSBFQzFTIGJsb2NrIGVuY29kaW5nL2VuZHBvaW50IG9wdGltaXphdGlvbgorCitjb25zdGFudCB1aW50OF90IGdfZXZhbF9kaXN0X3RhYmxlc1s4XVsyNTZdID0KK3sKKwkvLyA5OSUgdGhyZXNob2xkCisJeyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLH0sCisJeyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLH0sCisJeyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwwLDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLH0sCisJeyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLH0sCisJeyAxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLH0sCisJeyAxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDEsMSwwLDEsMSwxLDEsMSwwLDEsMSwxLDAsMSwxLDAsMCwwLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLH0sCisJeyAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMSwwLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLH0sCisJeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMSwxLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLH0KK307CisKK3R5cGVkZWYgc3RydWN0IGV0YzFzX29wdGltaXplcl9zb2x1dGlvbl9jb29yZGluYXRlc190YWcKK3sKKwljb2xvcl9yZ2JhIG1fdW5zY2FsZWRfY29sb3I7CisJdWludDMyX3QgbV9pbnRlbl90YWJsZTsKK30gZXRjMXNfb3B0aW1pemVyX3NvbHV0aW9uX2Nvb3JkaW5hdGVzOworCitjb2xvcl9yZ2JhIGdldF9zY2FsZWRfY29sb3IoY29sb3JfcmdiYSB1bnNjYWxlZF9jb2xvcikgCit7CisJaW50IGJyLCBiZywgYmI7CisJCisJYnIgPSAodW5zY2FsZWRfY29sb3IueCA+PiAyKSB8ICh1bnNjYWxlZF9jb2xvci54IDw8IDMpOworCWJnID0gKHVuc2NhbGVkX2NvbG9yLnkgPj4gMikgfCAodW5zY2FsZWRfY29sb3IueSA8PCAzKTsKKwliYiA9ICh1bnNjYWxlZF9jb2xvci56ID4+IDIpIHwgKHVuc2NhbGVkX2NvbG9yLnogPDwgMyk7CisJCisJcmV0dXJuIChjb2xvcl9yZ2JhKSgodWludDhfdCliciwgKHVpbnQ4X3QpYmcsICh1aW50OF90KWJiLCAyNTUpOworfQorCit0eXBlZGVmIHN0cnVjdCBldGMxc19vcHRpbWl6ZXJfcG90ZW50aWFsX3NvbHV0aW9uX3RhZworeworCXVpbnQ2NF90CQkJCQltX2Vycm9yOworCWV0YzFzX29wdGltaXplcl9zb2x1dGlvbl9jb29yZGluYXRlcyBtX2Nvb3JkczsKKwkJCisJdWludDhfdAkJCQkJCW1fc2VsZWN0b3JzWzE2XTsKKwlib29sCQkJCQkJbV92YWxpZDsKK30gZXRjMXNfb3B0aW1pemVyX3BvdGVudGlhbF9zb2x1dGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgZXRjMXNfb3B0aW1pemVyX3N0YXRlX3RhZworeworCWludCBtX2JyLCBtX2JnLCBtX2JiOworCWZsb2F0MyBtX2F2Z19jb2xvcjsKKwlpbnQgbV9tYXhfY29tcF9zcHJlYWQ7CisJZXRjMXNfb3B0aW1pemVyX3BvdGVudGlhbF9zb2x1dGlvbiBtX2Jlc3Rfc29sdXRpb247Cit9IGV0YzFzX29wdGltaXplcl9zdGF0ZTsKKworYm9vbCBldGMxc19vcHRpbWl6ZXJfZXZhbHVhdGVfc29sdXRpb24oCisJZXRjMXNfb3B0aW1pemVyX3N0YXRlICpwU3RhdGUsCisJY29uc3QgZ2xvYmFsIGVuY29kZV9ldGMxc19wYXJhbV9zdHJ1Y3QgKnBQYXJhbXMsCisJdWludDY0X3QgbnVtX3BpeGVscywgY29uc3QgZ2xvYmFsIGNvbG9yX3JnYmEgKnBQaXhlbHMsIAorCWNvbnN0IGdsb2JhbCB1aW50MzJfdCAqcFdlaWdodHMsCisJZXRjMXNfb3B0aW1pemVyX3NvbHV0aW9uX2Nvb3JkaW5hdGVzIGNvb3JkcywgCisJZXRjMXNfb3B0aW1pemVyX3BvdGVudGlhbF9zb2x1dGlvbiogcFRyaWFsX3NvbHV0aW9uLCAKKwlldGMxc19vcHRpbWl6ZXJfcG90ZW50aWFsX3NvbHV0aW9uKiBwQmVzdF9zb2x1dGlvbikKK3sKKwl1aW50OF90IHRlbXBfc2VsZWN0b3JzWzE2XTsKKworCXBUcmlhbF9zb2x1dGlvbi0+bV92YWxpZCA9IGZhbHNlOworCQkKKwljb25zdCBjb2xvcl9yZ2JhIGJhc2VfY29sb3IgPSBnZXRfc2NhbGVkX2NvbG9yKGNvb3Jkcy5tX3Vuc2NhbGVkX2NvbG9yKTsKKwkKKwlwVHJpYWxfc29sdXRpb24tPm1fZXJyb3IgPSBJTlQ2NF9NQVg7CisJCQorCWZvciAodWludDMyX3QgaW50ZW5fdGFibGUgPSAwOyBpbnRlbl90YWJsZSA8IGNFVEMxSW50ZW5Nb2RpZmllclZhbHVlczsgaW50ZW5fdGFibGUrKykKKwl7CisJCS8vIFRPRE86IFRoaXMgY2hlY2sgaXMgZXF1aXZhbGVudCB0byBtZWRpdW0gcXVhbGl0eSBpbiB0aGUgQysrIHZlcnNpb24uCisJCWlmICghZ19ldmFsX2Rpc3RfdGFibGVzW2ludGVuX3RhYmxlXVtwU3RhdGUtPm1fbWF4X2NvbXBfc3ByZWFkXSkKKwkJCWNvbnRpbnVlOworCisJCWNvbnN0YW50IGludCogcEludGVuX3RhYmxlID0gZ19ldGMxX2ludGVuX3RhYmxlc1tpbnRlbl90YWJsZV07CisKKwkJY29sb3JfcmdiYSBibG9ja19jb2xvcnNbNF07CisJCWZvciAodWludDMyX3QgcyA9IDA7IHMgPCA0OyBzKyspCisJCXsKKwkJCWludCB5ZCA9IHBJbnRlbl90YWJsZVtzXTsKKwkJCWJsb2NrX2NvbG9yc1tzXSA9IChjb2xvcl9yZ2JhKShjbGFtcDI1NShiYXNlX2NvbG9yLnggKyB5ZCksIGNsYW1wMjU1KGJhc2VfY29sb3IueSArIHlkKSwgY2xhbXAyNTUoYmFzZV9jb2xvci56ICsgeWQpLCAyNTUpOworCQl9CisKKwkJdWludDY0X3QgdG90YWxfZXJyb3IgPSAwOworCQkJCQorCQlmb3IgKHVpbnQ2NF90IGMgPSAwOyBjIDwgbnVtX3BpeGVsczsgYysrKQorCQl7CisJCQljb2xvcl9yZ2JhIHNyY19waXhlbCA9IHBQaXhlbHNbY107CisKKwkJCXVpbnQzMl90IGJlc3Rfc2VsZWN0b3JfaW5kZXggPSAzOworCQkJdWludDMyX3QgYmVzdF9lcnJvciA9IGNvbG9yX2Rpc3RhbmNlKHBQYXJhbXMtPm1fcGVyY2VwdHVhbCwgc3JjX3BpeGVsLCBibG9ja19jb2xvcnNbMF0sIGZhbHNlKTsKKworCQkJdWludDMyX3QgdHJpYWxfZXJyb3IgPSBjb2xvcl9kaXN0YW5jZShwUGFyYW1zLT5tX3BlcmNlcHR1YWwsIHNyY19waXhlbCwgYmxvY2tfY29sb3JzWzFdLCBmYWxzZSk7CisJCQlpZiAodHJpYWxfZXJyb3IgPCBiZXN0X2Vycm9yKQorCQkJeworCQkJCWJlc3RfZXJyb3IgPSB0cmlhbF9lcnJvcjsKKwkJCQliZXN0X3NlbGVjdG9yX2luZGV4ID0gMjsKKwkJCX0KKworCQkJdHJpYWxfZXJyb3IgPSBjb2xvcl9kaXN0YW5jZShwUGFyYW1zLT5tX3BlcmNlcHR1YWwsIHNyY19waXhlbCwgYmxvY2tfY29sb3JzWzJdLCBmYWxzZSk7CisJCQlpZiAodHJpYWxfZXJyb3IgPCBiZXN0X2Vycm9yKQorCQkJeworCQkJCWJlc3RfZXJyb3IgPSB0cmlhbF9lcnJvcjsKKwkJCQliZXN0X3NlbGVjdG9yX2luZGV4ID0gMDsKKwkJCX0KKworCQkJdHJpYWxfZXJyb3IgPSBjb2xvcl9kaXN0YW5jZShwUGFyYW1zLT5tX3BlcmNlcHR1YWwsIHNyY19waXhlbCwgYmxvY2tfY29sb3JzWzNdLCBmYWxzZSk7CisJCQlpZiAodHJpYWxfZXJyb3IgPCBiZXN0X2Vycm9yKQorCQkJeworCQkJCWJlc3RfZXJyb3IgPSB0cmlhbF9lcnJvcjsKKwkJCQliZXN0X3NlbGVjdG9yX2luZGV4ID0gMTsKKwkJCX0KKworCQkJaWYgKG51bV9waXhlbHMgPD0gMTYpCisJCQkJdGVtcF9zZWxlY3RvcnNbY10gPSAodWludDhfdCkoYmVzdF9zZWxlY3Rvcl9pbmRleCk7CisKKwkJCXRvdGFsX2Vycm9yICs9IHBXZWlnaHRzID8gKGJlc3RfZXJyb3IgKiAodWludDY0X3QpcFdlaWdodHNbY10pIDogYmVzdF9lcnJvcjsKKwkJCQorCQkJaWYgKHRvdGFsX2Vycm9yID49IHBUcmlhbF9zb2x1dGlvbi0+bV9lcnJvcikKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh0b3RhbF9lcnJvciA8IHBUcmlhbF9zb2x1dGlvbi0+bV9lcnJvcikKKwkJeworCQkJcFRyaWFsX3NvbHV0aW9uLT5tX2Vycm9yID0gdG90YWxfZXJyb3I7CisJCQlwVHJpYWxfc29sdXRpb24tPm1fY29vcmRzLm1faW50ZW5fdGFibGUgPSBpbnRlbl90YWJsZTsKKwkJCWlmIChudW1fcGl4ZWxzIDw9IDE2KQorCQkJeworCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspCisJCQkJCXBUcmlhbF9zb2x1dGlvbi0+bV9zZWxlY3RvcnNbaV0gPSB0ZW1wX3NlbGVjdG9yc1tpXTsKKwkJCX0KKwkJCXBUcmlhbF9zb2x1dGlvbi0+bV92YWxpZCA9IHRydWU7CisJCX0KKwl9CisJcFRyaWFsX3NvbHV0aW9uLT5tX2Nvb3Jkcy5tX3Vuc2NhbGVkX2NvbG9yID0gY29vcmRzLm1fdW5zY2FsZWRfY29sb3I7CisKKwlib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKwlpZiAocEJlc3Rfc29sdXRpb24pCisJeworCQlpZiAocFRyaWFsX3NvbHV0aW9uLT5tX2Vycm9yIDwgcEJlc3Rfc29sdXRpb24tPm1fZXJyb3IpCisJCXsKKwkJCSpwQmVzdF9zb2x1dGlvbiA9ICpwVHJpYWxfc29sdXRpb247CisJCQlzdWNjZXNzID0gdHJ1ZTsKKwkJfQorCX0KKwkJCQkKKwlyZXR1cm4gc3VjY2VzczsKK30KKwordm9pZCBldGMxc19vcHRpbWl6ZXJfaW5pdCgKKwlldGMxc19vcHRpbWl6ZXJfc3RhdGUgKnBTdGF0ZSwKKwljb25zdCBnbG9iYWwgZW5jb2RlX2V0YzFzX3BhcmFtX3N0cnVjdCAqcFBhcmFtcywKKwl1aW50NjRfdCBudW1fcGl4ZWxzLCBjb25zdCBnbG9iYWwgY29sb3JfcmdiYSAqcFBpeGVscywgCisJY29uc3QgZ2xvYmFsIHVpbnQzMl90ICpwV2VpZ2h0cykKK3sKKwljb25zdCBpbnQgTElNSVQgPSAzMTsKKwkJCisJY29sb3JfcmdiYSBtaW5fY29sb3IgPSAyNTU7CisJY29sb3JfcmdiYSBtYXhfY29sb3IgPSAwOworCXVpbnQ2NF90IHRvdGFsX3dlaWdodCA9IDA7CisJdWludDY0X3Qgc3VtX3IgPSAwLCBzdW1fZyA9IDAsIHN1bV9iID0gMDsKKwkJCQkKKwlmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKQorCXsKKwkJY29uc3QgY29sb3JfcmdiYSBjID0gcFBpeGVsc1tpXTsKKworCQltaW5fY29sb3IgPSBtaW4obWluX2NvbG9yLCBjKTsKKwkJbWF4X2NvbG9yID0gbWF4KG1heF9jb2xvciwgYyk7CisKKwkJaWYgKHBXZWlnaHRzKQorCQl7CisJCQl1aW50NjRfdCB3ZWlnaHQgPSBwV2VpZ2h0c1tpXTsKKworCQkJc3VtX3IgKz0gd2VpZ2h0ICogYy54OworCQkJc3VtX2cgKz0gd2VpZ2h0ICogYy55OworCQkJc3VtX2IgKz0gd2VpZ2h0ICogYy56OworCQkKKwkJCXRvdGFsX3dlaWdodCArPSB3ZWlnaHQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdW1fciArPSBjLng7CisJCQlzdW1fZyArPSBjLnk7CisJCQlzdW1fYiArPSBjLno7CisKKwkJCXRvdGFsX3dlaWdodCsrOworCQl9CisJfQorCQkJCQorCWZsb2F0MyBhdmdfY29sb3I7CisJYXZnX2NvbG9yLnggPSAoZmxvYXQpc3VtX3IgLyB0b3RhbF93ZWlnaHQ7CisJYXZnX2NvbG9yLnkgPSAoZmxvYXQpc3VtX2cgLyB0b3RhbF93ZWlnaHQ7CisJYXZnX2NvbG9yLnogPSAoZmxvYXQpc3VtX2IgLyB0b3RhbF93ZWlnaHQ7CisKKwlwU3RhdGUtPm1fYXZnX2NvbG9yID0gYXZnX2NvbG9yOworCXBTdGF0ZS0+bV9tYXhfY29tcF9zcHJlYWQgPSBtYXgobWF4KChpbnQpbWF4X2NvbG9yLnggLSAoaW50KW1pbl9jb2xvci54LCAoaW50KW1heF9jb2xvci55IC0gKGludCltaW5fY29sb3IueSksIChpbnQpbWF4X2NvbG9yLnogLSAoaW50KW1pbl9jb2xvci56KTsKKwkJCisJLy8gVE9ETzogVGhlIHJvdW5kaW5nIGhlcmUgY291bGQgYmUgaW1wcm92ZWQsIGxpa2Ugd2l0aCBEWFQxL0JDMS4KKwlwU3RhdGUtPm1fYnIgPSBjbGFtcCgoaW50KShhdmdfY29sb3IueCAqIChMSU1JVCAvIDI1NS4wZikgKyAuNWYpLCAwLCBMSU1JVCk7CisJcFN0YXRlLT5tX2JnID0gY2xhbXAoKGludCkoYXZnX2NvbG9yLnkgKiAoTElNSVQgLyAyNTUuMGYpICsgLjVmKSwgMCwgTElNSVQpOworCXBTdGF0ZS0+bV9iYiA9IGNsYW1wKChpbnQpKGF2Z19jb2xvci56ICogKExJTUlUIC8gMjU1LjBmKSArIC41ZiksIDAsIExJTUlUKTsKKworCXBTdGF0ZS0+bV9iZXN0X3NvbHV0aW9uLm1fdmFsaWQgPSBmYWxzZTsKKwlwU3RhdGUtPm1fYmVzdF9zb2x1dGlvbi5tX2Vycm9yID0gVUlOVDY0X01BWDsKK30KKwordm9pZCBldGMxc19vcHRpbWl6ZXJfaW50ZXJuYWxfY2x1c3Rlcl9maXQoCisJdWludDMyX3QgdG90YWxfcGVybXNfdG9fdHJ5LAorCWV0YzFzX29wdGltaXplcl9zdGF0ZSAqcFN0YXRlLAorCWNvbnN0IGdsb2JhbCBlbmNvZGVfZXRjMXNfcGFyYW1fc3RydWN0ICpwUGFyYW1zLAorCXVpbnQ2NF90IG51bV9waXhlbHMsIGNvbnN0IGdsb2JhbCBjb2xvcl9yZ2JhICpwUGl4ZWxzLAorCWNvbnN0IGdsb2JhbCB1aW50MzJfdCAqcFdlaWdodHMpCit7CisJY29uc3QgaW50IExJTUlUID0gMzE7CisKKwlldGMxc19vcHRpbWl6ZXJfcG90ZW50aWFsX3NvbHV0aW9uIHRyaWFsX3NvbHV0aW9uOworCisJZXRjMXNfb3B0aW1pemVyX3NvbHV0aW9uX2Nvb3JkaW5hdGVzIGN1cl9jb29yZHM7CisJY3VyX2Nvb3Jkcy5tX3Vuc2NhbGVkX2NvbG9yID0gKGNvbG9yX3JnYmEpKHBTdGF0ZS0+bV9iciwgcFN0YXRlLT5tX2JnLCBwU3RhdGUtPm1fYmIsIDI1NSk7CisJZXRjMXNfb3B0aW1pemVyX2V2YWx1YXRlX3NvbHV0aW9uKHBTdGF0ZSwgcFBhcmFtcywgbnVtX3BpeGVscywgcFBpeGVscywgcFdlaWdodHMsIGN1cl9jb29yZHMsICZ0cmlhbF9zb2x1dGlvbiwgJnBTdGF0ZS0+bV9iZXN0X3NvbHV0aW9uKTsKKwkJCQorCWlmIChwU3RhdGUtPm1fYmVzdF9zb2x1dGlvbi5tX2Vycm9yID09IDApCisJCXJldHVybjsKKworCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0b3RhbF9wZXJtc190b190cnk7IGkrKykKKwl7CisJCWludCBkZWx0YV9zdW1fciA9IDAsIGRlbHRhX3N1bV9nID0gMCwgZGVsdGFfc3VtX2IgPSAwOworCisJCWNvbnN0YW50IGludCAqcEludGVuX3RhYmxlID0gZ19ldGMxX2ludGVuX3RhYmxlc1twU3RhdGUtPm1fYmVzdF9zb2x1dGlvbi5tX2Nvb3Jkcy5tX2ludGVuX3RhYmxlXTsKKwkJY29uc3QgY29sb3JfcmdiYSBiYXNlX2NvbG9yID0gZ2V0X3NjYWxlZF9jb2xvcihwU3RhdGUtPm1fYmVzdF9zb2x1dGlvbi5tX2Nvb3Jkcy5tX3Vuc2NhbGVkX2NvbG9yKTsKKworCQljb25zdGFudCB1aW50OF90ICpwTnVtX3NlbGVjdG9ycyA9IGdfY2x1c3Rlcl9maXRfb3JkZXJfdGFiW2ldLm1fdjsKKworCQlmb3IgKHVpbnQzMl90IHEgPSAwOyBxIDwgNDsgcSsrKQorCQl7CisJCQljb25zdCBpbnQgeWRfdGVtcCA9IHBJbnRlbl90YWJsZVtxXTsKKworCQkJZGVsdGFfc3VtX3IgKz0gcE51bV9zZWxlY3RvcnNbcV0gKiAoY2xhbXAoYmFzZV9jb2xvci54ICsgeWRfdGVtcCwgMCwgMjU1KSAtIGJhc2VfY29sb3IueCk7CisJCQlkZWx0YV9zdW1fZyArPSBwTnVtX3NlbGVjdG9yc1txXSAqIChjbGFtcChiYXNlX2NvbG9yLnkgKyB5ZF90ZW1wLCAwLCAyNTUpIC0gYmFzZV9jb2xvci55KTsKKwkJCWRlbHRhX3N1bV9iICs9IHBOdW1fc2VsZWN0b3JzW3FdICogKGNsYW1wKGJhc2VfY29sb3IueiArIHlkX3RlbXAsIDAsIDI1NSkgLSBiYXNlX2NvbG9yLnopOworCQl9CisKKwkJaWYgKCghZGVsdGFfc3VtX3IpICYmICghZGVsdGFfc3VtX2cpICYmICghZGVsdGFfc3VtX2IpKQorCQkJY29udGludWU7CisKKwkJY29uc3QgZmxvYXQgYXZnX2RlbHRhX3JfZiA9IChmbG9hdCkoZGVsdGFfc3VtX3IpIC8gODsKKwkJY29uc3QgZmxvYXQgYXZnX2RlbHRhX2dfZiA9IChmbG9hdCkoZGVsdGFfc3VtX2cpIC8gODsKKwkJY29uc3QgZmxvYXQgYXZnX2RlbHRhX2JfZiA9IChmbG9hdCkoZGVsdGFfc3VtX2IpIC8gODsKKworCQljb25zdCBpbnQgYnIxID0gY2xhbXAoKGludCkoKHBTdGF0ZS0+bV9hdmdfY29sb3IueCAtIGF2Z19kZWx0YV9yX2YpICogKExJTUlUIC8gMjU1LjBmKSArIC41ZiksIDAsIExJTUlUKTsKKwkJY29uc3QgaW50IGJnMSA9IGNsYW1wKChpbnQpKChwU3RhdGUtPm1fYXZnX2NvbG9yLnkgLSBhdmdfZGVsdGFfZ19mKSAqIChMSU1JVCAvIDI1NS4wZikgKyAuNWYpLCAwLCBMSU1JVCk7CisJCWNvbnN0IGludCBiYjEgPSBjbGFtcCgoaW50KSgocFN0YXRlLT5tX2F2Z19jb2xvci56IC0gYXZnX2RlbHRhX2JfZikgKiAoTElNSVQgLyAyNTUuMGYpICsgLjVmKSwgMCwgTElNSVQpOworCQkKKwkJY3VyX2Nvb3Jkcy5tX3Vuc2NhbGVkX2NvbG9yID0gKGNvbG9yX3JnYmEpKGJyMSwgYmcxLCBiYjEsIDI1NSk7CisKKwkJZXRjMXNfb3B0aW1pemVyX2V2YWx1YXRlX3NvbHV0aW9uKHBTdGF0ZSwgcFBhcmFtcywgbnVtX3BpeGVscywgcFBpeGVscywgcFdlaWdodHMsIGN1cl9jb29yZHMsICZ0cmlhbF9zb2x1dGlvbiwgJnBTdGF0ZS0+bV9iZXN0X3NvbHV0aW9uKTsKKwkKKwkJaWYgKHBTdGF0ZS0+bV9iZXN0X3NvbHV0aW9uLm1fZXJyb3IgPT0gMCkKKwkJCWJyZWFrOworCX0KK30KKworLy8gRW5jb2RlIGFuIEVUQzFTIGJsb2NrIGdpdmVuIGEgNHg0IHBpeGVsIGJsb2NrLgora2VybmVsIHZvaWQgZW5jb2RlX2V0YzFzX2Jsb2NrcygKKyAgICBjb25zdCBnbG9iYWwgZW5jb2RlX2V0YzFzX3BhcmFtX3N0cnVjdCAqcFBhcmFtcywgCisgICAgY29uc3QgZ2xvYmFsIHBpeGVsX2Jsb2NrICpwSW5wdXRfYmxvY2tzLAorICAgIGdsb2JhbCBldGNfYmxvY2sgKnBPdXRwdXRfYmxvY2tzKQoreworCWNvbnN0IHVpbnQzMl90IGJsb2NrX2luZGV4ID0gZ2V0X2dsb2JhbF9pZCgwKTsKKwkKKwljb25zdCBnbG9iYWwgcGl4ZWxfYmxvY2sgKnBJbnB1dF9ibG9jayA9ICZwSW5wdXRfYmxvY2tzW2Jsb2NrX2luZGV4XTsKKworCWV0YzFzX29wdGltaXplcl9zdGF0ZSBzdGF0ZTsKKwlldGMxc19vcHRpbWl6ZXJfaW5pdCgmc3RhdGUsIHBQYXJhbXMsIDE2LCBwSW5wdXRfYmxvY2stPm1fcGl4ZWxzLCBOVUxMKTsKKwlldGMxc19vcHRpbWl6ZXJfaW50ZXJuYWxfY2x1c3Rlcl9maXQocFBhcmFtcy0+bV90b3RhbF9wZXJtcywgJnN0YXRlLCBwUGFyYW1zLCAxNiwgcElucHV0X2Jsb2NrLT5tX3BpeGVscywgTlVMTCk7CisJCisJZXRjX2Jsb2NrIGJsazsKKwlldGNfYmxvY2tfc2V0X2ZsaXBfYml0KCZibGssIHRydWUpOworCWV0Y19ibG9ja19zZXRfYmxvY2tfY29sb3I1X2V0YzFzKCZibGssIHN0YXRlLm1fYmVzdF9zb2x1dGlvbi5tX2Nvb3Jkcy5tX3Vuc2NhbGVkX2NvbG9yKTsKKwlldGNfYmxvY2tfc2V0X2ludGVuX3RhYmxlc19ldGMxcygmYmxrLCBzdGF0ZS5tX2Jlc3Rfc29sdXRpb24ubV9jb29yZHMubV9pbnRlbl90YWJsZSk7CisJZXRjX2Jsb2NrX3BhY2tfcmF3X3NlbGVjdG9ycygmYmxrLCBzdGF0ZS5tX2Jlc3Rfc29sdXRpb24ubV9zZWxlY3RvcnMpOworCQkJCQkJCQorCXBPdXRwdXRfYmxvY2tzW2Jsb2NrX2luZGV4XSA9IGJsazsKK30KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHBpeGVsX2NsdXN0ZXJfdGFnCit7CisJdWludDY0X3QgbV90b3RhbF9waXhlbHM7CisJdWludDY0X3QgbV9maXJzdF9waXhlbF9pbmRleDsKK30gcGl4ZWxfY2x1c3RlcjsKKworLy8gRGV0ZXJtaW5lIHRoZSBvcHRpbWFsIEVUQzFTIGNvbG9yNS9pbnRlbnNpdHkgZ2l2ZW4gYW4gYXJiaXRyYXJ5IGxhcmdlIGFycmF5IG9mIDR4NCBpbnB1dCBwaXhlbCBibG9ja3MuCitrZXJuZWwgdm9pZCBlbmNvZGVfZXRjMXNfZnJvbV9waXhlbF9jbHVzdGVyKAorICAgIGNvbnN0IGdsb2JhbCBlbmNvZGVfZXRjMXNfcGFyYW1fc3RydWN0ICpwUGFyYW1zLCAKKyAgICBjb25zdCBnbG9iYWwgcGl4ZWxfY2x1c3RlciAqcElucHV0X3BpeGVsX2NsdXN0ZXJzLAorCWNvbnN0IGdsb2JhbCBjb2xvcl9yZ2JhICpwSW5wdXRfcGl4ZWxzLAorCWNvbnN0IGdsb2JhbCB1aW50MzJfdCAqcElucHV0X3dlaWdodHMsCisgICAgZ2xvYmFsIGV0Y19ibG9jayAqcE91dHB1dF9ibG9ja3MpCit7CisJY29uc3QgdWludDMyX3QgY2x1c3Rlcl9pbmRleCA9IGdldF9nbG9iYWxfaWQoMCk7CisJCisJY29uc3QgZ2xvYmFsIHBpeGVsX2NsdXN0ZXIgKnBJbnB1dF9jbHVzdGVyID0gJnBJbnB1dF9waXhlbF9jbHVzdGVyc1tjbHVzdGVyX2luZGV4XTsKKworCXVpbnQ2NF90IHRvdGFsX3BpeGVscyA9IHBJbnB1dF9jbHVzdGVyLT5tX3RvdGFsX3BpeGVsczsKKwljb25zdCBnbG9iYWwgY29sb3JfcmdiYSAqcFBpeGVscyA9IHBJbnB1dF9waXhlbHMgKyBwSW5wdXRfY2x1c3Rlci0+bV9maXJzdF9waXhlbF9pbmRleDsKKwljb25zdCBnbG9iYWwgdWludDMyX3QgKnBXZWlnaHRzID0gcElucHV0X3dlaWdodHMgKyBwSW5wdXRfY2x1c3Rlci0+bV9maXJzdF9waXhlbF9pbmRleDsKKworCWV0YzFzX29wdGltaXplcl9zdGF0ZSBzdGF0ZTsKKwlldGMxc19vcHRpbWl6ZXJfaW5pdCgmc3RhdGUsIHBQYXJhbXMsIHRvdGFsX3BpeGVscywgcFBpeGVscywgcFdlaWdodHMpOworCWV0YzFzX29wdGltaXplcl9pbnRlcm5hbF9jbHVzdGVyX2ZpdChwUGFyYW1zLT5tX3RvdGFsX3Blcm1zLCAmc3RhdGUsIHBQYXJhbXMsIHRvdGFsX3BpeGVscywgcFBpeGVscywgcFdlaWdodHMpOworCQorCWV0Y19ibG9jayBibGs7CisJZXRjX2Jsb2NrX3NldF9mbGlwX2JpdCgmYmxrLCB0cnVlKTsKKwlldGNfYmxvY2tfc2V0X2Jsb2NrX2NvbG9yNV9ldGMxcygmYmxrLCBzdGF0ZS5tX2Jlc3Rfc29sdXRpb24ubV9jb29yZHMubV91bnNjYWxlZF9jb2xvcik7CisJZXRjX2Jsb2NrX3NldF9pbnRlbl90YWJsZXNfZXRjMXMoJmJsaywgc3RhdGUubV9iZXN0X3NvbHV0aW9uLm1fY29vcmRzLm1faW50ZW5fdGFibGUpOworCQkJCQkJCQkKKwlwT3V0cHV0X2Jsb2Nrc1tjbHVzdGVyX2luZGV4XSA9IGJsazsKK30KKworLy8gLS0tLSByZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb24KK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSByZWNfYmxvY2tfc3RydWN0X3RhZworeworCXVpbnQxNl90IG1fZmlyc3RfY2x1c3Rlcl9vZnM7CisJdWludDE2X3QgbV9udW1fY2x1c3RlcnM7CisJdWludDE2X3QgbV9jdXJfY2x1c3Rlcl9pbmRleDsKKwl1aW50OF90IG1fY3VyX2NsdXN0ZXJfZXRjX2ludGVuOworfSByZWNfYmxvY2tfc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcmVjX2VuZHBvaW50X2NsdXN0ZXJfc3RydWN0X3RhZworeworCWNvbG9yX3JnYmEgbV91bnNjYWxlZF9jb2xvcjsKKwl1aW50OF90IG1fZXRjX2ludGVuOworCXVpbnQxNl90IG1fY2x1c3Rlcl9pbmRleDsKK30gcmVjX2VuZHBvaW50X2NsdXN0ZXJfc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcmVjX3BhcmFtX3N0cnVjdF90YWcKK3sKKwl1aW50MzJfdCBtX3RvdGFsX2Jsb2NrczsKKwlpbnQgbV9wZXJjZXB0dWFsOworfSByZWNfcGFyYW1fc3RydWN0OworCisvLyBGb3IgZWFjaCBpbnB1dCBibG9jazogZmluZCB0aGUgYmVzdCBlbmRwb2ludCBjbHVzdGVyIHRoYXQgZW5jb2RlcyBpdC4KK2tlcm5lbCB2b2lkIHJlZmluZV9lbmRwb2ludF9jbHVzdGVyaXphdGlvbigKKyAgICBjb25zdCByZWNfcGFyYW1fc3RydWN0IHBhcmFtcywgCisgICAgY29uc3QgZ2xvYmFsIHBpeGVsX2Jsb2NrICpwSW5wdXRfYmxvY2tzLAorCWNvbnN0IGdsb2JhbCByZWNfYmxvY2tfc3RydWN0ICpwSW5wdXRfYmxvY2tfaW5mbywKKwljb25zdCBnbG9iYWwgcmVjX2VuZHBvaW50X2NsdXN0ZXJfc3RydWN0ICpwSW5wdXRfY2x1c3RlcnMsCisJY29uc3QgZ2xvYmFsIHVpbnQzMl90ICpwU29ydGVkX2Jsb2NrX2luZGljZXMsCisgICAgZ2xvYmFsIHVpbnQzMl90ICpwT3V0cHV0X2luZGljZXMpCit7CisJY29uc3QgdWludDMyX3Qgc29ydGVkX2Jsb2NrX2luZGV4ID0gZ2V0X2dsb2JhbF9pZCgwKTsKKwljb25zdCB1aW50MzJfdCBibG9ja19pbmRleCA9IHBTb3J0ZWRfYmxvY2tfaW5kaWNlc1tzb3J0ZWRfYmxvY2tfaW5kZXhdOworCWNvbnN0IGludCBwZXJjZXB0dWFsID0gcGFyYW1zLm1fcGVyY2VwdHVhbDsKKworCWNvbnN0IGdsb2JhbCBwaXhlbF9ibG9jayAqcElucHV0X2Jsb2NrID0gJnBJbnB1dF9ibG9ja3NbYmxvY2tfaW5kZXhdOworCQkJCisJcGl4ZWxfYmxvY2sgcHJpdl9waXhlbF9ibG9jazsKKwlwcml2X3BpeGVsX2Jsb2NrID0gKnBJbnB1dF9ibG9jazsKKworCWNvbnN0IHVpbnQzMl90IGZpcnN0X2NsdXN0ZXJfb2ZzID0gcElucHV0X2Jsb2NrX2luZm9bYmxvY2tfaW5kZXhdLm1fZmlyc3RfY2x1c3Rlcl9vZnM7CisJY29uc3QgdWludDMyX3QgbnVtX2NsdXN0ZXJzID0gcElucHV0X2Jsb2NrX2luZm9bYmxvY2tfaW5kZXhdLm1fbnVtX2NsdXN0ZXJzOworCWNvbnN0IHVpbnQzMl90IGN1cl9ibG9ja19jbHVzdGVyX2luZGV4ID0gcElucHV0X2Jsb2NrX2luZm9bYmxvY2tfaW5kZXhdLm1fY3VyX2NsdXN0ZXJfaW5kZXg7CisJY29uc3QgdWludDMyX3QgY3VyX2Jsb2NrX2NsdXN0ZXJfZXRjX2ludGVuID0gcElucHV0X2Jsb2NrX2luZm9bYmxvY2tfaW5kZXhdLm1fY3VyX2NsdXN0ZXJfZXRjX2ludGVuOworCQorCXVpbnQ2NF90IG92ZXJhbGxfYmVzdF9lcnIgPSBVSU5UNjRfTUFYOworCXVpbnQzMl90IGJlc3RfY2x1c3Rlcl9pbmRleCA9IDA7CisKKwlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX2NsdXN0ZXJzOyBpKyspCisJeworCQljb25zdCB1aW50MzJfdCBjbHVzdGVyX2luZGV4ID0gZmlyc3RfY2x1c3Rlcl9vZnMgKyBpOworCQljb2xvcl9yZ2JhIHVuc2NhbGVkX2NvbG9yID0gcElucHV0X2NsdXN0ZXJzW2NsdXN0ZXJfaW5kZXhdLm1fdW5zY2FsZWRfY29sb3I7CisJCWNvbnN0IHVpbnQ4X3QgZXRjX2ludGVuID0gcElucHV0X2NsdXN0ZXJzW2NsdXN0ZXJfaW5kZXhdLm1fZXRjX2ludGVuOworCQljb25zdCB1aW50MTZfdCBvcmlnX2NsdXN0ZXJfaW5kZXggPSBwSW5wdXRfY2x1c3RlcnNbY2x1c3Rlcl9pbmRleF0ubV9jbHVzdGVyX2luZGV4OworCisJCWlmIChldGNfaW50ZW4gPiBjdXJfYmxvY2tfY2x1c3Rlcl9ldGNfaW50ZW4pCisJCQljb250aW51ZTsKKworCQljb2xvcl9yZ2JhIGJsb2NrX2NvbG9yc1s0XTsKKwkJZ2V0X2Jsb2NrX2NvbG9yczUoYmxvY2tfY29sb3JzLCAmdW5zY2FsZWRfY29sb3IsIGV0Y19pbnRlbiwgZmFsc2UpOworCisJCXVpbnQ2NF90IHRvdGFsX2Vycm9yID0gMDsKKwkJCQkKKwkJZm9yICh1aW50MzJfdCBjID0gMDsgYyA8IDE2OyBjKyspCisJCXsKKwkJCWNvbG9yX3JnYmEgc3JjX3BpeGVsID0gcHJpdl9waXhlbF9ibG9jay5tX3BpeGVsc1tjXTsKKworCQkJdWludDMyX3QgYmVzdF9lcnJvciA9IGNvbG9yX2Rpc3RhbmNlKHBlcmNlcHR1YWwsIHNyY19waXhlbCwgYmxvY2tfY29sb3JzWzBdLCBmYWxzZSk7CisKKwkJCXVpbnQzMl90IHRyaWFsX2Vycm9yID0gY29sb3JfZGlzdGFuY2UocGVyY2VwdHVhbCwgc3JjX3BpeGVsLCBibG9ja19jb2xvcnNbMV0sIGZhbHNlKTsKKwkJCWlmICh0cmlhbF9lcnJvciA8IGJlc3RfZXJyb3IpCisJCQkJYmVzdF9lcnJvciA9IHRyaWFsX2Vycm9yOworCisJCQl0cmlhbF9lcnJvciA9IGNvbG9yX2Rpc3RhbmNlKHBlcmNlcHR1YWwsIHNyY19waXhlbCwgYmxvY2tfY29sb3JzWzJdLCBmYWxzZSk7CisJCQlpZiAodHJpYWxfZXJyb3IgPCBiZXN0X2Vycm9yKQorCQkJCWJlc3RfZXJyb3IgPSB0cmlhbF9lcnJvcjsKKworCQkJdHJpYWxfZXJyb3IgPSBjb2xvcl9kaXN0YW5jZShwZXJjZXB0dWFsLCBzcmNfcGl4ZWwsIGJsb2NrX2NvbG9yc1szXSwgZmFsc2UpOworCQkJaWYgKHRyaWFsX2Vycm9yIDwgYmVzdF9lcnJvcikKKwkJCQliZXN0X2Vycm9yID0gdHJpYWxfZXJyb3I7CisJCQkJCQkJCisJCQl0b3RhbF9lcnJvciArPSBiZXN0X2Vycm9yOworCQl9CisKKwkJaWYgKCAodG90YWxfZXJyb3IgPCBvdmVyYWxsX2Jlc3RfZXJyKSB8fAorCQkgICAgICgob3JpZ19jbHVzdGVyX2luZGV4ID09IGN1cl9ibG9ja19jbHVzdGVyX2luZGV4KSAmJiAodG90YWxfZXJyb3IgPT0gb3ZlcmFsbF9iZXN0X2VycikpCisJCQkpCisJCXsKKwkJCW92ZXJhbGxfYmVzdF9lcnIgPSB0b3RhbF9lcnJvcjsKKwkJCWJlc3RfY2x1c3Rlcl9pbmRleCA9IG9yaWdfY2x1c3Rlcl9pbmRleDsKKwkJCWlmICghb3ZlcmFsbF9iZXN0X2VycikKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXBPdXRwdXRfaW5kaWNlc1tibG9ja19pbmRleF0gPSBiZXN0X2NsdXN0ZXJfaW5kZXg7Cit9CisKKy8vIC0tLS0gZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrCisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBmb3NjX3NlbGVjdG9yX3N0cnVjdF90YWcKK3sKKwl1aW50MzJfdCBtX3BhY2tlZF9zZWxlY3RvcnM7CS8vIDR4NCBncmlkIG9mIDItYml0IHNlbGVjdG9ycworfSBmb3NjX3NlbGVjdG9yX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGZvc2NfYmxvY2tfc3RydWN0X3RhZworeworCWNvbG9yX3JnYmEgbV9ldGNfY29sb3I1X2ludGVuOyAgLy8gdW5zY2FsZWQgNS1iaXQgYmxvY2sgY29sb3IgaW4gUkdCLCBhbHBoYSBoYXMgYmxvY2sncyBpbnRlbnNpdHkgaW5kZXgKKwl1aW50MzJfdCBtX2ZpcnN0X3NlbGVjdG9yOwkJLy8gb2Zmc2V0IGludG8gc2VsZWN0b3IgdGFibGUKKwl1aW50MzJfdCBtX251bV9zZWxlY3RvcnM7CQkvLyBudW1iZXIgb2Ygc2VsZWN0b3JzIHRvIGNoZWNrCit9IGZvc2NfYmxvY2tfc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZm9zY19wYXJhbV9zdHJ1Y3RfdGFnCit7CisJdWludDMyX3QgbV90b3RhbF9ibG9ja3M7CisJaW50IG1fcGVyY2VwdHVhbDsKK30gZm9zY19wYXJhbV9zdHJ1Y3Q7CisKKy8vIEZvciBlYWNoIGlucHV0IGJsb2NrOiBGaW5kIHRoZSBxdWFudGl6ZWQgc2VsZWN0b3Igd2hpY2ggcmVzdWx0cyBpbiB0aGUgbG93ZXN0IGVycm9yLgora2VybmVsIHZvaWQgZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrKAorICAgIGNvbnN0IGZvc2NfcGFyYW1fc3RydWN0IHBhcmFtcywgCisgICAgY29uc3QgZ2xvYmFsIHBpeGVsX2Jsb2NrICpwSW5wdXRfYmxvY2tzLAorCWNvbnN0IGdsb2JhbCBmb3NjX2Jsb2NrX3N0cnVjdCAqcElucHV0X2Jsb2NrX2luZm8sCisJY29uc3QgZ2xvYmFsIGZvc2Nfc2VsZWN0b3Jfc3RydWN0ICpwSW5wdXRfc2VsZWN0b3JzLAorCWNvbnN0IGdsb2JhbCB1aW50MzJfdCAqcFNlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcywKKyAgICBnbG9iYWwgdWludDMyX3QgKnBPdXRwdXRfc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzKQoreworCWNvbnN0IHVpbnQzMl90IGJsb2NrX2luZGV4ID0gZ2V0X2dsb2JhbF9pZCgwKTsKKwkKKwljb25zdCBnbG9iYWwgY29sb3JfcmdiYSAqcEJsb2NrX3BpeGVscyA9IHBJbnB1dF9ibG9ja3NbYmxvY2tfaW5kZXhdLm1fcGl4ZWxzOworCWNvbnN0IGdsb2JhbCBmb3NjX2Jsb2NrX3N0cnVjdCAqcEJsb2NrX2luZm8gPSAmcElucHV0X2Jsb2NrX2luZm9bYmxvY2tfaW5kZXhdOworCQorCWNvbnN0IGdsb2JhbCBmb3NjX3NlbGVjdG9yX3N0cnVjdCAqcFNlbGVjdG9ycyA9ICZwSW5wdXRfc2VsZWN0b3JzW3BCbG9ja19pbmZvLT5tX2ZpcnN0X3NlbGVjdG9yXTsKKwljb25zdCB1aW50MzJfdCBudW1fc2VsZWN0b3JzID0gcEJsb2NrX2luZm8tPm1fbnVtX3NlbGVjdG9yczsKKworCWNvbG9yX3JnYmEgdHJpYWxfYmxvY2tfY29sb3JzWzRdOworCWNvbG9yX3JnYmEgZXRjX2NvbG9yNV9pbnRlbiA9IHBCbG9ja19pbmZvLT5tX2V0Y19jb2xvcjVfaW50ZW47CisJZ2V0X2Jsb2NrX2NvbG9yczUodHJpYWxfYmxvY2tfY29sb3JzLCAmZXRjX2NvbG9yNV9pbnRlbiwgZXRjX2NvbG9yNV9pbnRlbi53LCBmYWxzZSk7CisKKwl1aW50MzJfdCB0cmlhbF9lcnJvcnNbNF1bMTZdOworCisJaWYgKHBhcmFtcy5tX3BlcmNlcHR1YWwpCisJeworCQlmb3IgKHVpbnQzMl90IHNlbCA9IDA7IHNlbCA8IDQ7ICsrc2VsKQorCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDE2OyArK2kpCisJCQkJdHJpYWxfZXJyb3JzW3NlbF1baV0gPSBjb2xvcl9kaXN0YW5jZSh0cnVlLCBwQmxvY2tfcGl4ZWxzW2ldLCB0cmlhbF9ibG9ja19jb2xvcnNbc2VsXSwgZmFsc2UpOworCX0KKwllbHNlCisJeworCQlmb3IgKHVpbnQzMl90IHNlbCA9IDA7IHNlbCA8IDQ7ICsrc2VsKQorCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDE2OyArK2kpCisJCQkJdHJpYWxfZXJyb3JzW3NlbF1baV0gPSBjb2xvcl9kaXN0YW5jZShmYWxzZSwgcEJsb2NrX3BpeGVsc1tpXSwgdHJpYWxfYmxvY2tfY29sb3JzW3NlbF0sIGZhbHNlKTsKKwl9CisKKwl1aW50NjRfdCBiZXN0X2VyciA9IFVJTlQ2NF9NQVg7CisJdWludDMyX3QgYmVzdF9pbmRleCA9IDA7CisKKwlmb3IgKHVpbnQzMl90IHNlbF9pbmRleCA9IDA7IHNlbF9pbmRleCA8IG51bV9zZWxlY3RvcnM7IHNlbF9pbmRleCsrKQorCXsKKwkJdWludDMyX3Qgc2VscyA9IHBTZWxlY3RvcnNbc2VsX2luZGV4XS5tX3BhY2tlZF9zZWxlY3RvcnM7CisJCQorCQl1aW50NjRfdCB0b3RhbF9lcnIgPSAwOworCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKywgc2VscyA+Pj0gMikKKwkJCXRvdGFsX2VyciArPSB0cmlhbF9lcnJvcnNbc2VscyAmIDNdW2ldOworCisJCWlmICh0b3RhbF9lcnIgPCBiZXN0X2VycikKKwkJeworCQkJYmVzdF9lcnIgPSB0b3RhbF9lcnI7CisJCQliZXN0X2luZGV4ID0gc2VsX2luZGV4OworCisJCQlpZiAoIWJlc3RfZXJyKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcE91dHB1dF9zZWxlY3Rvcl9jbHVzdGVyX2luZGljZXNbYmxvY2tfaW5kZXhdID0gcFNlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlc1twQmxvY2tfaW5mby0+bV9maXJzdF9zZWxlY3RvciArIGJlc3RfaW5kZXhdOworfQorCisvLyBkZXRlcm1pbmVfc2VsZWN0b3JzCisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkc19wYXJhbV9zdHJ1Y3RfdGFnCit7CisJdWludDMyX3QgbV90b3RhbF9ibG9ja3M7CisJaW50IG1fcGVyY2VwdHVhbDsKK30gZHNfcGFyYW1fc3RydWN0OworCisvLyBGb3IgZWFjaCBpbnB1dCBibG9jazogRGV0ZXJtaW5lIHRoZSBFVEMxUyBzZWxlY3RvcnMgdGhhdCByZXN1bHQgaW4gdGhlIGxvd2VzdCBlcnJvciwgZ2l2ZW4gZWFjaCBibG9jaydzIHByZWRldGVybWluZWQgRVRDMVMgY29sb3I1L2ludGVuc2l0aWVzLiAKK2tlcm5lbCB2b2lkIGRldGVybWluZV9zZWxlY3RvcnMoCisgICAgY29uc3QgZHNfcGFyYW1fc3RydWN0IHBhcmFtcywgCisgICAgY29uc3QgZ2xvYmFsIHBpeGVsX2Jsb2NrICpwSW5wdXRfYmxvY2tzLAorCWNvbnN0IGdsb2JhbCBjb2xvcl9yZ2JhICpwSW5wdXRfZXRjX2NvbG9yNV9hbmRfaW50ZW4sCisgICAgZ2xvYmFsIGV0Y19ibG9jayAqcE91dHB1dF9ibG9ja3MpCit7CisJY29uc3QgdWludDMyX3QgYmxvY2tfaW5kZXggPSBnZXRfZ2xvYmFsX2lkKDApOworCQorCWNvbnN0IGdsb2JhbCBjb2xvcl9yZ2JhICpwQmxvY2tfcGl4ZWxzID0gcElucHV0X2Jsb2Nrc1tibG9ja19pbmRleF0ubV9waXhlbHM7CisKKwljb2xvcl9yZ2JhIGV0Y19jb2xvcjVfaW50ZW4gPSBwSW5wdXRfZXRjX2NvbG9yNV9hbmRfaW50ZW5bYmxvY2tfaW5kZXhdOworCisJY29sb3JfcmdiYSBibG9ja19jb2xvcnNbNF07CisJZ2V0X2Jsb2NrX2NvbG9yczUoYmxvY2tfY29sb3JzLCAmZXRjX2NvbG9yNV9pbnRlbiwgZXRjX2NvbG9yNV9pbnRlbi53LCBmYWxzZSk7CisKKwlldGNfYmxvY2sgb3V0cHV0X2Jsb2NrOworCWV0Y19ibG9ja19zZXRfZmxpcF9iaXQoJm91dHB1dF9ibG9jaywgdHJ1ZSk7CisJZXRjX2Jsb2NrX3NldF9ibG9ja19jb2xvcjVfZXRjMXMoJm91dHB1dF9ibG9jaywgZXRjX2NvbG9yNV9pbnRlbik7CisJZXRjX2Jsb2NrX3NldF9pbnRlbl90YWJsZXNfZXRjMXMoJm91dHB1dF9ibG9jaywgZXRjX2NvbG9yNV9pbnRlbi53KTsKKworCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkJY29sb3JfcmdiYSBwaXhlbF9jb2xvciA9IHBCbG9ja19waXhlbHNbaV07CisKKwkJdWludCBlcnIwID0gY29sb3JfZGlzdGFuY2UocGFyYW1zLm1fcGVyY2VwdHVhbCwgcGl4ZWxfY29sb3IsIGJsb2NrX2NvbG9yc1swXSwgZmFsc2UpOworCQl1aW50IGVycjEgPSBjb2xvcl9kaXN0YW5jZShwYXJhbXMubV9wZXJjZXB0dWFsLCBwaXhlbF9jb2xvciwgYmxvY2tfY29sb3JzWzFdLCBmYWxzZSk7CisJCXVpbnQgZXJyMiA9IGNvbG9yX2Rpc3RhbmNlKHBhcmFtcy5tX3BlcmNlcHR1YWwsIHBpeGVsX2NvbG9yLCBibG9ja19jb2xvcnNbMl0sIGZhbHNlKTsKKwkJdWludCBlcnIzID0gY29sb3JfZGlzdGFuY2UocGFyYW1zLm1fcGVyY2VwdHVhbCwgcGl4ZWxfY29sb3IsIGJsb2NrX2NvbG9yc1szXSwgZmFsc2UpOworCisJCXVpbnQgYmVzdF9lcnIgPSBtaW4obWluKG1pbihlcnIwLCBlcnIxKSwgZXJyMiksIGVycjMpOworCisJCXVpbnQzMl90IGJlc3Rfc2VsID0gKGJlc3RfZXJyID09IGVycjIpID8gMiA6IDM7CisJCWJlc3Rfc2VsID0gKGJlc3RfZXJyID09IGVycjEpID8gMSA6IGJlc3Rfc2VsOworCQliZXN0X3NlbCA9IChiZXN0X2VyciA9PSBlcnIwKSA/IDAgOiBiZXN0X3NlbDsKKworCQlldGNfYmxvY2tfc2V0X3NlbGVjdG9yKCZvdXRwdXRfYmxvY2ssIGkgJiAzLCBpID4+IDIsIGJlc3Rfc2VsKTsKKwl9CisKKwlwT3V0cHV0X2Jsb2Nrc1tibG9ja19pbmRleF0gPSBvdXRwdXRfYmxvY2s7Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcHJldmlld2Vycy9saWIvYmFzaXN1X3RyYW5zY29kZXIuY3BwIGIvY29udHJpYi9wcmV2aWV3ZXJzL2xpYi9iYXNpc3VfdHJhbnNjb2Rlci5jcHAKaW5kZXggYzU2NTJlMC4uMzc2NDBlZSAxMDA2NDQKLS0tIGEvY29udHJpYi9wcmV2aWV3ZXJzL2xpYi9iYXNpc3VfdHJhbnNjb2Rlci5jcHAKKysrIGIvY29udHJpYi9wcmV2aWV3ZXJzL2xpYi9iYXNpc3VfdHJhbnNjb2Rlci5jcHAKQEAgLTEsMTcgKzEsMTQgQEAKIC8qKgogICogQmFzaXMgVW5pdmVyc2FsIHNpbmdsZSBmaWxlIGxpYnJhcnkuIEdlbmVyYXRlZCB1c2luZzoKICAqIFxjb2RlCi0gKgkuL2NvbWJpbmUuc2ggLXIgLi4vLi4vdHJhbnNjb2RlciAteCBiYXNpc3VfdHJhbnNjb2Rlcl90YWJsZXNfYmM3X202LmluYyAtayBiYXNpc3VfdHJhbnNjb2Rlci5oIC1vIGJhc2lzdV90cmFuc2NvZGVyLmNwcCBiYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHAKKyAqCS4vY29tYmluZS5zaCAtciAuLi8uLi90cmFuc2NvZGVyIC1vIGJhc2lzdV90cmFuc2NvZGVyLmNwcCBiYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHAKICAqIFxlbmRjb2RlCi0gKiAKLSAqIFxub3RlIFRoZSBzY3JpcHQgYWJvdmUgZXhjbHVkZXMgdGhlIEJDNyBtb2RlIDYgdGFibGVzLCBhIGNob2ljZSByZWZsZWN0ZWQgaW4KLSAqIHRoZSBidWlsZCBvcHRpb25zLgogICovCiAKIC8qCiAgKiBUcmFuc2NvZGVyIGJ1aWxkIG9wdGlvbnMgZm9yIGtub3duIHBsYXRmb3JtcyAoaU9TIGhhcyBFVEMsIEFTVEMgYW5kIFBWUlRDOwogICogRW1zY3JpcHRlbiBhZGRzIERYVCB0byBpT1MncyBvcHRpb25zOyBBbmRyb2lkIGFkZHMgUFZSVEMyIHRvIEVtc2NyaXB0ZW4ncwotICogb3B0aW9uczsgb3RoZXIgcGxhdGZvcm1zIGJ1aWxkIGFsbCBleGNlcHQgQkM3IG1vZGUgNiBhbmQgRlhUMSkuCisgKiBvcHRpb25zOyBvdGhlciBwbGF0Zm9ybXMgYnVpbGQgYWxsIGV4Y2VwdCBGWFQxKS4KICAqIAogICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9CaW5vbWlhbExMQy9iYXNpc191bml2ZXJzYWwjc2hyaW5raW5nLXRoZS10cmFuc2NvZGVycy1jb21waWxlZC1zaXplCiAgKi8KQEAgLTI4LDE0ICsyNSwxNyBAQAogCSNpZm5kZWYgX19BTkRST0lEX18KIAkJI2RlZmluZSBCQVNJU0RfU1VQUE9SVF9QVlJUQzIgMAogCSNlbmRpZgotI2Vsc2UKLQkjZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0JDN19NT0RFNl9PUEFRVUVfT05MWSAwCiAjZW5kaWYKICNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfRlhUMSAwCiAKKy8qCisgKiBLVFgyIHN1cHBvcnQgZGlzYWJsZWQuCisgKi8KKyNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfS1RYMiAwCisKIC8qKioqIHN0YXJ0IGlubGluaW5nIGJhc2lzdV90cmFuc2NvZGVyLmNwcCAqKioqLwogLy8gYmFzaXN1X3RyYW5zY29kZXIuY3BwCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBCaW5vbWlhbCBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBCaW5vbWlhbCBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC00OSw3NiArNDksNTAzMCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLS8qKioqICpOT1QqIGlubGluaW5nIGJhc2lzdV90cmFuc2NvZGVyLmggKioqKi8KLSNpbmNsdWRlICJiYXNpc3VfdHJhbnNjb2Rlci5oIgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KKy8qKioqIHN0YXJ0IGlubGluaW5nIGJhc2lzdV90cmFuc2NvZGVyLmggKioqKi8KKy8vIGJhc2lzdV90cmFuc2NvZGVyLmgKKy8vIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEJpbm9taWFsIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIEltcG9ydGFudDogSWYgY29tcGlsaW5nIHdpdGggZ2NjLCBiZSBzdXJlIHN0cmljdCBhbGlhc2luZyBpcyBkaXNhYmxlZDogLWZuby1zdHJpY3QtYWxpYXNpbmcKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIElTX0JJR19FTkRJQU4KKy8vIEJ5IGRlZmF1bHQgS1RYMiBzdXBwb3J0IGlzIGVuYWJsZWQgdG8gc2ltcGxpZnkgY29tcGlsYXRpb24uIFRoaXMgaW1wbGllcyB0aGUgbmVlZCBmb3IgdGhlIFpzdGFuZGFyZCBsaWJyYXJ5ICh3aGljaCB3ZSBkaXN0cmlidXRlIGFzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIGluIHRoZSAienN0ZCIgZGlyZWN0b3J5KSBieSBkZWZhdWx0LgorLy8gU2V0IEJBU0lTRF9TVVBQT1JUX0tUWDIgdG8gMCB0byBjb21wbGV0ZWx5IGRpc2FibGUgS1RYMiBzdXBwb3J0IGFzIHdlbGwgYXMgWnN0ZC9taW5peiB1c2FnZSB3aGljaCBpcyBvbmx5IHJlcXVpcmVkIGZvciBVQVNUQyBzdXBlcmNvbXByZXNzaW9uIGluIEtUWDIgZmlsZXMuCisvLyBBbHNvIHNlZSBCQVNJU0RfU1VQUE9SVF9LVFgyX1pTVEQgaW4gYmFzaXN1X3RyYW5zY29kZXIuY3BwLCB3aGljaCBpbmRpdmlkdWFsbHkgZGlzYWJsZXMgWnN0ZCB1c2FnZS4KKyNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfS1RYMgorCSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfS1RYMiAxCisjZW5kaWYKKworLy8gU2V0IEJBU0lTRF9TVVBQT1JUX0tUWDJfWlNURCB0byAwIHRvIGRpc2FibGUgWnN0ZCB1c2FnZSBhbmQgS1RYMiBVQVNUQyBac3RkIHN1cGVyY29tcHJlc3Npb24gc3VwcG9ydCAKKyNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfS1RYMl9aU1RECisJI2RlZmluZSBCQVNJU0RfU1VQUE9SVF9LVFgyX1pTVEQgMQorI2VuZGlmCisKKy8vIFNldCBCQVNJU1VfRk9SQ0VfREVWRUxfTUVTU0FHRVMgdG8gMSB0byBlbmFibGUgZGVidWcgcHJpbnRmKCkncyB3aGVuZXZlciBhbiBlcnJvciBvY2N1cnMsIGZvciBlYXNpZXIgZGVidWdnaW5nIGR1cmluZyBkZXZlbG9wbWVudC4KKyNpZm5kZWYgQkFTSVNVX0ZPUkNFX0RFVkVMX01FU1NBR0VTCisJI2RlZmluZSBCQVNJU1VfRk9SQ0VfREVWRUxfTUVTU0FHRVMgMAorI2VuZGlmCisKKy8qKioqIHN0YXJ0IGlubGluaW5nIGJhc2lzdV90cmFuc2NvZGVyX2ludGVybmFsLmggKioqKi8KKy8vIGJhc2lzdV90cmFuc2NvZGVyX2ludGVybmFsLmggLSBVbml2ZXJzYWwgdGV4dHVyZSBmb3JtYXQgdHJhbnNjb2RlciBsaWJyYXJ5LgorLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgQmlub21pYWwgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIEltcG9ydGFudDogSWYgY29tcGlsaW5nIHdpdGggZ2NjLCBiZSBzdXJlIHN0cmljdCBhbGlhc2luZyBpcyBkaXNhYmxlZDogLWZuby1zdHJpY3QtYWxpYXNpbmcKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDEyNykgLy8gIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyNlbmRpZgorCisjZGVmaW5lIEJBU0lTRF9MSUJfVkVSU0lPTiAxMTYKKyNkZWZpbmUgQkFTSVNEX1ZFUlNJT05fU1RSSU5HICIwMS4xNiIKKworI2lmZGVmIF9ERUJVRworI2RlZmluZSBCQVNJU0RfQlVJTERfREVCVUcKKyNlbHNlCisjZGVmaW5lIEJBU0lTRF9CVUlMRF9SRUxFQVNFCisjZW5kaWYKKworLyoqKiogc3RhcnQgaW5saW5pbmcgYmFzaXN1LmggKioqKi8KKy8vIGJhc2lzdS5oCisvLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBCaW5vbWlhbCBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBJbXBvcnRhbnQ6IElmIGNvbXBpbGluZyB3aXRoIGdjYywgYmUgc3VyZSBzdHJpY3QgYWxpYXNpbmcgaXMgZGlzYWJsZWQ6IC1mbm8tc3RyaWN0LWFsaWFzaW5nCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmZGVmIF9NU0NfVkVSCisKKwkjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MjAxKQorCSNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQxMjcpIC8vIHdhcm5pbmcgQzQxMjc6IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKwkjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0NTMwKSAvLyBDKysgZXhjZXB0aW9uIGhhbmRsZXIgdXNlZCwgYnV0IHVud2luZCBzZW1hbnRpY3MgYXJlIG5vdCBlbmFibGVkLgorCisJLy8gU2xhbW1pbmcgdGhpcyBvZmYgYWx3YXlzIGZvciB2MS4xNiBiZWNhdXNlIHdlJ3ZlIGdvdHRlbiByaWQgb2YgbW9zdCBzdGQgY29udGFpbmVycy4KKwkjaWZuZGVmIEJBU0lTVV9OT19JVEVSQVRPUl9ERUJVR19MRVZFTAorCQkjZGVmaW5lIEJBU0lTVV9OT19JVEVSQVRPUl9ERUJVR19MRVZFTCAoMSkKKwkjZW5kaWYKKworCSNpZm5kZWYgQkFTSVNVX05PX0lURVJBVE9SX0RFQlVHX0xFVkVMCisJCS8vI2RlZmluZSBfSEFTX0lURVJBVE9SX0RFQlVHR0lORyAwCisKKwkJI2lmIGRlZmluZWQoX0RFQlVHKSB8fCBkZWZpbmVkKERFQlVHKQorCQkJLy8gVGhpcyBpcyBtYWRuZXNzLCBidXQgd2UgbmVlZCB0byBkaXNhYmxlIGl0ZXJhdG9yIGRlYnVnZ2luZyBpbiBkZWJ1ZyBidWlsZHMgb3IgdGhlIGVuY29kZXIgaXMgdW5zYWJsZSBiZWNhdXNlIE1TVkMncyBpdGVyYXRvciBkZWJ1Z2dpbmcgaW1wbGVtZW50YXRpb24gaXMgdG90YWxseSBicm9rZW4uCisJCQkjaWZuZGVmIF9JVEVSQVRPUl9ERUJVR19MRVZFTAorCQkJI2RlZmluZSBfSVRFUkFUT1JfREVCVUdfTEVWRUwgMQorCQkJI2VuZGlmCisJCQkjaWZuZGVmIF9TRUNVUkVfU0NMCisJCQkjZGVmaW5lIF9TRUNVUkVfU0NMIDEKKwkJCSNlbmRpZgorCQkjZWxzZSAvLyBkZWZpbmVkKF9ERUJVRykgfHwgZGVmaW5lZChERUJVRykKKwkJCSNpZm5kZWYgX1NFQ1VSRV9TQ0wKKwkJCSNkZWZpbmUgX1NFQ1VSRV9TQ0wgMAorCQkJI2VuZGlmCisJCQkjaWZuZGVmIF9JVEVSQVRPUl9ERUJVR19MRVZFTAorCQkJI2RlZmluZSBfSVRFUkFUT1JfREVCVUdfTEVWRUwgMAorCQkJI2VuZGlmCisJCSNlbmRpZiAvLyBkZWZpbmVkKF9ERUJVRykgfHwgZGVmaW5lZChERUJVRykKKworCSNlbmRpZiAvLyBCQVNJU1VfTk9fSVRFUkFUT1JfREVCVUdfTEVWRUwKKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxyYW5kb20+CisKKy8qKioqIHN0YXJ0IGlubGluaW5nIGJhc2lzdV9jb250YWluZXJzLmggKioqKi8KKy8vIGJhc2lzdV9jb250YWluZXJzLmgKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiAhZGVmaW5lZChBTkRST0lEKQorLy8gT25seSBmb3IgbWFsbG9jX3VzYWJsZV9zaXplKCkgaW4gYmFzaXN1X2NvbnRhaW5lcnNfaW1wbC5oCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjZGVmaW5lIEhBU19NQUxMT0NfVVNBQkxFX1NJWkUgMQorI2VuZGlmCisKKy8vIFNldCB0byAxIHRvIGFsd2F5cyBjaGVjayB2ZWN0b3Igb3BlcmF0b3JbXSwgZnJvbnQoKSwgYW5kIGJhY2soKSBldmVuIGluIHJlbGVhc2UuCisjZGVmaW5lIEJBU0lTVV9WRUNUT1JfRk9SQ0VfQ0hFQ0tJTkcgMAorCisvLyBJZiAxLCB0aGUgdmVjdG9yIGNvbnRhaW5lciB3aWxsIG5vdCBxdWVyeSB0aGUgQ1JUIHRvIGdldCB0aGUgc2l6ZSBvZiByZXNpemVkIG1lbW9yeSBibG9ja3MuCisjZGVmaW5lIEJBU0lTVV9WRUNUT1JfREVURVJNSU5JU1RJQyAxCisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBCQVNJU1VfRk9SQ0VfSU5MSU5FIF9fZm9yY2VpbmxpbmUKKyNlbHNlCisjZGVmaW5lIEJBU0lTVV9GT1JDRV9JTkxJTkUgaW5saW5lCisjZW5kaWYKKworbmFtZXNwYWNlIGJhc2lzdQoreworICAgZW51bSB7IGNJbnZhbGlkSW5kZXggPSAtMSB9OworCisgICBuYW1lc3BhY2UgaGVscGVycworICAgeworICAgICAgaW5saW5lIGJvb2wgaXNfcG93ZXJfb2ZfMih1aW50MzJfdCB4KSB7IHJldHVybiB4ICYmICgoeCAmICh4IC0gMVUpKSA9PSAwVSk7IH0KKyAgICAgIGlubGluZSBib29sIGlzX3Bvd2VyX29mXzIodWludDY0X3QgeCkgeyByZXR1cm4geCAmJiAoKHggJiAoeCAtIDFVKSkgPT0gMFUpOyB9CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjb25zdCBUJiBtaW5pbXVtKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpIHsgcmV0dXJuIChiIDwgYSkgPyBiIDogYTsgfQorICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY29uc3QgVCYgbWF4aW11bShjb25zdCBUJiBhLCBjb25zdCBUJiBiKSB7IHJldHVybiAoYSA8IGIpID8gYiA6IGE7IH0KKworICAgICAgaW5saW5lIHVpbnQzMl90IGZsb29yX2xvZzJpKHVpbnQzMl90IHYpCisgICAgICB7CisgICAgICAgICB1aW50MzJfdCBsID0gMDsKKyAgICAgICAgIHdoaWxlICh2ID4gMVUpCisgICAgICAgICB7CisgICAgICAgICAgICB2ID4+PSAxOworICAgICAgICAgICAgbCsrOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGw7CisgICAgICB9CisKKyAgICAgIGlubGluZSB1aW50MzJfdCBuZXh0X3BvdzIodWludDMyX3QgdmFsKQorICAgICAgeworICAgICAgICAgdmFsLS07CisgICAgICAgICB2YWwgfD0gdmFsID4+IDE2OworICAgICAgICAgdmFsIHw9IHZhbCA+PiA4OworICAgICAgICAgdmFsIHw9IHZhbCA+PiA0OworICAgICAgICAgdmFsIHw9IHZhbCA+PiAyOworICAgICAgICAgdmFsIHw9IHZhbCA+PiAxOworICAgICAgICAgcmV0dXJuIHZhbCArIDE7CisgICAgICB9CisKKyAgICAgIGlubGluZSB1aW50NjRfdCBuZXh0X3BvdzIodWludDY0X3QgdmFsKQorICAgICAgeworICAgICAgICAgdmFsLS07CisgICAgICAgICB2YWwgfD0gdmFsID4+IDMyOworICAgICAgICAgdmFsIHw9IHZhbCA+PiAxNjsKKyAgICAgICAgIHZhbCB8PSB2YWwgPj4gODsKKyAgICAgICAgIHZhbCB8PSB2YWwgPj4gNDsKKyAgICAgICAgIHZhbCB8PSB2YWwgPj4gMjsKKyAgICAgICAgIHZhbCB8PSB2YWwgPj4gMTsKKyAgICAgICAgIHJldHVybiB2YWwgKyAxOworICAgICAgfQorICAgfSAvLyBuYW1lc3BhY2UgaGVscGVycworCisgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgIGlubGluZSBUKiBjb25zdHJ1Y3QoVCogcCkKKyAgIHsKKyAgICAgIHJldHVybiBuZXcgKHN0YXRpY19jYXN0PHZvaWQqPihwKSkgVDsKKyAgIH0KKworICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgICBpbmxpbmUgVCogY29uc3RydWN0KFQqIHAsIGNvbnN0IFUmIGluaXQpCisgICB7CisgICAgICByZXR1cm4gbmV3IChzdGF0aWNfY2FzdDx2b2lkKj4ocCkpIFQoaW5pdCk7CisgICB9CisKKyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgaW5saW5lIHZvaWQgY29uc3RydWN0X2FycmF5KFQqIHAsIHNpemVfdCBuKQorICAgeworICAgICAgVCogcSA9IHAgKyBuOworICAgICAgZm9yICg7IHAgIT0gcTsgKytwKQorICAgICAgICAgbmV3IChzdGF0aWNfY2FzdDx2b2lkKj4ocCkpIFQ7CisgICB9CisKKyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICAgaW5saW5lIHZvaWQgY29uc3RydWN0X2FycmF5KFQqIHAsIHNpemVfdCBuLCBjb25zdCBVJiBpbml0KQorICAgeworICAgICAgVCogcSA9IHAgKyBuOworICAgICAgZm9yICg7IHAgIT0gcTsgKytwKQorICAgICAgICAgbmV3IChzdGF0aWNfY2FzdDx2b2lkKj4ocCkpIFQoaW5pdCk7CisgICB9CisKKyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgaW5saW5lIHZvaWQgZGVzdHJ1Y3QoVCogcCkKKyAgIHsKKyAgICAgICh2b2lkKXA7CisgICAgICBwLT5+VCgpOworICAgfQorCisgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgZGVzdHJ1Y3RfYXJyYXkoVCogcCwgc2l6ZV90IG4pCisgICB7CisgICAgICBUKiBxID0gcCArIG47CisgICAgICBmb3IgKDsgcCAhPSBxOyArK3ApCisgICAgICAgICBwLT5+VCgpOworICAgfQorCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaW50X3RyYWl0cyB7IGVudW0geyBjTWluID0gSU5UMzJfTUlOLCBjTWF4ID0gSU5UMzJfTUFYLCBjU2lnbmVkID0gdHJ1ZSB9OyB9OworCisgICB0ZW1wbGF0ZTw+IHN0cnVjdCBpbnRfdHJhaXRzPGludDhfdD4geyBlbnVtIHsgY01pbiA9IElOVDhfTUlOLCBjTWF4ID0gSU5UOF9NQVgsIGNTaWduZWQgPSB0cnVlIH07IH07CisgICB0ZW1wbGF0ZTw+IHN0cnVjdCBpbnRfdHJhaXRzPGludDE2X3Q+IHsgZW51bSB7IGNNaW4gPSBJTlQxNl9NSU4sIGNNYXggPSBJTlQxNl9NQVgsIGNTaWduZWQgPSB0cnVlIH07IH07CisgICB0ZW1wbGF0ZTw+IHN0cnVjdCBpbnRfdHJhaXRzPGludDMyX3Q+IHsgZW51bSB7IGNNaW4gPSBJTlQzMl9NSU4sIGNNYXggPSBJTlQzMl9NQVgsIGNTaWduZWQgPSB0cnVlIH07IH07CisKKyAgIHRlbXBsYXRlPD4gc3RydWN0IGludF90cmFpdHM8dWludDhfdD4geyBlbnVtIHsgY01pbiA9IDAsIGNNYXggPSBVSU5UOF9NQVgsIGNTaWduZWQgPSBmYWxzZSB9OyB9OworICAgdGVtcGxhdGU8PiBzdHJ1Y3QgaW50X3RyYWl0czx1aW50MTZfdD4geyBlbnVtIHsgY01pbiA9IDAsIGNNYXggPSBVSU5UMTZfTUFYLCBjU2lnbmVkID0gZmFsc2UgfTsgfTsKKyAgIHRlbXBsYXRlPD4gc3RydWN0IGludF90cmFpdHM8dWludDMyX3Q+IHsgZW51bSB7IGNNaW4gPSAwLCBjTWF4ID0gVUlOVDMyX01BWCwgY1NpZ25lZCA9IGZhbHNlIH07IH07CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICBzdHJ1Y3Qgc2NhbGFyX3R5cGUKKyAgIHsKKyAgICAgIGVudW0geyBjRmxhZyA9IGZhbHNlIH07CisgICAgICBzdGF0aWMgaW5saW5lIHZvaWQgY29uc3RydWN0KFQqIHApIHsgYmFzaXN1Ojpjb25zdHJ1Y3QocCk7IH0KKyAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb25zdHJ1Y3QoVCogcCwgY29uc3QgVCYgaW5pdCkgeyBiYXNpc3U6OmNvbnN0cnVjdChwLCBpbml0KTsgfQorICAgICAgc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdF9hcnJheShUKiBwLCBzaXplX3QgbikgeyBiYXNpc3U6OmNvbnN0cnVjdF9hcnJheShwLCBuKTsgfQorICAgICAgc3RhdGljIGlubGluZSB2b2lkIGRlc3RydWN0KFQqIHApIHsgYmFzaXN1OjpkZXN0cnVjdChwKTsgfQorICAgICAgc3RhdGljIGlubGluZSB2b2lkIGRlc3RydWN0X2FycmF5KFQqIHAsIHNpemVfdCBuKSB7IGJhc2lzdTo6ZGVzdHJ1Y3RfYXJyYXkocCwgbik7IH0KKyAgIH07CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBzY2FsYXJfdHlwZTxUKj4KKyAgIHsKKyAgICAgIGVudW0geyBjRmxhZyA9IHRydWUgfTsKKyAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb25zdHJ1Y3QoVCoqIHApIHsgbWVtc2V0KHAsIDAsIHNpemVvZihUKikpOyB9CisgICAgICBzdGF0aWMgaW5saW5lIHZvaWQgY29uc3RydWN0KFQqKiBwLCBUKiBpbml0KSB7ICpwID0gaW5pdDsgfQorICAgICAgc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdF9hcnJheShUKiogcCwgc2l6ZV90IG4pIHsgbWVtc2V0KHAsIDAsIHNpemVvZihUKikgKiBuKTsgfQorICAgICAgc3RhdGljIGlubGluZSB2b2lkIGRlc3RydWN0KFQqKiBwKSB7IHA7IH0KKyAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cnVjdF9hcnJheShUKiogcCwgc2l6ZV90IG4pIHsgcCwgbjsgfQorICAgfTsKKworI2RlZmluZSBCQVNJU1VfREVGSU5FX0JVSUxUX0lOX1RZUEUoWCkgXAorICAgdGVtcGxhdGU8PiBzdHJ1Y3Qgc2NhbGFyX3R5cGU8WD4geyBcCisgICBlbnVtIHsgY0ZsYWcgPSB0cnVlIH07IFwKKyAgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb25zdHJ1Y3QoWCogcCkgeyBtZW1zZXQocCwgMCwgc2l6ZW9mKFgpKTsgfSBcCisgICBzdGF0aWMgaW5saW5lIHZvaWQgY29uc3RydWN0KFgqIHAsIGNvbnN0IFgmIGluaXQpIHsgbWVtY3B5KHAsICZpbml0LCBzaXplb2YoWCkpOyB9IFwKKyAgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb25zdHJ1Y3RfYXJyYXkoWCogcCwgc2l6ZV90IG4pIHsgbWVtc2V0KHAsIDAsIHNpemVvZihYKSAqIG4pOyB9IFwKKyAgIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cnVjdChYKiBwKSB7IHA7IH0gXAorICAgc3RhdGljIGlubGluZSB2b2lkIGRlc3RydWN0X2FycmF5KFgqIHAsIHNpemVfdCBuKSB7IHAsIG47IH0gfTsKKworICAgQkFTSVNVX0RFRklORV9CVUlMVF9JTl9UWVBFKGJvb2wpCisgICBCQVNJU1VfREVGSU5FX0JVSUxUX0lOX1RZUEUoY2hhcikKKyAgIEJBU0lTVV9ERUZJTkVfQlVJTFRfSU5fVFlQRSh1bnNpZ25lZCBjaGFyKQorICAgQkFTSVNVX0RFRklORV9CVUlMVF9JTl9UWVBFKHNob3J0KQorICAgQkFTSVNVX0RFRklORV9CVUlMVF9JTl9UWVBFKHVuc2lnbmVkIHNob3J0KQorICAgQkFTSVNVX0RFRklORV9CVUlMVF9JTl9UWVBFKGludCkKKyAgIEJBU0lTVV9ERUZJTkVfQlVJTFRfSU5fVFlQRSh1bnNpZ25lZCBpbnQpCisgICBCQVNJU1VfREVGSU5FX0JVSUxUX0lOX1RZUEUobG9uZykKKyAgIEJBU0lTVV9ERUZJTkVfQlVJTFRfSU5fVFlQRSh1bnNpZ25lZCBsb25nKQorI2lmZGVmIF9fR05VQ19fCisgICBCQVNJU1VfREVGSU5FX0JVSUxUX0lOX1RZUEUobG9uZyBsb25nKQorICAgQkFTSVNVX0RFRklORV9CVUlMVF9JTl9UWVBFKHVuc2lnbmVkIGxvbmcgbG9uZykKKyNlbHNlCisgICBCQVNJU1VfREVGSU5FX0JVSUxUX0lOX1RZUEUoX19pbnQ2NCkKKyAgIEJBU0lTVV9ERUZJTkVfQlVJTFRfSU5fVFlQRSh1bnNpZ25lZCBfX2ludDY0KQorI2VuZGlmCisgICBCQVNJU1VfREVGSU5FX0JVSUxUX0lOX1RZUEUoZmxvYXQpCisgICBCQVNJU1VfREVGSU5FX0JVSUxUX0lOX1RZUEUoZG91YmxlKQorICAgQkFTSVNVX0RFRklORV9CVUlMVF9JTl9UWVBFKGxvbmcgZG91YmxlKQorCisjdW5kZWYgQkFTSVNVX0RFRklORV9CVUlMVF9JTl9UWVBFCisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICBzdHJ1Y3QgYml0d2lzZV9tb3ZhYmxlIHsgZW51bSB7IGNGbGFnID0gZmFsc2UgfTsgfTsKKworI2RlZmluZSBCQVNJU1VfREVGSU5FX0JJVFdJU0VfTU9WQUJMRShRKSB0ZW1wbGF0ZTw+IHN0cnVjdCBiaXR3aXNlX21vdmFibGU8UT4geyBlbnVtIHsgY0ZsYWcgPSB0cnVlIH07IH07CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICBzdHJ1Y3QgYml0d2lzZV9jb3B5YWJsZSB7IGVudW0geyBjRmxhZyA9IGZhbHNlIH07IH07CisKKyNkZWZpbmUgQkFTSVNVX0RFRklORV9CSVRXSVNFX0NPUFlBQkxFKFEpIHRlbXBsYXRlPD4gc3RydWN0IGJpdHdpc2VfY29weWFibGU8UT4geyBlbnVtIHsgY0ZsYWcgPSB0cnVlIH07IH07CisKKyNkZWZpbmUgQkFTSVNVX0lTX1BPRChUKSBfX2lzX3BvZChUKQorCisjZGVmaW5lIEJBU0lTVV9JU19TQ0FMQVJfVFlQRShUKSAoc2NhbGFyX3R5cGU8VD46OmNGbGFnKQorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX188NQorICAgI2RlZmluZSBCQVNJU1VfSVNfVFJJVklBTExZX0NPUFlBQkxFKC4uLikgX19oYXNfdHJpdmlhbF9jb3B5KF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICNkZWZpbmUgQkFTSVNVX0lTX1RSSVZJQUxMWV9DT1BZQUJMRSguLi4pIHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlPF9fVkFfQVJHU19fPjo6dmFsdWUKKyNlbmRpZgorCisvLyBUT0RPOiBjbGVhbiB0aGlzIHVwCisjZGVmaW5lIEJBU0lTVV9JU19CSVRXSVNFX0NPUFlBQkxFKFQpIChCQVNJU1VfSVNfU0NBTEFSX1RZUEUoVCkgfHwgQkFTSVNVX0lTX1BPRChUKSB8fCBCQVNJU1VfSVNfVFJJVklBTExZX0NPUFlBQkxFKFQpIHx8IChiaXR3aXNlX2NvcHlhYmxlPFQ+OjpjRmxhZykpCisKKyNkZWZpbmUgQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEVfT1JfTU9WQUJMRShUKSAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEUoVCkgfHwgKGJpdHdpc2VfbW92YWJsZTxUPjo6Y0ZsYWcpKQorCisjZGVmaW5lIEJBU0lTVV9IQVNfREVTVFJVQ1RPUihUKSAoKCFzY2FsYXJfdHlwZTxUPjo6Y0ZsYWcpICYmICghX19pc19wb2QoVCkpKQorCisgICB0eXBlZGVmIGNoYXIoJnllc190KVsxXTsKKyAgIHR5cGVkZWYgY2hhcigmbm9fdClbMl07CisKKyAgIHRlbXBsYXRlIDxjbGFzcyBVPiB5ZXNfdCBjbGFzc190ZXN0KGludCBVOjoqKTsKKyAgIHRlbXBsYXRlIDxjbGFzcyBVPiBub190IGNsYXNzX3Rlc3QoLi4uKTsKKworICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19jbGFzcworICAgeworICAgICAgZW51bSB7IHZhbHVlID0gKHNpemVvZihjbGFzc190ZXN0PFQ+KDApKSA9PSBzaXplb2YoeWVzX3QpKSB9OworICAgfTsKKworICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19wb2ludGVyCisgICB7CisgICAgICBlbnVtIHsgdmFsdWUgPSBmYWxzZSB9OworICAgfTsKKworICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19wb2ludGVyPFQqPgorICAgeworICAgICAgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OworICAgfTsKKworICAgc3RydWN0IGVtcHR5X3R5cGUgeyB9OworCisgICBCQVNJU1VfREVGSU5FX0JJVFdJU0VfQ09QWUFCTEUoZW1wdHlfdHlwZSk7CisgICBCQVNJU1VfREVGSU5FX0JJVFdJU0VfTU9WQUJMRShlbXB0eV90eXBlKTsKKworICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbF9vcHMKKyAgIHsKKyAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgeyByZXR1cm4gKCEoeCA9PSB5KSk7IH0KKyAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPiAoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgeyByZXR1cm4gKHkgPCB4KTsgfQorICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBUJiB4LCBjb25zdCBUJiB5KSB7IHJldHVybiAoISh5IDwgeCkpOyB9CisgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIHsgcmV0dXJuICghKHggPCB5KSk7IH0KKyAgIH07CisKKyAgIHN0cnVjdCBlbGVtZW50YWxfdmVjdG9yCisgICB7CisgICAgICB2b2lkKiBtX3A7CisgICAgICB1aW50MzJfdCBtX3NpemU7CisgICAgICB1aW50MzJfdCBtX2NhcGFjaXR5OworCisgICAgICB0eXBlZGVmIHZvaWQgKCpvYmplY3RfbW92ZXIpKHZvaWQqIHBEc3QsIHZvaWQqIHBTcmMsIHVpbnQzMl90IG51bSk7CisKKyAgICAgIGJvb2wgaW5jcmVhc2VfY2FwYWNpdHkodWludDMyX3QgbWluX25ld19jYXBhY2l0eSwgYm9vbCBncm93X2hpbnQsIHVpbnQzMl90IGVsZW1lbnRfc2l6ZSwgb2JqZWN0X21vdmVyIHBSZWxvY2F0ZSwgYm9vbCBub2ZhaWwpOworICAgfTsKKworICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgIGNsYXNzIHZlY3RvciA6IHB1YmxpYyByZWxfb3BzPCB2ZWN0b3I8VD4gPgorICAgeworICAgcHVibGljOgorICAgICAgdHlwZWRlZiBUKiBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgVCogY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgVCYgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBUJiBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIFQqIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IFQqIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIGlubGluZSB2ZWN0b3IoKSA6CisgICAgICAgICBtX3AoTlVMTCksCisgICAgICAgICBtX3NpemUoMCksCisgICAgICAgICBtX2NhcGFjaXR5KDApCisgICAgICB7CisgICAgICB9CisKKyAgICAgIGlubGluZSB2ZWN0b3IodWludDMyX3QgbiwgY29uc3QgVCYgaW5pdCkgOgorICAgICAgICAgbV9wKE5VTEwpLAorICAgICAgICAgbV9zaXplKDApLAorICAgICAgICAgbV9jYXBhY2l0eSgwKQorICAgICAgeworICAgICAgICAgaW5jcmVhc2VfY2FwYWNpdHkobiwgZmFsc2UpOworICAgICAgICAgY29uc3RydWN0X2FycmF5KG1fcCwgbiwgaW5pdCk7CisgICAgICAgICBtX3NpemUgPSBuOworICAgICAgfQorCisgICAgICBpbmxpbmUgdmVjdG9yKGNvbnN0IHZlY3RvciYgb3RoZXIpIDoKKyAgICAgICAgIG1fcChOVUxMKSwKKyAgICAgICAgIG1fc2l6ZSgwKSwKKyAgICAgICAgIG1fY2FwYWNpdHkoMCkKKyAgICAgIHsKKyAgICAgICAgIGluY3JlYXNlX2NhcGFjaXR5KG90aGVyLm1fc2l6ZSwgZmFsc2UpOworCisgICAgICAgICBtX3NpemUgPSBvdGhlci5tX3NpemU7CisKKyAgICAgICAgIGlmIChCQVNJU1VfSVNfQklUV0lTRV9DT1BZQUJMRShUKSkKKyAgICAgICAgICAgIG1lbWNweShtX3AsIG90aGVyLm1fcCwgbV9zaXplICogc2l6ZW9mKFQpKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFQqIHBEc3QgPSBtX3A7CisgICAgICAgICAgICBjb25zdCBUKiBwU3JjID0gb3RoZXIubV9wOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gbV9zaXplOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgICAgY29uc3RydWN0KHBEc3QrKywgKnBTcmMrKyk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlubGluZSBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90IHNpemUpIDoKKyAgICAgICAgIG1fcChOVUxMKSwKKyAgICAgICAgIG1fc2l6ZSgwKSwKKyAgICAgICAgIG1fY2FwYWNpdHkoMCkKKyAgICAgIHsKKyAgICAgICAgIHJlc2l6ZShzaXplKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIH52ZWN0b3IoKQorICAgICAgeworICAgICAgICAgaWYgKG1fcCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNjYWxhcl90eXBlPFQ+OjpkZXN0cnVjdF9hcnJheShtX3AsIG1fc2l6ZSk7CisgICAgICAgICAgICBmcmVlKG1fcCk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlubGluZSB2ZWN0b3ImIG9wZXJhdG9yPSAoY29uc3QgdmVjdG9yJiBvdGhlcikKKyAgICAgIHsKKyAgICAgICAgIGlmICh0aGlzID09ICZvdGhlcikKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKworICAgICAgICAgaWYgKG1fY2FwYWNpdHkgPj0gb3RoZXIubV9zaXplKQorICAgICAgICAgICAgcmVzaXplKDApOworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgICAgIGluY3JlYXNlX2NhcGFjaXR5KG90aGVyLm1fc2l6ZSwgZmFsc2UpOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEUoVCkpCisgICAgICAgICAgICBtZW1jcHkobV9wLCBvdGhlci5tX3AsIG90aGVyLm1fc2l6ZSAqIHNpemVvZihUKSk7CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBUKiBwRHN0ID0gbV9wOworICAgICAgICAgICAgY29uc3QgVCogcFNyYyA9IG90aGVyLm1fcDsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IG90aGVyLm1fc2l6ZTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgICAgIGNvbnN0cnVjdChwRHN0KyssICpwU3JjKyspOworICAgICAgICAgfQorCisgICAgICAgICBtX3NpemUgPSBvdGhlci5tX3NpemU7CisKKyAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBjb25zdCBUKiBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fcDsgfQorICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBUKiBiZWdpbigpIHsgcmV0dXJuIG1fcDsgfQorCisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIGNvbnN0IFQqIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fcCArIG1fc2l6ZTsgfQorICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBUKiBlbmQoKSB7IHJldHVybiBtX3AgKyBtX3NpemU7IH0KKworICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gIW1fc2l6ZTsgfQorICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIHVpbnQzMl90IHNpemVfaW5fYnl0ZXMoKSBjb25zdCB7IHJldHVybiBtX3NpemUgKiBzaXplb2YoVCk7IH0KKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgdWludDMyX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBtX2NhcGFjaXR5OyB9CisKKyAgICAgIC8vIG9wZXJhdG9yW10gd2lsbCBhc3NlcnQgb24gb3V0IG9mIHJhbmdlIGluZGljZXMsIGJ1dCBpbiBmaW5hbCBidWlsZHMgdGhlcmUgaXMgKGFuZCB3aWxsIG5ldmVyIGJlKSBhbnkgcmFuZ2UgY2hlY2tpbmcgb24gdGhpcyBtZXRob2QuCisgICAgICAvL0JBU0lTVV9GT1JDRV9JTkxJTkUgY29uc3QgVCYgb3BlcmF0b3JbXSAodWludDMyX3QgaSkgY29uc3QgeyBhc3NlcnQoaSA8IG1fc2l6ZSk7IHJldHVybiBtX3BbaV07IH0KKyAgICAgIC8vQkFTSVNVX0ZPUkNFX0lOTElORSBUJiBvcGVyYXRvcltdICh1aW50MzJfdCBpKSB7IGFzc2VydChpIDwgbV9zaXplKTsgcmV0dXJuIG1fcFtpXTsgfQorICAgICAgICAgICAgCisjaWYgIUJBU0lTVV9WRUNUT1JfRk9SQ0VfQ0hFQ0tJTkcKKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgY29uc3QgVCYgb3BlcmF0b3JbXSAoc2l6ZV90IGkpIGNvbnN0IHsgYXNzZXJ0KGkgPCBtX3NpemUpOyByZXR1cm4gbV9wW2ldOyB9CisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIFQmIG9wZXJhdG9yW10gKHNpemVfdCBpKSB7IGFzc2VydChpIDwgbV9zaXplKTsgcmV0dXJuIG1fcFtpXTsgfQorI2Vsc2UKKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgY29uc3QgVCYgb3BlcmF0b3JbXSAoc2l6ZV90IGkpIGNvbnN0IAorICAgICAgeyAKKyAgICAgICAgICBpZiAoaSA+PSBtX3NpemUpCisgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9wZXJhdG9yW10gaW52YWxpZCBpbmRleDogJXUsIG1heCBlbnRyaWVzICV1LCB0eXBlIHNpemUgJXVcbiIsICh1aW50MzJfdClpLCBtX3NpemUsICh1aW50MzJfdClzaXplb2YoVCkpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbV9wW2ldOyAKKyAgICAgIH0KKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCYgb3BlcmF0b3JbXSAoc2l6ZV90IGkpIAorICAgICAgeyAKKyAgICAgICAgICBpZiAoaSA+PSBtX3NpemUpCisgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9wZXJhdG9yW10gaW52YWxpZCBpbmRleDogJXUsIG1heCBlbnRyaWVzICV1LCB0eXBlIHNpemUgJXVcbiIsICh1aW50MzJfdClpLCBtX3NpemUsICh1aW50MzJfdClzaXplb2YoVCkpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbV9wW2ldOyAKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLyBhdCgpIGFsd2F5cyBpbmNsdWRlcyByYW5nZSBjaGVja2luZywgZXZlbiBpbiBmaW5hbCBidWlsZHMsIHVubGlrZSBvcGVyYXRvciBbXS4KKyAgICAgIC8vIFRoZSBmaXJzdCBlbGVtZW50IGlzIHJldHVybmVkIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIGNvbnN0IFQmIGF0KHNpemVfdCBpKSBjb25zdCB7IGFzc2VydChpIDwgbV9zaXplKTsgcmV0dXJuIChpID49IG1fc2l6ZSkgPyBtX3BbMF0gOiBtX3BbaV07IH0KKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCYgYXQoc2l6ZV90IGkpIHsgYXNzZXJ0KGkgPCBtX3NpemUpOyByZXR1cm4gKGkgPj0gbV9zaXplKSA/IG1fcFswXSA6IG1fcFtpXTsgfQorICAgICAgICAgICAgCisjaWYgIUJBU0lTVV9WRUNUT1JfRk9SQ0VfQ0hFQ0tJTkcKKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgY29uc3QgVCYgZnJvbnQoKSBjb25zdCB7IGFzc2VydChtX3NpemUpOyByZXR1cm4gbV9wWzBdOyB9CisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIFQmIGZyb250KCkgeyBhc3NlcnQobV9zaXplKTsgcmV0dXJuIG1fcFswXTsgfQorCisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIGNvbnN0IFQmIGJhY2soKSBjb25zdCB7IGFzc2VydChtX3NpemUpOyByZXR1cm4gbV9wW21fc2l6ZSAtIDFdOyB9CisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIFQmIGJhY2soKSB7IGFzc2VydChtX3NpemUpOyByZXR1cm4gbV9wW21fc2l6ZSAtIDFdOyB9CisjZWxzZQorICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBjb25zdCBUJiBmcm9udCgpIGNvbnN0IAorICAgICAgeyAKKyAgICAgICAgICBpZiAoIW1fc2l6ZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZnJvbnQ6IHZlY3RvciBpcyBlbXB0eSwgdHlwZSBzaXplICV1XG4iLCAodWludDMyX3Qpc2l6ZW9mKFQpKTsKKyAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIG1fcFswXTsgCisgICAgICB9CisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIFQmIGZyb250KCkgCisgICAgICB7IAorICAgICAgICAgIGlmICghbV9zaXplKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmcm9udDogdmVjdG9yIGlzIGVtcHR5LCB0eXBlIHNpemUgJXVcbiIsICh1aW50MzJfdClzaXplb2YoVCkpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbV9wWzBdOyAKKyAgICAgIH0KKworICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBjb25zdCBUJiBiYWNrKCkgY29uc3QgCisgICAgICB7IAorICAgICAgICAgIGlmKCFtX3NpemUpCisgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhY2s6IHZlY3RvciBpcyBlbXB0eSwgdHlwZSBzaXplICV1XG4iLCAodWludDMyX3Qpc2l6ZW9mKFQpKTsKKyAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIG1fcFttX3NpemUgLSAxXTsgCisgICAgICB9CisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIFQmIGJhY2soKSAKKyAgICAgIHsgCisgICAgICAgICAgaWYgKCFtX3NpemUpCisgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhY2s6IHZlY3RvciBpcyBlbXB0eSwgdHlwZSBzaXplICV1XG4iLCAodWludDMyX3Qpc2l6ZW9mKFQpKTsKKyAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIG1fcFttX3NpemUgLSAxXTsgCisgICAgICB9CisjZW5kaWYKKworICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBjb25zdCBUKiBnZXRfcHRyKCkgY29uc3QgeyByZXR1cm4gbV9wOyB9CisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIFQqIGdldF9wdHIoKSB7IHJldHVybiBtX3A7IH0KKworICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBjb25zdCBUKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wOyB9CisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIFQqIGRhdGEoKSB7IHJldHVybiBtX3A7IH0KKworICAgICAgLy8gY2xlYXIoKSBzZXRzIHRoZSBjb250YWluZXIgdG8gZW1wdHksIHRoZW4gZnJlZXMgdGhlIGFsbG9jYXRlZCBibG9jay4KKyAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkKKyAgICAgIHsKKyAgICAgICAgIGlmIChtX3ApCisgICAgICAgICB7CisgICAgICAgICAgICBzY2FsYXJfdHlwZTxUPjo6ZGVzdHJ1Y3RfYXJyYXkobV9wLCBtX3NpemUpOworICAgICAgICAgICAgZnJlZShtX3ApOworICAgICAgICAgICAgbV9wID0gTlVMTDsKKyAgICAgICAgICAgIG1fc2l6ZSA9IDA7CisgICAgICAgICAgICBtX2NhcGFjaXR5ID0gMDsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgY2xlYXJfbm9fZGVzdHJ1Y3Rpb24oKQorICAgICAgeworICAgICAgICAgaWYgKG1fcCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZyZWUobV9wKTsKKyAgICAgICAgICAgIG1fcCA9IE5VTEw7CisgICAgICAgICAgICBtX3NpemUgPSAwOworICAgICAgICAgICAgbV9jYXBhY2l0eSA9IDA7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkIHJlc2VydmUoc2l6ZV90IG5ld19jYXBhY2l0eV9zaXplX3QpCisgICAgICB7CisgICAgICAgICBpZiAobmV3X2NhcGFjaXR5X3NpemVfdCA+IFVJTlQzMl9NQVgpCisgICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisKKyAgICAgICAgIHVpbnQzMl90IG5ld19jYXBhY2l0eSA9ICh1aW50MzJfdCluZXdfY2FwYWNpdHlfc2l6ZV90OworCisgICAgICAgICBpZiAobmV3X2NhcGFjaXR5ID4gbV9jYXBhY2l0eSkKKyAgICAgICAgICAgIGluY3JlYXNlX2NhcGFjaXR5KG5ld19jYXBhY2l0eSwgZmFsc2UpOworICAgICAgICAgZWxzZSBpZiAobmV3X2NhcGFjaXR5IDwgbV9jYXBhY2l0eSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE11c3Qgd29yayBhcm91bmQgdGhlIGxhY2sgb2YgYSAiZGVjcmVhc2VfY2FwYWNpdHkoKSIgbWV0aG9kLgorICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGlzIHJhcmUgZW5vdWdoIGluIHByYWN0aWNlIHRoYXQgaXQncyBwcm9iYWJseSBub3Qgd29ydGggaW1wbGVtZW50aW5nIGFuIG9wdGltaXplZCBpbi1wbGFjZSByZXNpemUuCisgICAgICAgICAgICB2ZWN0b3IgdG1wOworICAgICAgICAgICAgdG1wLmluY3JlYXNlX2NhcGFjaXR5KGhlbHBlcnM6Om1heGltdW0obV9zaXplLCBuZXdfY2FwYWNpdHkpLCBmYWxzZSk7CisgICAgICAgICAgICB0bXAgPSAqdGhpczsKKyAgICAgICAgICAgIHN3YXAodG1wKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wgdHJ5X3Jlc2VydmUoc2l6ZV90IG5ld19jYXBhY2l0eV9zaXplX3QpCisgICAgICB7CisgICAgICAgICBpZiAobmV3X2NhcGFjaXR5X3NpemVfdCA+IFVJTlQzMl9NQVgpCisgICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICB9CisKKyAgICAgICAgIHVpbnQzMl90IG5ld19jYXBhY2l0eSA9ICh1aW50MzJfdCluZXdfY2FwYWNpdHlfc2l6ZV90OworCisgICAgICAgICBpZiAobmV3X2NhcGFjaXR5ID4gbV9jYXBhY2l0eSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaW5jcmVhc2VfY2FwYWNpdHkobmV3X2NhcGFjaXR5LCBmYWxzZSkpCisgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmIChuZXdfY2FwYWNpdHkgPCBtX2NhcGFjaXR5KQorICAgICAgICAgeworICAgICAgICAgICAgLy8gTXVzdCB3b3JrIGFyb3VuZCB0aGUgbGFjayBvZiBhICJkZWNyZWFzZV9jYXBhY2l0eSgpIiBtZXRob2QuCisgICAgICAgICAgICAvLyBUaGlzIGNhc2UgaXMgcmFyZSBlbm91Z2ggaW4gcHJhY3RpY2UgdGhhdCBpdCdzIHByb2JhYmx5IG5vdCB3b3J0aCBpbXBsZW1lbnRpbmcgYW4gb3B0aW1pemVkIGluLXBsYWNlIHJlc2l6ZS4KKyAgICAgICAgICAgIHZlY3RvciB0bXA7CisgICAgICAgICAgICB0bXAuaW5jcmVhc2VfY2FwYWNpdHkoaGVscGVyczo6bWF4aW11bShtX3NpemUsIG5ld19jYXBhY2l0eSksIGZhbHNlKTsKKyAgICAgICAgICAgIHRtcCA9ICp0aGlzOworICAgICAgICAgICAgc3dhcCh0bXApOworICAgICAgICAgfQorCisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gcmVzaXplKDApIHNldHMgdGhlIGNvbnRhaW5lciB0byBlbXB0eSwgYnV0IGRvZXMgbm90IGZyZWUgdGhlIGFsbG9jYXRlZCBibG9jay4KKyAgICAgIGlubGluZSB2b2lkIHJlc2l6ZShzaXplX3QgbmV3X3NpemVfc2l6ZV90LCBib29sIGdyb3dfaGludCA9IGZhbHNlKQorICAgICAgeworICAgICAgICAgaWYgKG5ld19zaXplX3NpemVfdCA+IFVJTlQzMl9NQVgpCisgICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisKKyAgICAgICAgIHVpbnQzMl90IG5ld19zaXplID0gKHVpbnQzMl90KW5ld19zaXplX3NpemVfdDsKKworICAgICAgICAgaWYgKG1fc2l6ZSAhPSBuZXdfc2l6ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChuZXdfc2l6ZSA8IG1fc2l6ZSkKKyAgICAgICAgICAgICAgIHNjYWxhcl90eXBlPFQ+OjpkZXN0cnVjdF9hcnJheShtX3AgKyBuZXdfc2l6ZSwgbV9zaXplIC0gbmV3X3NpemUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKG5ld19zaXplID4gbV9jYXBhY2l0eSkKKyAgICAgICAgICAgICAgICAgIGluY3JlYXNlX2NhcGFjaXR5KG5ld19zaXplLCAobmV3X3NpemUgPT0gKG1fc2l6ZSArIDEpKSB8fCBncm93X2hpbnQpOworCisgICAgICAgICAgICAgICBzY2FsYXJfdHlwZTxUPjo6Y29uc3RydWN0X2FycmF5KG1fcCArIG1fc2l6ZSwgbmV3X3NpemUgLSBtX3NpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wgdHJ5X3Jlc2l6ZShzaXplX3QgbmV3X3NpemVfc2l6ZV90LCBib29sIGdyb3dfaGludCA9IGZhbHNlKQorICAgICAgeworICAgICAgICAgaWYgKG5ld19zaXplX3NpemVfdCA+IFVJTlQzMl9NQVgpCisgICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICB9CisKKyAgICAgICAgIHVpbnQzMl90IG5ld19zaXplID0gKHVpbnQzMl90KW5ld19zaXplX3NpemVfdDsKKworICAgICAgICAgaWYgKG1fc2l6ZSAhPSBuZXdfc2l6ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChuZXdfc2l6ZSA8IG1fc2l6ZSkKKyAgICAgICAgICAgICAgIHNjYWxhcl90eXBlPFQ+OjpkZXN0cnVjdF9hcnJheShtX3AgKyBuZXdfc2l6ZSwgbV9zaXplIC0gbmV3X3NpemUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKG5ld19zaXplID4gbV9jYXBhY2l0eSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghaW5jcmVhc2VfY2FwYWNpdHkobmV3X3NpemUsIChuZXdfc2l6ZSA9PSAobV9zaXplICsgMSkpIHx8IGdyb3dfaGludCwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIHNjYWxhcl90eXBlPFQ+Ojpjb25zdHJ1Y3RfYXJyYXkobV9wICsgbV9zaXplLCBuZXdfc2l6ZSAtIG1fc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1fc2l6ZSA9IG5ld19zaXplOworICAgICAgICAgfQorCisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgc2l6ZSA+PSBjYXBhY2l0eS8yLCByZXNldCgpIHNldHMgdGhlIGNvbnRhaW5lcidzIHNpemUgdG8gMCBidXQgZG9lc24ndCBmcmVlIHRoZSBhbGxvY2F0ZWQgYmxvY2sgKGJlY2F1c2UgdGhlIGNvbnRhaW5lciBtYXkgYmUgc2ltaWxhcmx5IGxvYWRlZCBpbiB0aGUgZnV0dXJlKS4KKyAgICAgIC8vIE90aGVyd2lzZSBpdCBibG93cyBhd2F5IHRoZSBhbGxvY2F0ZWQgYmxvY2suIFNlZSBodHRwOi8vd3d3LmNvZGVyY29ybmVyLmNvbS9ibG9nLz9wPTQ5NAorICAgICAgaW5saW5lIHZvaWQgcmVzZXQoKQorICAgICAgeworICAgICAgICAgaWYgKG1fc2l6ZSA+PSAobV9jYXBhY2l0eSA+PiAxKSkKKyAgICAgICAgICAgIHJlc2l6ZSgwKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBUKiBlbmxhcmdlKHVpbnQzMl90IGkpCisgICAgICB7CisgICAgICAgICB1aW50MzJfdCBjdXJfc2l6ZSA9IG1fc2l6ZTsKKyAgICAgICAgIHJlc2l6ZShjdXJfc2l6ZSArIGksIHRydWUpOworICAgICAgICAgcmV0dXJuIGdldF9wdHIoKSArIGN1cl9zaXplOworICAgICAgfQorCisgICAgICBpbmxpbmUgVCogdHJ5X2VubGFyZ2UodWludDMyX3QgaSkKKyAgICAgIHsKKyAgICAgICAgIHVpbnQzMl90IGN1cl9zaXplID0gbV9zaXplOworICAgICAgICAgaWYgKCF0cnlfcmVzaXplKGN1cl9zaXplICsgaSwgdHJ1ZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgIHJldHVybiBnZXRfcHRyKCkgKyBjdXJfc2l6ZTsKKyAgICAgIH0KKworICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSB2b2lkIHB1c2hfYmFjayhjb25zdCBUJiBvYmopCisgICAgICB7CisgICAgICAgICBhc3NlcnQoIW1fcCB8fCAoJm9iaiA8IG1fcCkgfHwgKCZvYmogPj0gKG1fcCArIG1fc2l6ZSkpKTsKKworICAgICAgICAgaWYgKG1fc2l6ZSA+PSBtX2NhcGFjaXR5KQorICAgICAgICAgICAgaW5jcmVhc2VfY2FwYWNpdHkobV9zaXplICsgMSwgdHJ1ZSk7CisKKyAgICAgICAgIHNjYWxhcl90eXBlPFQ+Ojpjb25zdHJ1Y3QobV9wICsgbV9zaXplLCBvYmopOworICAgICAgICAgbV9zaXplKys7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sIHRyeV9wdXNoX2JhY2soY29uc3QgVCYgb2JqKQorICAgICAgeworICAgICAgICAgYXNzZXJ0KCFtX3AgfHwgKCZvYmogPCBtX3ApIHx8ICgmb2JqID49IChtX3AgKyBtX3NpemUpKSk7CisKKyAgICAgICAgIGlmIChtX3NpemUgPj0gbV9jYXBhY2l0eSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaW5jcmVhc2VfY2FwYWNpdHkobV9zaXplICsgMSwgdHJ1ZSwgdHJ1ZSkpCisgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICB9CisKKyAgICAgICAgIHNjYWxhcl90eXBlPFQ+Ojpjb25zdHJ1Y3QobV9wICsgbV9zaXplLCBvYmopOworICAgICAgICAgbV9zaXplKys7CisKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCBwdXNoX2JhY2tfdmFsdWUoVCBvYmopCisgICAgICB7CisgICAgICAgICBpZiAobV9zaXplID49IG1fY2FwYWNpdHkpCisgICAgICAgICAgICBpbmNyZWFzZV9jYXBhY2l0eShtX3NpemUgKyAxLCB0cnVlKTsKKworICAgICAgICAgc2NhbGFyX3R5cGU8VD46OmNvbnN0cnVjdChtX3AgKyBtX3NpemUsIG9iaik7CisgICAgICAgICBtX3NpemUrKzsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgcG9wX2JhY2soKQorICAgICAgeworICAgICAgICAgYXNzZXJ0KG1fc2l6ZSk7CisKKyAgICAgICAgIGlmIChtX3NpemUpCisgICAgICAgICB7CisgICAgICAgICAgICBtX3NpemUtLTsKKyAgICAgICAgICAgIHNjYWxhcl90eXBlPFQ+OjpkZXN0cnVjdCgmbV9wW21fc2l6ZV0pOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCBpbnNlcnQodWludDMyX3QgaW5kZXgsIGNvbnN0IFQqIHAsIHVpbnQzMl90IG4pCisgICAgICB7CisgICAgICAgICBhc3NlcnQoaW5kZXggPD0gbV9zaXplKTsKKyAgICAgICAgIGlmICghbikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgY29uc3QgdWludDMyX3Qgb3JpZ19zaXplID0gbV9zaXplOworICAgICAgICAgcmVzaXplKG1fc2l6ZSArIG4sIHRydWUpOworCisgICAgICAgICBjb25zdCB1aW50MzJfdCBudW1fdG9fbW92ZSA9IG9yaWdfc2l6ZSAtIGluZGV4OworCisgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEUoVCkpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIG92ZXJ3cml0ZXMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBiaXRzLCBidXQgYml0d2lzZSBjb3B5YWJsZSBtZWFucyB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGRlc3RydWN0aW9uLgorICAgICAgICAgICAgbWVtbW92ZShtX3AgKyBpbmRleCArIG4sIG1fcCArIGluZGV4LCBzaXplb2YoVCkgKiBudW1fdG9fbW92ZSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBUKiBwU3JjID0gbV9wICsgb3JpZ19zaXplIC0gMTsKKyAgICAgICAgICAgIFQqIHBEc3QgPSBjb25zdF9jYXN0PFQqPihwU3JjKSArIG47CisKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fdG9fbW92ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYXNzZXJ0KChwRHN0IC0gbV9wKSA8IChpbnQpbV9zaXplKTsKKyAgICAgICAgICAgICAgICpwRHN0LS0gPSAqcFNyYy0tOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBUKiBwRHN0ID0gbV9wICsgaW5kZXg7CisKKyAgICAgICAgIGlmIChCQVNJU1VfSVNfQklUV0lTRV9DT1BZQUJMRShUKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgY29waWVzIGluIHRoZSBuZXcgYml0cywgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nIG9iamVjdHMsIHdoaWNoIGlzIE9LIGZvciBjb3B5YWJsZSB0eXBlcyB0aGF0IGRvbid0IG5lZWQgZGVzdHJ1Y3Rpb24uCisgICAgICAgICAgICBtZW1jcHkocERzdCwgcCwgc2l6ZW9mKFQpICogbik7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYXNzZXJ0KChwRHN0IC0gbV9wKSA8IChpbnQpbV9zaXplKTsKKyAgICAgICAgICAgICAgICpwRHN0KysgPSAqcCsrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCBpbnNlcnQoVCogcCwgY29uc3QgVCYgb2JqKQorICAgICAgeworICAgICAgICAgaW50NjRfdCBvZnMgPSBwIC0gYmVnaW4oKTsKKyAgICAgICAgIGlmICgob2ZzIDwgMCkgfHwgKG9mcyA+IFVJTlQzMl9NQVgpKQorICAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorCisgICAgICAgICBpbnNlcnQoKHVpbnQzMl90KW9mcywgJm9iaiwgMSk7CisgICAgICB9CisKKyAgICAgIC8vIHB1c2hfZnJvbnQoKSBpc24ndCBnb2luZyB0byBiZSB2ZXJ5IGZhc3QgLSBpdCdzIG9ubHkgaGVyZSBmb3IgdXNhYmlsaXR5LgorICAgICAgaW5saW5lIHZvaWQgcHVzaF9mcm9udChjb25zdCBUJiBvYmopCisgICAgICB7CisgICAgICAgICBpbnNlcnQoMCwgJm9iaiwgMSk7CisgICAgICB9CisKKyAgICAgIHZlY3RvciYgYXBwZW5kKGNvbnN0IHZlY3RvciYgb3RoZXIpCisgICAgICB7CisgICAgICAgICBpZiAob3RoZXIubV9zaXplKQorICAgICAgICAgICAgaW5zZXJ0KG1fc2l6ZSwgJm90aGVyWzBdLCBvdGhlci5tX3NpemUpOworICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2ZWN0b3ImIGFwcGVuZChjb25zdCBUKiBwLCB1aW50MzJfdCBuKQorICAgICAgeworICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICBpbnNlcnQobV9zaXplLCBwLCBuKTsKKyAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgaW5saW5lIHZvaWQgZXJhc2UodWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IG4pCisgICAgICB7CisgICAgICAgICBhc3NlcnQoKHN0YXJ0ICsgbikgPD0gbV9zaXplKTsKKyAgICAgICAgIGlmICgoc3RhcnQgKyBuKSA+IG1fc2l6ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgaWYgKCFuKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBjb25zdCB1aW50MzJfdCBudW1fdG9fbW92ZSA9IG1fc2l6ZSAtIChzdGFydCArIG4pOworCisgICAgICAgICBUKiBwRHN0ID0gbV9wICsgc3RhcnQ7CisKKyAgICAgICAgIGNvbnN0IFQqIHBTcmMgPSBtX3AgKyBzdGFydCArIG47CisKKyAgICAgICAgIGlmIChCQVNJU1VfSVNfQklUV0lTRV9DT1BZQUJMRV9PUl9NT1ZBQkxFKFQpKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGlzIG92ZXJseSBjYXV0aW91cy4KKyAgICAgICAgICAgIGlmICgoIUJBU0lTVV9JU19CSVRXSVNFX0NPUFlBQkxFKFQpKSB8fCAoQkFTSVNVX0hBU19ERVNUUlVDVE9SKFQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vIFR5cGUgaGFzIGJlZW4gbWFya2VkIGV4cGxpY3RseSBhcyBiaXR3aXNlIG1vdmFibGUsIHdoaWNoIG1lYW5zIHdlIGNhbiBtb3ZlIHRoZW0gYXJvdW5kIGJ1dCB0aGV5IG1heSBuZWVkIHRvIGJlIGRlc3RydWN0ZWQuCisgICAgICAgICAgICAgICAvLyBGaXJzdCBkZXN0cm95IHRoZSBlcmFzZWQgb2JqZWN0cy4KKyAgICAgICAgICAgICAgIHNjYWxhcl90eXBlPFQ+OjpkZXN0cnVjdF9hcnJheShwRHN0LCBuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29weSAiZG93biIgdGhlIG9iamVjdHMgdG8gcHJlc2VydmUsIGZpbGxpbmcgaW4gdGhlIGVtcHR5IHNsb3RzLgorICAgICAgICAgICAgbWVtbW92ZShwRHN0LCBwU3JjLCBudW1fdG9fbW92ZSAqIHNpemVvZihUKSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBUeXBlIGlzIG5vdCBiaXR3aXNlIGNvcHlhYmxlIG9yIG1vdmFibGUuIAorICAgICAgICAgICAgLy8gTW92ZSB0aGVtIGRvd24gb25lIGF0IGEgdGltZSBieSB1c2luZyB0aGUgZXF1YWxzIG9wZXJhdG9yLCBhbmQgZGVzdHJveWluZyBhbnl0aGluZyB0aGF0J3MgbGVmdCBvdmVyIGF0IHRoZSBlbmQuCisgICAgICAgICAgICBUKiBwRHN0X2VuZCA9IHBEc3QgKyBudW1fdG9fbW92ZTsKKyAgICAgICAgICAgIHdoaWxlIChwRHN0ICE9IHBEc3RfZW5kKQorICAgICAgICAgICAgICAgKnBEc3QrKyA9ICpwU3JjKys7CisKKyAgICAgICAgICAgIHNjYWxhcl90eXBlPFQ+OjpkZXN0cnVjdF9hcnJheShwRHN0X2VuZCwgbik7CisgICAgICAgICB9CisKKyAgICAgICAgIG1fc2l6ZSAtPSBuOworICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCBlcmFzZSh1aW50MzJfdCBpbmRleCkKKyAgICAgIHsKKyAgICAgICAgIGVyYXNlKGluZGV4LCAxKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgZXJhc2UoVCogcCkKKyAgICAgIHsKKyAgICAgICAgIGFzc2VydCgocCA+PSBtX3ApICYmIChwIDwgKG1fcCArIG1fc2l6ZSkpKTsKKyAgICAgICAgIGVyYXNlKHN0YXRpY19jYXN0PHVpbnQzMl90PihwIC0gbV9wKSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkIGVyYXNlKFQgKnBGaXJzdCwgVCAqcEVuZCkKKyAgICAgIHsKKyAgICAgICAgIGFzc2VydChwRmlyc3QgPD0gcEVuZCk7CisgICAgICAgICBhc3NlcnQocEZpcnN0ID49IGJlZ2luKCkgJiYgcEZpcnN0IDw9IGVuZCgpKTsKKyAgICAgICAgIGFzc2VydChwRW5kID49IGJlZ2luKCkgJiYgcEVuZCA8PSBlbmQoKSk7CisKKyAgICAgICAgIGludDY0X3Qgb2ZzID0gcEZpcnN0IC0gYmVnaW4oKTsKKyAgICAgICAgIGlmICgob2ZzIDwgMCkgfHwgKG9mcyA+IFVJTlQzMl9NQVgpKQorICAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorCisgICAgICAgICBpbnQ2NF90IG4gPSBwRW5kIC0gcEZpcnN0OworICAgICAgICAgaWYgKChuIDwgMCkgfHwgKG4gPiBVSU5UMzJfTUFYKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKworICAgICAgICAgZXJhc2UoKHVpbnQzMl90KW9mcywgKHVpbnQzMl90KW4pOworICAgICAgfQorCisgICAgICB2b2lkIGVyYXNlX3Vub3JkZXJlZCh1aW50MzJfdCBpbmRleCkKKyAgICAgIHsKKyAgICAgICAgIGFzc2VydChpbmRleCA8IG1fc2l6ZSk7CisKKyAgICAgICAgIGlmICgoaW5kZXggKyAxKSA8IG1fc2l6ZSkKKyAgICAgICAgICAgICgqdGhpcylbaW5kZXhdID0gYmFjaygpOworCisgICAgICAgICBwb3BfYmFjaygpOworICAgICAgfQorCisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCB2ZWN0b3ImIHJocykgY29uc3QKKyAgICAgIHsKKyAgICAgICAgIGlmIChtX3NpemUgIT0gcmhzLm1fc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgIGVsc2UgaWYgKG1fc2l6ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzY2FsYXJfdHlwZTxUPjo6Y0ZsYWcpCisgICAgICAgICAgICAgICByZXR1cm4gbWVtY21wKG1fcCwgcmhzLm1fcCwgc2l6ZW9mKFQpICogbV9zaXplKSA9PSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY29uc3QgVCogcFNyYyA9IG1fcDsKKyAgICAgICAgICAgICAgIGNvbnN0IFQqIHBEc3QgPSByaHMubV9wOworICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gbV9zaXplOyBpOyBpLS0pCisgICAgICAgICAgICAgICAgICBpZiAoISgqcFNyYysrID09ICpwRHN0KyspKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8IChjb25zdCB2ZWN0b3ImIHJocykgY29uc3QKKyAgICAgIHsKKyAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1pbl9zaXplID0gaGVscGVyczo6bWluaW11bShtX3NpemUsIHJocy5tX3NpemUpOworCisgICAgICAgICBjb25zdCBUKiBwU3JjID0gbV9wOworICAgICAgICAgY29uc3QgVCogcFNyY19lbmQgPSBtX3AgKyBtaW5fc2l6ZTsKKyAgICAgICAgIGNvbnN0IFQqIHBEc3QgPSByaHMubV9wOworCisgICAgICAgICB3aGlsZSAoKHBTcmMgPCBwU3JjX2VuZCkgJiYgKCpwU3JjID09ICpwRHN0KSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBTcmMrKzsKKyAgICAgICAgICAgIHBEc3QrKzsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHBTcmMgPCBwU3JjX2VuZCkKKyAgICAgICAgICAgIHJldHVybiAqcFNyYyA8ICpwRHN0OworCisgICAgICAgICByZXR1cm4gbV9zaXplIDwgcmhzLm1fc2l6ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgc3dhcCh2ZWN0b3ImIG90aGVyKQorICAgICAgeworICAgICAgICAgc3RkOjpzd2FwKG1fcCwgb3RoZXIubV9wKTsKKyAgICAgICAgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7CisgICAgICAgICBzdGQ6OnN3YXAobV9jYXBhY2l0eSwgb3RoZXIubV9jYXBhY2l0eSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkIHNvcnQoKQorICAgICAgeworICAgICAgICAgc3RkOjpzb3J0KGJlZ2luKCksIGVuZCgpKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgdW5pcXVlKCkKKyAgICAgIHsKKyAgICAgICAgIGlmICghZW1wdHkoKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNvcnQoKTsKKworICAgICAgICAgICAgcmVzaXplKHN0ZDo6dW5pcXVlKGJlZ2luKCksIGVuZCgpKSAtIGJlZ2luKCkpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCByZXZlcnNlKCkKKyAgICAgIHsKKyAgICAgICAgIHVpbnQzMl90IGogPSBtX3NpemUgPj4gMTsKKyAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBqOyBpKyspCisgICAgICAgICAgICBzdGQ6OnN3YXAobV9wW2ldLCBtX3BbbV9zaXplIC0gMSAtIGldKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGludCBmaW5kKGNvbnN0IFQmIGtleSkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgIGNvbnN0IFQqIHAgPSBtX3A7CisgICAgICAgICBjb25zdCBUKiBwX2VuZCA9IG1fcCArIG1fc2l6ZTsKKworICAgICAgICAgdWludDMyX3QgaW5kZXggPSAwOworCisgICAgICAgICB3aGlsZSAocCAhPSBwX2VuZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gKnApCisgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiBjSW52YWxpZEluZGV4OworICAgICAgfQorCisgICAgICBpbmxpbmUgaW50IGZpbmRfc29ydGVkKGNvbnN0IFQmIGtleSkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgIGlmIChtX3NpemUpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBVbmlmb3JtIGJpbmFyeSBzZWFyY2ggLSBLbnV0aCBBbGdvcml0aG0gNi4yLjEgVSwgdW5yb2xsZWQgdHdpY2UuCisgICAgICAgICAgICBpbnQgaSA9ICgobV9zaXplICsgMSkgPj4gMSkgLSAxOworICAgICAgICAgICAgaW50IG0gPSBtX3NpemU7CisKKyAgICAgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGFzc2VydChpID49IDAgJiYgaSA8IChpbnQpbV9zaXplKTsKKyAgICAgICAgICAgICAgIGNvbnN0IFQqIHBLZXlfaSA9IG1fcCArIGk7CisgICAgICAgICAgICAgICBpbnQgY21wID0ga2V5IDwgKnBLZXlfaTsKKyNpZiBkZWZpbmVkKF9ERUJVRykgfHwgZGVmaW5lZChERUJVRykKKyAgICAgICAgICAgICAgIGludCBjbXAyID0gKnBLZXlfaSA8IGtleTsKKyAgICAgICAgICAgICAgIGFzc2VydCgoY21wICE9IGNtcDIpIHx8IChrZXkgPT0gKnBLZXlfaSkpOworI2VuZGlmCisgICAgICAgICAgICAgICBpZiAoKCFjbXApICYmIChrZXkgPT0gKnBLZXlfaSkpIHJldHVybiBpOworICAgICAgICAgICAgICAgbSA+Pj0gMTsKKyAgICAgICAgICAgICAgIGlmICghbSkgYnJlYWs7CisgICAgICAgICAgICAgICBjbXAgPSAtY21wOworICAgICAgICAgICAgICAgaSArPSAoKChtICsgMSkgPj4gMSkgXiBjbXApIC0gY21wOworICAgICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGFzc2VydChpID49IDAgJiYgaSA8IChpbnQpbV9zaXplKTsKKyAgICAgICAgICAgICAgIHBLZXlfaSA9IG1fcCArIGk7CisgICAgICAgICAgICAgICBjbXAgPSBrZXkgPCAqcEtleV9pOworI2lmIGRlZmluZWQoX0RFQlVHKSB8fCBkZWZpbmVkKERFQlVHKQorICAgICAgICAgICAgICAgY21wMiA9ICpwS2V5X2kgPCBrZXk7CisgICAgICAgICAgICAgICBhc3NlcnQoKGNtcCAhPSBjbXAyKSB8fCAoa2V5ID09ICpwS2V5X2kpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgaWYgKCghY21wKSAmJiAoa2V5ID09ICpwS2V5X2kpKSByZXR1cm4gaTsKKyAgICAgICAgICAgICAgIG0gPj49IDE7CisgICAgICAgICAgICAgICBpZiAoIW0pIGJyZWFrOworICAgICAgICAgICAgICAgY21wID0gLWNtcDsKKyAgICAgICAgICAgICAgIGkgKz0gKCgobSArIDEpID4+IDEpIF4gY21wKSAtIGNtcDsKKyAgICAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICByZXR1cm4gY0ludmFsaWRJbmRleDsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUT4KKyAgICAgIGlubGluZSBpbnQgZmluZF9zb3J0ZWQoY29uc3QgVCYga2V5LCBRIGxlc3NfdGhhbikgY29uc3QKKyAgICAgIHsKKyAgICAgICAgIGlmIChtX3NpemUpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBVbmlmb3JtIGJpbmFyeSBzZWFyY2ggLSBLbnV0aCBBbGdvcml0aG0gNi4yLjEgVSwgdW5yb2xsZWQgdHdpY2UuCisgICAgICAgICAgICBpbnQgaSA9ICgobV9zaXplICsgMSkgPj4gMSkgLSAxOworICAgICAgICAgICAgaW50IG0gPSBtX3NpemU7CisKKyAgICAgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGFzc2VydChpID49IDAgJiYgaSA8IChpbnQpbV9zaXplKTsKKyAgICAgICAgICAgICAgIGNvbnN0IFQqIHBLZXlfaSA9IG1fcCArIGk7CisgICAgICAgICAgICAgICBpbnQgY21wID0gbGVzc190aGFuKGtleSwgKnBLZXlfaSk7CisgICAgICAgICAgICAgICBpZiAoKCFjbXApICYmICghbGVzc190aGFuKCpwS2V5X2ksIGtleSkpKSByZXR1cm4gaTsKKyAgICAgICAgICAgICAgIG0gPj49IDE7CisgICAgICAgICAgICAgICBpZiAoIW0pIGJyZWFrOworICAgICAgICAgICAgICAgY21wID0gLWNtcDsKKyAgICAgICAgICAgICAgIGkgKz0gKCgobSArIDEpID4+IDEpIF4gY21wKSAtIGNtcDsKKyAgICAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICBhc3NlcnQoaSA+PSAwICYmIGkgPCAoaW50KW1fc2l6ZSk7CisgICAgICAgICAgICAgICBwS2V5X2kgPSBtX3AgKyBpOworICAgICAgICAgICAgICAgY21wID0gbGVzc190aGFuKGtleSwgKnBLZXlfaSk7CisgICAgICAgICAgICAgICBpZiAoKCFjbXApICYmICghbGVzc190aGFuKCpwS2V5X2ksIGtleSkpKSByZXR1cm4gaTsKKyAgICAgICAgICAgICAgIG0gPj49IDE7CisgICAgICAgICAgICAgICBpZiAoIW0pIGJyZWFrOworICAgICAgICAgICAgICAgY21wID0gLWNtcDsKKyAgICAgICAgICAgICAgIGkgKz0gKCgobSArIDEpID4+IDEpIF4gY21wKSAtIGNtcDsKKyAgICAgICAgICAgICAgIGlmIChpIDwgMCkgCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIGNJbnZhbGlkSW5kZXg7CisgICAgICB9CisKKyAgICAgIGlubGluZSB1aW50MzJfdCBjb3VudF9vY2N1cmVuY2VzKGNvbnN0IFQmIGtleSkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgIHVpbnQzMl90IGMgPSAwOworCisgICAgICAgICBjb25zdCBUKiBwID0gbV9wOworICAgICAgICAgY29uc3QgVCogcF9lbmQgPSBtX3AgKyBtX3NpemU7CisKKyAgICAgICAgIHdoaWxlIChwICE9IHBfZW5kKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGtleSA9PSAqcCkKKyAgICAgICAgICAgICAgIGMrKzsKKworICAgICAgICAgICAgcCsrOworICAgICAgICAgfQorCisgICAgICAgICByZXR1cm4gYzsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgc2V0X2FsbChjb25zdCBUJiBvKQorICAgICAgeworICAgICAgICAgaWYgKChzaXplb2YoVCkgPT0gMSkgJiYgKHNjYWxhcl90eXBlPFQ+OjpjRmxhZykpCisgICAgICAgICAgICBtZW1zZXQobV9wLCAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJm8pLCBtX3NpemUpOworICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgVCogcERzdCA9IG1fcDsKKyAgICAgICAgICAgIFQqIHBEc3RfZW5kID0gcERzdCArIG1fc2l6ZTsKKyAgICAgICAgICAgIHdoaWxlIChwRHN0ICE9IHBEc3RfZW5kKQorICAgICAgICAgICAgICAgKnBEc3QrKyA9IG87CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIENhbGxlciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgaGVhcCBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRhaW5lci4gQ29udGFpbmVyIGlzIGNsZWFyZWQuCisgICAgICBpbmxpbmUgdm9pZCogYXNzdW1lX293bmVyc2hpcCgpCisgICAgICB7CisgICAgICAgICBUKiBwID0gbV9wOworICAgICAgICAgbV9wID0gTlVMTDsKKyAgICAgICAgIG1fc2l6ZSA9IDA7CisgICAgICAgICBtX2NhcGFjaXR5ID0gMDsKKyAgICAgICAgIHJldHVybiBwOworICAgICAgfQorCisgICAgICAvLyBDYWxsZXIgaXMgZ3JhbnRpbmcgb3duZXJzaGlwIG9mIHRoZSBpbmRpY2F0ZWQgaGVhcCBibG9jay4KKyAgICAgIC8vIEJsb2NrIG11c3QgaGF2ZSBzaXplIGNvbnN0cnVjdGVkIGVsZW1lbnRzLCBhbmQgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgY2FwYWNpdHkgZWxlbWVudHMuCisgICAgICAvLyBUaGUgYmxvY2sgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHVzaW5nIG1hbGxvYygpLgorICAgICAgLy8gSW1wb3J0YW50OiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIEJhc2lzIFVuaXZlcnNhbC4gSWYgeW91IGNoYW5nZSBob3cgdGhpcyBjb250YWluZXIgYWxsb2NhdGVzIG1lbW9yeSwgeW91J2xsIG5lZWQgdG8gY2hhbmdlIGFueSB1c2VycyBvZiB0aGlzIG1ldGhvZC4KKyAgICAgIGlubGluZSBib29sIGdyYW50X293bmVyc2hpcChUKiBwLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBjYXBhY2l0eSkKKyAgICAgIHsKKyAgICAgICAgIC8vIFRvIHRvIHByZXZlbnQgdGhlIGNhbGxlciBmcm9tIG9idmlvdXNseSBzaG9vdGluZyB0aGVtc2VsdmVzIGluIHRoZSBmb290LgorICAgICAgICAgaWYgKCgocCArIGNhcGFjaXR5KSA+IG1fcCkgJiYgKHAgPCAobV9wICsgbV9jYXBhY2l0eSkpKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gQ2FuIGdyYW50IG93bmVyc2hpcCBvZiBhIGJsb2NrIGluc2lkZSB0aGUgY29udGFpbmVyIGl0c2VsZiEKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHNpemUgPiBjYXBhY2l0eSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKCFwKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhcGFjaXR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAoIWNhcGFjaXR5KQorICAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorCisgICAgICAgICBjbGVhcigpOworICAgICAgICAgbV9wID0gcDsKKyAgICAgICAgIG1fc2l6ZSA9IHNpemU7CisgICAgICAgICBtX2NhcGFjaXR5ID0gY2FwYWNpdHk7CisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgcHJpdmF0ZToKKyAgICAgIFQqIG1fcDsKKyAgICAgIHVpbnQzMl90IG1fc2l6ZTsKKyAgICAgIHVpbnQzMl90IG1fY2FwYWNpdHk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFE+IHN0cnVjdCBpc192ZWN0b3IgeyBlbnVtIHsgY0ZsYWcgPSBmYWxzZSB9OyB9OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUT4gc3RydWN0IGlzX3ZlY3RvcjwgdmVjdG9yPFE+ID4geyBlbnVtIHsgY0ZsYWcgPSB0cnVlIH07IH07CisKKyAgICAgIHN0YXRpYyB2b2lkIG9iamVjdF9tb3Zlcih2b2lkKiBwRHN0X3ZvaWQsIHZvaWQqIHBTcmNfdm9pZCwgdWludDMyX3QgbnVtKQorICAgICAgeworICAgICAgICAgVCogcFNyYyA9IHN0YXRpY19jYXN0PFQqPihwU3JjX3ZvaWQpOworICAgICAgICAgVCogY29uc3QgcFNyY19lbmQgPSBwU3JjICsgbnVtOworICAgICAgICAgVCogcERzdCA9IHN0YXRpY19jYXN0PFQqPihwRHN0X3ZvaWQpOworCisgICAgICAgICB3aGlsZSAocFNyYyAhPSBwU3JjX2VuZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHBsYWNlbWVudCBuZXcKKyAgICAgICAgICAgIG5ldyAoc3RhdGljX2Nhc3Q8dm9pZCo+KHBEc3QpKSBUKCpwU3JjKTsKKyAgICAgICAgICAgIHBTcmMtPn5UKCk7CisgICAgICAgICAgICArK3BTcmM7CisgICAgICAgICAgICArK3BEc3Q7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sIGluY3JlYXNlX2NhcGFjaXR5KHVpbnQzMl90IG1pbl9uZXdfY2FwYWNpdHksIGJvb2wgZ3Jvd19oaW50LCBib29sIG5vZmFpbCA9IGZhbHNlKQorICAgICAgeworICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZWxlbWVudGFsX3ZlY3Rvcio+KHRoaXMpLT5pbmNyZWFzZV9jYXBhY2l0eSgKKyAgICAgICAgICAgIG1pbl9uZXdfY2FwYWNpdHksIGdyb3dfaGludCwgc2l6ZW9mKFQpLAorICAgICAgICAgICAgKEJBU0lTVV9JU19CSVRXSVNFX0NPUFlBQkxFX09SX01PVkFCTEUoVCkgfHwgKGlzX3ZlY3RvcjxUPjo6Y0ZsYWcpKSA/IE5VTEwgOiBvYmplY3RfbW92ZXIsIG5vZmFpbCk7CisgICAgICB9CisgICB9OworCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgYml0d2lzZV9tb3ZhYmxlPCB2ZWN0b3I8VD4gPiB7IGVudW0geyBjRmxhZyA9IHRydWUgfTsgfTsKKworICAgLy8gSGFzaCBtYXAKKworICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICBzdHJ1Y3QgaGFzaGVyCisgICB7CisgICAgICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkgKGNvbnN0IFQmIGtleSkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihrZXkpOyB9CisgICB9OworCisgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgIHN0cnVjdCBlcXVhbF90bworICAgeworICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiBhLCBjb25zdCBUJiBiKSBjb25zdCB7IHJldHVybiBhID09IGI7IH0KKyAgIH07CisKKyAgIC8vIEltcG9ydGFudDogVGhlIEhhc2hlciBhbmQgRXF1YWxzIG9iamVjdHMgbXVzdCBiZSBiaXR3aXNlIG1vdmFibGUhCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlID0gZW1wdHlfdHlwZSwgdHlwZW5hbWUgSGFzaGVyID0gaGFzaGVyPEtleT4sIHR5cGVuYW1lIEVxdWFscyA9IGVxdWFsX3RvPEtleT4gPgorICAgY2xhc3MgaGFzaF9tYXAKKyAgIHsKKyAgIHB1YmxpYzoKKyAgICAgIGNsYXNzIGl0ZXJhdG9yOworICAgICAgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisgICAKKyAgIHByaXZhdGU6CisgICAgICBmcmllbmQgY2xhc3MgaXRlcmF0b3I7CisgICAgICBmcmllbmQgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGVudW0gc3RhdGUKKyAgICAgIHsKKyAgICAgICAgIGNTdGF0ZUludmFsaWQgPSAwLAorICAgICAgICAgY1N0YXRlVmFsaWQgPSAxCisgICAgICB9OworCisgICAgICBlbnVtCisgICAgICB7CisgICAgICAgICBjTWluSGFzaFNpemUgPSA0VQorICAgICAgfTsKKworICAgcHVibGljOgorICAgICAgdHlwZWRlZiBoYXNoX21hcDxLZXksIFZhbHVlLCBIYXNoZXIsIEVxdWFscz4gaGFzaF9tYXBfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPEtleSwgVmFsdWU+IHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIEtleSAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgVmFsdWUgICAgICAgICAgICAgICAgIHJlZmVyZW50X3R5cGU7CisgICAgICB0eXBlZGVmIEhhc2hlciAgICAgICAgICAgICAgICBoYXNoZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgRXF1YWxzICAgICAgICAgICAgICAgIGVxdWFsc190eXBlOworCisgICAgICBoYXNoX21hcCgpIDoKKyAgICAgICAgIG1faGFzaF9zaGlmdCgzMiksIG1fbnVtX3ZhbGlkKDApLCBtX2dyb3dfdGhyZXNob2xkKDApCisgICAgICB7CisgICAgICB9CisKKyAgICAgIGhhc2hfbWFwKGNvbnN0IGhhc2hfbWFwJiBvdGhlcikgOgorICAgICAgICAgbV92YWx1ZXMob3RoZXIubV92YWx1ZXMpLAorICAgICAgICAgbV9oYXNoX3NoaWZ0KG90aGVyLm1faGFzaF9zaGlmdCksCisgICAgICAgICBtX2hhc2hlcihvdGhlci5tX2hhc2hlciksCisgICAgICAgICBtX2VxdWFscyhvdGhlci5tX2VxdWFscyksCisgICAgICAgICBtX251bV92YWxpZChvdGhlci5tX251bV92YWxpZCksCisgICAgICAgICBtX2dyb3dfdGhyZXNob2xkKG90aGVyLm1fZ3Jvd190aHJlc2hvbGQpCisgICAgICB7CisgICAgICB9CisKKyAgICAgIGhhc2hfbWFwJiBvcGVyYXRvcj0gKGNvbnN0IGhhc2hfbWFwJiBvdGhlcikKKyAgICAgIHsKKyAgICAgICAgIGlmICh0aGlzID09ICZvdGhlcikKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKworICAgICAgICAgY2xlYXIoKTsKKworICAgICAgICAgbV92YWx1ZXMgPSBvdGhlci5tX3ZhbHVlczsKKyAgICAgICAgIG1faGFzaF9zaGlmdCA9IG90aGVyLm1faGFzaF9zaGlmdDsKKyAgICAgICAgIG1fbnVtX3ZhbGlkID0gb3RoZXIubV9udW1fdmFsaWQ7CisgICAgICAgICBtX2dyb3dfdGhyZXNob2xkID0gb3RoZXIubV9ncm93X3RocmVzaG9sZDsKKyAgICAgICAgIG1faGFzaGVyID0gb3RoZXIubV9oYXNoZXI7CisgICAgICAgICBtX2VxdWFscyA9IG90aGVyLm1fZXF1YWxzOworCisgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSB+aGFzaF9tYXAoKQorICAgICAgeworICAgICAgICAgY2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgRXF1YWxzJiBnZXRfZXF1YWxzKCkgY29uc3QgeyByZXR1cm4gbV9lcXVhbHM7IH0KKyAgICAgIEVxdWFscyYgZ2V0X2VxdWFscygpIHsgcmV0dXJuIG1fZXF1YWxzOyB9CisKKyAgICAgIHZvaWQgc2V0X2VxdWFscyhjb25zdCBFcXVhbHMmIGVxdWFscykgeyBtX2VxdWFscyA9IGVxdWFsczsgfQorCisgICAgICBjb25zdCBIYXNoZXImIGdldF9oYXNoZXIoKSBjb25zdCB7IHJldHVybiBtX2hhc2hlcjsgfQorICAgICAgSGFzaGVyJiBnZXRfaGFzaGVyKCkgeyByZXR1cm4gbV9oYXNoZXI7IH0KKworICAgICAgdm9pZCBzZXRfaGFzaGVyKGNvbnN0IEhhc2hlciYgaGFzaGVyKSB7IG1faGFzaGVyID0gaGFzaGVyOyB9CisKKyAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkKKyAgICAgIHsKKyAgICAgICAgIGlmICghbV92YWx1ZXMuZW1wdHkoKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChCQVNJU1VfSEFTX0RFU1RSVUNUT1IoS2V5KSB8fCBCQVNJU1VfSEFTX0RFU1RSVUNUT1IoVmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbm9kZSogcCA9ICZnZXRfbm9kZSgwKTsKKyAgICAgICAgICAgICAgIG5vZGUqIHBfZW5kID0gcCArIG1fdmFsdWVzLnNpemUoKTsKKworICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX3JlbWFpbmluZyA9IG1fbnVtX3ZhbGlkOworICAgICAgICAgICAgICAgd2hpbGUgKHAgIT0gcF9lbmQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAocC0+c3RhdGUpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdF92YWx1ZV90eXBlKHApOworICAgICAgICAgICAgICAgICAgICAgbnVtX3JlbWFpbmluZy0tOworICAgICAgICAgICAgICAgICAgICAgaWYgKCFudW1fcmVtYWluaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV92YWx1ZXMuY2xlYXJfbm9fZGVzdHJ1Y3Rpb24oKTsKKworICAgICAgICAgICAgbV9oYXNoX3NoaWZ0ID0gMzI7CisgICAgICAgICAgICBtX251bV92YWxpZCA9IDA7CisgICAgICAgICAgICBtX2dyb3dfdGhyZXNob2xkID0gMDsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgcmVzZXQoKQorICAgICAgeworICAgICAgICAgaWYgKCFtX251bV92YWxpZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgaWYgKEJBU0lTVV9IQVNfREVTVFJVQ1RPUihLZXkpIHx8IEJBU0lTVV9IQVNfREVTVFJVQ1RPUihWYWx1ZSkpCisgICAgICAgICB7CisgICAgICAgICAgICBub2RlKiBwID0gJmdldF9ub2RlKDApOworICAgICAgICAgICAgbm9kZSogcF9lbmQgPSBwICsgbV92YWx1ZXMuc2l6ZSgpOworCisgICAgICAgICAgICB1aW50MzJfdCBudW1fcmVtYWluaW5nID0gbV9udW1fdmFsaWQ7CisgICAgICAgICAgICB3aGlsZSAocCAhPSBwX2VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChwLT5zdGF0ZSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3ZhbHVlX3R5cGUocCk7CisgICAgICAgICAgICAgICAgICBwLT5zdGF0ZSA9IGNTdGF0ZUludmFsaWQ7CisKKyAgICAgICAgICAgICAgICAgIG51bV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgIGlmICghbnVtX3JlbWFpbmluZykKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmIChzaXplb2Yobm9kZSkgPD0gMzIpCisgICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoJm1fdmFsdWVzWzBdLCAwLCBtX3ZhbHVlcy5zaXplX2luX2J5dGVzKCkpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgbm9kZSogcCA9ICZnZXRfbm9kZSgwKTsKKyAgICAgICAgICAgIG5vZGUqIHBfZW5kID0gcCArIG1fdmFsdWVzLnNpemUoKTsKKworICAgICAgICAgICAgdWludDMyX3QgbnVtX3JlbWFpbmluZyA9IG1fbnVtX3ZhbGlkOworICAgICAgICAgICAgd2hpbGUgKHAgIT0gcF9lbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAocC0+c3RhdGUpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwLT5zdGF0ZSA9IGNTdGF0ZUludmFsaWQ7CisKKyAgICAgICAgICAgICAgICAgIG51bV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgIGlmICghbnVtX3JlbWFpbmluZykKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIG1fbnVtX3ZhbGlkID0gMDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHVpbnQzMl90IHNpemUoKQorICAgICAgeworICAgICAgICAgcmV0dXJuIG1fbnVtX3ZhbGlkOworICAgICAgfQorCisgICAgICBpbmxpbmUgdWludDMyX3QgZ2V0X3RhYmxlX3NpemUoKQorICAgICAgeworICAgICAgICAgcmV0dXJuIG1fdmFsdWVzLnNpemUoKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wgZW1wdHkoKQorICAgICAgeworICAgICAgICAgcmV0dXJuICFtX251bV92YWxpZDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZSh1aW50MzJfdCBuZXdfY2FwYWNpdHkpCisgICAgICB7CisgICAgICAgICB1aW50NjRfdCBuZXdfaGFzaF9zaXplID0gaGVscGVyczo6bWF4aW11bSgxVSwgbmV3X2NhcGFjaXR5KTsKKworICAgICAgICAgbmV3X2hhc2hfc2l6ZSA9IG5ld19oYXNoX3NpemUgKiAyVUxMOworCisgICAgICAgICBpZiAoIWhlbHBlcnM6OmlzX3Bvd2VyX29mXzIobmV3X2hhc2hfc2l6ZSkpCisgICAgICAgICAgICBuZXdfaGFzaF9zaXplID0gaGVscGVyczo6bmV4dF9wb3cyKG5ld19oYXNoX3NpemUpOworCisgICAgICAgICBuZXdfaGFzaF9zaXplID0gaGVscGVyczo6bWF4aW11bTx1aW50NjRfdD4oY01pbkhhc2hTaXplLCBuZXdfaGFzaF9zaXplKTsKKworICAgICAgICAgbmV3X2hhc2hfc2l6ZSA9IGhlbHBlcnM6Om1pbmltdW08dWludDY0X3Q+KDB4ODAwMDAwMDBVTCwgbmV3X2hhc2hfc2l6ZSk7CisKKyAgICAgICAgIGlmIChuZXdfaGFzaF9zaXplID4gbV92YWx1ZXMuc2l6ZSgpKQorICAgICAgICAgICAgcmVoYXNoKCh1aW50MzJfdCluZXdfaGFzaF9zaXplKTsKKyAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgY2xhc3MgaXRlcmF0b3IKKyAgICAgIHsKKyAgICAgICAgIGZyaWVuZCBjbGFzcyBoYXNoX21hcDxLZXksIFZhbHVlLCBIYXNoZXIsIEVxdWFscz47CisgICAgICAgICBmcmllbmQgY2xhc3MgaGFzaF9tYXA8S2V5LCBWYWx1ZSwgSGFzaGVyLCBFcXVhbHM+Ojpjb25zdF9pdGVyYXRvcjsKKworICAgICAgcHVibGljOgorICAgICAgICAgaW5saW5lIGl0ZXJhdG9yKCkgOiBtX3BUYWJsZShOVUxMKSwgbV9pbmRleCgwKSB7IH0KKyAgICAgICAgIGlubGluZSBpdGVyYXRvcihoYXNoX21hcF90eXBlJiB0YWJsZSwgdWludDMyX3QgaW5kZXgpIDogbV9wVGFibGUoJnRhYmxlKSwgbV9pbmRleChpbmRleCkgeyB9CisgICAgICAgICBpbmxpbmUgaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIG90aGVyKSA6IG1fcFRhYmxlKG90aGVyLm1fcFRhYmxlKSwgbV9pbmRleChvdGhlci5tX2luZGV4KSB7IH0KKworICAgICAgICAgaW5saW5lIGl0ZXJhdG9yJiBvcGVyYXRvcj0gKGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG1fcFRhYmxlID0gb3RoZXIubV9wVGFibGU7CisgICAgICAgICAgICBtX2luZGV4ID0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gcG9zdC1pbmNyZW1lbnQKKyAgICAgICAgIGlubGluZSBpdGVyYXRvciBvcGVyYXRvcisrKGludCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yIHJlc3VsdCgqdGhpcyk7CisgICAgICAgICAgICArKyp0aGlzOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gcHJlLWluY3JlbWVudAorICAgICAgICAgaW5saW5lIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHByb2JlKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICB9CisKKyAgICAgICAgIGlubGluZSB2YWx1ZV90eXBlJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0X2N1cigpOyB9CisgICAgICAgICBpbmxpbmUgdmFsdWVfdHlwZSogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldF9jdXIoKTsgfQorCisgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgaXRlcmF0b3ImIGIpIGNvbnN0IHsgcmV0dXJuIChtX3BUYWJsZSA9PSBiLm1fcFRhYmxlKSAmJiAobV9pbmRleCA9PSBiLm1faW5kZXgpOyB9CisgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgaXRlcmF0b3ImIGIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gYik7IH0KKyAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBjb25zdF9pdGVyYXRvciYgYikgY29uc3QgeyByZXR1cm4gKG1fcFRhYmxlID09IGIubV9wVGFibGUpICYmIChtX2luZGV4ID09IGIubV9pbmRleCk7IH0KKyAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBjb25zdF9pdGVyYXRvciYgYikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBiKTsgfQorCisgICAgICBwcml2YXRlOgorICAgICAgICAgaGFzaF9tYXBfdHlwZSogbV9wVGFibGU7CisgICAgICAgICB1aW50MzJfdCBtX2luZGV4OworCisgICAgICAgICBpbmxpbmUgdmFsdWVfdHlwZSogZ2V0X2N1cigpIGNvbnN0CisgICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQobV9wVGFibGUgJiYgKG1faW5kZXggPCBtX3BUYWJsZS0+bV92YWx1ZXMuc2l6ZSgpKSk7CisgICAgICAgICAgICBhc3NlcnQobV9wVGFibGUtPmdldF9ub2RlX3N0YXRlKG1faW5kZXgpID09IGNTdGF0ZVZhbGlkKTsKKworICAgICAgICAgICAgcmV0dXJuICZtX3BUYWJsZS0+Z2V0X25vZGUobV9pbmRleCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGlubGluZSB2b2lkIHByb2JlKCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChtX3BUYWJsZSk7CisgICAgICAgICAgICBtX2luZGV4ID0gbV9wVGFibGUtPmZpbmRfbmV4dChtX2luZGV4KTsKKyAgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yCisgICAgICB7CisgICAgICAgICBmcmllbmQgY2xhc3MgaGFzaF9tYXA8S2V5LCBWYWx1ZSwgSGFzaGVyLCBFcXVhbHM+OworICAgICAgICAgZnJpZW5kIGNsYXNzIGhhc2hfbWFwPEtleSwgVmFsdWUsIEhhc2hlciwgRXF1YWxzPjo6aXRlcmF0b3I7CisKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcigpIDogbV9wVGFibGUoTlVMTCksIG1faW5kZXgoMCkgeyB9CisgICAgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IoY29uc3QgaGFzaF9tYXBfdHlwZSYgdGFibGUsIHVpbnQzMl90IGluZGV4KSA6IG1fcFRhYmxlKCZ0YWJsZSksIG1faW5kZXgoaW5kZXgpIHsgfQorICAgICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgOiBtX3BUYWJsZShvdGhlci5tX3BUYWJsZSksIG1faW5kZXgob3RoZXIubV9pbmRleCkgeyB9CisgICAgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IoY29uc3QgY29uc3RfaXRlcmF0b3ImIG90aGVyKSA6IG1fcFRhYmxlKG90aGVyLm1fcFRhYmxlKSwgbV9pbmRleChvdGhlci5tX2luZGV4KSB7IH0KKworICAgICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcj0gKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG1fcFRhYmxlID0gb3RoZXIubV9wVGFibGU7CisgICAgICAgICAgICBtX2luZGV4ID0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgIH0KKworICAgICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcj0gKGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG1fcFRhYmxlID0gb3RoZXIubV9wVGFibGU7CisgICAgICAgICAgICBtX2luZGV4ID0gb3RoZXIubV9pbmRleDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gcG9zdC1pbmNyZW1lbnQKKyAgICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIHJlc3VsdCgqdGhpcyk7CisgICAgICAgICAgICArKyp0aGlzOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gcHJlLWluY3JlbWVudAorICAgICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHByb2JlKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICB9CisKKyAgICAgICAgIGlubGluZSBjb25zdCB2YWx1ZV90eXBlJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0X2N1cigpOyB9CisgICAgICAgICBpbmxpbmUgY29uc3QgdmFsdWVfdHlwZSogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldF9jdXIoKTsgfQorCisgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgY29uc3RfaXRlcmF0b3ImIGIpIGNvbnN0IHsgcmV0dXJuIChtX3BUYWJsZSA9PSBiLm1fcFRhYmxlKSAmJiAobV9pbmRleCA9PSBiLm1faW5kZXgpOyB9CisgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgY29uc3RfaXRlcmF0b3ImIGIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gYik7IH0KKyAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBpdGVyYXRvciYgYikgY29uc3QgeyByZXR1cm4gKG1fcFRhYmxlID09IGIubV9wVGFibGUpICYmIChtX2luZGV4ID09IGIubV9pbmRleCk7IH0KKyAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBpdGVyYXRvciYgYikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBiKTsgfQorCisgICAgICBwcml2YXRlOgorICAgICAgICAgY29uc3QgaGFzaF9tYXBfdHlwZSogbV9wVGFibGU7CisgICAgICAgICB1aW50MzJfdCBtX2luZGV4OworCisgICAgICAgICBpbmxpbmUgY29uc3QgdmFsdWVfdHlwZSogZ2V0X2N1cigpIGNvbnN0CisgICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQobV9wVGFibGUgJiYgKG1faW5kZXggPCBtX3BUYWJsZS0+bV92YWx1ZXMuc2l6ZSgpKSk7CisgICAgICAgICAgICBhc3NlcnQobV9wVGFibGUtPmdldF9ub2RlX3N0YXRlKG1faW5kZXgpID09IGNTdGF0ZVZhbGlkKTsKKworICAgICAgICAgICAgcmV0dXJuICZtX3BUYWJsZS0+Z2V0X25vZGUobV9pbmRleCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGlubGluZSB2b2lkIHByb2JlKCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChtX3BUYWJsZSk7CisgICAgICAgICAgICBtX2luZGV4ID0gbV9wVGFibGUtPmZpbmRfbmV4dChtX2luZGV4KTsKKyAgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0CisgICAgICB7CisgICAgICAgICBpZiAoIW1fbnVtX3ZhbGlkKQorICAgICAgICAgICAgcmV0dXJuIGVuZCgpOworCisgICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoKnRoaXMsIGZpbmRfbmV4dChVSU5UMzJfTUFYKSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdAorICAgICAgeworICAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCp0aGlzLCBtX3ZhbHVlcy5zaXplKCkpOworICAgICAgfQorCisgICAgICBpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKQorICAgICAgeworICAgICAgICAgaWYgKCFtX251bV92YWxpZCkKKyAgICAgICAgICAgIHJldHVybiBlbmQoKTsKKworICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCBmaW5kX25leHQoVUlOVDMyX01BWCkpOworICAgICAgfQorCisgICAgICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBpdGVyYXRvcigqdGhpcywgbV92YWx1ZXMuc2l6ZSgpKTsKKyAgICAgIH0KKworICAgICAgLy8gaW5zZXJ0X3Jlc3VsdC5maXJzdCB3aWxsIGFsd2F5cyBwb2ludCB0byBpbnNlcnRlZCBrZXkvdmFsdWUgKG9yIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGtleS92YWx1ZSkuCisgICAgICAvLyBpbnNlcnRfcmVzdXR0LnNlY29uZCB3aWxsIGJlIHRydWUgaWYgYSBuZXcga2V5L3ZhbHVlIHdhcyBpbnNlcnRlZCwgb3IgZmFsc2UgaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0ZWQgKGluIHdoaWNoIGNhc2UgZmlyc3Qgd2lsbCBwb2ludCB0byB0aGUgYWxyZWFkeSBleGlzdGluZyB2YWx1ZSkuCisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3Jlc3VsdDsKKworICAgICAgaW5saW5lIGluc2VydF9yZXN1bHQgaW5zZXJ0KGNvbnN0IEtleSYgaywgY29uc3QgVmFsdWUmIHYgPSBWYWx1ZSgpKQorICAgICAgeworICAgICAgICAgaW5zZXJ0X3Jlc3VsdCByZXN1bHQ7CisgICAgICAgICBpZiAoIWluc2VydF9ub19ncm93KHJlc3VsdCwgaywgdikpCisgICAgICAgICB7CisgICAgICAgICAgICBncm93KCk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgbXVzdCBzdWNjZWVkLgorICAgICAgICAgICAgaWYgKCFpbnNlcnRfbm9fZ3JvdyhyZXN1bHQsIGssIHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnNlcnQoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSBpbnNlcnRfcmVzdWx0IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiB2KQorICAgICAgeworICAgICAgICAgcmV0dXJuIGluc2VydCh2LmZpcnN0LCB2LnNlY29uZCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEtleSYgaykgY29uc3QKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcigqdGhpcywgZmluZF9pbmRleChrKSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBpdGVyYXRvciBmaW5kKGNvbnN0IEtleSYgaykKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBpdGVyYXRvcigqdGhpcywgZmluZF9pbmRleChrKSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sIGVyYXNlKGNvbnN0IEtleSYgaykKKyAgICAgIHsKKyAgICAgICAgIHVpbnQzMl90IGkgPSBmaW5kX2luZGV4KGspOworCisgICAgICAgICBpZiAoaSA+PSBtX3ZhbHVlcy5zaXplKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgIG5vZGUqIHBEc3QgPSAmZ2V0X25vZGUoaSk7CisgICAgICAgICBkZXN0cnVjdF92YWx1ZV90eXBlKHBEc3QpOworICAgICAgICAgcERzdC0+c3RhdGUgPSBjU3RhdGVJbnZhbGlkOworCisgICAgICAgICBtX251bV92YWxpZC0tOworCisgICAgICAgICBmb3IgKDsgOyApCisgICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByLCBqID0gaTsKKworICAgICAgICAgICAgbm9kZSogcFNyYyA9IHBEc3Q7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoIWkpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpID0gbV92YWx1ZXMuc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICAgIHBTcmMgPSAmZ2V0X25vZGUoaSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgICBwU3JjLS07CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmICghcFNyYy0+c3RhdGUpCisgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgciA9IGhhc2hfa2V5KHBTcmMtPmZpcnN0KTsKKworICAgICAgICAgICAgfSB3aGlsZSAoKGkgPD0gciAmJiByIDwgaikgfHwgKHIgPCBqICYmIGogPCBpKSB8fCAoaiA8IGkgJiYgaSA8PSByKSk7CisKKyAgICAgICAgICAgIG1vdmVfbm9kZShwRHN0LCBwU3JjKTsKKworICAgICAgICAgICAgcERzdCA9IHBTcmM7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkIHN3YXAoaGFzaF9tYXBfdHlwZSYgb3RoZXIpCisgICAgICB7CisgICAgICAgICBtX3ZhbHVlcy5zd2FwKG90aGVyLm1fdmFsdWVzKTsKKyAgICAgICAgIHN0ZDo6c3dhcChtX2hhc2hfc2hpZnQsIG90aGVyLm1faGFzaF9zaGlmdCk7CisgICAgICAgICBzdGQ6OnN3YXAobV9udW1fdmFsaWQsIG90aGVyLm1fbnVtX3ZhbGlkKTsKKyAgICAgICAgIHN0ZDo6c3dhcChtX2dyb3dfdGhyZXNob2xkLCBvdGhlci5tX2dyb3dfdGhyZXNob2xkKTsKKyAgICAgICAgIHN0ZDo6c3dhcChtX2hhc2hlciwgb3RoZXIubV9oYXNoZXIpOworICAgICAgICAgc3RkOjpzd2FwKG1fZXF1YWxzLCBvdGhlci5tX2VxdWFscyk7CisgICAgICB9CisKKyAgIHByaXZhdGU6CisgICAgICBzdHJ1Y3Qgbm9kZSA6IHB1YmxpYyB2YWx1ZV90eXBlCisgICAgICB7CisgICAgICAgICB1aW50OF90IHN0YXRlOworICAgICAgfTsKKworICAgICAgc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdF92YWx1ZV90eXBlKHZhbHVlX3R5cGUqIHBEc3QsIGNvbnN0IEtleSYgaywgY29uc3QgVmFsdWUmIHYpCisgICAgICB7CisgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEUoS2V5KSkKKyAgICAgICAgICAgIG1lbWNweSgmcERzdC0+Zmlyc3QsICZrLCBzaXplb2YoS2V5KSk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBzY2FsYXJfdHlwZTxLZXk+Ojpjb25zdHJ1Y3QoJnBEc3QtPmZpcnN0LCBrKTsKKworICAgICAgICAgaWYgKEJBU0lTVV9JU19CSVRXSVNFX0NPUFlBQkxFKFZhbHVlKSkKKyAgICAgICAgICAgIG1lbWNweSgmcERzdC0+c2Vjb25kLCAmdiwgc2l6ZW9mKFZhbHVlKSk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBzY2FsYXJfdHlwZTxWYWx1ZT46OmNvbnN0cnVjdCgmcERzdC0+c2Vjb25kLCB2KTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdF92YWx1ZV90eXBlKHZhbHVlX3R5cGUqIHBEc3QsIGNvbnN0IHZhbHVlX3R5cGUqIHBTcmMpCisgICAgICB7CisgICAgICAgICBpZiAoKEJBU0lTVV9JU19CSVRXSVNFX0NPUFlBQkxFKEtleSkpICYmIChCQVNJU1VfSVNfQklUV0lTRV9DT1BZQUJMRShWYWx1ZSkpKQorICAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KHBEc3QsIHBTcmMsIHNpemVvZih2YWx1ZV90eXBlKSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEUoS2V5KSkKKyAgICAgICAgICAgICAgIG1lbWNweSgmcERzdC0+Zmlyc3QsICZwU3JjLT5maXJzdCwgc2l6ZW9mKEtleSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgc2NhbGFyX3R5cGU8S2V5Pjo6Y29uc3RydWN0KCZwRHN0LT5maXJzdCwgcFNyYy0+Zmlyc3QpOworCisgICAgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEUoVmFsdWUpKQorICAgICAgICAgICAgICAgbWVtY3B5KCZwRHN0LT5zZWNvbmQsICZwU3JjLT5zZWNvbmQsIHNpemVvZihWYWx1ZSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgc2NhbGFyX3R5cGU8VmFsdWU+Ojpjb25zdHJ1Y3QoJnBEc3QtPnNlY29uZCwgcFNyYy0+c2Vjb25kKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RhdGljIGlubGluZSB2b2lkIGRlc3RydWN0X3ZhbHVlX3R5cGUodmFsdWVfdHlwZSogcCkKKyAgICAgIHsKKyAgICAgICAgIHNjYWxhcl90eXBlPEtleT46OmRlc3RydWN0KCZwLT5maXJzdCk7CisgICAgICAgICBzY2FsYXJfdHlwZTxWYWx1ZT46OmRlc3RydWN0KCZwLT5zZWNvbmQpOworICAgICAgfQorCisgICAgICAvLyBNb3ZlcyAqcFNyYyB0byAqcERzdCBlZmZpY2llbnRseS4KKyAgICAgIC8vIHBEc3Qgc2hvdWxkIE5PVCBiZSBjb25zdHJ1Y3RlZCBvbiBlbnRyeS4KKyAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBtb3ZlX25vZGUobm9kZSogcERzdCwgbm9kZSogcFNyYywgYm9vbCB1cGRhdGVfc3JjX3N0YXRlID0gdHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgIGFzc2VydCghcERzdC0+c3RhdGUpOworCisgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEVfT1JfTU9WQUJMRShLZXkpICYmIEJBU0lTVV9JU19CSVRXSVNFX0NPUFlBQkxFX09SX01PVkFCTEUoVmFsdWUpKQorICAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KHBEc3QsIHBTcmMsIHNpemVvZihub2RlKSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEVfT1JfTU9WQUJMRShLZXkpKQorICAgICAgICAgICAgICAgbWVtY3B5KCZwRHN0LT5maXJzdCwgJnBTcmMtPmZpcnN0LCBzaXplb2YoS2V5KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzY2FsYXJfdHlwZTxLZXk+Ojpjb25zdHJ1Y3QoJnBEc3QtPmZpcnN0LCBwU3JjLT5maXJzdCk7CisgICAgICAgICAgICAgICBzY2FsYXJfdHlwZTxLZXk+OjpkZXN0cnVjdCgmcFNyYy0+Zmlyc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEVfT1JfTU9WQUJMRShWYWx1ZSkpCisgICAgICAgICAgICAgICBtZW1jcHkoJnBEc3QtPnNlY29uZCwgJnBTcmMtPnNlY29uZCwgc2l6ZW9mKFZhbHVlKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzY2FsYXJfdHlwZTxWYWx1ZT46OmNvbnN0cnVjdCgmcERzdC0+c2Vjb25kLCBwU3JjLT5zZWNvbmQpOworICAgICAgICAgICAgICAgc2NhbGFyX3R5cGU8VmFsdWU+OjpkZXN0cnVjdCgmcFNyYy0+c2Vjb25kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcERzdC0+c3RhdGUgPSBjU3RhdGVWYWxpZDsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHVwZGF0ZV9zcmNfc3RhdGUpCisgICAgICAgICAgICBwU3JjLT5zdGF0ZSA9IGNTdGF0ZUludmFsaWQ7CisgICAgICB9CisKKyAgICAgIHN0cnVjdCByYXdfbm9kZQorICAgICAgeworICAgICAgICAgaW5saW5lIHJhd19ub2RlKCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGUqIHAgPSByZWludGVycHJldF9jYXN0PG5vZGUqPih0aGlzKTsKKyAgICAgICAgICAgIHAtPnN0YXRlID0gY1N0YXRlSW52YWxpZDsKKyAgICAgICAgIH0KKworICAgICAgICAgaW5saW5lIH5yYXdfbm9kZSgpCisgICAgICAgICB7CisgICAgICAgICAgICBub2RlKiBwID0gcmVpbnRlcnByZXRfY2FzdDxub2RlKj4odGhpcyk7CisgICAgICAgICAgICBpZiAocC0+c3RhdGUpCisgICAgICAgICAgICAgICBoYXNoX21hcF90eXBlOjpkZXN0cnVjdF92YWx1ZV90eXBlKHApOworICAgICAgICAgfQorCisgICAgICAgICBpbmxpbmUgcmF3X25vZGUoY29uc3QgcmF3X25vZGUmIG90aGVyKQorICAgICAgICAgeworICAgICAgICAgICAgbm9kZSogcERzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8bm9kZSo+KHRoaXMpOworICAgICAgICAgICAgY29uc3Qgbm9kZSogcFNyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgbm9kZSo+KCZvdGhlcik7CisKKyAgICAgICAgICAgIGlmIChwU3JjLT5zdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhhc2hfbWFwX3R5cGU6OmNvbnN0cnVjdF92YWx1ZV90eXBlKHBEc3QsIHBTcmMpOworICAgICAgICAgICAgICAgcERzdC0+c3RhdGUgPSBjU3RhdGVWYWxpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHBEc3QtPnN0YXRlID0gY1N0YXRlSW52YWxpZDsKKyAgICAgICAgIH0KKworICAgICAgICAgaW5saW5lIHJhd19ub2RlJiBvcGVyYXRvcj0gKGNvbnN0IHJhd19ub2RlJiByaHMpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSAmcmhzKQorICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworCisgICAgICAgICAgICBub2RlKiBwRHN0ID0gcmVpbnRlcnByZXRfY2FzdDxub2RlKj4odGhpcyk7CisgICAgICAgICAgICBjb25zdCBub2RlKiBwU3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBub2RlKj4oJnJocyk7CisKKyAgICAgICAgICAgIGlmIChwU3JjLT5zdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChwRHN0LT5zdGF0ZSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBEc3QtPmZpcnN0ID0gcFNyYy0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgICBwRHN0LT5zZWNvbmQgPSBwU3JjLT5zZWNvbmQ7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBoYXNoX21hcF90eXBlOjpjb25zdHJ1Y3RfdmFsdWVfdHlwZShwRHN0LCBwU3JjKTsKKyAgICAgICAgICAgICAgICAgIHBEc3QtPnN0YXRlID0gY1N0YXRlVmFsaWQ7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwRHN0LT5zdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhhc2hfbWFwX3R5cGU6OmRlc3RydWN0X3ZhbHVlX3R5cGUocERzdCk7CisgICAgICAgICAgICAgICBwRHN0LT5zdGF0ZSA9IGNTdGF0ZUludmFsaWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgIH0KKworICAgICAgICAgdWludDhfdCBtX2JpdHNbc2l6ZW9mKG5vZGUpXTsKKyAgICAgIH07CisKKyAgICAgIHR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8cmF3X25vZGU+IG5vZGVfdmVjdG9yOworCisgICAgICBub2RlX3ZlY3RvciAgICBtX3ZhbHVlczsKKyAgICAgIHVpbnQzMl90ICAgICAgIG1faGFzaF9zaGlmdDsKKworICAgICAgSGFzaGVyICAgICAgICAgbV9oYXNoZXI7CisgICAgICBFcXVhbHMgICAgICAgICBtX2VxdWFsczsKKworICAgICAgdWludDMyX3QgICAgICAgbV9udW1fdmFsaWQ7CisKKyAgICAgIHVpbnQzMl90ICAgICAgIG1fZ3Jvd190aHJlc2hvbGQ7CisKKyAgICAgIGlubGluZSB1aW50MzJfdCBoYXNoX2tleShjb25zdCBLZXkmIGspIGNvbnN0CisgICAgICB7CisgICAgICAgICBhc3NlcnQoKDFVIDw8ICgzMlUgLSBtX2hhc2hfc2hpZnQpKSA9PSBtX3ZhbHVlcy5zaXplKCkpOworCisgICAgICAgICB1aW50MzJfdCBoYXNoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1faGFzaGVyKGspKTsKKworICAgICAgICAgLy8gRmlib25hY2NpIGhhc2hpbmcKKyAgICAgICAgIGhhc2ggPSAoMjY1NDQzNTc2OVUgKiBoYXNoKSA+PiBtX2hhc2hfc2hpZnQ7CisKKyAgICAgICAgIGFzc2VydChoYXNoIDwgbV92YWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgfQorCisgICAgICBpbmxpbmUgY29uc3Qgbm9kZSYgZ2V0X25vZGUodWludDMyX3QgaW5kZXgpIGNvbnN0CisgICAgICB7CisgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgbm9kZSo+KCZtX3ZhbHVlc1tpbmRleF0pOworICAgICAgfQorCisgICAgICBpbmxpbmUgbm9kZSYgZ2V0X25vZGUodWludDMyX3QgaW5kZXgpCisgICAgICB7CisgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8bm9kZSo+KCZtX3ZhbHVlc1tpbmRleF0pOworICAgICAgfQorCisgICAgICBpbmxpbmUgc3RhdGUgZ2V0X25vZGVfc3RhdGUodWludDMyX3QgaW5kZXgpIGNvbnN0CisgICAgICB7CisgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdGU+KGdldF9ub2RlKGluZGV4KS5zdGF0ZSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkIHNldF9ub2RlX3N0YXRlKHVpbnQzMl90IGluZGV4LCBib29sIHZhbGlkKQorICAgICAgeworICAgICAgICAgZ2V0X25vZGUoaW5kZXgpLnN0YXRlID0gdmFsaWQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkIGdyb3coKQorICAgICAgeworICAgICAgICAgdWludDY0X3QgbiA9IG1fdmFsdWVzLnNpemUoKSAqIDNVTEw7IC8vIHdhcyAqIDIKKyAgICAgICAgIAorICAgICAgICAgaWYgKCFoZWxwZXJzOjppc19wb3dlcl9vZl8yKG4pKQorICAgICAgICAgICAgbiA9IGhlbHBlcnM6Om5leHRfcG93MihuKTsKKworICAgICAgICAgaWYgKG4gPiAweDgwMDAwMDAwVUwpCisgICAgICAgICAgICBuID0gMHg4MDAwMDAwMFVMOworCisgICAgICAgICByZWhhc2goaGVscGVyczo6bWF4aW11bTx1aW50MzJfdD4oY01pbkhhc2hTaXplLCAodWludDMyX3QpbikpOworICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCByZWhhc2godWludDMyX3QgbmV3X2hhc2hfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgIGFzc2VydChuZXdfaGFzaF9zaXplID49IG1fbnVtX3ZhbGlkKTsKKyAgICAgICAgIGFzc2VydChoZWxwZXJzOjppc19wb3dlcl9vZl8yKG5ld19oYXNoX3NpemUpKTsKKworICAgICAgICAgaWYgKChuZXdfaGFzaF9zaXplIDwgbV9udW1fdmFsaWQpIHx8IChuZXdfaGFzaF9zaXplID09IG1fdmFsdWVzLnNpemUoKSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgIGhhc2hfbWFwIG5ld19tYXA7CisgICAgICAgICBuZXdfbWFwLm1fdmFsdWVzLnJlc2l6ZShuZXdfaGFzaF9zaXplKTsKKyAgICAgICAgIG5ld19tYXAubV9oYXNoX3NoaWZ0ID0gMzJVIC0gaGVscGVyczo6Zmxvb3JfbG9nMmkobmV3X2hhc2hfc2l6ZSk7CisgICAgICAgICBhc3NlcnQobmV3X2hhc2hfc2l6ZSA9PSAoMVUgPDwgKDMyVSAtIG5ld19tYXAubV9oYXNoX3NoaWZ0KSkpOworICAgICAgICAgbmV3X21hcC5tX2dyb3dfdGhyZXNob2xkID0gVUlOVF9NQVg7CisKKyAgICAgICAgIG5vZGUqIHBOb2RlID0gcmVpbnRlcnByZXRfY2FzdDxub2RlKj4obV92YWx1ZXMuYmVnaW4oKSk7CisgICAgICAgICBub2RlKiBwTm9kZV9lbmQgPSBwTm9kZSArIG1fdmFsdWVzLnNpemUoKTsKKworICAgICAgICAgd2hpbGUgKHBOb2RlICE9IHBOb2RlX2VuZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTm9kZS0+c3RhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBuZXdfbWFwLm1vdmVfaW50byhwTm9kZSk7CisKKyAgICAgICAgICAgICAgIGlmIChuZXdfbWFwLm1fbnVtX3ZhbGlkID09IG1fbnVtX3ZhbGlkKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBOb2RlKys7CisgICAgICAgICB9CisKKyAgICAgICAgIG5ld19tYXAubV9ncm93X3RocmVzaG9sZCA9IChuZXdfaGFzaF9zaXplICsgMVUpID4+IDFVOworCisgICAgICAgICBtX3ZhbHVlcy5jbGVhcl9ub19kZXN0cnVjdGlvbigpOworICAgICAgICAgbV9oYXNoX3NoaWZ0ID0gMzI7CisKKyAgICAgICAgIHN3YXAobmV3X21hcCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSB1aW50MzJfdCBmaW5kX25leHQodWludDMyX3QgaW5kZXgpIGNvbnN0CisgICAgICB7CisgICAgICAgICBpbmRleCsrOworCisgICAgICAgICBpZiAoaW5kZXggPj0gbV92YWx1ZXMuc2l6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGluZGV4OworCisgICAgICAgICBjb25zdCBub2RlKiBwTm9kZSA9ICZnZXRfbm9kZShpbmRleCk7CisKKyAgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTm9kZS0+c3RhdGUpCisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKCsraW5kZXggPj0gbV92YWx1ZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHBOb2RlKys7CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHVpbnQzMl90IGZpbmRfaW5kZXgoY29uc3QgS2V5JiBrKSBjb25zdAorICAgICAgeworICAgICAgICAgaWYgKG1fbnVtX3ZhbGlkKQorICAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgaW5kZXggPSBoYXNoX2tleShrKTsKKyAgICAgICAgICAgIGNvbnN0IG5vZGUqIHBOb2RlID0gJmdldF9ub2RlKGluZGV4KTsKKworICAgICAgICAgICAgaWYgKHBOb2RlLT5zdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChtX2VxdWFscyhwTm9kZS0+Zmlyc3QsIGspKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworCisgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBvcmlnX2luZGV4ID0gaW5kZXg7CisKKyAgICAgICAgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghaW5kZXgpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG1fdmFsdWVzLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICBwTm9kZSA9ICZnZXRfbm9kZShpbmRleCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgICAgcE5vZGUtLTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IG9yaWdfaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgaWYgKCFwTm9kZS0+c3RhdGUpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgaWYgKG1fZXF1YWxzKHBOb2RlLT5maXJzdCwgaykpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiBtX3ZhbHVlcy5zaXplKCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sIGluc2VydF9ub19ncm93KGluc2VydF9yZXN1bHQmIHJlc3VsdCwgY29uc3QgS2V5JiBrLCBjb25zdCBWYWx1ZSYgdiA9IFZhbHVlKCkpCisgICAgICB7CisgICAgICAgICBpZiAoIW1fdmFsdWVzLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgdWludDMyX3QgaW5kZXggPSBoYXNoX2tleShrKTsKKyAgICAgICAgIG5vZGUqIHBOb2RlID0gJmdldF9ub2RlKGluZGV4KTsKKworICAgICAgICAgaWYgKHBOb2RlLT5zdGF0ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX2VxdWFscyhwTm9kZS0+Zmlyc3QsIGspKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmVzdWx0LmZpcnN0ID0gaXRlcmF0b3IoKnRoaXMsIGluZGV4KTsKKyAgICAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBvcmlnX2luZGV4ID0gaW5kZXg7CisKKyAgICAgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmICghaW5kZXgpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbmRleCA9IG1fdmFsdWVzLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICBwTm9kZSA9ICZnZXRfbm9kZShpbmRleCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgcE5vZGUtLTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgaWYgKG9yaWdfaW5kZXggPT0gaW5kZXgpCisgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgIGlmICghcE5vZGUtPnN0YXRlKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGlmIChtX2VxdWFscyhwTm9kZS0+Zmlyc3QsIGspKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpcnN0ID0gaXRlcmF0b3IoKnRoaXMsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBpZiAobV9udW1fdmFsaWQgPj0gbV9ncm93X3RocmVzaG9sZCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgY29uc3RydWN0X3ZhbHVlX3R5cGUocE5vZGUsIGssIHYpOworCisgICAgICAgICBwTm9kZS0+c3RhdGUgPSBjU3RhdGVWYWxpZDsKKworICAgICAgICAgbV9udW1fdmFsaWQrKzsKKyAgICAgICAgIGFzc2VydChtX251bV92YWxpZCA8PSBtX3ZhbHVlcy5zaXplKCkpOworCisgICAgICAgICByZXN1bHQuZmlyc3QgPSBpdGVyYXRvcigqdGhpcywgaW5kZXgpOworICAgICAgICAgcmVzdWx0LnNlY29uZCA9IHRydWU7CisKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCBtb3ZlX2ludG8obm9kZSogcE5vZGUpCisgICAgICB7CisgICAgICAgICB1aW50MzJfdCBpbmRleCA9IGhhc2hfa2V5KHBOb2RlLT5maXJzdCk7CisgICAgICAgICBub2RlKiBwRHN0X25vZGUgPSAmZ2V0X25vZGUoaW5kZXgpOworCisgICAgICAgICBpZiAocERzdF9ub2RlLT5zdGF0ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG9yaWdfaW5kZXggPSBpbmRleDsKKworICAgICAgICAgICAgZm9yICg7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCFpbmRleCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGluZGV4ID0gbV92YWx1ZXMuc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICAgIHBEc3Rfbm9kZSA9ICZnZXRfbm9kZShpbmRleCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgcERzdF9ub2RlLS07CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBvcmlnX2luZGV4KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgaWYgKCFwRHN0X25vZGUtPnN0YXRlKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIG1vdmVfbm9kZShwRHN0X25vZGUsIHBOb2RlLCBmYWxzZSk7CisKKyAgICAgICAgIG1fbnVtX3ZhbGlkKys7CisgICAgICB9CisgICB9OworCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoZXIsIHR5cGVuYW1lIEVxdWFscz4KKyAgIHN0cnVjdCBiaXR3aXNlX21vdmFibGU8IGhhc2hfbWFwPEtleSwgVmFsdWUsIEhhc2hlciwgRXF1YWxzPiA+IHsgZW51bSB7IGNGbGFnID0gdHJ1ZSB9OyB9OworICAgCisjaWYgQkFTSVNVX0hBU0hNQVBfVEVTVAorICAgZXh0ZXJuIHZvaWQgaGFzaF9tYXBfdGVzdCgpOworI2VuZGlmCisgICAgICAKK30gLy8gbmFtZXNwYWNlIGJhc2lzdQorCituYW1lc3BhY2Ugc3RkCit7CisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgaW5saW5lIHZvaWQgc3dhcChiYXNpc3U6OnZlY3RvcjxUPiYgYSwgYmFzaXN1Ojp2ZWN0b3I8VD4mIGIpCisgICB7CisgICAgICBhLnN3YXAoYik7CisgICB9CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hlciwgdHlwZW5hbWUgRXF1YWxzPgorICAgaW5saW5lIHZvaWQgc3dhcChiYXNpc3U6Omhhc2hfbWFwPEtleSwgVmFsdWUsIEhhc2hlciwgRXF1YWxzPiYgYSwgYmFzaXN1OjpoYXNoX21hcDxLZXksIFZhbHVlLCBIYXNoZXIsIEVxdWFscz4mIGIpCisgICB7CisgICAgICBhLnN3YXAoYik7CisgICB9CisKK30gLy8gbmFtZXNwYWNlIHN0ZAorLyoqKiogZW5kZWQgaW5saW5pbmcgYmFzaXN1X2NvbnRhaW5lcnMuaCAqKioqLworCisjaWZkZWYgbWF4CisjdW5kZWYgbWF4CisjZW5kaWYKKworI2lmZGVmIG1pbgorI3VuZGVmIG1pbgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgc3RyY2FzZWNtcCBfc3RyaWNtcAorI2VuZGlmCisKKy8vIFNldCB0byBvbmUgdG8gZW5hYmxlIGRlYnVnIHByaW50ZigpJ3Mgd2hlbiBhbnkgZXJyb3JzIG9jY3VyLCBmb3IgZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgV2ViR0wgZGV2ZWxvcG1lbnQuCisjaWZuZGVmIEJBU0lTVV9GT1JDRV9ERVZFTF9NRVNTQUdFUworI2RlZmluZSBCQVNJU1VfRk9SQ0VfREVWRUxfTUVTU0FHRVMgMAorI2VuZGlmCisKKyNkZWZpbmUgQkFTSVNVX05PVEVfVU5VU0VEKHgpICh2b2lkKSh4KQorI2RlZmluZSBCQVNJU1VfQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKHhbMF0pKQorI2RlZmluZSBCQVNJU1VfTk9fRVFVQUxTX09SX0NPUFlfQ09OU1RSVUNUKHgpIHgoY29uc3QgeCAmKSA9IGRlbGV0ZTsgeCYgb3BlcmF0b3I9IChjb25zdCB4ICYpID0gZGVsZXRlOworI2RlZmluZSBCQVNJU1VfQVNTVU1FKHgpIHN0YXRpY19hc3NlcnQoeCwgI3gpOworI2RlZmluZSBCQVNJU1VfT0ZGU0VUT0YocywgbSkgb2Zmc2V0b2YocywgbSkKKyNkZWZpbmUgQkFTSVNVX1NUUklOR0laRSh4KSAjeAorI2RlZmluZSBCQVNJU1VfU1RSSU5HSVpFMih4KSBCQVNJU1VfU1RSSU5HSVpFKHgpCisKKyNpZiBCQVNJU1VfRk9SQ0VfREVWRUxfTUVTU0FHRVMKKwkjZGVmaW5lIEJBU0lTVV9ERVZFTF9FUlJPUiguLi4pIGRvIHsgYmFzaXN1OjpkZWJ1Z19wcmludGYoX19WQV9BUkdTX18pOyB9IHdoaWxlKDApCisjZWxzZQorCSNkZWZpbmUgQkFTSVNVX0RFVkVMX0VSUk9SKC4uLikKKyNlbmRpZgorCituYW1lc3BhY2UgYmFzaXN1Cit7CisJLy8gVHlwZXMvdXRpbGl0aWVzCisKKyNpZmRlZiBfV0lOMzIKKwljb25zdCBjaGFyIEJBU0lTVV9QQVRIX1NFUEVSQVRPUl9DSEFSID0gJ1xcJzsKKyNlbHNlCisJY29uc3QgY2hhciBCQVNJU1VfUEFUSF9TRVBFUkFUT1JfQ0hBUiA9ICcvJzsKKyNlbmRpZgorCisJdHlwZWRlZiBiYXNpc3U6OnZlY3Rvcjx1aW50OF90PiB1aW50OF92ZWM7CisJdHlwZWRlZiBiYXNpc3U6OnZlY3RvcjxpbnQxNl90PiBpbnQxNl92ZWM7CisJdHlwZWRlZiBiYXNpc3U6OnZlY3Rvcjx1aW50MTZfdD4gdWludDE2X3ZlYzsKKwl0eXBlZGVmIGJhc2lzdTo6dmVjdG9yPHVpbnQzMl90PiB1aW50X3ZlYzsKKwl0eXBlZGVmIGJhc2lzdTo6dmVjdG9yPHVpbnQ2NF90PiB1aW50NjRfdmVjOworCXR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8aW50PiBpbnRfdmVjOworCXR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8Ym9vbD4gYm9vbF92ZWM7CisKKwl2b2lkIGVuYWJsZV9kZWJ1Z19wcmludGYoYm9vbCBlbmFibGVkKTsKKwl2b2lkIGRlYnVnX3ByaW50Zihjb25zdCBjaGFyICpwRm10LCAuLi4pOworCQkKKworCXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCBjbGVhcl9vYmooVCYgb2JqKSB7IG1lbXNldCgmb2JqLCAwLCBzaXplb2Yob2JqKSk7IH0KKworCXRlbXBsYXRlIDx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+IGlubGluZSBUMCBsZXJwKFQwIGEsIFQwIGIsIFQxIGMpIHsgcmV0dXJuIGEgKyAoYiAtIGEpICogYzsgfQorCisJdGVtcGxhdGUgPHR5cGVuYW1lIFM+IGlubGluZSBTIG1heGltdW0oUyBhLCBTIGIpIHsgcmV0dXJuIChhID4gYikgPyBhIDogYjsgfQorCXRlbXBsYXRlIDx0eXBlbmFtZSBTPiBpbmxpbmUgUyBtYXhpbXVtKFMgYSwgUyBiLCBTIGMpIHsgcmV0dXJuIG1heGltdW0obWF4aW11bShhLCBiKSwgYyk7IH0KKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgUz4gaW5saW5lIFMgbWF4aW11bShTIGEsIFMgYiwgUyBjLCBTIGQpIHsgcmV0dXJuIG1heGltdW0obWF4aW11bShtYXhpbXVtKGEsIGIpLCBjKSwgZCk7IH0KKwkKKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgUz4gaW5saW5lIFMgbWluaW11bShTIGEsIFMgYikgewlyZXR1cm4gKGEgPCBiKSA/IGEgOiBiOyB9CisJdGVtcGxhdGUgPHR5cGVuYW1lIFM+IGlubGluZSBTIG1pbmltdW0oUyBhLCBTIGIsIFMgYykgewlyZXR1cm4gbWluaW11bShtaW5pbXVtKGEsIGIpLCBjKTsgfQorCXRlbXBsYXRlIDx0eXBlbmFtZSBTPiBpbmxpbmUgUyBtaW5pbXVtKFMgYSwgUyBiLCBTIGMsIFMgZCkgeyByZXR1cm4gbWluaW11bShtaW5pbXVtKG1pbmltdW0oYSwgYiksIGMpLCBkKTsgfQorCisJaW5saW5lIGZsb2F0IGNsYW1wZihmbG9hdCB2YWx1ZSwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7IGlmICh2YWx1ZSA8IGxvdykgdmFsdWUgPSBsb3c7IGVsc2UgaWYgKHZhbHVlID4gaGlnaCkgdmFsdWUgPSBoaWdoOwlyZXR1cm4gdmFsdWU7IH0KKwlpbmxpbmUgZmxvYXQgc2F0dXJhdGUoZmxvYXQgdmFsdWUpIHsgcmV0dXJuIGNsYW1wZih2YWx1ZSwgMCwgMS4wZik7IH0KKwlpbmxpbmUgdWludDhfdCBtaW5pbXVtdWIodWludDhfdCBhLCB1aW50OF90IGIpIHsgcmV0dXJuIChhIDwgYikgPyBhIDogYjsgfQorCWlubGluZSB1aW50MzJfdCBtaW5pbXVtdSh1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7IHJldHVybiAoYSA8IGIpID8gYSA6IGI7IH0KKwlpbmxpbmUgaW50MzJfdCBtaW5pbXVtaShpbnQzMl90IGEsIGludDMyX3QgYikgeyByZXR1cm4gKGEgPCBiKSA/IGEgOiBiOyB9CisJaW5saW5lIGZsb2F0IG1pbmltdW1mKGZsb2F0IGEsIGZsb2F0IGIpIHsgcmV0dXJuIChhIDwgYikgPyBhIDogYjsgfQorCWlubGluZSB1aW50OF90IG1heGltdW11Yih1aW50OF90IGEsIHVpbnQ4X3QgYikgeyByZXR1cm4gKGEgPiBiKSA/IGEgOiBiOyB9CisJaW5saW5lIHVpbnQzMl90IG1heGltdW11KHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsgcmV0dXJuIChhID4gYikgPyBhIDogYjsgfQorCWlubGluZSBpbnQzMl90IG1heGltdW1pKGludDMyX3QgYSwgaW50MzJfdCBiKSB7IHJldHVybiAoYSA+IGIpID8gYSA6IGI7IH0KKwlpbmxpbmUgZmxvYXQgbWF4aW11bWYoZmxvYXQgYSwgZmxvYXQgYikgeyByZXR1cm4gKGEgPiBiKSA/IGEgOiBiOyB9CisJaW5saW5lIGludCBzcXVhcmVpKGludCBpKSB7IHJldHVybiBpICogaTsgfQorCWlubGluZSBmbG9hdCBzcXVhcmVmKGZsb2F0IGkpIHsgcmV0dXJuIGkgKiBpOyB9CisJdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgc3F1YXJlKFQgYSkgeyByZXR1cm4gYSAqIGE7IH0KKworCXRlbXBsYXRlIDx0eXBlbmFtZSBTPiBpbmxpbmUgUyBjbGFtcChTIHZhbHVlLCBTIGxvdywgUyBoaWdoKSB7IHJldHVybiAodmFsdWUgPCBsb3cpID8gbG93IDogKCh2YWx1ZSA+IGhpZ2gpID8gaGlnaCA6IHZhbHVlKTsgfQorCisJaW5saW5lIHVpbnQzMl90IGlhYnMoaW50MzJfdCBpKSB7IHJldHVybiAoaSA8IDApID8gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC1pKSA6IHN0YXRpY19jYXN0PHVpbnQzMl90PihpKTsJfQorCWlubGluZSB1aW50NjRfdCBpYWJzNjQoaW50NjRfdCBpKSB7CXJldHVybiAoaSA8IDApID8gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KC1pKSA6IHN0YXRpY19jYXN0PHVpbnQ2NF90PihpKTsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgY2xlYXJfdmVjdG9yKFQgJnZlYykgeyB2ZWMuZXJhc2UodmVjLmJlZ2luKCksIHZlYy5lbmQoKSk7IH0JCQorCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlICplbmxhcmdlX3ZlY3RvcihUICZ2ZWMsIHNpemVfdCBuKSB7IHNpemVfdCBjcyA9IHZlYy5zaXplKCk7IHZlYy5yZXNpemUoY3MgKyBuKTsgcmV0dXJuICZ2ZWNbY3NdOyB9CisKKwlpbmxpbmUgYm9vbCBpc19wb3cyKHVpbnQzMl90IHgpIHsgcmV0dXJuIHggJiYgKCh4ICYgKHggLSAxVSkpID09IDBVKTsgfQorCWlubGluZSBib29sIGlzX3BvdzIodWludDY0X3QgeCkgeyByZXR1cm4geCAmJiAoKHggJiAoeCAtIDFVKSkgPT0gMFUpOyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBvcGVuX3JhbmdlX2NoZWNrKFQgdiwgVCBtaW52LCBUIG1heHYpIHsgYXNzZXJ0KHYgPj0gbWludiAmJiB2IDwgbWF4dik7IEJBU0lTVV9OT1RFX1VOVVNFRChtaW52KTsgQkFTSVNVX05PVEVfVU5VU0VEKG1heHYpOyByZXR1cm4gdjsgfQorCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBUIG9wZW5fcmFuZ2VfY2hlY2soVCB2LCBUIG1heHYpIHsgYXNzZXJ0KHYgPCBtYXh2KTsgQkFTSVNVX05PVEVfVU5VU0VEKG1heHYpOyByZXR1cm4gdjsgfQorCisJaW5saW5lIHVpbnQzMl90IHRvdGFsX2JpdHModWludDMyX3QgdikgeyB1aW50MzJfdCBsID0gMDsgZm9yICggOyB2ID4gMFU7ICsrbCkgdiA+Pj0gMTsgcmV0dXJuIGw7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBUIHNhdHVyYXRlKFQgdmFsKSB7IHJldHVybiBjbGFtcCh2YWwsIDAuMGYsIDEuMGYpOyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBSPiBpbmxpbmUgdm9pZCBhcHBlbmRfdmVjdG9yKFQgJnZlYywgY29uc3QgUiAqcE9ianMsIHNpemVfdCBuKSAKKwl7IAorCQlpZiAobikKKwkJeworCQkJaWYgKHZlYy5zaXplKCkpCisJCQl7CisJCQkJYXNzZXJ0KChwT2JqcyArIG4pIDw9IHZlYy5iZWdpbigpIHx8IChwT2JqcyA+PSB2ZWMuZW5kKCkpKTsKKwkJCX0KKwkJCWNvbnN0IHNpemVfdCBjdXJfcyA9IHZlYy5zaXplKCk7CisJCQl2ZWMucmVzaXplKGN1cl9zICsgbik7CisJCQltZW1jcHkoJnZlY1tjdXJfc10sIHBPYmpzLCBzaXplb2YoUikgKiBuKTsKKwkJfQorCX0KKworCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSB2b2lkIGFwcGVuZF92ZWN0b3IoVCAmdmVjLCBjb25zdCBUICZvdGhlcl92ZWMpCisJeworCQlhc3NlcnQoJnZlYyAhPSAmb3RoZXJfdmVjKTsKKwkJaWYgKG90aGVyX3ZlYy5zaXplKCkpCisJCQlhcHBlbmRfdmVjdG9yKHZlYywgJm90aGVyX3ZlY1swXSwgb3RoZXJfdmVjLnNpemUoKSk7CisJfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgdmVjdG9yX2Vuc3VyZV9lbGVtZW50X2lzX3ZhbGlkKFQgJnZlYywgc2l6ZV90IGlkeCkKKwl7CisJCWlmIChpZHggPj0gdmVjLnNpemUoKSkKKwkJCXZlYy5yZXNpemUoaWR4ICsgMSk7CisJfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgdmVjdG9yX3NvcnQoVCAmdmVjKQorCXsKKwkJaWYgKHZlYy5zaXplKCkpCisJCQlzdGQ6OnNvcnQodmVjLmJlZ2luKCksIHZlYy5lbmQoKSk7CisJfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gaW5saW5lIGJvb2wgdW5vcmRlcmVkX3NldF9jb250YWlucyhUJiBzZXQsIGNvbnN0IFUmb2JqKQorCXsKKwkJcmV0dXJuIHNldC5maW5kKG9iaikgIT0gc2V0LmVuZCgpOworCX0KKworCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCB2ZWN0b3JfZmluZChjb25zdCBUICZ2ZWMsIGNvbnN0IHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgJm9iaikKKwl7CisJCWFzc2VydCh2ZWMuc2l6ZSgpIDw9IElOVF9NQVgpOworCQlmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlYy5zaXplKCk7IGkrKykKKwkJCWlmICh2ZWNbaV0gPT0gb2JqKQorCQkJCXJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGkpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB2ZWN0b3Jfc2V0X2FsbChUICZ2ZWMsIGNvbnN0IHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgJm9iaikKKwl7CisJCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjLnNpemUoKTsgaSsrKQorCQkJdmVjW2ldID0gb2JqOworCX0KKwkJCisJaW5saW5lIHVpbnQ2NF90IHJlYWRfYmU2NChjb25zdCB2b2lkICpwKQorCXsKKwkJdWludDY0X3QgdmFsID0gMDsKKwkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCXZhbCB8PSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocClbNyAtIGldKSA8PCAoaSAqIDgpKTsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlpbmxpbmUgdm9pZCB3cml0ZV9iZTY0KHZvaWQgKnAsIHVpbnQ2NF90IHgpCisJeworCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgODsgaSsrKQorCQkJc3RhdGljX2Nhc3Q8dWludDhfdCAqPihwKVs3IC0gaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih4ID4+IChpICogOCkpOworCX0KKworCXN0YXRpYyBpbmxpbmUgdWludDE2X3QgYnl0ZXN3YXAxNih1aW50MTZfdCB4KSB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oKHggPDwgOCkgfCAoeCA+PiA4KSk7IH0KKwlzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJ5dGVzd2FwMzIodWludDMyX3QgeCkgeyByZXR1cm4gKCh4IDw8IDI0KSB8ICgoeCA8PCA4KSAmIDB4MDBGRjAwMDApIHwgKCh4ID4+IDgpICYgMHgwMDAwRkYwMCkgfCAoeCA+PiAyNCkpOyB9CisKKwlpbmxpbmUgdWludDMyX3QgZmxvb3JfbG9nMmkodWludDMyX3QgdikKKwl7CisJCXVpbnQzMl90IGIgPSAwOworCQlmb3IgKDsgdiA+IDFVOyArK2IpCisJCQl2ID4+PSAxOworCQlyZXR1cm4gYjsKKwl9CisKKwlpbmxpbmUgdWludDMyX3QgY2VpbF9sb2cyaSh1aW50MzJfdCB2KQorCXsKKwkJdWludDMyX3QgYiA9IGZsb29yX2xvZzJpKHYpOworCQlpZiAoKGIgIT0gMzIpICYmICh2ID4gKDFVIDw8IGIpKSkKKwkJCSsrYjsKKwkJcmV0dXJuIGI7CisJfQorCisJaW5saW5lIGludCBwb3Ntb2QoaW50IHgsIGludCB5KQorCXsKKwkJaWYgKHggPj0gMCkKKwkJCXJldHVybiAoeCA8IHkpID8geCA6ICh4ICUgeSk7CisJCWludCBtID0gKC14KSAlIHk7CisJCXJldHVybiAobSAhPSAwKSA/ICh5IC0gbSkgOiBtOworCX0KKworCWlubGluZSBib29sIGRvX2V4Y2xfcmFuZ2VzX292ZXJsYXAoaW50IGxhLCBpbnQgaGEsIGludCBsYiwgaW50IGhiKQorCXsKKwkJYXNzZXJ0KGxhIDwgaGEgJiYgbGIgPCBoYik7CisJCWlmICgoaGEgPD0gbGIpIHx8IChsYSA+PSBoYikpIHJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJc3RhdGljIGlubGluZSB1aW50MzJfdCByZWFkX2xlX2R3b3JkKGNvbnN0IHVpbnQ4X3QgKnBCeXRlcykKKwl7CisJCXJldHVybiAocEJ5dGVzWzNdIDw8IDI0VSkgfCAocEJ5dGVzWzJdIDw8IDE2VSkgfCAocEJ5dGVzWzFdIDw8IDhVKSB8IChwQnl0ZXNbMF0pOworCX0KKworCXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9sZV9kd29yZCh1aW50OF90KiBwQnl0ZXMsIHVpbnQzMl90IHZhbCkKKwl7CisJCXBCeXRlc1swXSA9ICh1aW50OF90KXZhbDsKKwkJcEJ5dGVzWzFdID0gKHVpbnQ4X3QpKHZhbCA+PiA4VSk7CisJCXBCeXRlc1syXSA9ICh1aW50OF90KSh2YWwgPj4gMTZVKTsKKwkJcEJ5dGVzWzNdID0gKHVpbnQ4X3QpKHZhbCA+PiAyNFUpOworCX0KKwkJCisJLy8gQWx3YXlzIGxpdHRsZSBlbmRpYW4gMS04IGJ5dGUgdW5zaWduZWQgaW50CisJdGVtcGxhdGU8dWludDMyX3QgTnVtQnl0ZXM+CisJc3RydWN0IHBhY2tlZF91aW50CisJeworCQl1aW50OF90IG1fYnl0ZXNbTnVtQnl0ZXNdOworCisJCWlubGluZSBwYWNrZWRfdWludCgpIHsgc3RhdGljX2Fzc2VydChOdW1CeXRlcyA8PSBzaXplb2YodWludDY0X3QpLCAiSW52YWxpZCBOdW1CeXRlcyIpOyB9CisJCWlubGluZSBwYWNrZWRfdWludCh1aW50NjRfdCB2KSB7ICp0aGlzID0gdjsgfQorCQlpbmxpbmUgcGFja2VkX3VpbnQoY29uc3QgcGFja2VkX3VpbnQmIG90aGVyKSB7ICp0aGlzID0gb3RoZXI7IH0KKwkJCQkJCQorCQlpbmxpbmUgcGFja2VkX3VpbnQmIG9wZXJhdG9yPSAodWludDY0X3QgdikgCisJCXsgCisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTnVtQnl0ZXM7IGkrKykgCisJCQkJbV9ieXRlc1tpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYgPj4gKGkgKiA4KSk7IAorCQkJcmV0dXJuICp0aGlzOyAKKwkJfQorCisJCWlubGluZSBwYWNrZWRfdWludCYgb3BlcmF0b3I9IChjb25zdCBwYWNrZWRfdWludCYgcmhzKSAKKwkJeyAKKwkJCW1lbWNweShtX2J5dGVzLCByaHMubV9ieXRlcywgc2l6ZW9mKG1fYnl0ZXMpKTsgCisJCQlyZXR1cm4gKnRoaXM7CisJCX0KKworCQlpbmxpbmUgb3BlcmF0b3IgdWludDMyX3QoKSBjb25zdAorCQl7CisJCQlzd2l0Y2ggKE51bUJ5dGVzKQorCQkJeworCQkJCWNhc2UgMTogIAorCQkJCXsKKwkJCQkJcmV0dXJuICBtX2J5dGVzWzBdOworCQkJCX0KKwkJCQljYXNlIDI6ICAKKwkJCQl7CisJCQkJCXJldHVybiAobV9ieXRlc1sxXSA8PCA4VSkgfCBtX2J5dGVzWzBdOworCQkJCX0KKwkJCQljYXNlIDM6ICAKKwkJCQl7CisJCQkJCXJldHVybiAobV9ieXRlc1syXSA8PCAxNlUpIHwgKG1fYnl0ZXNbMV0gPDwgOFUpIHwgbV9ieXRlc1swXTsKKwkJCQl9CisJCQkJY2FzZSA0OiAgCisJCQkJeworCQkJCQlyZXR1cm4gcmVhZF9sZV9kd29yZChtX2J5dGVzKTsKKwkJCQl9CisJCQkJY2FzZSA1OgorCQkJCXsKKwkJCQkJdWludDMyX3QgbCA9IHJlYWRfbGVfZHdvcmQobV9ieXRlcyk7CisJCQkJCXVpbnQzMl90IGggPSBtX2J5dGVzWzRdOworCQkJCQlyZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGwpIHwgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihoKSA8PCAzMlUpOworCQkJCX0KKwkJCQljYXNlIDY6CisJCQkJeworCQkJCQl1aW50MzJfdCBsID0gcmVhZF9sZV9kd29yZChtX2J5dGVzKTsKKwkJCQkJdWludDMyX3QgaCA9IChtX2J5dGVzWzVdIDw8IDhVKSB8IG1fYnl0ZXNbNF07CisJCQkJCXJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4obCkgfCAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGgpIDw8IDMyVSk7CisJCQkJfQorCQkJCWNhc2UgNzoKKwkJCQl7CisJCQkJCXVpbnQzMl90IGwgPSByZWFkX2xlX2R3b3JkKG1fYnl0ZXMpOworCQkJCQl1aW50MzJfdCBoID0gKG1fYnl0ZXNbNl0gPDwgMTZVKSB8IChtX2J5dGVzWzVdIDw8IDhVKSB8IG1fYnl0ZXNbNF07CisJCQkJCXJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4obCkgfCAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGgpIDw8IDMyVSk7CisJCQkJfQorCQkJCWNhc2UgODogIAorCQkJCXsKKwkJCQkJdWludDMyX3QgbCA9IHJlYWRfbGVfZHdvcmQobV9ieXRlcyk7CisJCQkJCXVpbnQzMl90IGggPSByZWFkX2xlX2R3b3JkKG1fYnl0ZXMgKyA0KTsKKwkJCQkJcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihsKSB8IChzdGF0aWNfY2FzdDx1aW50NjRfdD4oaCkgPDwgMzJVKTsKKwkJCQl9CisJCQkJZGVmYXVsdDogCisJCQkJeworCQkJCQlhc3NlcnQoMCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCX07CisKKwllbnVtIGVaZXJvIHsgY1plcm8gfTsKKwllbnVtIGVOb0NsYW1wIHsgY05vQ2xhbXAgfTsKKwkKKwkvLyBSaWNlL0h1ZmZtYW4gZW50cm9weSBjb2RpbmcKKwkJCisJLy8gVGhpcyBpcyBiYXNpY2FsbHkgRGVmbGF0ZS1zdHlsZSBjYW5vbmljYWwgSHVmZm1hbiwgZXhjZXB0IHdlIGFsbG93IGZvciBhIGxvdCBtb3JlIHN5bWJvbHMuCisJZW51bQorCXsKKwkJY0h1ZmZtYW5NYXhTdXBwb3J0ZWRDb2RlU2l6ZSA9IDE2LCBjSHVmZm1hbk1heFN1cHBvcnRlZEludGVybmFsQ29kZVNpemUgPSAzMSwgCisJCWNIdWZmbWFuRmFzdExvb2t1cEJpdHMgPSAxMCwgCisJCWNIdWZmbWFuTWF4U3ltc0xvZzIgPSAxNCwgY0h1ZmZtYW5NYXhTeW1zID0gMSA8PCBjSHVmZm1hbk1heFN5bXNMb2cyLAorCisJCS8vIFNtYWxsIHplcm8gcnVucworCQljSHVmZm1hblNtYWxsWmVyb1J1blNpemVNaW4gPSAzLCBjSHVmZm1hblNtYWxsWmVyb1J1blNpemVNYXggPSAxMCwgY0h1ZmZtYW5TbWFsbFplcm9SdW5FeHRyYUJpdHMgPSAzLAorCisJCS8vIEJpZyB6ZXJvIHJ1bgorCQljSHVmZm1hbkJpZ1plcm9SdW5TaXplTWluID0gMTEsIGNIdWZmbWFuQmlnWmVyb1J1blNpemVNYXggPSAxMzgsIGNIdWZmbWFuQmlnWmVyb1J1bkV4dHJhQml0cyA9IDcsCisKKwkJLy8gU21hbGwgbm9uLXplcm8gcnVuCisJCWNIdWZmbWFuU21hbGxSZXBlYXRTaXplTWluID0gMywgY0h1ZmZtYW5TbWFsbFJlcGVhdFNpemVNYXggPSA2LCBjSHVmZm1hblNtYWxsUmVwZWF0RXh0cmFCaXRzID0gMiwKKworCQkvLyBCaWcgbm9uLXplcm8gcnVuCisJCWNIdWZmbWFuQmlnUmVwZWF0U2l6ZU1pbiA9IDcsIGNIdWZmbWFuQmlnUmVwZWF0U2l6ZU1heCA9IDEzNCwgY0h1ZmZtYW5CaWdSZXBlYXRFeHRyYUJpdHMgPSA3LAorCisJCWNIdWZmbWFuVG90YWxDb2RlbGVuZ3RoQ29kZXMgPSAyMSwgY0h1ZmZtYW5TbWFsbFplcm9SdW5Db2RlID0gMTcsIGNIdWZmbWFuQmlnWmVyb1J1bkNvZGUgPSAxOCwgY0h1ZmZtYW5TbWFsbFJlcGVhdENvZGUgPSAxOSwgY0h1ZmZtYW5CaWdSZXBlYXRDb2RlID0gMjAKKwl9OworCisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ19odWZmbWFuX3NvcnRlZF9jb2RlbGVuZ3RoX2NvZGVzW10gPSB7IGNIdWZmbWFuU21hbGxaZXJvUnVuQ29kZSwgY0h1ZmZtYW5CaWdaZXJvUnVuQ29kZSwJY0h1ZmZtYW5TbWFsbFJlcGVhdENvZGUsIGNIdWZmbWFuQmlnUmVwZWF0Q29kZSwgMCwgOCwgNywgOSwgNiwgMHhBLCA1LCAweEIsIDQsIDB4QywgMywgMHhELCAyLCAweEUsIDEsIDB4RiwgMHgxMCB9OworCWNvbnN0IHVpbnQzMl90IGNIdWZmbWFuVG90YWxTb3J0ZWRDb2RlbGVuZ3RoQ29kZXMgPSBzaXplb2YoZ19odWZmbWFuX3NvcnRlZF9jb2RlbGVuZ3RoX2NvZGVzKSAvIHNpemVvZihnX2h1ZmZtYW5fc29ydGVkX2NvZGVsZW5ndGhfY29kZXNbMF0pOworCisJLy8gR1BVIHRleHR1cmUgZm9ybWF0cworCisJZW51bSBjbGFzcyB0ZXh0dXJlX2Zvcm1hdAorCXsKKwkJY0ludmFsaWRUZXh0dXJlRm9ybWF0ID0gLTEsCisJCQorCQkvLyBCbG9jay1iYXNlZCBmb3JtYXRzCisJCWNFVEMxLAkJCS8vIEVUQzEKKwkJY0VUQzFTLAkJCS8vIEVUQzEgKHN1YnNldDogZGlmZiBjb2xvcnMgb25seSwgbm8gc3ViYmxvY2tzKQorCQljRVRDMl9SR0IsCQkvLyBFVEMyIGNvbG9yIGJsb2NrIChiYXNpc3UgZG9lc24ndCBzdXBwb3J0IEVUQzIgcGxhbmFyL1QvSCBtb2RlcyAtIGp1c3QgYmFzaWMgRVRDMSkKKwkJY0VUQzJfUkdCQSwJCS8vIEVUQzIgRUFDIGFscGhhIGJsb2NrIGZvbGxvd2VkIGJ5IEVUQzIgY29sb3IgYmxvY2sKKwkJY0VUQzJfQUxQSEEsCS8vIEVUQzIgRUFDIGFscGhhIGJsb2NrIAorCQljQkMxLAkJCQkvLyBEWFQxCisJCWNCQzMsCQkJCS8vIERYVDUgKEJDNC9EWFQ1QSBibG9jayBmb2xsb3dlZCBieSBhIEJDMS9EWFQxIGJsb2NrKQorCQljQkM0LAkJCQkvLyBEWFQ1QQorCQljQkM1LAkJCQkvLyAzREMvRFhOICh0d28gQkM0L0RYVDVBIGJsb2NrcykKKwkJY0JDNywKKwkJY0FTVEM0eDQsCQkvLyBMRFIgb25seQorCQljUFZSVEMxXzRfUkdCLAorCQljUFZSVEMxXzRfUkdCQSwKKwkJY0FUQ19SR0IsCisJCWNBVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEEsCisJCWNGWFQxX1JHQiwKKwkJY1BWUlRDMl80X1JHQkEsCisJCWNFVEMyX1IxMV9FQUMsCisJCWNFVEMyX1JHMTFfRUFDLAorCQljVUFTVEM0eDQsCQkKKwkJY0JDMV9OViwKKwkJY0JDMV9BTUQsCisJCQorCQkvLyBVbmNvbXByZXNzZWQvcmF3IHBpeGVscworCQljUkdCQTMyLAorCQljUkdCNTY1LAorCQljQkdSNTY1LAorCQljUkdCQTQ0NDQsCisJCWNBQkdSNDQ0NAorCX07CisKKwlpbmxpbmUgdWludDMyX3QgZ2V0X2J5dGVzX3Blcl9ibG9jayh0ZXh0dXJlX2Zvcm1hdCBmbXQpCisJeworCQlzd2l0Y2ggKGZtdCkKKwkJeworCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjRVRDMToKKwkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y0VUQzFTOgorCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjRVRDMl9SR0I6CisJCWNhc2UgdGV4dHVyZV9mb3JtYXQ6OmNFVEMyX0FMUEhBOgorCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjQkMxOgorCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjQkMxX05WOgorCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjQkMxX0FNRDoKKwkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y0JDNDoKKwkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y1BWUlRDMV80X1JHQjoKKwkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y1BWUlRDMV80X1JHQkE6CisJCWNhc2UgdGV4dHVyZV9mb3JtYXQ6OmNBVENfUkdCOgorCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjUFZSVEMyXzRfUkdCQToKKwkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y0VUQzJfUjExX0VBQzoKKwkJCXJldHVybiA4OworCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjUkdCQTMyOgorCQkJcmV0dXJuIHNpemVvZih1aW50MzJfdCkgKiAxNjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAxNjsKKwl9CisKKwlpbmxpbmUgdWludDMyX3QgZ2V0X3F3b3Jkc19wZXJfYmxvY2sodGV4dHVyZV9mb3JtYXQgZm10KQorCXsKKwkJcmV0dXJuIGdldF9ieXRlc19wZXJfYmxvY2soZm10KSA+PiAzOworCX0KKworCWlubGluZSB1aW50MzJfdCBnZXRfYmxvY2tfd2lkdGgodGV4dHVyZV9mb3JtYXQgZm10KQorCXsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKGZtdCk7CisJCXN3aXRjaCAoZm10KQorCQl7CisJCWNhc2UgdGV4dHVyZV9mb3JtYXQ6OmNGWFQxX1JHQjoKKwkJCXJldHVybiA4OworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDQ7CisJfQorCisJaW5saW5lIHVpbnQzMl90IGdldF9ibG9ja19oZWlnaHQodGV4dHVyZV9mb3JtYXQgZm10KQorCXsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKGZtdCk7CisJCXJldHVybiA0OworCX0KKwkJCQkJCQkKK30gLy8gbmFtZXNwYWNlIGJhc2lzdQorCisvKioqKiBlbmRlZCBpbmxpbmluZyBiYXNpc3UuaCAqKioqLworCisjZGVmaW5lIEJBU0lTRF96bmV3ICh6ID0gMzY5NjkgKiAoeiAmIDY1NTM1KSArICh6ID4+IDE2KSkKKworbmFtZXNwYWNlIGJhc2lzdQoreworCWV4dGVybiBib29sIGdfZGVidWdfcHJpbnRmOworfQorCituYW1lc3BhY2UgYmFzaXN0Cit7CisJLy8gTG93LWxldmVsIGZvcm1hdHMgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IHRoZSB0cmFuc2NvZGVyIChvdGhlciBzdXBwb3J0ZWQgdGV4dHVyZSBmb3JtYXRzIGFyZSBjb21iaW5hdGlvbnMgb2YgdGhlc2UgbG93LWxldmVsIGJsb2NrIGZvcm1hdHMpLgorCS8vIFlvdSBwcm9iYWJseSBkb24ndCBjYXJlIGFib3V0IHRoZXNlIGVudW0ncyB1bmxlc3MgeW91IGFyZSBnb2luZyBwcmV0dHkgbG93LWxldmVsIGFuZCBjYWxsaW5nIHRoZSB0cmFuc2NvZGVyIHRvIGRlY29kZSBpbmRpdmlkdWFsIHNsaWNlcy4KKwllbnVtIGNsYXNzIGJsb2NrX2Zvcm1hdAorCXsKKwkJY0VUQzEsCQkJCQkJCQkvLyBFVEMxUyBSR0IgCisJCWNFVEMyX1JHQkEsCQkJCQkJCS8vIGZ1bGwgRVRDMiBFQUMgUkdCQTggYmxvY2sKKwkJY0JDMSwJCQkJCQkJCQkvLyBEWFQxIFJHQiAKKwkJY0JDMywJCQkJCQkJCQkvLyBCQzQgYmxvY2sgZm9sbG93ZWQgYnkgYSBmb3VyIGNvbG9yIEJDMSBibG9jaworCQljQkM0LAkJCQkJCQkJCS8vIERYVDVBIChhbHBoYSBibG9jayBvbmx5KQorCQljQkM1LAkJCQkJCQkJCS8vIHR3byBCQzQgYmxvY2tzCisJCWNQVlJUQzFfNF9SR0IsCQkJCQkJLy8gb3BhcXVlLW9ubHkgUFZSVEMxIDRicHAKKwkJY1BWUlRDMV80X1JHQkEsCQkJCQkvLyBQVlJUQzEgNGJwcCBSR0JBCisJCWNCQzcsCQkJCQkJCQkJLy8gRnVsbCBCQzcgYmxvY2ssIGFueSBtb2RlCisJCWNCQzdfTTVfQ09MT1IsCQkJCQkJLy8gUkdCIEJDNyBtb2RlIDUgY29sb3IgKHdyaXRlcyBhbiBvcGFxdWUgbW9kZSA1IGJsb2NrKQorCQljQkM3X001X0FMUEhBLAkJCQkJCS8vIGFscGhhIHBvcnRpb24gb2YgQkM3IG1vZGUgNSAoY0JDN19NNV9DT0xPUiBvdXRwdXQgZGF0YSBtdXN0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGZpcnN0IHRvIHNldCB0aGUgbW9kZS9yb3QgZmllbGRzIGV0Yy4pCisJCWNFVEMyX0VBQ19BOCwJCQkJCQkvLyBhbHBoYSBibG9jayBvZiBFVEMyIEVBQyAoZmlyc3QgOCBieXRlcyBvZiB0aGUgMTYtYml0IEVUQzIgRUFDIFJHQkEgZm9ybWF0KQorCQljQVNUQ180eDQsCQkJCQkJCS8vIEFTVEMgNHg0IChlaXRoZXIgY29sb3Itb25seSBvciBjb2xvcithbHBoYSkuIE5vdGUgdGhhdCB0aGUgdHJhbnNjb2RlciBhbHdheXMgY3VycmVudGx5IGFzc3VtZXMgc1JHQiBpcyBub3QgZW5hYmxlZCB3aGVuIG91dHB1dHRpbmcgQVNUQyAKKwkJCQkJCQkJCQkJCS8vIGRhdGEuIElmIHlvdSB1c2UgYSBzUkdCIEFTVEMgZm9ybWF0IHlvdSdsbCBnZXQgfjEgTFNCIG9mIGFkZGl0aW9uYWwgZXJyb3IsIGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVudCB3YXkgQVNUQyBkZWNvZGVycyBzY2FsZSA4LWJpdCBlbmRwb2ludHMgdG8gMTYtYml0cyBkdXJpbmcgdW5wYWNraW5nLgorCQkKKwkJY0FUQ19SR0IsCisJCWNBVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEEsCisJCWNGWFQxX1JHQiwJCQkJCQkJLy8gT3BhcXVlLW9ubHksIGhhcyBvZGRiYWxsIDh4NCBwaXhlbCBibG9jayBzaXplCisKKwkJY1BWUlRDMl80X1JHQiwKKwkJY1BWUlRDMl80X1JHQkEsCisKKwkJY0VUQzJfRUFDX1IxMSwKKwkJY0VUQzJfRUFDX1JHMTEsCisJCQkJCQkJCQkJCQkKKwkJY0luZGljZXMsCQkJCQkJCS8vIFVzZWQgaW50ZXJuYWxseTogV3JpdGUgMTYtYml0IGVuZHBvaW50IGFuZCBzZWxlY3RvciBpbmRpY2VzIGRpcmVjdGx5IHRvIG91dHB1dCAob3V0cHV0IGJsb2NrIG11c3QgYmUgYXQgbGVhc3QgMzItYml0cykKKworCQljUkdCMzIsCQkJCQkJCQkvLyBXcml0ZXMgUkdCIGNvbXBvbmVudHMgdG8gMzJicHAgb3V0cHV0IHBpeGVscworCQljUkdCQTMyLAkJCQkJCQkJLy8gV3JpdGVzIFJHQjI1NSBjb21wb25lbnRzIHRvIDMyYnBwIG91dHB1dCBwaXhlbHMKKwkJY0EzMiwJCQkJCQkJCQkvLyBXcml0ZXMgYWxwaGEgY29tcG9uZW50IHRvIDMyYnBwIG91dHB1dCBwaXhlbHMKKwkJCQkKKwkJY1JHQjU2NSwKKwkJY0JHUjU2NSwKKwkJCisJCWNSR0JBNDQ0NF9DT0xPUiwKKwkJY1JHQkE0NDQ0X0FMUEhBLAorCQljUkdCQTQ0NDRfQ09MT1JfT1BBUVVFLAorCQljUkdCQTQ0NDQsCisJCQkJCQkKKwkJY1RvdGFsQmxvY2tGb3JtYXRzCisJfTsKKworCWNvbnN0IGludCBDT0xPUjVfUEFMMF9QUkVWX0hJID0gOSwgQ09MT1I1X1BBTDBfREVMVEFfTE8gPSAtOSwgQ09MT1I1X1BBTDBfREVMVEFfSEkgPSAzMTsKKwljb25zdCBpbnQgQ09MT1I1X1BBTDFfUFJFVl9ISSA9IDIxLCBDT0xPUjVfUEFMMV9ERUxUQV9MTyA9IC0yMSwgQ09MT1I1X1BBTDFfREVMVEFfSEkgPSAyMTsKKwljb25zdCBpbnQgQ09MT1I1X1BBTDJfUFJFVl9ISSA9IDMxLCBDT0xPUjVfUEFMMl9ERUxUQV9MTyA9IC0zMSwgQ09MT1I1X1BBTDJfREVMVEFfSEkgPSA5OworCWNvbnN0IGludCBDT0xPUjVfUEFMX01JTl9ERUxUQV9CX1JVTkxFTiA9IDMsIENPTE9SNV9QQUxfREVMVEFfNV9SVU5MRU5fVkxDX0JJVFMgPSAzOworCisJY29uc3QgdWludDMyX3QgRU5EUE9JTlRfUFJFRF9UT1RBTF9TWU1CT0xTID0gKDQgKiA0ICogNCAqIDQpICsgMTsKKwljb25zdCB1aW50MzJfdCBFTkRQT0lOVF9QUkVEX1JFUEVBVF9MQVNUX1NZTUJPTCA9IEVORFBPSU5UX1BSRURfVE9UQUxfU1lNQk9MUyAtIDE7CisJY29uc3QgdWludDMyX3QgRU5EUE9JTlRfUFJFRF9NSU5fUkVQRUFUX0NPVU5UID0gMzsKKwljb25zdCB1aW50MzJfdCBFTkRQT0lOVF9QUkVEX0NPVU5UX1ZMQ19CSVRTID0gNDsKKworCWNvbnN0IHVpbnQzMl90IE5VTV9FTkRQT0lOVF9QUkVEUyA9IDM7Ly8gQkFTSVNVX0FSUkFZX1NJWkUoZ19lbmRwb2ludF9wcmVkcyk7CisJY29uc3QgdWludDMyX3QgQ1JfRU5EUE9JTlRfUFJFRF9JTkRFWCA9IE5VTV9FTkRQT0lOVF9QUkVEUyAtIDE7CisJY29uc3QgdWludDMyX3QgTk9fRU5EUE9JTlRfUFJFRF9JTkRFWCA9IDM7Ly9OVU1fRU5EUE9JTlRfUFJFRFM7CisJY29uc3QgdWludDMyX3QgTUFYX1NFTEVDVE9SX0hJU1RPUllfQlVGX1NJWkUgPSA2NDsKKwljb25zdCB1aW50MzJfdCBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9STEVfQ09VTlRfVEhSRVNIID0gMzsKKwljb25zdCB1aW50MzJfdCBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9STEVfQ09VTlRfQklUUyA9IDY7CisJY29uc3QgdWludDMyX3QgU0VMRUNUT1JfSElTVE9SWV9CVUZfUkxFX0NPVU5UX1RPVEFMID0gKDEgPDwgU0VMRUNUT1JfSElTVE9SWV9CVUZfUkxFX0NPVU5UX0JJVFMpOworCQkKKwl1aW50MTZfdCBjcmMxNihjb25zdCB2b2lkICpyLCBzaXplX3Qgc2l6ZSwgdWludDE2X3QgY3JjKTsKKwkJCisJY2xhc3MgaHVmZm1hbl9kZWNvZGluZ190YWJsZQorCXsKKwkJZnJpZW5kIGNsYXNzIGJpdHdpc2VfZGVjb2RlcjsKKworCXB1YmxpYzoKKwkJaHVmZm1hbl9kZWNvZGluZ190YWJsZSgpCisJCXsKKwkJfQorCisJCXZvaWQgY2xlYXIoKQorCQl7CisJCQliYXNpc3U6OmNsZWFyX3ZlY3RvcihtX2NvZGVfc2l6ZXMpOworCQkJYmFzaXN1OjpjbGVhcl92ZWN0b3IobV9sb29rdXApOworCQkJYmFzaXN1OjpjbGVhcl92ZWN0b3IobV90cmVlKTsKKwkJfQorCisJCWJvb2wgaW5pdCh1aW50MzJfdCB0b3RhbF9zeW1zLCBjb25zdCB1aW50OF90ICpwQ29kZV9zaXplcywgdWludDMyX3QgZmFzdF9sb29rdXBfYml0cyA9IGJhc2lzdTo6Y0h1ZmZtYW5GYXN0TG9va3VwQml0cykKKwkJeworCQkJaWYgKCF0b3RhbF9zeW1zKQorCQkJeworCQkJCWNsZWFyKCk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCW1fY29kZV9zaXplcy5yZXNpemUodG90YWxfc3ltcyk7CisJCQltZW1jcHkoJm1fY29kZV9zaXplc1swXSwgcENvZGVfc2l6ZXMsIHRvdGFsX3N5bXMpOworCisJCQljb25zdCB1aW50MzJfdCBodWZmbWFuX2Zhc3RfbG9va3VwX3NpemUgPSAxIDw8IGZhc3RfbG9va3VwX2JpdHM7CisKKwkJCW1fbG9va3VwLnJlc2l6ZSgwKTsKKwkJCW1fbG9va3VwLnJlc2l6ZShodWZmbWFuX2Zhc3RfbG9va3VwX3NpemUpOworCisJCQltX3RyZWUucmVzaXplKDApOworCQkJbV90cmVlLnJlc2l6ZSh0b3RhbF9zeW1zICogMik7CisKKwkJCXVpbnQzMl90IHN5bXNfdXNpbmdfY29kZXNpemVbYmFzaXN1OjpjSHVmZm1hbk1heFN1cHBvcnRlZEludGVybmFsQ29kZVNpemUgKyAxXTsKKwkJCWJhc2lzdTo6Y2xlYXJfb2JqKHN5bXNfdXNpbmdfY29kZXNpemUpOworCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHRvdGFsX3N5bXM7IGkrKykKKwkJCXsKKwkJCQlpZiAocENvZGVfc2l6ZXNbaV0gPiBiYXNpc3U6OmNIdWZmbWFuTWF4U3VwcG9ydGVkSW50ZXJuYWxDb2RlU2l6ZSkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCXN5bXNfdXNpbmdfY29kZXNpemVbcENvZGVfc2l6ZXNbaV1dKys7CisJCQl9CisKKwkJCXVpbnQzMl90IG5leHRfY29kZVtiYXNpc3U6OmNIdWZmbWFuTWF4U3VwcG9ydGVkSW50ZXJuYWxDb2RlU2l6ZSArIDFdOworCQkJbmV4dF9jb2RlWzBdID0gbmV4dF9jb2RlWzFdID0gMDsKKworCQkJdWludDMyX3QgdXNlZF9zeW1zID0gMCwgdG90YWwgPSAwOworCQkJZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IGJhc2lzdTo6Y0h1ZmZtYW5NYXhTdXBwb3J0ZWRJbnRlcm5hbENvZGVTaXplOyBpKyspCisJCQl7CisJCQkJdXNlZF9zeW1zICs9IHN5bXNfdXNpbmdfY29kZXNpemVbaV07CisJCQkJbmV4dF9jb2RlW2kgKyAxXSA9ICh0b3RhbCA9ICgodG90YWwgKyBzeW1zX3VzaW5nX2NvZGVzaXplW2ldKSA8PCAxKSk7CisJCQl9CisKKwkJCWlmICgoKDFVIDw8IGJhc2lzdTo6Y0h1ZmZtYW5NYXhTdXBwb3J0ZWRJbnRlcm5hbENvZGVTaXplKSAhPSB0b3RhbCkgJiYgKHVzZWRfc3ltcyA+IDFVKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCWZvciAoaW50IHRyZWVfbmV4dCA9IC0xLCBzeW1faW5kZXggPSAwOyBzeW1faW5kZXggPCAoaW50KXRvdGFsX3N5bXM7ICsrc3ltX2luZGV4KQorCQkJeworCQkJCXVpbnQzMl90IHJldl9jb2RlID0gMCwgbCwgY3VyX2NvZGUsIGNvZGVfc2l6ZSA9IHBDb2RlX3NpemVzW3N5bV9pbmRleF07CisJCQkJaWYgKCFjb2RlX3NpemUpCisJCQkJCWNvbnRpbnVlOworCisJCQkJY3VyX2NvZGUgPSBuZXh0X2NvZGVbY29kZV9zaXplXSsrOworCisJCQkJZm9yIChsID0gY29kZV9zaXplOyBsID4gMDsgbC0tLCBjdXJfY29kZSA+Pj0gMSkKKwkJCQkJcmV2X2NvZGUgPSAocmV2X2NvZGUgPDwgMSkgfCAoY3VyX2NvZGUgJiAxKTsKKworCQkJCWlmIChjb2RlX3NpemUgPD0gZmFzdF9sb29rdXBfYml0cykKKwkJCQl7CisJCQkJCXVpbnQzMl90IGsgPSAoY29kZV9zaXplIDw8IDE2KSB8IHN5bV9pbmRleDsKKwkJCQkJd2hpbGUgKHJldl9jb2RlIDwgaHVmZm1hbl9mYXN0X2xvb2t1cF9zaXplKQorCQkJCQl7CisJCQkJCQlpZiAobV9sb29rdXBbcmV2X2NvZGVdICE9IDApCisJCQkJCQl7CisJCQkJCQkJLy8gU3VwcGxpZWQgY29kZXNpemVzIGNhbid0IGNyZWF0ZSBhIHZhbGlkIHByZWZpeCBjb2RlLgorCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0KKworCQkJCQkJbV9sb29rdXBbcmV2X2NvZGVdID0gazsKKwkJCQkJCXJldl9jb2RlICs9ICgxIDw8IGNvZGVfc2l6ZSk7CisJCQkJCX0KKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaW50IHRyZWVfY3VyOworCQkJCWlmICgwID09ICh0cmVlX2N1ciA9IG1fbG9va3VwW3Jldl9jb2RlICYgKGh1ZmZtYW5fZmFzdF9sb29rdXBfc2l6ZSAtIDEpXSkpCisJCQkJeworCQkJCQljb25zdCB1aW50MzJfdCBpZHggPSByZXZfY29kZSAmIChodWZmbWFuX2Zhc3RfbG9va3VwX3NpemUgLSAxKTsKKwkJCQkJaWYgKG1fbG9va3VwW2lkeF0gIT0gMCkKKwkJCQkJeworCQkJCQkJLy8gU3VwcGxpZWQgY29kZXNpemVzIGNhbid0IGNyZWF0ZSBhIHZhbGlkIHByZWZpeCBjb2RlLgorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisKKwkJCQkJbV9sb29rdXBbaWR4XSA9IHRyZWVfbmV4dDsKKwkJCQkJdHJlZV9jdXIgPSB0cmVlX25leHQ7CisJCQkJCXRyZWVfbmV4dCAtPSAyOworCQkJCX0KKworCQkJCWlmICh0cmVlX2N1ciA+PSAwKQorCQkJCXsKKwkJCQkJLy8gU3VwcGxpZWQgY29kZXNpemVzIGNhbid0IGNyZWF0ZSBhIHZhbGlkIHByZWZpeCBjb2RlLgorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQkJcmV2X2NvZGUgPj49IChmYXN0X2xvb2t1cF9iaXRzIC0gMSk7CisKKwkJCQlmb3IgKGludCBqID0gY29kZV9zaXplOyBqID4gKChpbnQpZmFzdF9sb29rdXBfYml0cyArIDEpOyBqLS0pCisJCQkJeworCQkJCQl0cmVlX2N1ciAtPSAoKHJldl9jb2RlID4+PSAxKSAmIDEpOworCisJCQkJCWNvbnN0IGludCBpZHggPSAtdHJlZV9jdXIgLSAxOworCQkJCQlpZiAoaWR4IDwgMCkKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJZWxzZSBpZiAoaWR4ID49IChpbnQpbV90cmVlLnNpemUoKSkKKwkJCQkJCW1fdHJlZS5yZXNpemUoaWR4ICsgMSk7CisJCQkJCQkJCQkJCisJCQkJCWlmICghbV90cmVlW2lkeF0pCisJCQkJCXsKKwkJCQkJCW1fdHJlZVtpZHhdID0gKGludDE2X3QpdHJlZV9uZXh0OworCQkJCQkJdHJlZV9jdXIgPSB0cmVlX25leHQ7CisJCQkJCQl0cmVlX25leHQgLT0gMjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXRyZWVfY3VyID0gbV90cmVlW2lkeF07CisJCQkJCQlpZiAodHJlZV9jdXIgPj0gMCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBTdXBwbGllZCBjb2Rlc2l6ZXMgY2FuJ3QgY3JlYXRlIGEgdmFsaWQgcHJlZml4IGNvZGUuCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJdHJlZV9jdXIgLT0gKChyZXZfY29kZSA+Pj0gMSkgJiAxKTsKKworCQkJCWNvbnN0IGludCBpZHggPSAtdHJlZV9jdXIgLSAxOworCQkJCWlmIChpZHggPCAwKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJZWxzZSBpZiAoaWR4ID49IChpbnQpbV90cmVlLnNpemUoKSkKKwkJCQkJbV90cmVlLnJlc2l6ZShpZHggKyAxKTsKKworCQkJCWlmIChtX3RyZWVbaWR4XSAhPSAwKQorCQkJCXsKKwkJCQkJLy8gU3VwcGxpZWQgY29kZXNpemVzIGNhbid0IGNyZWF0ZSBhIHZhbGlkIHByZWZpeCBjb2RlLgorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQkJbV90cmVlW2lkeF0gPSAoaW50MTZfdClzeW1faW5kZXg7CisJCQl9CisKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJY29uc3QgYmFzaXN1Ojp1aW50OF92ZWMgJmdldF9jb2RlX3NpemVzKCkgY29uc3QgeyByZXR1cm4gbV9jb2RlX3NpemVzOyB9CisJCWNvbnN0IGJhc2lzdTo6aW50X3ZlYyBnZXRfbG9va3VwKCkgY29uc3QgeyByZXR1cm4gbV9sb29rdXA7IH0KKwkJY29uc3QgYmFzaXN1OjppbnQxNl92ZWMgZ2V0X3RyZWUoKSBjb25zdCB7IHJldHVybiBtX3RyZWU7IH0KKworCQlib29sIGlzX3ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9jb2RlX3NpemVzLnNpemUoKSA+IDA7IH0KKworCXByaXZhdGU6CisJCWJhc2lzdTo6dWludDhfdmVjIG1fY29kZV9zaXplczsKKwkJYmFzaXN1OjppbnRfdmVjIG1fbG9va3VwOworCQliYXNpc3U6OmludDE2X3ZlYyBtX3RyZWU7CisJfTsKKworCWNsYXNzIGJpdHdpc2VfZGVjb2RlcgorCXsKKwlwdWJsaWM6CisJCWJpdHdpc2VfZGVjb2RlcigpIDoKKwkJCW1fYnVmX3NpemUoMCksCisJCQltX3BCdWYobnVsbHB0ciksCisJCQltX3BCdWZfc3RhcnQobnVsbHB0ciksCisJCQltX3BCdWZfZW5kKG51bGxwdHIpLAorCQkJbV9iaXRfYnVmKDApLAorCQkJbV9iaXRfYnVmX3NpemUoMCkKKwkJeworCQl9CisKKwkJdm9pZCBjbGVhcigpCisJCXsKKwkJCW1fYnVmX3NpemUgPSAwOworCQkJbV9wQnVmID0gbnVsbHB0cjsKKwkJCW1fcEJ1Zl9zdGFydCA9IG51bGxwdHI7CisJCQltX3BCdWZfZW5kID0gbnVsbHB0cjsKKwkJCW1fYml0X2J1ZiA9IDA7CisJCQltX2JpdF9idWZfc2l6ZSA9IDA7CisJCX0KKworCQlib29sIGluaXQoY29uc3QgdWludDhfdCAqcEJ1ZiwgdWludDMyX3QgYnVmX3NpemUpCisJCXsKKwkJCWlmICgoIXBCdWYpICYmIChidWZfc2l6ZSkpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQltX2J1Zl9zaXplID0gYnVmX3NpemU7CisJCQltX3BCdWYgPSBwQnVmOworCQkJbV9wQnVmX3N0YXJ0ID0gcEJ1ZjsKKwkJCW1fcEJ1Zl9lbmQgPSBwQnVmICsgYnVmX3NpemU7CisJCQltX2JpdF9idWYgPSAwOworCQkJbV9iaXRfYnVmX3NpemUgPSAwOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQl2b2lkIHN0b3AoKQorCQl7CisJCX0KKworCQlpbmxpbmUgdWludDMyX3QgcGVla19iaXRzKHVpbnQzMl90IG51bV9iaXRzKQorCQl7CisJCQlpZiAoIW51bV9iaXRzKQorCQkJCXJldHVybiAwOworCisJCQlhc3NlcnQobnVtX2JpdHMgPD0gMjUpOworCisJCQl3aGlsZSAobV9iaXRfYnVmX3NpemUgPCBudW1fYml0cykKKwkJCXsKKwkJCQl1aW50MzJfdCBjID0gMDsKKwkJCQlpZiAobV9wQnVmIDwgbV9wQnVmX2VuZCkKKwkJCQkJYyA9ICptX3BCdWYrKzsKKworCQkJCW1fYml0X2J1ZiB8PSAoYyA8PCBtX2JpdF9idWZfc2l6ZSk7CisJCQkJbV9iaXRfYnVmX3NpemUgKz0gODsKKwkJCQlhc3NlcnQobV9iaXRfYnVmX3NpemUgPD0gMzIpOworCQkJfQorCisJCQlyZXR1cm4gbV9iaXRfYnVmICYgKCgxIDw8IG51bV9iaXRzKSAtIDEpOworCQl9CisKKwkJdm9pZCByZW1vdmVfYml0cyh1aW50MzJfdCBudW1fYml0cykKKwkJeworCQkJYXNzZXJ0KG1fYml0X2J1Zl9zaXplID49IG51bV9iaXRzKTsKKworCQkJbV9iaXRfYnVmID4+PSBudW1fYml0czsKKwkJCW1fYml0X2J1Zl9zaXplIC09IG51bV9iaXRzOworCQl9CisKKwkJdWludDMyX3QgZ2V0X2JpdHModWludDMyX3QgbnVtX2JpdHMpCisJCXsKKwkJCWlmIChudW1fYml0cyA+IDI1KQorCQkJeworCQkJCWFzc2VydChudW1fYml0cyA8PSAzMik7CisKKwkJCQljb25zdCB1aW50MzJfdCBiaXRzMCA9IHBlZWtfYml0cygyNSk7CisJCQkJbV9iaXRfYnVmID4+PSAyNTsKKwkJCQltX2JpdF9idWZfc2l6ZSAtPSAyNTsKKwkJCQludW1fYml0cyAtPSAyNTsKKworCQkJCWNvbnN0IHVpbnQzMl90IGJpdHMgPSBwZWVrX2JpdHMobnVtX2JpdHMpOworCQkJCW1fYml0X2J1ZiA+Pj0gbnVtX2JpdHM7CisJCQkJbV9iaXRfYnVmX3NpemUgLT0gbnVtX2JpdHM7CisKKwkJCQlyZXR1cm4gYml0czAgfCAoYml0cyA8PCAyNSk7CisJCQl9CisKKwkJCWNvbnN0IHVpbnQzMl90IGJpdHMgPSBwZWVrX2JpdHMobnVtX2JpdHMpOworCisJCQltX2JpdF9idWYgPj49IG51bV9iaXRzOworCQkJbV9iaXRfYnVmX3NpemUgLT0gbnVtX2JpdHM7CisKKwkJCXJldHVybiBiaXRzOworCQl9CisKKwkJdWludDMyX3QgZGVjb2RlX3RydW5jYXRlZF9iaW5hcnkodWludDMyX3QgbikKKwkJeworCQkJYXNzZXJ0KG4gPj0gMik7CisKKwkJCWNvbnN0IHVpbnQzMl90IGsgPSBiYXNpc3U6OmZsb29yX2xvZzJpKG4pOworCQkJY29uc3QgdWludDMyX3QgdSA9ICgxIDw8IChrICsgMSkpIC0gbjsKKworCQkJdWludDMyX3QgcmVzdWx0ID0gZ2V0X2JpdHMoayk7CisKKwkJCWlmIChyZXN1bHQgPj0gdSkKKwkJCQlyZXN1bHQgPSAoKHJlc3VsdCA8PCAxKSB8IGdldF9iaXRzKDEpKSAtIHU7CisKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQl1aW50MzJfdCBkZWNvZGVfcmljZSh1aW50MzJfdCBtKQorCQl7CisJCQlhc3NlcnQobSk7CisKKwkJCXVpbnQzMl90IHEgPSAwOworCQkJZm9yICg7OykKKwkJCXsKKwkJCQl1aW50MzJfdCBrID0gcGVla19iaXRzKDE2KTsKKwkJCQkKKwkJCQl1aW50MzJfdCBsID0gMDsKKwkJCQl3aGlsZSAoayAmIDEpCisJCQkJeworCQkJCQlsKys7CisJCQkJCWsgPj49IDE7CisJCQkJfQorCQkJCQorCQkJCXEgKz0gbDsKKworCQkJCXJlbW92ZV9iaXRzKGwpOworCisJCQkJaWYgKGwgPCAxNikKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJldHVybiAocSA8PCBtKSArIChnZXRfYml0cyhtICsgMSkgPj4gMSk7CisJCX0KKworCQlpbmxpbmUgdWludDMyX3QgZGVjb2RlX3ZsYyh1aW50MzJfdCBjaHVua19iaXRzKQorCQl7CisJCQlhc3NlcnQoY2h1bmtfYml0cyk7CisKKwkJCWNvbnN0IHVpbnQzMl90IGNodW5rX3NpemUgPSAxIDw8IGNodW5rX2JpdHM7CisJCQljb25zdCB1aW50MzJfdCBjaHVua19tYXNrID0gY2h1bmtfc2l6ZSAtIDE7CisJCQkJCQorCQkJdWludDMyX3QgdiA9IDA7CisJCQl1aW50MzJfdCBvZnMgPSAwOworCisJCQlmb3IgKCA7IDsgKQorCQkJeworCQkJCXVpbnQzMl90IHMgPSBnZXRfYml0cyhjaHVua19iaXRzICsgMSk7CisJCQkJdiB8PSAoKHMgJiBjaHVua19tYXNrKSA8PCBvZnMpOworCQkJCW9mcyArPSBjaHVua19iaXRzOworCisJCQkJaWYgKChzICYgY2h1bmtfc2l6ZSkgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJaWYgKG9mcyA+PSAzMikKKwkJCQl7CisJCQkJCWFzc2VydCgwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gdjsKKwkJfQorCisJCWlubGluZSB1aW50MzJfdCBkZWNvZGVfaHVmZm1hbihjb25zdCBodWZmbWFuX2RlY29kaW5nX3RhYmxlICZjdCwgaW50IGZhc3RfbG9va3VwX2JpdHMgPSBiYXNpc3U6OmNIdWZmbWFuRmFzdExvb2t1cEJpdHMpCisJCXsKKwkJCWFzc2VydChjdC5tX2NvZGVfc2l6ZXMuc2l6ZSgpKTsKKworCQkJY29uc3QgdWludDMyX3QgaHVmZm1hbl9mYXN0X2xvb2t1cF9zaXplID0gMSA8PCBmYXN0X2xvb2t1cF9iaXRzOworCQkJCQkJCisJCQl3aGlsZSAobV9iaXRfYnVmX3NpemUgPCAxNikKKwkJCXsKKwkJCQl1aW50MzJfdCBjID0gMDsKKwkJCQlpZiAobV9wQnVmIDwgbV9wQnVmX2VuZCkKKwkJCQkJYyA9ICptX3BCdWYrKzsKKworCQkJCW1fYml0X2J1ZiB8PSAoYyA8PCBtX2JpdF9idWZfc2l6ZSk7CisJCQkJbV9iaXRfYnVmX3NpemUgKz0gODsKKwkJCQlhc3NlcnQobV9iaXRfYnVmX3NpemUgPD0gMzIpOworCQkJfQorCQkJCQkJCisJCQlpbnQgY29kZV9sZW47CisKKwkJCWludCBzeW07CisJCQlpZiAoKHN5bSA9IGN0Lm1fbG9va3VwW21fYml0X2J1ZiAmIChodWZmbWFuX2Zhc3RfbG9va3VwX3NpemUgLSAxKV0pID49IDApCisJCQl7CisJCQkJY29kZV9sZW4gPSBzeW0gPj4gMTY7CisJCQkJc3ltICY9IDB4RkZGRjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljb2RlX2xlbiA9IGZhc3RfbG9va3VwX2JpdHM7CisJCQkJZG8KKwkJCQl7CisJCQkJCXN5bSA9IGN0Lm1fdHJlZVt+c3ltICsgKChtX2JpdF9idWYgPj4gY29kZV9sZW4rKykgJiAxKV07IC8vIH5zeW0gPSAtc3ltIC0gMQorCQkJCX0gd2hpbGUgKHN5bSA8IDApOworCQkJfQorCisJCQltX2JpdF9idWYgPj49IGNvZGVfbGVuOworCQkJbV9iaXRfYnVmX3NpemUgLT0gY29kZV9sZW47CisKKwkJCXJldHVybiBzeW07CisJCX0KKworCQlib29sIHJlYWRfaHVmZm1hbl90YWJsZShodWZmbWFuX2RlY29kaW5nX3RhYmxlICZjdCkKKwkJeworCQkJY3QuY2xlYXIoKTsKKworCQkJY29uc3QgdWludDMyX3QgdG90YWxfdXNlZF9zeW1zID0gZ2V0X2JpdHMoYmFzaXN1OjpjSHVmZm1hbk1heFN5bXNMb2cyKTsKKworCQkJaWYgKCF0b3RhbF91c2VkX3N5bXMpCisJCQkJcmV0dXJuIHRydWU7CisJCQlpZiAodG90YWxfdXNlZF9zeW1zID4gYmFzaXN1OjpjSHVmZm1hbk1heFN5bXMpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQl1aW50OF90IGNvZGVfbGVuZ3RoX2NvZGVfc2l6ZXNbYmFzaXN1OjpjSHVmZm1hblRvdGFsQ29kZWxlbmd0aENvZGVzXTsKKwkJCWJhc2lzdTo6Y2xlYXJfb2JqKGNvZGVfbGVuZ3RoX2NvZGVfc2l6ZXMpOworCisJCQljb25zdCB1aW50MzJfdCBudW1fY29kZWxlbmd0aF9jb2RlcyA9IGdldF9iaXRzKDUpOworCQkJaWYgKChudW1fY29kZWxlbmd0aF9jb2RlcyA8IDEpIHx8IChudW1fY29kZWxlbmd0aF9jb2RlcyA+IGJhc2lzdTo6Y0h1ZmZtYW5Ub3RhbENvZGVsZW5ndGhDb2RlcykpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX2NvZGVsZW5ndGhfY29kZXM7IGkrKykKKwkJCQljb2RlX2xlbmd0aF9jb2RlX3NpemVzW2Jhc2lzdTo6Z19odWZmbWFuX3NvcnRlZF9jb2RlbGVuZ3RoX2NvZGVzW2ldXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGdldF9iaXRzKDMpKTsKKworCQkJaHVmZm1hbl9kZWNvZGluZ190YWJsZSBjb2RlX2xlbmd0aF90YWJsZTsKKwkJCWlmICghY29kZV9sZW5ndGhfdGFibGUuaW5pdChiYXNpc3U6OmNIdWZmbWFuVG90YWxDb2RlbGVuZ3RoQ29kZXMsIGNvZGVfbGVuZ3RoX2NvZGVfc2l6ZXMpKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJaWYgKCFjb2RlX2xlbmd0aF90YWJsZS5pc192YWxpZCgpKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJYmFzaXN1Ojp1aW50OF92ZWMgY29kZV9zaXplcyh0b3RhbF91c2VkX3N5bXMpOworCisJCQl1aW50MzJfdCBjdXIgPSAwOworCQkJd2hpbGUgKGN1ciA8IHRvdGFsX3VzZWRfc3ltcykKKwkJCXsKKwkJCQlpbnQgYyA9IGRlY29kZV9odWZmbWFuKGNvZGVfbGVuZ3RoX3RhYmxlKTsKKworCQkJCWlmIChjIDw9IDE2KQorCQkJCQljb2RlX3NpemVzW2N1cisrXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGMpOworCQkJCWVsc2UgaWYgKGMgPT0gYmFzaXN1OjpjSHVmZm1hblNtYWxsWmVyb1J1bkNvZGUpCisJCQkJCWN1ciArPSBnZXRfYml0cyhiYXNpc3U6OmNIdWZmbWFuU21hbGxaZXJvUnVuRXh0cmFCaXRzKSArIGJhc2lzdTo6Y0h1ZmZtYW5TbWFsbFplcm9SdW5TaXplTWluOworCQkJCWVsc2UgaWYgKGMgPT0gYmFzaXN1OjpjSHVmZm1hbkJpZ1plcm9SdW5Db2RlKQorCQkJCQljdXIgKz0gZ2V0X2JpdHMoYmFzaXN1OjpjSHVmZm1hbkJpZ1plcm9SdW5FeHRyYUJpdHMpICsgYmFzaXN1OjpjSHVmZm1hbkJpZ1plcm9SdW5TaXplTWluOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmICghY3VyKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCisJCQkJCXVpbnQzMl90IGw7CisJCQkJCWlmIChjID09IGJhc2lzdTo6Y0h1ZmZtYW5TbWFsbFJlcGVhdENvZGUpCisJCQkJCQlsID0gZ2V0X2JpdHMoYmFzaXN1OjpjSHVmZm1hblNtYWxsUmVwZWF0RXh0cmFCaXRzKSArIGJhc2lzdTo6Y0h1ZmZtYW5TbWFsbFJlcGVhdFNpemVNaW47CisJCQkJCWVsc2UKKwkJCQkJCWwgPSBnZXRfYml0cyhiYXNpc3U6OmNIdWZmbWFuQmlnUmVwZWF0RXh0cmFCaXRzKSArIGJhc2lzdTo6Y0h1ZmZtYW5CaWdSZXBlYXRTaXplTWluOworCisJCQkJCWNvbnN0IHVpbnQ4X3QgcHJldiA9IGNvZGVfc2l6ZXNbY3VyIC0gMV07CisJCQkJCWlmIChwcmV2ID09IDApCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCWRvCisJCQkJCXsKKwkJCQkJCWlmIChjdXIgPj0gdG90YWxfdXNlZF9zeW1zKQorCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCWNvZGVfc2l6ZXNbY3VyKytdID0gcHJldjsKKwkJCQkJfSB3aGlsZSAoLS1sID4gMCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY3VyICE9IHRvdGFsX3VzZWRfc3ltcykKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCXJldHVybiBjdC5pbml0KHRvdGFsX3VzZWRfc3ltcywgJmNvZGVfc2l6ZXNbMF0pOworCQl9CisKKwlwcml2YXRlOgorCQl1aW50MzJfdCBtX2J1Zl9zaXplOworCQljb25zdCB1aW50OF90ICptX3BCdWY7CisJCWNvbnN0IHVpbnQ4X3QgKm1fcEJ1Zl9zdGFydDsKKwkJY29uc3QgdWludDhfdCAqbV9wQnVmX2VuZDsKKworCQl1aW50MzJfdCBtX2JpdF9idWY7CisJCXVpbnQzMl90IG1fYml0X2J1Zl9zaXplOworCX07CisKKwlpbmxpbmUgdWludDMyX3QgYmFzaXNkX3JhbmQodWludDMyX3Qgc2VlZCkKKwl7CisJCWlmICghc2VlZCkKKwkJCXNlZWQrKzsKKwkJdWludDMyX3QgeiA9IHNlZWQ7CisJCUJBU0lTRF96bmV3OworCQlyZXR1cm4gejsKKwl9CisKKwkvLyBSZXR1cm5zIHJhbmRvbSBudW1iZXIgaW4gWzAsbGltaXQpLiBNYXggbGltaXQgaXMgMHhGRkZGLgorCWlubGluZSB1aW50MzJfdCBiYXNpc2RfdXJhbmQodWludDMyX3QmIHNlZWQsIHVpbnQzMl90IGxpbWl0KQorCXsKKwkJc2VlZCA9IGJhc2lzZF9yYW5kKHNlZWQpOworCQlyZXR1cm4gKCgoc2VlZCBeIChzZWVkID4+IDE2KSkgJiAweEZGRkYpICogbGltaXQpID4+IDE2OworCX0KKworCWNsYXNzIGFwcHJveF9tb3ZlX3RvX2Zyb250CisJeworCXB1YmxpYzoKKwkJYXBwcm94X21vdmVfdG9fZnJvbnQodWludDMyX3QgbikKKwkJeworCQkJaW5pdChuKTsKKwkJfQorCisJCXZvaWQgaW5pdCh1aW50MzJfdCBuKQorCQl7CisJCQltX3ZhbHVlcy5yZXNpemUobik7CisJCQltX3JvdmVyID0gbiAvIDI7CisJCX0KKworCQljb25zdCBiYXNpc3U6OmludF92ZWMmIGdldF92YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorCQliYXNpc3U6OmludF92ZWMmIGdldF92YWx1ZXMoKSB7IHJldHVybiBtX3ZhbHVlczsgfQorCisJCXVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpbV92YWx1ZXMuc2l6ZSgpOyB9CisKKwkJY29uc3QgaW50JiBvcGVyYXRvcltdICh1aW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisJCWludCBvcGVyYXRvcltdICh1aW50MzJfdCBpbmRleCkgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CisKKwkJdm9pZCBhZGQoaW50IG5ld192YWx1ZSkKKwkJeworCQkJbV92YWx1ZXNbbV9yb3ZlcisrXSA9IG5ld192YWx1ZTsKKwkJCWlmIChtX3JvdmVyID09IG1fdmFsdWVzLnNpemUoKSkKKwkJCQltX3JvdmVyID0gKHVpbnQzMl90KW1fdmFsdWVzLnNpemUoKSAvIDI7CisJCX0KKworCQl2b2lkIHVzZSh1aW50MzJfdCBpbmRleCkKKwkJeworCQkJaWYgKGluZGV4KQorCQkJeworCQkJCS8vc3RkOjpzd2FwKG1fdmFsdWVzW2luZGV4IC8gMl0sIG1fdmFsdWVzW2luZGV4XSk7CisJCQkJaW50IHggPSBtX3ZhbHVlc1tpbmRleCAvIDJdOworCQkJCWludCB5ID0gbV92YWx1ZXNbaW5kZXhdOworCQkJCW1fdmFsdWVzW2luZGV4IC8gMl0gPSB5OworCQkJCW1fdmFsdWVzW2luZGV4XSA9IHg7CisJCQl9CisJCX0KKworCQkvLyByZXR1cm5zIC0xIGlmIG5vdCBmb3VuZAorCQlpbnQgZmluZChpbnQgdmFsdWUpIGNvbnN0CisJCXsKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3ZhbHVlcy5zaXplKCk7IGkrKykKKwkJCQlpZiAobV92YWx1ZXNbaV0gPT0gdmFsdWUpCisJCQkJCXJldHVybiBpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJdm9pZCByZXNldCgpCisJCXsKKwkJCWNvbnN0IHVpbnQzMl90IG4gPSAodWludDMyX3QpbV92YWx1ZXMuc2l6ZSgpOworCisJCQltX3ZhbHVlcy5jbGVhcigpOworCisJCQlpbml0KG4pOworCQl9CisKKwlwcml2YXRlOgorCQliYXNpc3U6OmludF92ZWMgbV92YWx1ZXM7CisJCXVpbnQzMl90IG1fcm92ZXI7CisJfTsKKworCXN0cnVjdCBkZWNvZGVyX2V0Y19ibG9jazsKKwkKKwlpbmxpbmUgdWludDhfdCBjbGFtcDI1NShpbnQzMl90IGkpCisJeworCQlyZXR1cm4gKHVpbnQ4X3QpKChpICYgMHhGRkZGRkYwMFUpID8gKH4oaSA+PiAzMSkpIDogaSk7CisJfQorCisJZW51bSBlTm9DbGFtcAorCXsKKwkJY05vQ2xhbXAgPSAwCisJfTsKKworCXN0cnVjdCBjb2xvcjMyCisJeworCQl1bmlvbgorCQl7CisJCQlzdHJ1Y3QKKwkJCXsKKwkJCQl1aW50OF90IHI7CisJCQkJdWludDhfdCBnOworCQkJCXVpbnQ4X3QgYjsKKwkJCQl1aW50OF90IGE7CisJCQl9OworCisJCQl1aW50OF90IGNbNF07CisJCQkKKwkJCXVpbnQzMl90IG07CisJCX07CisKKwkJY29sb3IzMigpIHsgfQorCisJCWNvbG9yMzIodWludDMyX3QgdnIsIHVpbnQzMl90IHZnLCB1aW50MzJfdCB2YiwgdWludDMyX3QgdmEpIHsgc2V0KHZyLCB2ZywgdmIsIHZhKTsgfQorCQljb2xvcjMyKGVOb0NsYW1wIHVudXNlZCwgdWludDMyX3QgdnIsIHVpbnQzMl90IHZnLCB1aW50MzJfdCB2YiwgdWludDMyX3QgdmEpIHsgKHZvaWQpdW51c2VkOyBzZXRfbm9jbGFtcF9yZ2JhKHZyLCB2ZywgdmIsIHZhKTsgfQorCisJCXZvaWQgc2V0KHVpbnQzMl90IHZyLCB1aW50MzJfdCB2ZywgdWludDMyX3QgdmIsIHVpbnQzMl90IHZhKSB7IGNbMF0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2cik7IGNbMV0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2Zyk7IGNbMl0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2Yik7IGNbM10gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2YSk7IH0KKworCQl2b2lkIHNldF9ub2NsYW1wX3JnYih1aW50MzJfdCB2ciwgdWludDMyX3QgdmcsIHVpbnQzMl90IHZiKSB7IGNbMF0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2cik7IGNbMV0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2Zyk7IGNbMl0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2Yik7IH0KKwkJdm9pZCBzZXRfbm9jbGFtcF9yZ2JhKHVpbnQzMl90IHZyLCB1aW50MzJfdCB2ZywgdWludDMyX3QgdmIsIHVpbnQzMl90IHZhKSB7IHNldCh2ciwgdmcsIHZiLCB2YSk7IH0KKworCQl2b2lkIHNldF9jbGFtcGVkKGludCB2ciwgaW50IHZnLCBpbnQgdmIsIGludCB2YSkgeyBjWzBdID0gY2xhbXAyNTUodnIpOyBjWzFdID0gY2xhbXAyNTUodmcpOwljWzJdID0gY2xhbXAyNTUodmIpOyBjWzNdID0gY2xhbXAyNTUodmEpOyB9CisKKwkJdWludDhfdCBvcGVyYXRvcltdICh1aW50MzJfdCBpZHgpIGNvbnN0IHsgYXNzZXJ0KGlkeCA8IDQpOyByZXR1cm4gY1tpZHhdOyB9CisJCXVpbnQ4X3QgJm9wZXJhdG9yW10gKHVpbnQzMl90IGlkeCkgeyBhc3NlcnQoaWR4IDwgNCk7IHJldHVybiBjW2lkeF07IH0KKworCQlib29sIG9wZXJhdG9yPT0gKGNvbnN0IGNvbG9yMzImcmhzKSBjb25zdCB7IHJldHVybiBtID09IHJocy5tOyB9CisKKwkJc3RhdGljIGNvbG9yMzIgY29tcF9taW4oY29uc3QgY29sb3IzMiYgYSwgY29uc3QgY29sb3IzMiYgYikgeyByZXR1cm4gY29sb3IzMihjTm9DbGFtcCwgYmFzaXN1OjptaW5pbXVtKGFbMF0sIGJbMF0pLCBiYXNpc3U6Om1pbmltdW0oYVsxXSwgYlsxXSksIGJhc2lzdTo6bWluaW11bShhWzJdLCBiWzJdKSwgYmFzaXN1OjptaW5pbXVtKGFbM10sIGJbM10pKTsgfQorCQlzdGF0aWMgY29sb3IzMiBjb21wX21heChjb25zdCBjb2xvcjMyJiBhLCBjb25zdCBjb2xvcjMyJiBiKSB7IHJldHVybiBjb2xvcjMyKGNOb0NsYW1wLCBiYXNpc3U6Om1heGltdW0oYVswXSwgYlswXSksIGJhc2lzdTo6bWF4aW11bShhWzFdLCBiWzFdKSwgYmFzaXN1OjptYXhpbXVtKGFbMl0sIGJbMl0pLCBiYXNpc3U6Om1heGltdW0oYVszXSwgYlszXSkpOyB9CisJfTsKKworCXN0cnVjdCBlbmRwb2ludAorCXsKKwkJY29sb3IzMiBtX2NvbG9yNTsKKwkJdWludDhfdCBtX2ludGVuNTsKKwkJYm9vbCBvcGVyYXRvcj09IChjb25zdCBlbmRwb2ludCYgcmhzKSBjb25zdAorCQl7CisJCQlyZXR1cm4gKG1fY29sb3I1LnIgPT0gcmhzLm1fY29sb3I1LnIpICYmIChtX2NvbG9yNS5nID09IHJocy5tX2NvbG9yNS5nKSAmJiAobV9jb2xvcjUuYiA9PSByaHMubV9jb2xvcjUuYikgJiYgKG1faW50ZW41ID09IHJocy5tX2ludGVuNSk7CisJCX0KKwkJYm9vbCBvcGVyYXRvciE9IChjb25zdCBlbmRwb2ludCYgcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHJocyk7IH0KKwl9OworCisJc3RydWN0IHNlbGVjdG9yCisJeworCQkvLyBQbGFpbiBzZWxlY3RvcnMgKDItYml0cyBwZXIgdmFsdWUpCisJCXVpbnQ4X3QgbV9zZWxlY3RvcnNbNF07CisKKwkJLy8gRVRDMSBzZWxlY3RvcnMKKwkJdWludDhfdCBtX2J5dGVzWzRdOworCisJCXVpbnQ4X3QgbV9sb19zZWxlY3RvciwgbV9oaV9zZWxlY3RvcjsKKwkJdWludDhfdCBtX251bV91bmlxdWVfc2VsZWN0b3JzOworCQlib29sIG9wZXJhdG9yPT0gKGNvbnN0IHNlbGVjdG9yJiByaHMpIGNvbnN0CisJCXsKKwkJCXJldHVybiAobV9zZWxlY3RvcnNbMF0gPT0gcmhzLm1fc2VsZWN0b3JzWzBdKSAmJgorCQkJCShtX3NlbGVjdG9yc1sxXSA9PSByaHMubV9zZWxlY3RvcnNbMV0pICYmCisJCQkJKG1fc2VsZWN0b3JzWzJdID09IHJocy5tX3NlbGVjdG9yc1syXSkgJiYKKwkJCQkobV9zZWxlY3RvcnNbM10gPT0gcmhzLm1fc2VsZWN0b3JzWzNdKTsKKwkJfQorCQlib29sIG9wZXJhdG9yIT0gKGNvbnN0IHNlbGVjdG9yJiByaHMpIGNvbnN0CisJCXsKKwkJCXJldHVybiAhKCp0aGlzID09IHJocyk7CisJCX0KKworCQl2b2lkIGluaXRfZmxhZ3MoKQorCQl7CisJCQl1aW50MzJfdCBoaXN0WzRdID0geyAwLCAwLCAwLCAwIH07CisJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQorCQkJeworCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCisJCQkJeworCQkJCQl1aW50MzJfdCBzID0gZ2V0X3NlbGVjdG9yKHgsIHkpOworCQkJCQloaXN0W3NdKys7CisJCQkJfQorCQkJfQorCisJCQltX2xvX3NlbGVjdG9yID0gMzsKKwkJCW1faGlfc2VsZWN0b3IgPSAwOworCQkJbV9udW1fdW5pcXVlX3NlbGVjdG9ycyA9IDA7CisKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyBpKyspCisJCQl7CisJCQkJaWYgKGhpc3RbaV0pCisJCQkJeworCQkJCQltX251bV91bmlxdWVfc2VsZWN0b3JzKys7CisJCQkJCWlmIChpIDwgbV9sb19zZWxlY3RvcikgbV9sb19zZWxlY3RvciA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkpOworCQkJCQlpZiAoaSA+IG1faGlfc2VsZWN0b3IpIG1faGlfc2VsZWN0b3IgPSBzdGF0aWNfY2FzdDx1aW50OF90PihpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBSZXR1cm5lZCBzZWxlY3RvciB2YWx1ZSByYW5nZXMgZnJvbSAwLTMgYW5kIGlzIGEgZGlyZWN0IGluZGV4IGludG8gZ19ldGMxX2ludGVuX3RhYmxlcy4KKwkJaW5saW5lIHVpbnQzMl90IGdldF9zZWxlY3Rvcih1aW50MzJfdCB4LCB1aW50MzJfdCB5KSBjb25zdAorCQl7CisJCQlhc3NlcnQoKHggPCA0KSAmJiAoeSA8IDQpKTsKKwkJCXJldHVybiAobV9zZWxlY3RvcnNbeV0gPj4gKHggKiAyKSkgJiAzOworCQl9CisKKwkJdm9pZCBzZXRfc2VsZWN0b3IodWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgdmFsKQorCQl7CisJCQlzdGF0aWMgY29uc3QgdWludDhfdCBzX3NlbGVjdG9yX2luZGV4X3RvX2V0YzFbNF0gPSB7IDMsIDIsIDAsIDEgfTsKKworCQkJYXNzZXJ0KCh4IHwgeSB8IHZhbCkgPCA0KTsKKworCQkJbV9zZWxlY3RvcnNbeV0gJj0gfigzIDw8ICh4ICogMikpOworCQkJbV9zZWxlY3RvcnNbeV0gfD0gKHZhbCA8PCAoeCAqIDIpKTsKKworCQkJY29uc3QgdWludDMyX3QgZXRjMV9iaXRfaW5kZXggPSB4ICogNCArIHk7CisKKwkJCXVpbnQ4X3QgKnAgPSAmbV9ieXRlc1szIC0gKGV0YzFfYml0X2luZGV4ID4+IDMpXTsKKworCQkJY29uc3QgdWludDMyX3QgYnl0ZV9iaXRfb2ZzID0gZXRjMV9iaXRfaW5kZXggJiA3OworCQkJY29uc3QgdWludDMyX3QgbWFzayA9IDEgPDwgYnl0ZV9iaXRfb2ZzOworCisJCQljb25zdCB1aW50MzJfdCBldGMxX3ZhbCA9IHNfc2VsZWN0b3JfaW5kZXhfdG9fZXRjMVt2YWxdOworCisJCQljb25zdCB1aW50MzJfdCBsc2IgPSBldGMxX3ZhbCAmIDE7CisJCQljb25zdCB1aW50MzJfdCBtc2IgPSBldGMxX3ZhbCA+PiAxOworCisJCQlwWzBdICY9IH5tYXNrOworCQkJcFswXSB8PSAobHNiIDw8IGJ5dGVfYml0X29mcyk7CisKKwkJCXBbLTJdICY9IH5tYXNrOworCQkJcFstMl0gfD0gKG1zYiA8PCBieXRlX2JpdF9vZnMpOworCQl9CisJfTsKKworCWJvb2wgYmFzaXNfYmxvY2tfZm9ybWF0X2lzX3VuY29tcHJlc3NlZChibG9ja19mb3JtYXQgdGV4X3R5cGUpOworCQorfSAvLyBuYW1lc3BhY2UgYmFzaXN0CisKKworCisvKioqKiBlbmRlZCBpbmxpbmluZyBiYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oICoqKiovCisvKioqKiBzdGFydCBpbmxpbmluZyBiYXNpc3VfdHJhbnNjb2Rlcl91YXN0Yy5oICoqKiovCisvLyBiYXNpc3VfdHJhbnNjb2Rlcl91YXN0Yy5oCisvKioqKiBza2lwcGluZyBmaWxlOiBiYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oICoqKiovCisKK25hbWVzcGFjZSBiYXNpc3QKK3sKKwlzdHJ1Y3QgY29sb3JfcXVhZF91OAorCXsgCisJCXVpbnQ4X3QgbV9jWzRdOyAKKwl9OworCisJY29uc3QgdWludDMyX3QgVE9UQUxfVUFTVENfTU9ERVMgPSAxOTsKKwljb25zdCB1aW50MzJfdCBVQVNUQ19NT0RFX0lOREVYX1NPTElEX0NPTE9SID0gODsKKworCWNvbnN0IHVpbnQzMl90IFRPVEFMX0FTVENfQkM3X0NPTU1PTl9QQVJUSVRJT05TMiA9IDMwOworCWNvbnN0IHVpbnQzMl90IFRPVEFMX0FTVENfQkM3X0NPTU1PTl9QQVJUSVRJT05TMyA9IDExOworCWNvbnN0IHVpbnQzMl90IFRPVEFMX0JDN18zX0FTVEMyX0NPTU1PTl9QQVJUSVRJT05TID0gMTk7CisKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX3Vhc3RjX21vZGVfd2VpZ2h0X2JpdHNbVE9UQUxfVUFTVENfTU9ERVNdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfdWFzdGNfbW9kZV93ZWlnaHRfcmFuZ2VzW1RPVEFMX1VBU1RDX01PREVTXTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX3Vhc3RjX21vZGVfZW5kcG9pbnRfcmFuZ2VzW1RPVEFMX1VBU1RDX01PREVTXTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX3Vhc3RjX21vZGVfc3Vic2V0c1tUT1RBTF9VQVNUQ19NT0RFU107CisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX3BsYW5lc1tUT1RBTF9VQVNUQ19NT0RFU107CisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX2NvbXBzW1RPVEFMX1VBU1RDX01PREVTXTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX3Vhc3RjX21vZGVfaGFzX2V0YzFfYmlhc1tUT1RBTF9VQVNUQ19NT0RFU107CisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX2hhc19iYzFfaGludDBbVE9UQUxfVUFTVENfTU9ERVNdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfdWFzdGNfbW9kZV9oYXNfYmMxX2hpbnQxW1RPVEFMX1VBU1RDX01PREVTXTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX3Vhc3RjX21vZGVfaGFzX2FscGhhW1RPVEFMX1VBU1RDX01PREVTXTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX3Vhc3RjX21vZGVfaXNfbGFbVE9UQUxfVUFTVENfTU9ERVNdOworCisJc3RydWN0IGFzdGNfYmM3X2NvbW1vbl9wYXJ0aXRpb24yX2Rlc2MKKwl7CisJCXVpbnQ4X3QgbV9iYzc7CisJCXVpbnQxNl90IG1fYXN0YzsKKwkJYm9vbCBtX2ludmVydDsKKwl9OworCisJZXh0ZXJuIGNvbnN0IGFzdGNfYmM3X2NvbW1vbl9wYXJ0aXRpb24yX2Rlc2MgZ19hc3RjX2JjN19jb21tb25fcGFydGl0aW9uczJbVE9UQUxfQVNUQ19CQzdfQ09NTU9OX1BBUlRJVElPTlMyXTsKKworCXN0cnVjdCBiYzczX2FzdGMyX2NvbW1vbl9wYXJ0aXRpb25fZGVzYworCXsKKwkJdWludDhfdCBtX2JjNzM7CisJCXVpbnQxNl90IG1fYXN0YzI7CisJCXVpbnQ4X3QgazsJCS8vIDAtNSAtIGhvdyB0byBtb2RpZnkgdGhlIEJDNyAzLXN1YnNldCBwYXR0ZXJuIHRvIG1hdGNoIHRoZSBBU1RDIHBhdHRlcm4gKExTQj1pbnZlcnQpCisJfTsKKworCWV4dGVybiBjb25zdCBiYzczX2FzdGMyX2NvbW1vbl9wYXJ0aXRpb25fZGVzYyBnX2JjN18zX2FzdGMyX2NvbW1vbl9wYXJ0aXRpb25zW1RPVEFMX0JDN18zX0FTVEMyX0NPTU1PTl9QQVJUSVRJT05TXTsKKworCXN0cnVjdCBhc3RjX2JjN19jb21tb25fcGFydGl0aW9uM19kZXNjCisJeworCQl1aW50OF90IG1fYmM3OworCQl1aW50MTZfdCBtX2FzdGM7CisJCXVpbnQ4X3QgbV9hc3RjX3RvX2JjN19wZXJtOyAvLyBjb252ZXJ0cyBBU1RDIHRvIEJDNyBwYXJ0aXRpb24gdXNpbmcgZ19hc3RjX2JjN19wYXJ0aXRpb25faW5kZXhfcGVybV90YWJsZXNbXVtdCisJfTsKKworCWV4dGVybiBjb25zdCBhc3RjX2JjN19jb21tb25fcGFydGl0aW9uM19kZXNjIGdfYXN0Y19iYzdfY29tbW9uX3BhcnRpdGlvbnMzW1RPVEFMX0FTVENfQkM3X0NPTU1PTl9QQVJUSVRJT05TM107CisKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX2FzdGNfYmM3X3BhdHRlcm5zMltUT1RBTF9BU1RDX0JDN19DT01NT05fUEFSVElUSU9OUzJdWzE2XTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX2FzdGNfYmM3X3BhdHRlcm5zM1tUT1RBTF9BU1RDX0JDN19DT01NT05fUEFSVElUSU9OUzNdWzE2XTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN18zX2FzdGMyX3BhdHRlcm5zMltUT1RBTF9CQzdfM19BU1RDMl9DT01NT05fUEFSVElUSU9OU11bMTZdOworCisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19hc3RjX2JjN19wYXR0ZXJuMl9hbmNob3JzW1RPVEFMX0FTVENfQkM3X0NPTU1PTl9QQVJUSVRJT05TMl1bM107CisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19hc3RjX2JjN19wYXR0ZXJuM19hbmNob3JzW1RPVEFMX0FTVENfQkM3X0NPTU1PTl9QQVJUSVRJT05TM11bM107CisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzdfM19hc3RjMl9wYXR0ZXJuczJfYW5jaG9yc1tUT1RBTF9CQzdfM19BU1RDMl9DT01NT05fUEFSVElUSU9OU11bM107CisKKwlleHRlcm4gY29uc3QgdWludDMyX3QgZ191YXN0Y19tb2RlX2h1ZmZfY29kZXNbVE9UQUxfVUFTVENfTU9ERVMgKyAxXVsyXTsKKworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYXN0Y190b19iYzdfcGFydGl0aW9uX2luZGV4X3Blcm1fdGFibGVzWzZdWzNdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X3RvX2FzdGNfcGFydGl0aW9uX2luZGV4X3Blcm1fdGFibGVzWzZdWzNdOyAvLyBpbnZlcnNlIG9mIGdfYXN0Y190b19iYzdfcGFydGl0aW9uX2luZGV4X3Blcm1fdGFibGVzCisKKwlleHRlcm4gY29uc3QgdWludDhfdCogc191YXN0Y190b19iYzFfd2VpZ2h0c1s2XTsKKworCXVpbnQzMl90IGJjN19jb252ZXJ0X3BhcnRpdGlvbl9pbmRleF8zX3RvXzIodWludDMyX3QgcCwgdWludDMyX3Qgayk7CisKKwlpbmxpbmUgdWludDMyX3QgYXN0Y19pbnRlcnBvbGF0ZSh1aW50MzJfdCBsLCB1aW50MzJfdCBoLCB1aW50MzJfdCB3LCBib29sIHNyZ2IpCisJeworCQlpZiAoc3JnYikKKwkJeworCQkJbCA9IChsIDw8IDgpIHwgMHg4MDsKKwkJCWggPSAoaCA8PCA4KSB8IDB4ODA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsID0gKGwgPDwgOCkgfCBsOworCQkJaCA9IChoIDw8IDgpIHwgaDsKKwkJfQorCisJCXVpbnQzMl90IGsgPSAobCAqICg2NCAtIHcpICsgaCAqIHcgKyAzMikgPj4gNjsKKworCQlyZXR1cm4gayA+PiA4OworCX0KKworCXN0cnVjdCBhc3RjX2Jsb2NrX2Rlc2MKKwl7CisJCWludCBtX3dlaWdodF9yYW5nZTsJLy8gd2VpZ2h0IEJJU0UgcmFuZ2UKKworCQlpbnQgbV9zdWJzZXRzOwkJCS8vIG51bWJlciBvZiBBU1RDIHBhcnRpdGlvbnMKKwkJaW50IG1fcGFydGl0aW9uX3NlZWQ7CS8vIHBhcnRpdGlvbiBwYXR0ZXJuIHNlZWQKKwkJaW50IG1fY2VtOwkJCQkvLyBjb2xvciBlbmRwb2ludCBtb2RlIHVzZWQgYnkgYWxsIHN1YnNldHMKKworCQlpbnQgbV9jY3M7CQkJCS8vIGNvbG9yIGNvbXBvbmVudCBzZWxlY3RvciAoZHVhbCBwbGFuZSBvbmx5KQorCQlib29sIG1fZHVhbF9wbGFuZTsJLy8gdHJ1ZSBpZiBkdWFsIHBsYW5lCisKKwkJLy8gV2VpZ2h0IGFuZCBlbmRwb2ludCBCSVNFIHZhbHVlcy4gCisJCS8vIE5vdGUgdGhlc2UgdmFsdWVzIGFyZSBOT1QgbGluZWFyLCB0aGV5IG11c3QgYmUgQklTRSBlbmNvZGVkLiBTZWUgVGFibGUgOTcgYW5kIFRhYmxlIDEwNy4KKwkJdWludDhfdCBtX2VuZHBvaW50c1sxOF07CS8vIGVuZHBvaW50IHZhbHVlcywgaW4gUlIgR0cgQkIgZXRjLiBvcmRlciAKKwkJdWludDhfdCBtX3dlaWdodHNbNjRdOwkJLy8gd2VpZ2h0IGluZGV4IHZhbHVlcywgcmFzdGVyIG9yZGVyLCBpbiBQMCBQMSwgUDAgUDEsIGV0Yy4gb3IgUDAsIFAwLCBQMCwgUDAsIGV0Yy4gb3JkZXIKKwl9OworCisJY29uc3QgdWludDMyX3QgQkM3RU5DX1RPVEFMX0FTVENfUkFOR0VTID0gMjE7CisKKwkvLyBTZWUgdGFibGVzIDgxLCA5MywgMTguMTMuRW5kcG9pbnQgVW5xdWFudGl6YXRpb24KKwljb25zdCB1aW50MzJfdCBUT1RBTF9BU1RDX1JBTkdFUyA9IDIxOworCWV4dGVybiBjb25zdCBpbnQgZ19hc3RjX2Jpc2VfcmFuZ2VfdGFibGVbVE9UQUxfQVNUQ19SQU5HRVNdWzNdOworCisJc3RydWN0IGFzdGNfcXVhbnRfYmluCisJeworCQl1aW50OF90IG1fdW5xdWFudDsgLy8gdW5xdWFudGl6ZWQgdmFsdWUKKwkJdWludDhfdCBtX2luZGV4OyAvLyBzb3J0ZWQgaW5kZXgKKwl9OworCisJZXh0ZXJuIGFzdGNfcXVhbnRfYmluIGdfYXN0Y191bnF1YW50W0JDN0VOQ19UT1RBTF9BU1RDX1JBTkdFU11bMjU2XTsgLy8gW0FTVEMgZW5jb2RlZCBlbmRwb2ludCBpbmRleF0KKworCWludCBhc3RjX2dldF9sZXZlbHMoaW50IHJhbmdlKTsKKwlib29sIGFzdGNfaXNfdmFsaWRfZW5kcG9pbnRfcmFuZ2UodWludDMyX3QgcmFuZ2UpOworCXVpbnQzMl90IHVucXVhbnRfYXN0Y19lbmRwb2ludCh1aW50MzJfdCBwYWNrZWRfYml0cywgdWludDMyX3QgcGFja2VkX3RyaXRzLCB1aW50MzJfdCBwYWNrZWRfcXVpbnRzLCB1aW50MzJfdCByYW5nZSk7CisJdWludDMyX3QgdW5xdWFudF9hc3RjX2VuZHBvaW50X3ZhbCh1aW50MzJfdCBwYWNrZWRfdmFsLCB1aW50MzJfdCByYW5nZSk7CisKKwljb25zdCB1aW50OF90KiBnZXRfYW5jaG9yX2luZGljZXModWludDMyX3Qgc3Vic2V0cywgdWludDMyX3QgbW9kZSwgdWludDMyX3QgY29tbW9uX3BhdHRlcm4sIGNvbnN0IHVpbnQ4X3QqJiBwUGFydGl0aW9uX3BhdHRlcm4pOworCisJLy8gQkM3CisJY29uc3QgdWludDMyX3QgQkM3RU5DX0JMT0NLX1NJWkUgPSAxNjsKKworCXN0cnVjdCBiYzdfYmxvY2sKKwl7CisJCXVpbnQ2NF90IG1fcXdvcmRzWzJdOworCX07CisKKwlzdHJ1Y3QgYmM3X29wdGltaXphdGlvbl9yZXN1bHRzCisJeworCQl1aW50MzJfdCBtX21vZGU7CisJCXVpbnQzMl90IG1fcGFydGl0aW9uOworCQl1aW50OF90IG1fc2VsZWN0b3JzWzE2XTsKKwkJdWludDhfdCBtX2FscGhhX3NlbGVjdG9yc1sxNl07CisJCWNvbG9yX3F1YWRfdTggbV9sb3dbM107CisJCWNvbG9yX3F1YWRfdTggbV9oaWdoWzNdOworCQl1aW50MzJfdCBtX3BiaXRzWzNdWzJdOworCQl1aW50MzJfdCBtX2luZGV4X3NlbGVjdG9yOworCQl1aW50MzJfdCBtX3JvdGF0aW9uOworCX07CisKKwlleHRlcm4gY29uc3QgdWludDMyX3QgZ19iYzdfd2VpZ2h0czFbMl07CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGdfYmM3X3dlaWdodHMyWzRdOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBnX2JjN193ZWlnaHRzM1s4XTsKKwlleHRlcm4gY29uc3QgdWludDMyX3QgZ19iYzdfd2VpZ2h0czRbMTZdOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBnX2FzdGNfd2VpZ2h0czRbMTZdOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBnX2FzdGNfd2VpZ2h0czVbMzJdOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBnX2FzdGNfd2VpZ2h0c18zbGV2ZWxzWzNdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X3BhcnRpdGlvbjFbMTZdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X3BhcnRpdGlvbjJbNjQgKiAxNl07CisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzdfcGFydGl0aW9uM1s2NCAqIDE2XTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN190YWJsZV9hbmNob3JfaW5kZXhfc2Vjb25kX3N1YnNldFs2NF07CisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzdfdGFibGVfYW5jaG9yX2luZGV4X3RoaXJkX3N1YnNldF8xWzY0XTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN190YWJsZV9hbmNob3JfaW5kZXhfdGhpcmRfc3Vic2V0XzJbNjRdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X251bV9zdWJzZXRzWzhdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X3BhcnRpdGlvbl9iaXRzWzhdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X2NvbG9yX2luZGV4X2JpdGNvdW50WzhdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X21vZGVfaGFzX3BfYml0c1s4XTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19tb2RlX2hhc19zaGFyZWRfcF9iaXRzWzhdOworCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X2NvbG9yX3ByZWNpc2lvbl90YWJsZVs4XTsKKwlleHRlcm4gY29uc3QgaW50OF90IGdfYmM3X2FscGhhX3ByZWNpc2lvbl90YWJsZVs4XTsKKwlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19hbHBoYV9pbmRleF9iaXRjb3VudFs4XTsKKworCWlubGluZSBib29sIGdldF9iYzdfbW9kZV9oYXNfc2VwZXJhdGVfYWxwaGFfc2VsZWN0b3JzKGludCBtb2RlKSB7IHJldHVybiAobW9kZSA9PSA0KSB8fCAobW9kZSA9PSA1KTsgfQorCWlubGluZSBpbnQgZ2V0X2JjN19jb2xvcl9pbmRleF9zaXplKGludCBtb2RlLCBpbnQgaW5kZXhfc2VsZWN0aW9uX2JpdCkgeyByZXR1cm4gZ19iYzdfY29sb3JfaW5kZXhfYml0Y291bnRbbW9kZV0gKyBpbmRleF9zZWxlY3Rpb25fYml0OyB9CisJaW5saW5lIGludCBnZXRfYmM3X2FscGhhX2luZGV4X3NpemUoaW50IG1vZGUsIGludCBpbmRleF9zZWxlY3Rpb25fYml0KSB7IHJldHVybiBnX2JjN19hbHBoYV9pbmRleF9iaXRjb3VudFttb2RlXSAtIGluZGV4X3NlbGVjdGlvbl9iaXQ7IH0KKworCXN0cnVjdCBlbmRwb2ludF9lcnIKKwl7CisJCXVpbnQxNl90IG1fZXJyb3I7IHVpbnQ4X3QgbV9sbzsgdWludDhfdCBtX2hpOworCX07CisKKwlleHRlcm4gZW5kcG9pbnRfZXJyIGdfYmM3X21vZGVfNl9vcHRpbWFsX2VuZHBvaW50c1syNTZdWzJdOyAvLyBbY11bcGJpdF0KKwljb25zdCB1aW50MzJfdCBCQzdFTkNfTU9ERV82X09QVElNQUxfSU5ERVggPSA1OworCisJZXh0ZXJuIGVuZHBvaW50X2VyciBnX2JjN19tb2RlXzVfb3B0aW1hbF9lbmRwb2ludHNbMjU2XTsgLy8gW2NdCisJY29uc3QgdWludDMyX3QgQkM3RU5DX01PREVfNV9PUFRJTUFMX0lOREVYID0gMTsKKworCS8vIFBhY2tzIGEgQkM3IGJsb2NrIGZyb20gYSBoaWdoLWxldmVsIGRlc2NyaXB0aW9uLiBIYW5kbGVzIGFsbCBCQzcgbW9kZXMuCisJdm9pZCBlbmNvZGVfYmM3X2Jsb2NrKHZvaWQqIHBCbG9jaywgY29uc3QgYmM3X29wdGltaXphdGlvbl9yZXN1bHRzKiBwUmVzdWx0cyk7CisKKwkvLyBQYWNrcyBhbiBBU1RDIGJsb2NrCisJLy8gQ29uc3RyYWludHM6IEFsd2F5cyA0eDQsIGFsbCBzdWJzZXQgQ0VNJ3MgbXVzdCBiZSBlcXVhbCwgb25seSB0ZXN0ZWQgd2l0aCBMRFIgQ0VNJ3MuCisJYm9vbCBwYWNrX2FzdGNfYmxvY2sodWludDMyX3QqIHBEc3QsIGNvbnN0IGFzdGNfYmxvY2tfZGVzYyogcEJsb2NrLCB1aW50MzJfdCBtb2RlKTsKKworCXZvaWQgcGFja19hc3RjX3NvbGlkX2Jsb2NrKHZvaWQqIHBEc3RfYmxvY2ssIGNvbnN0IGNvbG9yMzImIGNvbG9yKTsKKworI2lmZGVmIF9ERUJVRworCWludCBhc3RjX2NvbXB1dGVfdGV4ZWxfcGFydGl0aW9uKGludCBzZWVkLCBpbnQgeCwgaW50IHksIGludCB6LCBpbnQgcGFydGl0aW9uY291bnQsIGJvb2wgc21hbGxfYmxvY2spOworI2VuZGlmCisJCQorCXN0cnVjdCB1YXN0Y19ibG9jaworCXsKKwkJdW5pb24KKwkJeworCQkJdWludDhfdCBtX2J5dGVzWzE2XTsKKwkJCXVpbnQzMl90IG1fZHdvcmRzWzRdOworCisjaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCisJCQl1aW50NjRfdCBtX3F3b3Jkc1syXTsKKyNlbmRpZgorCQl9OworCX07CisKKwlzdHJ1Y3QgdW5wYWNrZWRfdWFzdGNfYmxvY2sKKwl7CisJCWFzdGNfYmxvY2tfZGVzYyBtX2FzdGM7CisKKwkJdWludDMyX3QgbV9tb2RlOworCQl1aW50MzJfdCBtX2NvbW1vbl9wYXR0ZXJuOworCisJCWNvbG9yMzIgbV9zb2xpZF9jb2xvcjsKKworCQlib29sIG1fYmMxX2hpbnQwOworCQlib29sIG1fYmMxX2hpbnQxOworCisJCWJvb2wgbV9ldGMxX2ZsaXA7CisJCWJvb2wgbV9ldGMxX2RpZmY7CisJCXVpbnQzMl90IG1fZXRjMV9pbnRlbjA7CisJCXVpbnQzMl90IG1fZXRjMV9pbnRlbjE7CisKKwkJdWludDMyX3QgbV9ldGMxX2JpYXM7CisKKwkJdWludDMyX3QgbV9ldGMyX2hpbnRzOworCisJCXVpbnQzMl90IG1fZXRjMV9zZWxlY3RvcjsKKwkJdWludDMyX3QgbV9ldGMxX3IsIG1fZXRjMV9nLCBtX2V0YzFfYjsKKwl9OworCisJY29sb3IzMiBhcHBseV9ldGMxX2JpYXMoY29uc3QgY29sb3IzMiAmYmxvY2tfY29sb3IsIHVpbnQzMl90IGJpYXMsIHVpbnQzMl90IGxpbWl0LCB1aW50MzJfdCBzdWJibG9jayk7CisJCisJc3RydWN0IGRlY29kZXJfZXRjX2Jsb2NrOworCXN0cnVjdCBlYWNfYmxvY2s7CisJCQorCWJvb2wgdW5wYWNrX3Vhc3RjKHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IGNvbW1vbl9wYXR0ZXJuLCBjb25zdCBjb2xvcjMyJiBzb2xpZF9jb2xvciwgY29uc3QgYXN0Y19ibG9ja19kZXNjJiBhc3RjLCBjb2xvcjMyKiBwUGl4ZWxzLCBib29sIHNyZ2IpOworCWJvb2wgdW5wYWNrX3Vhc3RjKGNvbnN0IHVucGFja2VkX3Vhc3RjX2Jsb2NrJiB1bnBhY2tlZF9ibGssIGNvbG9yMzIqIHBQaXhlbHMsIGJvb2wgc3JnYik7CisKKwlib29sIHVucGFja191YXN0Yyhjb25zdCB1YXN0Y19ibG9jayYgYmxrLCBjb2xvcjMyKiBwUGl4ZWxzLCBib29sIHNyZ2IpOworCWJvb2wgdW5wYWNrX3Vhc3RjKGNvbnN0IHVhc3RjX2Jsb2NrJiBibGssIHVucGFja2VkX3Vhc3RjX2Jsb2NrJiB1bnBhY2tlZCwgYm9vbCB1bmRvX2JsdWVfY29udHJhY3QsIGJvb2wgcmVhZF9oaW50cyA9IHRydWUpOworCisJYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fYXN0Yyhjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCk7CisKKwlib29sIHRyYW5zY29kZV91YXN0Y190b19iYzcoY29uc3QgdW5wYWNrZWRfdWFzdGNfYmxvY2smIHVucGFja2VkX3NyY19ibGssIGJjN19vcHRpbWl6YXRpb25fcmVzdWx0cyYgZHN0X2Jsayk7CisJYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fYmM3KGNvbnN0IHVhc3RjX2Jsb2NrJiBzcmNfYmxrLCBiYzdfb3B0aW1pemF0aW9uX3Jlc3VsdHMmIGRzdF9ibGspOworCWJvb2wgdHJhbnNjb2RlX3Vhc3RjX3RvX2JjNyhjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCk7CisKKwl2b2lkIHRyYW5zY29kZV91YXN0Y190b19ldGMxKHVucGFja2VkX3Vhc3RjX2Jsb2NrJiB1bnBhY2tlZF9zcmNfYmxrLCBjb2xvcjMyIGJsb2NrX3BpeGVsc1s0XVs0XSwgdm9pZCogcERzdCk7CisJYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fZXRjMShjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCk7CisJYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fZXRjMShjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCwgdWludDMyX3QgY2hhbm5lbCk7CisKKwl2b2lkIHRyYW5zY29kZV91YXN0Y190b19ldGMyX2VhY19hOCh1bnBhY2tlZF91YXN0Y19ibG9jayYgdW5wYWNrZWRfc3JjX2JsaywgY29sb3IzMiBibG9ja19waXhlbHNbNF1bNF0sIHZvaWQqIHBEc3QpOworCWJvb2wgdHJhbnNjb2RlX3Vhc3RjX3RvX2V0YzJfcmdiYShjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCk7CisKKwkvLyBQYWNrcyAxNiBzY2FsYXIgdmFsdWVzIHRvIEJDNC4gU2FtZSBQU05SIGFzIHN0Yl9keHQncyBCQzQgZW5jb2RlciwgYXJvdW5kIDEzJSBmYXN0ZXIuCisJdm9pZCBlbmNvZGVfYmM0KHZvaWQqIHBEc3QsIGNvbnN0IHVpbnQ4X3QqIHBQaXhlbHMsIHVpbnQzMl90IHN0cmlkZSk7CisJCisJdm9pZCBlbmNvZGVfYmMxX3NvbGlkX2Jsb2NrKHZvaWQqIHBEc3QsIHVpbnQzMl90IGZyLCB1aW50MzJfdCBmZywgdWludDMyX3QgZmIpOworCisJZW51bQorCXsKKwkJY0VuY29kZUJDMUhpZ2hRdWFsaXR5ID0gMSwKKwkJY0VuY29kZUJDMUhpZ2hlclF1YWxpdHkgPSAyLAorCQljRW5jb2RlQkMxVXNlU2VsZWN0b3JzID0gNCwKKwl9OworCXZvaWQgZW5jb2RlX2JjMSh2b2lkKiBwRHN0LCBjb25zdCB1aW50OF90KiBwUGl4ZWxzLCB1aW50MzJfdCBmbGFncyk7CisJCisJLy8gQWx0ZXJuYXRlIFBDQS1mcmVlIGVuY29kZXIsIGFyb3VuZCAxNSUgZmFzdGVyLCBzYW1lIChvciBzbGlnaHRseSBoaWdoZXIpIGF2Zy4gUFNOUgorCXZvaWQgZW5jb2RlX2JjMV9hbHQodm9pZCogcERzdCwgY29uc3QgdWludDhfdCogcFBpeGVscywgdWludDMyX3QgZmxhZ3MpOworCisJdm9pZCB0cmFuc2NvZGVfdWFzdGNfdG9fYmMxX2hpbnQwKGNvbnN0IHVucGFja2VkX3Vhc3RjX2Jsb2NrJiB1bnBhY2tlZF9zcmNfYmxrLCB2b2lkKiBwRHN0KTsKKwl2b2lkIHRyYW5zY29kZV91YXN0Y190b19iYzFfaGludDEoY29uc3QgdW5wYWNrZWRfdWFzdGNfYmxvY2smIHVucGFja2VkX3NyY19ibGssIGNvbnN0IGNvbG9yMzIgYmxvY2tfcGl4ZWxzWzRdWzRdLCB2b2lkKiBwRHN0LCBib29sIGhpZ2hfcXVhbGl0eSk7CisKKwlib29sIHRyYW5zY29kZV91YXN0Y190b19iYzEoY29uc3QgdWFzdGNfYmxvY2smIHNyY19ibGssIHZvaWQqIHBEc3QsIGJvb2wgaGlnaF9xdWFsaXR5KTsKKwlib29sIHRyYW5zY29kZV91YXN0Y190b19iYzMoY29uc3QgdWFzdGNfYmxvY2smIHNyY19ibGssIHZvaWQqIHBEc3QsIGJvb2wgaGlnaF9xdWFsaXR5KTsKKwlib29sIHRyYW5zY29kZV91YXN0Y190b19iYzQoY29uc3QgdWFzdGNfYmxvY2smIHNyY19ibGssIHZvaWQqIHBEc3QsIGJvb2wgaGlnaF9xdWFsaXR5LCB1aW50MzJfdCBjaGFuMCk7CisJYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fYmM1KGNvbnN0IHVhc3RjX2Jsb2NrJiBzcmNfYmxrLCB2b2lkKiBwRHN0LCBib29sIGhpZ2hfcXVhbGl0eSwgdWludDMyX3QgY2hhbjAsIHVpbnQzMl90IGNoYW4xKTsKKworCWJvb2wgdHJhbnNjb2RlX3Vhc3RjX3RvX2V0YzJfZWFjX3IxMShjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCwgYm9vbCBoaWdoX3F1YWxpdHksIHVpbnQzMl90IGNoYW4wKTsKKwlib29sIHRyYW5zY29kZV91YXN0Y190b19ldGMyX2VhY19yZzExKGNvbnN0IHVhc3RjX2Jsb2NrJiBzcmNfYmxrLCB2b2lkKiBwRHN0LCBib29sIGhpZ2hfcXVhbGl0eSwgdWludDMyX3QgY2hhbjAsIHVpbnQzMl90IGNoYW4xKTsKKworCWJvb2wgdHJhbnNjb2RlX3Vhc3RjX3RvX3B2cnRjMV80X3JnYihjb25zdCB1YXN0Y19ibG9jayogcFNyY19ibG9ja3MsIHZvaWQqIHBEc3RfYmxvY2tzLCB1aW50MzJfdCBudW1fYmxvY2tzX3gsIHVpbnQzMl90IG51bV9ibG9ja3NfeSwgYm9vbCBoaWdoX3F1YWxpdHksIGJvb2wgZnJvbV9hbHBoYSk7CisJYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fcHZydGMxXzRfcmdiYShjb25zdCB1YXN0Y19ibG9jayogcFNyY19ibG9ja3MsIHZvaWQqIHBEc3RfYmxvY2tzLCB1aW50MzJfdCBudW1fYmxvY2tzX3gsIHVpbnQzMl90IG51bV9ibG9ja3NfeSwgYm9vbCBoaWdoX3F1YWxpdHkpOworCQkKKwkvLyB1YXN0Y19pbml0KCkgTVVTVCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIHRoaXMgbW9kdWxlLgorCXZvaWQgdWFzdGNfaW5pdCgpOworCit9IC8vIG5hbWVzcGFjZSBiYXNpc3QKKy8qKioqIGVuZGVkIGlubGluaW5nIGJhc2lzdV90cmFuc2NvZGVyX3Vhc3RjLmggKioqKi8KKy8qKioqIHN0YXJ0IGlubGluaW5nIGJhc2lzdV9maWxlX2hlYWRlcnMuaCAqKioqLworLy8gYmFzaXNfZmlsZV9oZWFkZXJzLmgKKy8vIENvcHlyaWdodCAoQykgMjAxOS0yMDIwIEJpbm9taWFsIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLyoqKiogc2tpcHBpbmcgZmlsZTogYmFzaXN1X3RyYW5zY29kZXJfaW50ZXJuYWwuaCAqKioqLworCituYW1lc3BhY2UgYmFzaXN0Cit7CisJLy8gU2xpY2UgZGVzYyBoZWFkZXIgZmxhZ3MKKwllbnVtIGJhc2lzX3NsaWNlX2Rlc2NfZmxhZ3MKKwl7CisJCWNTbGljZURlc2NGbGFnc0hhc0FscGhhID0gMSwKKwkJCisJCS8vIFZpZGVvIG9ubHk6IEZyYW1lIGRvZXNuJ3QgcmVmZXIgdG8gcHJldmlvdXMgZnJhbWUgKG5vIHVzYWdlIG9mIGNvbmRpdGlvbmFsIHJlcGxlbmlzaG1lbnQgcHJlZCBzeW1ib2xzKQorCQkvLyBDdXJyZW50bHkgdGhlIGZpcnN0IGZyYW1lIGlzIGFsd2F5cyBhbiBJLUZyYW1lLCBhbGwgc3Vic2VxdWVudCBmcmFtZXMgYXJlIFAtRnJhbWVzLiBUaGlzIHdpbGwgZXZlbnR1YWxseSBiZSBjaGFuZ2VkIHRvIHBlcmlvZGljIEktRnJhbWVzLgorCQljU2xpY2VEZXNjRmxhZ3NGcmFtZUlzSUZyYW1lID0gMgkJCQorCX07CisKKyNwcmFnbWEgcGFjayhwdXNoKQorI3ByYWdtYSBwYWNrKDEpCisJc3RydWN0IGJhc2lzX3NsaWNlX2Rlc2MKKwl7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mz4gbV9pbWFnZV9pbmRleDsgIC8vIFRoZSBpbmRleCBvZiB0aGUgc291cmNlIGltYWdlIHByb3ZpZGVkIHRvIHRoZSBlbmNvZGVyICh3aWxsIGFsd2F5cyBhcHBlYXIgaW4gb3JkZXIgZnJvbSBmaXJzdCB0byBsYXN0LCBmaXJzdCBpbWFnZSBpbmRleCBpcyAwLCBubyBza2lwcGluZyBhbGxvd2VkKQorCQliYXNpc3U6OnBhY2tlZF91aW50PDE+IG1fbGV2ZWxfaW5kZXg7CS8vIFRoZSBtaXBtYXAgbGV2ZWwgaW5kZXggKG1pcG1hcHMgd2lsbCBhbHdheXMgYXBwZWFyIGZyb20gbGFyZ2VzdCB0byBzbWFsbGVzdCkKKwkJYmFzaXN1OjpwYWNrZWRfdWludDwxPiBtX2ZsYWdzOwkJCS8vIGVudW0gYmFzaXNfc2xpY2VfZGVzY19mbGFncworCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gbV9vcmlnX3dpZHRoOwkvLyBUaGUgb3JpZ2luYWwgaW1hZ2Ugd2lkdGggKG1heSBub3QgYmUgYSBtdWx0aXBsZSBvZiA0IHBpeGVscykKKwkJYmFzaXN1OjpwYWNrZWRfdWludDwyPiBtX29yaWdfaGVpZ2h0OyAgLy8gVGhlIG9yaWdpbmFsIGltYWdlIGhlaWdodCAobWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIDQgcGl4ZWxzKQorCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gbV9udW1fYmxvY2tzX3g7CS8vIFRoZSBzbGljZSdzIGJsb2NrIFggZGltZW5zaW9ucy4gRWFjaCBibG9jayBpcyA0eDQgcGl4ZWxzLiBUaGUgc2xpY2UncyBwaXhlbCByZXNvbHV0aW9uIG1heSBvciBtYXkgbm90IGJlIGEgcG93ZXIgb2YgMi4KKwkJYmFzaXN1OjpwYWNrZWRfdWludDwyPiBtX251bV9ibG9ja3NfeTsJLy8gVGhlIHNsaWNlJ3MgYmxvY2sgWSBkaW1lbnNpb25zLiAKKworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fZmlsZV9vZnM7CQkvLyBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzbGljZSdzIGRhdGEKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX2ZpbGVfc2l6ZTsJCS8vIFRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIHNsaWNlIGRhdGEgaW4gYnl0ZXMKKworCQliYXNpc3U6OnBhY2tlZF91aW50PDI+IG1fc2xpY2VfZGF0YV9jcmMxNjsgLy8gVGhlIENSQzE2IG9mIHRoZSBjb21wcmVzc2VkIHNsaWNlIGRhdGEsIGZvciBleHRyYS1wYXJhbm9pZCB1c2UgY2FzZXMKKwl9OworCisJLy8gRmlsZSBoZWFkZXIgZmlsZXMKKwllbnVtIGJhc2lzX2hlYWRlcl9mbGFncworCXsKKwkJLy8gQWx3YXlzIHNldCBmb3IgRVRDMVMgZmlsZXMuIE5vdCBzZXQgZm9yIFVBU1RDIGZpbGVzLgorCQljQkFTSVNIZWFkZXJGbGFnRVRDMVMgPSAxLAkJCQkJIAorCQkKKwkJLy8gU2V0IGlmIHRoZSB0ZXh0dXJlIGhhZCB0byBiZSBZIGZsaXBwZWQgYmVmb3JlIGVuY29kaW5nLiBUaGUgYWN0dWFsIGludGVycHJldGF0aW9uIG9mIHRoaXMgKGlzIFkgdXAgb3IgZG93bj8pIGlzIHVwIHRvIHRoZSB1c2VyLgorCQljQkFTSVNIZWFkZXJGbGFnWUZsaXBwZWQgPSAyLAkJCQkgCisJCQorCQkvLyBTZXQgaWYgYW55IHNsaWNlcyBjb250YWluIGFscGhhIChmb3IgRVRDMVMsIGlmIHRoZSBvZGQgc2xpY2VzIGNvbnRhaW4gYWxwaGEgZGF0YSkKKwkJY0JBU0lTSGVhZGVyRmxhZ0hhc0FscGhhU2xpY2VzID0gNCwJCSAKKwkJCisJCS8vIEZvciBFVEMxUyBmaWxlcywgdGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpbGUgdXRpbGl6ZXMgYSBjb2RlYm9vayBmcm9tIGFub3RoZXIgLmJhc2lzIGZpbGUuIAorCQljQkFTSVNIZWFkZXJGbGFnVXNlc0dsb2JhbENvZGVib29rID0gOCwgCisJCQorCQkvLyBTZXQgaWYgdGhlIHRleHR1cmUgZGF0YSBpcyBzUkdCLCBvdGhlcndpc2UgaXQncyBsaW5lYXIuIAorCQkvLyBJbiByZWFsaXR5LCB3ZSBoYXZlIG5vIGlkZWEgaWYgdGhlIHRleHR1cmUgZGF0YSBpcyBhY3R1YWxseSBsaW5lYXIgb3Igc1JHQi4gVGhpcyBpcyB0aGUgbV9wZXJjZXB0dWFsIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNvbXByZXNzb3IuCisJCWNCQVNJU0hlYWRlckZsYWdTUkdCID0gMTYsCQkJCQkgCisJfTsKKworCS8vIFRoZSBpbWFnZSB0eXBlIGZpZWxkIGF0dGVtcHRzIHRvIGRlc2NyaWJlIGhvdyB0byBpbnRlcnByZXQgdGhlIGltYWdlIGRhdGEgaW4gYSBCYXNpcyBmaWxlLgorCS8vIFRoZSBlbmNvZGVyIGxpYnJhcnkgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcgc3BlY2lhbCBvciBkaWZmZXJlbnQgd2l0aCB0aGVzZSB0ZXh0dXJlIHR5cGVzLCB0aGlzIGlzIG1vc3RseSBoZXJlIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgdXNlci4gCisJLy8gV2UgZG8gbWFrZSBzdXJlIHRoZSB2YXJpb3VzIGNvbnN0cmFpbnRzIGFyZSBmb2xsb3dlZCAoMkRBcnJheS9jdWJlbWFwL3ZpZGVvZnJhbWVzL3ZvbHVtZSBpbXBsaWVzIHRoYXQgZWFjaCBpbWFnZSBoYXMgdGhlIHNhbWUgcmVzb2x1dGlvbiBhbmQgIyBvZiBtaXBtYXAgbGV2ZWxzLCBldGMuLCBjdWJlbWFwIGltcGxpZXMgdGhhdCB0aGUgIyBvZiBpbWFnZSBzbGljZXMgaXMgYSBtdWx0aXBsZSBvZiA2KQorCWVudW0gYmFzaXNfdGV4dHVyZV90eXBlCisJeworCQljQkFTSVNUZXhUeXBlMkQgPSAwLAkJCQkJLy8gQW4gYXJiaXRyYXJ5IGFycmF5IG9mIDJEIFJHQiBvciBSR0JBIGltYWdlcyB3aXRoIG9wdGlvbmFsIG1pcG1hcHMsIGFycmF5IHNpemUgPSAjIGltYWdlcywgZWFjaCBpbWFnZSBtYXkgaGF2ZSBhIGRpZmZlcmVudCByZXNvbHV0aW9uIGFuZCAjIG9mIG1pcG1hcCBsZXZlbHMKKwkJY0JBU0lTVGV4VHlwZTJEQXJyYXkgPSAxLAkJCS8vIEFuIGFycmF5IG9mIDJEIFJHQiBvciBSR0JBIGltYWdlcyB3aXRoIG9wdGlvbmFsIG1pcG1hcHMsIGFycmF5IHNpemUgPSAjIGltYWdlcywgZWFjaCBpbWFnZSBoYXMgdGhlIHNhbWUgcmVzb2x1dGlvbiBhbmQgbWlwbWFwIGxldmVscworCQljQkFTSVNUZXhUeXBlQ3ViZW1hcEFycmF5ID0gMiwJLy8gYW4gYXJyYXkgb2YgY3ViZW1hcCBsZXZlbHMsIHRvdGFsICMgb2YgaW1hZ2VzIG11c3QgYmUgZGl2aXNhYmxlIGJ5IDYsIGluIFgrLCBYLSwgWSssIFktLCBaKywgWi0gb3JkZXIsIHdpdGggb3B0aW9uYWwgbWlwbWFwcworCQljQkFTSVNUZXhUeXBlVmlkZW9GcmFtZXMgPSAzLAkJLy8gQW4gYXJyYXkgb2YgMkQgdmlkZW8gZnJhbWVzLCB3aXRoIG9wdGlvbmFsIG1pcG1hcHMsICMgZnJhbWVzID0gIyBpbWFnZXMsIGVhY2ggaW1hZ2UgaGFzIHRoZSBzYW1lIHJlc29sdXRpb24gYW5kICMgb2YgbWlwbWFwIGxldmVscworCQljQkFTSVNUZXhUeXBlVm9sdW1lID0gNCwJCQkvLyBBIDNEIHRleHR1cmUgd2l0aCBvcHRpb25hbCBtaXBtYXBzLCBaIGRpbWVuc2lvbiA9ICMgaW1hZ2VzLCBlYWNoIGltYWdlIGhhcyB0aGUgc2FtZSByZXNvbHV0aW9uIGFuZCAjIG9mIG1pcG1hcCBsZXZlbHMKKworCQljQkFTSVNUZXhUeXBlVG90YWwKKwl9OworCisJZW51bQorCXsKKwkJY0JBU0lTTWF4VVNQZXJGcmFtZSA9IDB4RkZGRkZGCisJfTsKKworCWVudW0gY2xhc3MgYmFzaXNfdGV4X2Zvcm1hdAorCXsKKwkJY0VUQzFTID0gMCwKKwkJY1VBU1RDNHg0ID0gMQorCX07CisKKwlzdHJ1Y3QgYmFzaXNfZmlsZV9oZWFkZXIKKwl7CisJCWVudW0KKwkJeworCQkJY0JBU0lTU2lnVmFsdWUgPSAoJ0InIDw8IDgpIHwgJ3MnLAorCQkJY0JBU0lTRmlyc3RWZXJzaW9uID0gMHgxMAorCQl9OworCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX3NpZzsJCQkJLy8gMiBieXRlIGZpbGUgc2lnbmF0dXJlCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX3ZlcjsJCQkJLy8gQmFzZWxpbmUgZmlsZSB2ZXJzaW9uCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX2hlYWRlcl9zaXplOwkvLyBIZWFkZXIgc2l6ZSBpbiBieXRlcywgc2l6ZW9mKGJhc2lzX2ZpbGVfaGVhZGVyKQorCQliYXNpc3U6OnBhY2tlZF91aW50PDI+ICAgICAgbV9oZWFkZXJfY3JjMTY7CS8vIENSQzE2IG9mIHRoZSByZW1haW5pbmcgaGVhZGVyIGRhdGEKKworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV9kYXRhX3NpemU7CQkvLyBUaGUgdG90YWwgc2l6ZSBvZiBhbGwgZGF0YSBhZnRlciB0aGUgaGVhZGVyCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX2RhdGFfY3JjMTY7CQkvLyBUaGUgQ1JDMTYgb2YgYWxsIGRhdGEgYWZ0ZXIgdGhlIGhlYWRlcgorCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mz4gICAgICBtX3RvdGFsX3NsaWNlczsJLy8gVGhlIHRvdGFsICMgb2YgY29tcHJlc3NlZCBzbGljZXMgKDEgc2xpY2UgcGVyIGltYWdlLCBvciAyIGZvciBhbHBoYSAuYmFzaXMgZmlsZXMpCisKKwkJYmFzaXN1OjpwYWNrZWRfdWludDwzPiAgICAgIG1fdG90YWxfaW1hZ2VzOwkvLyBUaGUgdG90YWwgIyBvZiBpbWFnZXMKKwkJCQkKKwkJYmFzaXN1OjpwYWNrZWRfdWludDwxPiAgICAgIG1fdGV4X2Zvcm1hdDsJCS8vIGVudW0gYmFzaXNfdGV4X2Zvcm1hdAorCQliYXNpc3U6OnBhY2tlZF91aW50PDI+ICAgICAgbV9mbGFnczsJCQkvLyBlbnVtIGJhc2lzdDo6aGVhZGVyX2ZsYWdzCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8MT4gICAgICBtX3RleF90eXBlOwkJLy8gZW51bSBiYXNpc3Q6OmJhc2lzX3RleHR1cmVfdHlwZQorCQliYXNpc3U6OnBhY2tlZF91aW50PDM+ICAgICAgbV91c19wZXJfZnJhbWU7CS8vIEZyYW1lcmF0ZSBvZiB2aWRlbywgaW4gbWljcm9zZWNvbmRzIHBlciBmcmFtZQorCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gICAgICBtX3Jlc2VydmVkOwkJLy8gRm9yIGZ1dHVyZSB1c2UKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiAgICAgIG1fdXNlcmRhdGEwOwkJLy8gRm9yIGNsaWVudCB1c2UKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiAgICAgIG1fdXNlcmRhdGExOwkJLy8gRm9yIGNsaWVudCB1c2UKKworCQliYXNpc3U6OnBhY2tlZF91aW50PDI+ICAgICAgbV90b3RhbF9lbmRwb2ludHM7CQkJLy8gVGhlIG51bWJlciBvZiBlbmRwb2ludHMgaW4gdGhlIGVuZHBvaW50IGNvZGVib29rIAorCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV9lbmRwb2ludF9jYl9maWxlX29mczsJLy8gVGhlIGNvbXByZXNzZWQgZW5kcG9pbnQgY29kZWJvb2sncyBmaWxlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUKKwkJYmFzaXN1OjpwYWNrZWRfdWludDwzPiAgICAgIG1fZW5kcG9pbnRfY2JfZmlsZV9zaXplOwkvLyBUaGUgY29tcHJlc3NlZCBlbmRwb2ludCBjb2RlYm9vaydzIHNpemUgaW4gYnl0ZXMKKworCQliYXNpc3U6OnBhY2tlZF91aW50PDI+ICAgICAgbV90b3RhbF9zZWxlY3RvcnM7CQkJLy8gVGhlIG51bWJlciBvZiBzZWxlY3RvcnMgaW4gdGhlIGVuZHBvaW50IGNvZGVib29rIAorCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV9zZWxlY3Rvcl9jYl9maWxlX29mczsJLy8gVGhlIGNvbXByZXNzZWQgc2VsZWN0b3JzIGNvZGVib29rJ3MgZmlsZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mz4gICAgICBtX3NlbGVjdG9yX2NiX2ZpbGVfc2l6ZTsJLy8gVGhlIGNvbXByZXNzZWQgc2VsZWN0b3IgY29kZWJvb2sncyBzaXplIGluIGJ5dGVzCisKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiAgICAgIG1fdGFibGVzX2ZpbGVfb2ZzOwkJCS8vIFRoZSBmaWxlIG9mZnNldCBvZiB0aGUgY29tcHJlc3NlZCBIdWZmbWFuIGNvZGVsZW5ndGggdGFibGVzLCBmb3IgZGVjb21wcmVzc2luZyBzbGljZXMKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiAgICAgIG1fdGFibGVzX2ZpbGVfc2l6ZTsJCQkvLyBUaGUgZmlsZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjb21wcmVzc2VkIGh1ZmZtYW4gY29kZWxlbmd0aCB0YWJsZXMKKworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV9zbGljZV9kZXNjX2ZpbGVfb2ZzOwkJLy8gVGhlIGZpbGUgb2Zmc2V0IHRvIHRoZSBzbGljZSBkZXNjcmlwdGlvbiBhcnJheSwgdXN1YWxseSBmb2xsb3dzIHRoZSBoZWFkZXIKKwkJCisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gICAgICBtX2V4dGVuZGVkX2ZpbGVfb2ZzOwkJLy8gVGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSAiZXh0ZW5kZWQiIGhlYWRlciBhbmQgY29tcHJlc3NlZCBkYXRhLCBmb3IgZnV0dXJlIHVzZQorCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV9leHRlbmRlZF9maWxlX3NpemU7CQkvLyBUaGUgZmlsZSBzaXplIGluIGJ5dGVzIG9mIHRoZSAiZXh0ZW5kZWQiIGhlYWRlciBhbmQgY29tcHJlc3NlZCBkYXRhLCBmb3IgZnV0dXJlIHVzZQorCX07CisjcHJhZ21hIHBhY2sgKHBvcCkKKworfSAvLyBuYW1lc3BhY2UgYmFzaXN0CisvKioqKiBlbmRlZCBpbmxpbmluZyBiYXNpc3VfZmlsZV9oZWFkZXJzLmggKioqKi8KKworbmFtZXNwYWNlIGJhc2lzdAoreworCS8vIEhpZ2gtbGV2ZWwgY29tcG9zaXRlIHRleHR1cmUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlIHRyYW5zY29kZXIuCisJLy8gRWFjaCBvZiB0aGVzZSB0ZXh0dXJlIGZvcm1hdHMgZGlyZWN0bHkgY29ycmVzcG9uZCB0byBPcGVuR0wvRDNEL1Z1bGthbiBldGMuIHRleHR1cmUgZm9ybWF0cy4KKwkvLyBOb3RlczoKKwkvLyAtIElmIHlvdSBzcGVjaWZ5IGEgdGV4dHVyZSBmb3JtYXQgdGhhdCBzdXBwb3J0cyBhbHBoYSwgYnV0IHRoZSAuYmFzaXMgZmlsZSBkb2Vzbid0IGhhdmUgYWxwaGEsIHRoZSB0cmFuc2NvZGVyIHdpbGwgYXV0b21hdGljYWxseSBvdXRwdXQgYSAKKwkvLyBmdWxseSBvcGFxdWUgKDI1NSkgYWxwaGEgY2hhbm5lbC4KKwkvLyAtIFRoZSBQVlJUQzEgdGV4dHVyZSBmb3JtYXRzIG9ubHkgc3VwcG9ydCBwb3dlciBvZiAyIGRpbWVuc2lvbiAuYmFzaXMgZmlsZXMsIGJ1dCB0aGlzIG1heSBiZSByZWxheGVkIGluIGEgZnV0dXJlIHZlcnNpb24uCisJLy8gLSBUaGUgUFZSVEMxIHRyYW5zY29kZXJzIGFyZSByZWFsLXRpbWUgZW5jb2RlcnMsIHNvIGRvbid0IGV4cGVjdCB0aGUgaGlnaGVzdCBxdWFsaXR5LiBXZSBtYXkgYWRkIGEgc2xvd2VyIGVuY29kZXIgd2l0aCBpbXByb3ZlZCBxdWFsaXR5LgorCS8vIC0gVGhlc2UgZW51bXMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBKYXZhc2NyaXB0IGNvZGUgdGhhdCBjYWxscyB0aGUgdHJhbnNjb2Rlci4KKwllbnVtIGNsYXNzIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQKKwl7CisJCS8vIENvbXByZXNzZWQgZm9ybWF0cworCisJCS8vIEVUQzEtMgorCQljVEZFVEMxX1JHQiA9IDAsCQkJCQkJCS8vIE9wYXF1ZSBvbmx5LCByZXR1cm5zIFJHQiBvciBhbHBoYSBkYXRhIGlmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cyBmbGFnIGlzIHNwZWNpZmllZAorCQljVEZFVEMyX1JHQkEgPSAxLAkJCQkJCQkvLyBPcGFxdWUrYWxwaGEsIEVUQzJfRUFDX0E4IGJsb2NrIGZvbGxvd2VkIGJ5IGEgRVRDMSBibG9jaywgYWxwaGEgY2hhbm5lbCB3aWxsIGJlIG9wYXF1ZSBmb3Igb3BhcXVlIC5iYXNpcyBmaWxlcworCisJCS8vIEJDMS01LCBCQzcgKGRlc2t0b3AsIHNvbWUgbW9iaWxlIGRldmljZXMpCisJCWNURkJDMV9SR0IgPSAyLAkJCQkJCQkvLyBPcGFxdWUgb25seSwgbm8gcHVuY2h0aHJvdWdoIGFscGhhIHN1cHBvcnQgeWV0LCB0cmFuc2NvZGVzIGFscGhhIHNsaWNlIGlmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cyBmbGFnIGlzIHNwZWNpZmllZAorCQljVEZCQzNfUkdCQSA9IDMsIAkJCQkJCQkvLyBPcGFxdWUrYWxwaGEsIEJDNCBmb2xsb3dlZCBieSBhIEJDMSBibG9jaywgYWxwaGEgY2hhbm5lbCB3aWxsIGJlIG9wYXF1ZSBmb3Igb3BhcXVlIC5iYXNpcyBmaWxlcworCQljVEZCQzRfUiA9IDQsCQkJCQkJCQkvLyBSZWQgb25seSwgYWxwaGEgc2xpY2UgaXMgdHJhbnNjb2RlZCB0byBvdXRwdXQgaWYgY0RlY29kZUZsYWdzVHJhbnNjb2RlQWxwaGFEYXRhVG9PcGFxdWVGb3JtYXRzIGZsYWcgaXMgc3BlY2lmaWVkCisJCWNURkJDNV9SRyA9IDUsCQkJCQkJCQkvLyBYWTogVHdvIEJDNCBibG9ja3MsIFg9UiBhbmQgWT1BbHBoYSwgLmJhc2lzIGZpbGUgc2hvdWxkIGhhdmUgYWxwaGEgZGF0YSAoaWYgbm90IFkgd2lsbCBiZSBhbGwgMjU1J3MpCisJCWNURkJDN19SR0JBID0gNiwJCQkJCQkJLy8gUkdCIG9yIFJHQkEsIG1vZGUgNSBmb3IgRVRDMVMsIG1vZGVzICgxLDIsMyw1LDYsNykgZm9yIFVBU1RDCisKKwkJLy8gUFZSVEMxIDRicHAgKG1vYmlsZSwgUG93ZXJWUiBkZXZpY2VzKQorCQljVEZQVlJUQzFfNF9SR0IgPSA4LAkJCQkJCS8vIE9wYXF1ZSBvbmx5LCBSR0Igb3IgYWxwaGEgaWYgY0RlY29kZUZsYWdzVHJhbnNjb2RlQWxwaGFEYXRhVG9PcGFxdWVGb3JtYXRzIGZsYWcgaXMgc3BlY2lmaWVkLCBuZWFybHkgbG93ZXN0IHF1YWxpdHkgb2YgYW55IHRleHR1cmUgZm9ybWF0LgorCQljVEZQVlJUQzFfNF9SR0JBID0gOSwJCQkJCS8vIE9wYXF1ZSthbHBoYSwgbW9zdCB1c2VmdWwgZm9yIHNpbXBsZSBvcGFjaXR5IG1hcHMuIElmIC5iYXNpcyBmaWxlIGRvZXNuJ3QgaGF2ZSBhbHBoYSBjVEZQVlJUQzFfNF9SR0Igd2lsbCBiZSB1c2VkIGluc3RlYWQuIExvd2VzdCBxdWFsaXR5IG9mIGFueSBzdXBwb3J0ZWQgdGV4dHVyZSBmb3JtYXQuCisKKwkJLy8gQVNUQyAobW9iaWxlLCBJbnRlbCBkZXZpY2VzLCBob3BlZnVsbHkgYWxsIGRlc2t0b3AgR1BVJ3Mgb25lIGRheSkKKwkJY1RGQVNUQ180eDRfUkdCQSA9IDEwLAkJCQkJLy8gT3BhcXVlK2FscGhhLCBBU1RDIDR4NCwgYWxwaGEgY2hhbm5lbCB3aWxsIGJlIG9wYXF1ZSBmb3Igb3BhcXVlIC5iYXNpcyBmaWxlcy4gVHJhbnNjb2RlciB1c2VzIFJHQi9SR0JBL0wvTEEgbW9kZXMsIHZvaWQgZXh0ZW50LCBhbmQgdXAgdG8gdHdvIChbMCw0N10gYW5kIFswLDI1NV0pIGVuZHBvaW50IHByZWNpc2lvbnMuCisKKwkJLy8gQVRDIChtb2JpbGUsIEFkcmVubyBkZXZpY2VzLCB0aGlzIGlzIGEgbmljaGUgZm9ybWF0KQorCQljVEZBVENfUkdCID0gMTEsCQkJCQkJCS8vIE9wYXF1ZSwgUkdCIG9yIGFscGhhIGlmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cyBmbGFnIGlzIHNwZWNpZmllZC4gQVRJIEFUQyAoR0xfQVRDX1JHQl9BTUQpCisJCWNURkFUQ19SR0JBID0gMTIsCQkJCQkJCS8vIE9wYXF1ZSthbHBoYSwgYWxwaGEgY2hhbm5lbCB3aWxsIGJlIG9wYXF1ZSBmb3Igb3BhcXVlIC5iYXNpcyBmaWxlcy4gQVRJIEFUQyAoR0xfQVRDX1JHQkFfSU5URVJQT0xBVEVEX0FMUEhBX0FNRCkgCisKKwkJLy8gRlhUMSAoZGVza3RvcCwgSW50ZWwgZGV2aWNlcywgdGhpcyBpcyBhIHN1cGVyIG9ic2N1cmUgZm9ybWF0KQorCQljVEZGWFQxX1JHQiA9IDE3LAkJCQkJCQkvLyBPcGFxdWUgb25seSwgdXNlcyBleGNsdXNpdmVseSBDQ19NSVhFRCBibG9ja3MuIE5vdGFibGUgZm9yIGhhdmluZyBhIDh4NCBibG9jayBzaXplLiBHTF8zREZYX3RleHR1cmVfY29tcHJlc3Npb25fRlhUMSBpcyBzdXBwb3J0ZWQgb24gSW50ZWwgaW50ZWdyYXRlZCBHUFUncyAoc3VjaCBhcyBIRCA2MzApLgorCQkJCQkJCQkJCQkJCQkvLyBQdW5jaC10aHJvdWdoIGFscGhhIGlzIHJlbGF0aXZlbHkgZWFzeSB0byBzdXBwb3J0LCBidXQgZnVsbCBhbHBoYSBpcyBoYXJkZXIuIFRoaXMgZm9ybWF0IGlzIG9ubHkgaGVyZSBmb3IgY29tcGxldGVuZXNzIHNvIG9wYXF1ZS1vbmx5IGlzIGZpbmUgZm9yIG5vdy4KKwkJCQkJCQkJCQkJCQkJLy8gU2VlIHRoZSBCQVNJU1VfVVNFX09SSUdJTkFMXzNERlhfRlhUMV9FTkNPRElORyBtYWNybyBpbiBiYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oLgorCisJCWNURlBWUlRDMl80X1JHQiA9IDE4LAkJCQkJLy8gT3BhcXVlLW9ubHksIGFsbW9zdCBCQzEgcXVhbGl0eSwgbXVjaCBmYXN0ZXIgdG8gdHJhbnNjb2RlIGFuZCBzdXBwb3J0cyBhcmJpdHJhcnkgdGV4dHVyZSBkaW1lbnNpb25zICh1bmxpa2UgUFZSVEMxIFJHQikuCisJCWNURlBWUlRDMl80X1JHQkEgPSAxOSwJCQkJCS8vIE9wYXF1ZSthbHBoYSwgc2xvd2VyIHRvIGVuY29kZSB0aGFuIGNURlBWUlRDMl80X1JHQi4gUHJlbXVsdGlwbGllZCBhbHBoYSBpcyBoaWdobHkgcmVjb21tZW5kZWQsIG90aGVyd2lzZSB0aGUgY29sb3IgY2hhbm5lbCBjYW4gbGVhayBpbnRvIHRoZSBhbHBoYSBjaGFubmVsIG9uIHRyYW5zcGFyZW50IGJsb2Nrcy4KKworCQljVEZFVEMyX0VBQ19SMTEgPSAyMCwJCQkJCS8vIFIgb25seSAoRVRDMiBFQUMgUjExIHVuc2lnbmVkKQorCQljVEZFVEMyX0VBQ19SRzExID0gMjEsCQkJCQkvLyBSRyBvbmx5IChFVEMyIEVBQyBSRzExIHVuc2lnbmVkKSwgUj1vcGFxdWUuciwgRz1hbHBoYSAtIGZvciB0YW5nZW50IHNwYWNlIG5vcm1hbCBtYXBzCisKKwkJLy8gVW5jb21wcmVzc2VkIChyYXcgcGl4ZWwpIGZvcm1hdHMKKwkJY1RGUkdCQTMyID0gMTMsCQkJCQkJCS8vIDMyYnBwIFJHQkEgaW1hZ2Ugc3RvcmVkIGluIHJhc3RlciAobm90IGJsb2NrKSBvcmRlciBpbiBtZW1vcnksIFIgaXMgZmlyc3QgYnl0ZSwgQSBpcyBsYXN0IGJ5dGUuCisJCWNURlJHQjU2NSA9IDE0LAkJCQkJCQkvLyAxNmJwcCBSR0IgaW1hZ2Ugc3RvcmVkIGluIHJhc3RlciAobm90IGJsb2NrKSBvcmRlciBpbiBtZW1vcnksIFIgYXQgYml0IHBvc2l0aW9uIDExCisJCWNURkJHUjU2NSA9IDE1LAkJCQkJCQkvLyAxNmJwcCBSR0IgaW1hZ2Ugc3RvcmVkIGluIHJhc3RlciAobm90IGJsb2NrKSBvcmRlciBpbiBtZW1vcnksIFIgYXQgYml0IHBvc2l0aW9uIDAKKwkJY1RGUkdCQTQ0NDQgPSAxNiwJCQkJCQkJLy8gMTZicHAgUkdCQSBpbWFnZSBzdG9yZWQgaW4gcmFzdGVyIChub3QgYmxvY2spIG9yZGVyIGluIG1lbW9yeSwgUiBhdCBiaXQgcG9zaXRpb24gMTIsIEEgYXQgYml0IHBvc2l0aW9uIDAKKworCQljVEZUb3RhbFRleHR1cmVGb3JtYXRzID0gMjIsCisKKwkJLy8gT2xkIGVudW1zIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29kZSBjb21waWxlZCBhZ2FpbnN0IHByZXZpb3VzIHZlcnNpb25zCisJCWNURkVUQzEgPSBjVEZFVEMxX1JHQiwKKwkJY1RGRVRDMiA9IGNURkVUQzJfUkdCQSwKKwkJY1RGQkMxID0gY1RGQkMxX1JHQiwKKwkJY1RGQkMzID0gY1RGQkMzX1JHQkEsCisJCWNURkJDNCA9IGNURkJDNF9SLAorCQljVEZCQzUgPSBjVEZCQzVfUkcsCisKKwkJLy8gUHJldmlvdXNseSwgdGhlIGNhbGxlciBoYWQgc29tZSBjb250cm9sIG92ZXIgd2hpY2ggQkM3IG1vZGUgdGhlIHRyYW5zY29kZXIgb3V0cHV0LiBXZSd2ZSBzaW1wbGlmaWVkIHRoaXMgZHVlIHRvIFVBU1RDLCB3aGljaCBzdXBwb3J0cyBudW1lcm91cyBtb2Rlcy4KKwkJY1RGQkM3X002X1JHQiA9IGNURkJDN19SR0JBLAkJCS8vIE9wYXF1ZSBvbmx5LCBSR0Igb3IgYWxwaGEgaWYgY0RlY29kZUZsYWdzVHJhbnNjb2RlQWxwaGFEYXRhVG9PcGFxdWVGb3JtYXRzIGZsYWcgaXMgc3BlY2lmaWVkLiBIaWdoZXN0IHF1YWxpdHkgb2YgYWxsIHRoZSBub24tRVRDMSBmb3JtYXRzLgorCQljVEZCQzdfTTVfUkdCQSA9IGNURkJDN19SR0JBLAkJCS8vIE9wYXF1ZSthbHBoYSwgYWxwaGEgY2hhbm5lbCB3aWxsIGJlIG9wYXF1ZSBmb3Igb3BhcXVlIC5iYXNpcyBmaWxlcworCQljVEZCQzdfTTZfT1BBUVVFX09OTFkgPSBjVEZCQzdfUkdCQSwKKwkJY1RGQkM3X001ID0gY1RGQkM3X1JHQkEsCisJCWNURkJDN19BTFQgPSA3LAorCisJCWNURkFTVENfNHg0ID0gY1RGQVNUQ180eDRfUkdCQSwKKworCQljVEZBVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEEgPSBjVEZBVENfUkdCQSwKKwl9OworCisJLy8gRm9yIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXRzLCB0aGlzIHJldHVybnMgdGhlICMgb2YgYnl0ZXMgcGVyIGJsb2NrLiBGb3IgdW5jb21wcmVzc2VkLCBpdCByZXR1cm5zIHRoZSAjIG9mIGJ5dGVzIHBlciBwaXhlbC4KKwkvLyBOT1RFOiBQcmV2aW91c2x5LCB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYmFzaXNfZ2V0X2J5dGVzX3Blcl9ibG9jaygpLCBhbmQgaXQgYWx3YXlzIHJldHVybmVkIDE2KmJ5dGVzX3Blcl9waXhlbCBmb3IgdW5jb21wcmVzc2VkIGZvcm1hdHMgd2hpY2ggd2FzIGNvbmZ1c2luZy4KKwl1aW50MzJfdCBiYXNpc19nZXRfYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsKHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgZm10KTsKKworCS8vIFJldHVybnMgZm9ybWF0J3MgbmFtZSBpbiBBU0NJSQorCWNvbnN0IGNoYXIqIGJhc2lzX2dldF9mb3JtYXRfbmFtZSh0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IGZtdCk7CisKKwkvLyBSZXR1cm5zIGJsb2NrIGZvcm1hdCBuYW1lIGluIEFTQ0lJCisJY29uc3QgY2hhciogYmFzaXNfZ2V0X2Jsb2NrX2Zvcm1hdF9uYW1lKGJsb2NrX2Zvcm1hdCBmbXQpOworCisJLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtYXQgc3VwcG9ydHMgYW4gYWxwaGEgY2hhbm5lbC4KKwlib29sIGJhc2lzX3RyYW5zY29kZXJfZm9ybWF0X2hhc19hbHBoYSh0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IGZtdCk7CisKKwkvLyBSZXR1cm5zIHRoZSBiYXNpc3U6OnRleHR1cmVfZm9ybWF0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0LgorCWJhc2lzdTo6dGV4dHVyZV9mb3JtYXQgYmFzaXNfZ2V0X2Jhc2lzdV90ZXh0dXJlX2Zvcm1hdCh0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IGZtdCk7CisKKwkvLyBSZXR1cm5zIHRoZSB0ZXh0dXJlIHR5cGUncyBuYW1lIGluIEFTQ0lJLgorCWNvbnN0IGNoYXIqIGJhc2lzX2dldF90ZXh0dXJlX3R5cGVfbmFtZShiYXNpc190ZXh0dXJlX3R5cGUgdGV4X3R5cGUpOworCisJLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc2NvZGVyIHRleHR1cmUgdHlwZSBpcyBhbiB1bmNvbXByZXNzZWQgKHJhdyBwaXhlbCkgZm9ybWF0LgorCWJvb2wgYmFzaXNfdHJhbnNjb2Rlcl9mb3JtYXRfaXNfdW5jb21wcmVzc2VkKHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgdGV4X3R5cGUpOworCisJLy8gUmV0dXJucyB0aGUgIyBvZiBieXRlcyBwZXIgcGl4ZWwgZm9yIHVuY29tcHJlc3NlZCBmb3JtYXRzLCBvciAwIGZvciBibG9jayB0ZXh0dXJlIGZvcm1hdHMuCisJdWludDMyX3QgYmFzaXNfZ2V0X3VuY29tcHJlc3NlZF9ieXRlc19wZXJfcGl4ZWwodHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCBmbXQpOworCisJLy8gUmV0dXJucyB0aGUgYmxvY2sgd2lkdGggZm9yIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBmb3JtYXQsIHdoaWNoIGlzIGN1cnJlbnRseSBlaXRoZXIgNCBvciA4IGZvciBGWFQxLgorCXVpbnQzMl90IGJhc2lzX2dldF9ibG9ja193aWR0aCh0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IHRleF90eXBlKTsKKworCS8vIFJldHVybnMgdGhlIGJsb2NrIGhlaWdodCBmb3IgdGhlIHNwZWNpZmllZCB0ZXh0dXJlIGZvcm1hdCwgd2hpY2ggaXMgY3VycmVudGx5IGFsd2F5cyA0LgorCXVpbnQzMl90IGJhc2lzX2dldF9ibG9ja19oZWlnaHQodHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCB0ZXhfdHlwZSk7CisKKwkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBmb3JtYXQgd2FzIGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lLgorCWJvb2wgYmFzaXNfaXNfZm9ybWF0X3N1cHBvcnRlZCh0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IHRleF90eXBlLCBiYXNpc190ZXhfZm9ybWF0IGZtdCA9IGJhc2lzX3RleF9mb3JtYXQ6OmNFVEMxUyk7CisKKwkvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlIHRyYW5zY29kZWQgdGV4dHVyZS4KKwkvLyBGb3IgdW5jb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0cywgbW9zdCBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbiBwaXhlbHMsIG5vdCBibG9ja3MuIEJsb2NrcyBhcmUgNHg0IHBpeGVscy4KKwlib29sIGJhc2lzX3ZhbGlkYXRlX291dHB1dF9idWZmZXJfc2l6ZSh0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IHRhcmdldF9mb3JtYXQsCisJCXVpbnQzMl90IG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJdWludDMyX3Qgb3JpZ193aWR0aCwgdWludDMyX3Qgb3JpZ19oZWlnaHQsCisJCXVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLAorCQl1aW50MzJfdCB0b3RhbF9zbGljZV9ibG9ja3MpOworCisJY2xhc3MgYmFzaXN1X3RyYW5zY29kZXI7CisKKwkvLyBUaGlzIHN0cnVjdCBob2xkcyBhbGwgc3RhdGUgdXNlZCBkdXJpbmcgdHJhbnNjb2RpbmcuIEZvciB2aWRlbywgaXQgbmVlZHMgdG8gcGVyc2lzdCBiZXR3ZWVuIGltYWdlIHRyYW5zY29kZXMgKGl0IGhvbGRzIHRoZSBwcmV2aW91cyBmcmFtZSkuCisJLy8gRm9yIHRocmVhZGluZyB5b3UgY2FuIHVzZSBvbmUgc3RhdGUgcGVyIHRocmVhZC4KKwlzdHJ1Y3QgYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUKKwl7CisJCXN0cnVjdCBibG9ja19wcmVkcworCQl7CisJCQl1aW50MTZfdCBtX2VuZHBvaW50X2luZGV4OworCQkJdWludDhfdCBtX3ByZWRfYml0czsKKwkJfTsKKworCQliYXNpc3U6OnZlY3RvcjxibG9ja19wcmVkcz4gbV9ibG9ja19lbmRwb2ludF9wcmVkc1syXTsKKworCQllbnVtIHsgY01heFByZXZGcmFtZUxldmVscyA9IDE2IH07CisJCWJhc2lzdTo6dmVjdG9yPHVpbnQzMl90PiBtX3ByZXZfZnJhbWVfaW5kaWNlc1syXVtjTWF4UHJldkZyYW1lTGV2ZWxzXTsgLy8gW2FscGhhX2ZsYWddW2xldmVsX2luZGV4XSAKKworCQl2b2lkIGNsZWFyKCkKKwkJeworCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykKKwkJCXsKKwkJCQltX2Jsb2NrX2VuZHBvaW50X3ByZWRzW2ldLmNsZWFyKCk7CisKKwkJCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgY01heFByZXZGcmFtZUxldmVsczsgaisrKQorCQkJCQltX3ByZXZfZnJhbWVfaW5kaWNlc1tpXVtqXS5jbGVhcigpOworCQkJfQorCQl9CisJfTsKKworCS8vIExvdy1sZXZlbCBoZWxwZXIgY2xhc3MgdGhhdCBkb2VzIHRoZSBhY3R1YWwgdHJhbnNjb2RpbmcuCisJY2xhc3MgYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIKKwl7CisJCWZyaWVuZCBjbGFzcyBiYXNpc3VfdHJhbnNjb2RlcjsKKworCXB1YmxpYzoKKwkJYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIoKTsKKworCQl2b2lkIHNldF9nbG9iYWxfY29kZWJvb2tzKGNvbnN0IGJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyKiBwR2xvYmFsX2NvZGVib29rKSB7IG1fcEdsb2JhbF9jb2RlYm9vayA9IHBHbG9iYWxfY29kZWJvb2s7IH0KKwkJY29uc3QgYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIqIGdldF9nbG9iYWxfY29kZWJvb2tzKCkgY29uc3QgeyByZXR1cm4gbV9wR2xvYmFsX2NvZGVib29rOyB9CisKKwkJYm9vbCBkZWNvZGVfcGFsZXR0ZXMoCisJCQl1aW50MzJfdCBudW1fZW5kcG9pbnRzLCBjb25zdCB1aW50OF90KiBwRW5kcG9pbnRzX2RhdGEsIHVpbnQzMl90IGVuZHBvaW50c19kYXRhX3NpemUsCisJCQl1aW50MzJfdCBudW1fc2VsZWN0b3JzLCBjb25zdCB1aW50OF90KiBwU2VsZWN0b3JzX2RhdGEsIHVpbnQzMl90IHNlbGVjdG9yc19kYXRhX3NpemUpOworCisJCWJvb2wgZGVjb2RlX3RhYmxlcyhjb25zdCB1aW50OF90KiBwVGFibGVfZGF0YSwgdWludDMyX3QgdGFibGVfZGF0YV9zaXplKTsKKworCQlib29sIHRyYW5zY29kZV9zbGljZSh2b2lkKiBwRHN0X2Jsb2NrcywgdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIGNvbnN0IHVpbnQ4X3QqIHBJbWFnZV9kYXRhLCB1aW50MzJfdCBpbWFnZV9kYXRhX3NpemUsIGJsb2NrX2Zvcm1hdCBmbXQsCisJCQl1aW50MzJfdCBvdXRwdXRfYmxvY2tfb3JfcGl4ZWxfc3RyaWRlX2luX2J5dGVzLCBib29sIGJjMV9hbGxvd190aHJlZWNvbG9yX2Jsb2NrcywgY29uc3QgYm9vbCBpc192aWRlbywgY29uc3QgYm9vbCBpc19hbHBoYV9zbGljZSwgY29uc3QgdWludDMyX3QgbGV2ZWxfaW5kZXgsIGNvbnN0IHVpbnQzMl90IG9yaWdfd2lkdGgsIGNvbnN0IHVpbnQzMl90IG9yaWdfaGVpZ2h0LCB1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAwLAorCQkJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSA9IG51bGxwdHIsIGJvb2wgYXN0Y190cmFuc2NvZGVfYWxwaGEgPSBmYWxzZSwgdm9pZCogcEFscGhhX2Jsb2NrcyA9IG51bGxwdHIsIHVpbnQzMl90IG91dHB1dF9yb3dzX2luX3BpeGVscyA9IDApOworCisJCWJvb2wgdHJhbnNjb2RlX3NsaWNlKHZvaWQqIHBEc3RfYmxvY2tzLCB1aW50MzJfdCBudW1fYmxvY2tzX3gsIHVpbnQzMl90IG51bV9ibG9ja3NfeSwgY29uc3QgdWludDhfdCogcEltYWdlX2RhdGEsIHVpbnQzMl90IGltYWdlX2RhdGFfc2l6ZSwgYmxvY2tfZm9ybWF0IGZtdCwKKwkJCXVpbnQzMl90IG91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMsIGJvb2wgYmMxX2FsbG93X3RocmVlY29sb3JfYmxvY2tzLCBjb25zdCBiYXNpc19maWxlX2hlYWRlciYgaGVhZGVyLCBjb25zdCBiYXNpc19zbGljZV9kZXNjJiBzbGljZV9kZXNjLCB1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAwLAorCQkJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSA9IG51bGxwdHIsIGJvb2wgYXN0Y190cmFuc2NvZGVfYWxwaGEgPSBmYWxzZSwgdm9pZCogcEFscGhhX2Jsb2NrcyA9IG51bGxwdHIsIHVpbnQzMl90IG91dHB1dF9yb3dzX2luX3BpeGVscyA9IDApCisJCXsKKwkJCXJldHVybiB0cmFuc2NvZGVfc2xpY2UocERzdF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwSW1hZ2VfZGF0YSwgaW1hZ2VfZGF0YV9zaXplLCBmbXQsIG91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMsIGJjMV9hbGxvd190aHJlZWNvbG9yX2Jsb2NrcywKKwkJCQloZWFkZXIubV90ZXhfdHlwZSA9PSBjQkFTSVNUZXhUeXBlVmlkZW9GcmFtZXMsIChzbGljZV9kZXNjLm1fZmxhZ3MgJiBjU2xpY2VEZXNjRmxhZ3NIYXNBbHBoYSkgIT0gMCwgc2xpY2VfZGVzYy5tX2xldmVsX2luZGV4LAorCQkJCXNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoLCBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLAorCQkJCWFzdGNfdHJhbnNjb2RlX2FscGhhLAorCQkJCXBBbHBoYV9ibG9ja3MsCisJCQkJb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJfQorCisJCS8vIENvbnRhaW5lciBpbmRlcGVuZGVudCB0cmFuc2NvZGluZworCQlib29sIHRyYW5zY29kZV9pbWFnZSgKKwkJCXRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgdGFyZ2V0X2Zvcm1hdCwKKwkJCXZvaWQqIHBPdXRwdXRfYmxvY2tzLCB1aW50MzJfdCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsCisJCQljb25zdCB1aW50OF90KiBwQ29tcHJlc3NlZF9kYXRhLCB1aW50MzJfdCBjb21wcmVzc2VkX2RhdGFfbGVuZ3RoLAorCQkJdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIHVpbnQzMl90IG9yaWdfd2lkdGgsIHVpbnQzMl90IG9yaWdfaGVpZ2h0LCB1aW50MzJfdCBsZXZlbF9pbmRleCwKKwkJCXVpbnQzMl90IHJnYl9vZmZzZXQsIHVpbnQzMl90IHJnYl9sZW5ndGgsIHVpbnQzMl90IGFscGhhX29mZnNldCwgdWludDMyX3QgYWxwaGFfbGVuZ3RoLAorCQkJdWludDMyX3QgZGVjb2RlX2ZsYWdzID0gMCwKKwkJCWJvb2wgYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzID0gZmFsc2UsCisJCQlib29sIGlzX3ZpZGVvID0gZmFsc2UsCisJCQl1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAwLAorCQkJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSA9IG51bGxwdHIsCisJCQl1aW50MzJfdCBvdXRwdXRfcm93c19pbl9waXhlbHMgPSAwKTsKKworCQl2b2lkIGNsZWFyKCkKKwkJeworCQkJbV9sb2NhbF9lbmRwb2ludHMuY2xlYXIoKTsKKwkJCW1fbG9jYWxfc2VsZWN0b3JzLmNsZWFyKCk7CisJCQltX2VuZHBvaW50X3ByZWRfbW9kZWwuY2xlYXIoKTsKKwkJCW1fZGVsdGFfZW5kcG9pbnRfbW9kZWwuY2xlYXIoKTsKKwkJCW1fc2VsZWN0b3JfbW9kZWwuY2xlYXIoKTsKKwkJCW1fc2VsZWN0b3JfaGlzdG9yeV9idWZfcmxlX21vZGVsLmNsZWFyKCk7CisJCQltX3NlbGVjdG9yX2hpc3RvcnlfYnVmX3NpemUgPSAwOworCQl9CisKKwkJLy8gTG93LWxldmVsIG1ldGhvZHMKKwkJdHlwZWRlZiBiYXNpc3U6OnZlY3RvcjxlbmRwb2ludD4gZW5kcG9pbnRfdmVjOworCQljb25zdCBlbmRwb2ludF92ZWMmIGdldF9lbmRwb2ludHMoKSBjb25zdCB7IHJldHVybiBtX2xvY2FsX2VuZHBvaW50czsgfQorCisJCXR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8c2VsZWN0b3I+IHNlbGVjdG9yX3ZlYzsKKwkJY29uc3Qgc2VsZWN0b3JfdmVjJiBnZXRfc2VsZWN0b3JzKCkgY29uc3QgeyByZXR1cm4gbV9sb2NhbF9zZWxlY3RvcnM7IH0KKwkJCQkKKwlwcml2YXRlOgorCQljb25zdCBiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlciogbV9wR2xvYmFsX2NvZGVib29rOworCisJCWVuZHBvaW50X3ZlYyBtX2xvY2FsX2VuZHBvaW50czsKKwkJc2VsZWN0b3JfdmVjIG1fbG9jYWxfc2VsZWN0b3JzOworCQkJCQorCQlodWZmbWFuX2RlY29kaW5nX3RhYmxlIG1fZW5kcG9pbnRfcHJlZF9tb2RlbCwgbV9kZWx0YV9lbmRwb2ludF9tb2RlbCwgbV9zZWxlY3Rvcl9tb2RlbCwgbV9zZWxlY3Rvcl9oaXN0b3J5X2J1Zl9ybGVfbW9kZWw7CisKKwkJdWludDMyX3QgbV9zZWxlY3Rvcl9oaXN0b3J5X2J1Zl9zaXplOworCisJCWJhc2lzdV90cmFuc2NvZGVyX3N0YXRlIG1fZGVmX3N0YXRlOworCX07CisKKwllbnVtIGJhc2lzdV9kZWNvZGVfZmxhZ3MKKwl7CisJCS8vIFBWUlRDMTogZGVjb2RlIG5vbi1wb3cyIEVUQzFTIHRleHR1cmUgbGV2ZWwgdG8gdGhlIG5leHQgbGFyZ2VyIHBvd2VyIG9mIDIgKG5vdCBpbXBsZW1lbnRlZCB5ZXQsIGJ1dCB3ZSdyZSBnb2luZyB0byBzdXBwb3J0IGl0KS4gSWdub3JlZCBpZiB0aGUgc2xpY2UncyBkaW1lbnNpb25zIGFyZSBhbHJlYWR5IGEgcG93ZXIgb2YgMi4KKwkJY0RlY29kZUZsYWdzUFZSVENEZWNvZGVUb05leHRQb3cyID0gMiwKKworCQkvLyBXaGVuIGRlY29kaW5nIHRvIGFuIG9wYXF1ZSB0ZXh0dXJlIGZvcm1hdCwgaWYgdGhlIGJhc2lzIGZpbGUgaGFzIGFscGhhLCBkZWNvZGUgdGhlIGFscGhhIHNsaWNlIGluc3RlYWQgb2YgdGhlIGNvbG9yIHNsaWNlIHRvIHRoZSBvdXRwdXQgdGV4dHVyZSBmb3JtYXQuCisJCS8vIFRoaXMgaXMgcHJpbWFyaWx5IHRvIGFsbG93IGRlY29kaW5nIG9mIHRleHR1cmVzIHdpdGggYWxwaGEgdG8gbXVsdGlwbGUgRVRDMSB0ZXh0dXJlcyAob25lIGZvciBjb2xvciwgYW5vdGhlciBmb3IgYWxwaGEpLgorCQljRGVjb2RlRmxhZ3NUcmFuc2NvZGVBbHBoYURhdGFUb09wYXF1ZUZvcm1hdHMgPSA0LAorCisJCS8vIEZvcmJpZCB1c2FnZSBvZiBCQzEgMyBjb2xvciBibG9ja3MgKHdlIGRvbid0IHN1cHBvcnQgQkMxIHB1bmNodGhyb3VnaCBhbHBoYSB5ZXQpLgorCQkvLyBUaGlzIGZsYWcgaXMgdXNlZCBpbnRlcm5hbGx5IHdoZW4gZGVjb2RpbmcgdG8gQkMzLgorCQljRGVjb2RlRmxhZ3NCQzFGb3JiaWRUaHJlZUNvbG9yQmxvY2tzID0gOCwKKworCQkvLyBUaGUgb3V0cHV0IGJ1ZmZlciBjb250YWlucyBhbHBoYSBlbmRwb2ludC9zZWxlY3RvciBpbmRpY2VzLiAKKwkJLy8gVXNlZCBpbnRlcm5hbGx5IHdoZW4gZGVjb2RpbmcgZm9ybWF0cyBsaWtlIEFTVEMgdGhhdCByZXF1aXJlIGJvdGggY29sb3IgYW5kIGFscGhhIGRhdGEgdG8gYmUgYXZhaWxhYmxlIHdoZW4gdHJhbnNjb2RpbmcgdG8gdGhlIG91dHB1dCBmb3JtYXQuCisJCWNEZWNvZGVGbGFnc091dHB1dEhhc0FscGhhSW5kaWNlcyA9IDE2LAorCisJCWNEZWNvZGVGbGFnc0hpZ2hRdWFsaXR5ID0gMzIKKwl9OworCisJY2xhc3MgYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXIKKwl7CisJCWZyaWVuZCBjbGFzcyBiYXNpc3VfdHJhbnNjb2RlcjsKKworCXB1YmxpYzoKKwkJYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXIoKTsKKworCQlib29sIHRyYW5zY29kZV9zbGljZSh2b2lkKiBwRHN0X2Jsb2NrcywgdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIGNvbnN0IHVpbnQ4X3QqIHBJbWFnZV9kYXRhLCB1aW50MzJfdCBpbWFnZV9kYXRhX3NpemUsIGJsb2NrX2Zvcm1hdCBmbXQsCisJCQl1aW50MzJfdCBvdXRwdXRfYmxvY2tfb3JfcGl4ZWxfc3RyaWRlX2luX2J5dGVzLCBib29sIGJjMV9hbGxvd190aHJlZWNvbG9yX2Jsb2NrcywgYm9vbCBoYXNfYWxwaGEsIGNvbnN0IHVpbnQzMl90IG9yaWdfd2lkdGgsIGNvbnN0IHVpbnQzMl90IG9yaWdfaGVpZ2h0LCB1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAwLAorCQkJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSA9IG51bGxwdHIsIHVpbnQzMl90IG91dHB1dF9yb3dzX2luX3BpeGVscyA9IDAsIGludCBjaGFubmVsMCA9IC0xLCBpbnQgY2hhbm5lbDEgPSAtMSwgdWludDMyX3QgZGVjb2RlX2ZsYWdzID0gMCk7CisKKwkJYm9vbCB0cmFuc2NvZGVfc2xpY2Uodm9pZCogcERzdF9ibG9ja3MsIHVpbnQzMl90IG51bV9ibG9ja3NfeCwgdWludDMyX3QgbnVtX2Jsb2Nrc195LCBjb25zdCB1aW50OF90KiBwSW1hZ2VfZGF0YSwgdWludDMyX3QgaW1hZ2VfZGF0YV9zaXplLCBibG9ja19mb3JtYXQgZm10LAorCQkJdWludDMyX3Qgb3V0cHV0X2Jsb2NrX29yX3BpeGVsX3N0cmlkZV9pbl9ieXRlcywgYm9vbCBiYzFfYWxsb3dfdGhyZWVjb2xvcl9ibG9ja3MsIGNvbnN0IGJhc2lzX2ZpbGVfaGVhZGVyJiBoZWFkZXIsIGNvbnN0IGJhc2lzX3NsaWNlX2Rlc2MmIHNsaWNlX2Rlc2MsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IDAsCisJCQliYXNpc3VfdHJhbnNjb2Rlcl9zdGF0ZSogcFN0YXRlID0gbnVsbHB0ciwgdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gMCwgaW50IGNoYW5uZWwwID0gLTEsIGludCBjaGFubmVsMSA9IC0xLCB1aW50MzJfdCBkZWNvZGVfZmxhZ3MgPSAwKQorCQl7CisJCQlyZXR1cm4gdHJhbnNjb2RlX3NsaWNlKHBEc3RfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcEltYWdlX2RhdGEsIGltYWdlX2RhdGFfc2l6ZSwgZm10LAorCQkJCW91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMsIGJjMV9hbGxvd190aHJlZWNvbG9yX2Jsb2NrcywgKGhlYWRlci5tX2ZsYWdzICYgY0JBU0lTSGVhZGVyRmxhZ0hhc0FscGhhU2xpY2VzKSAhPSAwLCBzbGljZV9kZXNjLm1fb3JpZ193aWR0aCwgc2xpY2VfZGVzYy5tX29yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsCisJCQkJcFN0YXRlLCBvdXRwdXRfcm93c19pbl9waXhlbHMsIGNoYW5uZWwwLCBjaGFubmVsMSwgZGVjb2RlX2ZsYWdzKTsKKwkJfQorCisJCS8vIENvbnRhaW5lciBpbmRlcGVuZGVudCB0cmFuc2NvZGluZworCQlib29sIHRyYW5zY29kZV9pbWFnZSgKKwkJCXRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgdGFyZ2V0X2Zvcm1hdCwKKwkJCXZvaWQqIHBPdXRwdXRfYmxvY2tzLCB1aW50MzJfdCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsCisJCQljb25zdCB1aW50OF90KiBwQ29tcHJlc3NlZF9kYXRhLCB1aW50MzJfdCBjb21wcmVzc2VkX2RhdGFfbGVuZ3RoLAorCQkJdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIHVpbnQzMl90IG9yaWdfd2lkdGgsIHVpbnQzMl90IG9yaWdfaGVpZ2h0LCB1aW50MzJfdCBsZXZlbF9pbmRleCwKKwkJCXVpbnQzMl90IHNsaWNlX29mZnNldCwgdWludDMyX3Qgc2xpY2VfbGVuZ3RoLAorCQkJdWludDMyX3QgZGVjb2RlX2ZsYWdzID0gMCwKKwkJCWJvb2wgaGFzX2FscGhhID0gZmFsc2UsCisJCQlib29sIGlzX3ZpZGVvID0gZmFsc2UsCisJCQl1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAwLAorCQkJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSA9IG51bGxwdHIsCisJCQl1aW50MzJfdCBvdXRwdXRfcm93c19pbl9waXhlbHMgPSAwLAorCQkJaW50IGNoYW5uZWwwID0gLTEsIGludCBjaGFubmVsMSA9IC0xKTsKKwl9OworCisJc3RydWN0IGJhc2lzdV9zbGljZV9pbmZvCisJeworCQl1aW50MzJfdCBtX29yaWdfd2lkdGg7CisJCXVpbnQzMl90IG1fb3JpZ19oZWlnaHQ7CisKKwkJdWludDMyX3QgbV93aWR0aDsKKwkJdWludDMyX3QgbV9oZWlnaHQ7CisKKwkJdWludDMyX3QgbV9udW1fYmxvY2tzX3g7CisJCXVpbnQzMl90IG1fbnVtX2Jsb2Nrc195OworCQl1aW50MzJfdCBtX3RvdGFsX2Jsb2NrczsKKworCQl1aW50MzJfdCBtX2NvbXByZXNzZWRfc2l6ZTsKKworCQl1aW50MzJfdCBtX3NsaWNlX2luZGV4OwkvLyB0aGUgc2xpY2UgaW5kZXggaW4gdGhlIC5iYXNpcyBmaWxlCisJCXVpbnQzMl90IG1faW1hZ2VfaW5kZXg7CS8vIHRoZSBzb3VyY2UgaW1hZ2UgaW5kZXggb3JpZ2luYWxseSBwcm92aWRlZCB0byB0aGUgZW5jb2RlcgorCQl1aW50MzJfdCBtX2xldmVsX2luZGV4OwkvLyB0aGUgbWlwbWFwIGxldmVsIHdpdGhpbiB0aGlzIGltYWdlCisKKwkJdWludDMyX3QgbV91bnBhY2tlZF9zbGljZV9jcmMxNjsKKworCQlib29sIG1fYWxwaGFfZmxhZzsJCS8vIHRydWUgaWYgdGhlIHNsaWNlIGhhcyBhbHBoYSBkYXRhCisJCWJvb2wgbV9pZnJhbWVfZmxhZzsJCS8vIHRydWUgaWYgdGhlIHNsaWNlIGlzIGFuIEktRnJhbWUKKwl9OworCisJdHlwZWRlZiBiYXNpc3U6OnZlY3RvcjxiYXNpc3Vfc2xpY2VfaW5mbz4gYmFzaXN1X3NsaWNlX2luZm9fdmVjOworCisJc3RydWN0IGJhc2lzdV9pbWFnZV9pbmZvCisJeworCQl1aW50MzJfdCBtX2ltYWdlX2luZGV4OworCQl1aW50MzJfdCBtX3RvdGFsX2xldmVsczsKKworCQl1aW50MzJfdCBtX29yaWdfd2lkdGg7CisJCXVpbnQzMl90IG1fb3JpZ19oZWlnaHQ7CisKKwkJdWludDMyX3QgbV93aWR0aDsKKwkJdWludDMyX3QgbV9oZWlnaHQ7CisKKwkJdWludDMyX3QgbV9udW1fYmxvY2tzX3g7CisJCXVpbnQzMl90IG1fbnVtX2Jsb2Nrc195OworCQl1aW50MzJfdCBtX3RvdGFsX2Jsb2NrczsKKworCQl1aW50MzJfdCBtX2ZpcnN0X3NsaWNlX2luZGV4OworCisJCWJvb2wgbV9hbHBoYV9mbGFnOwkJLy8gdHJ1ZSBpZiB0aGUgaW1hZ2UgaGFzIGFscGhhIGRhdGEKKwkJYm9vbCBtX2lmcmFtZV9mbGFnOwkJLy8gdHJ1ZSBpZiB0aGUgaW1hZ2UgaXMgYW4gSS1GcmFtZQorCX07CisKKwlzdHJ1Y3QgYmFzaXN1X2ltYWdlX2xldmVsX2luZm8KKwl7CisJCXVpbnQzMl90IG1faW1hZ2VfaW5kZXg7CisJCXVpbnQzMl90IG1fbGV2ZWxfaW5kZXg7CisKKwkJdWludDMyX3QgbV9vcmlnX3dpZHRoOworCQl1aW50MzJfdCBtX29yaWdfaGVpZ2h0OworCisJCXVpbnQzMl90IG1fd2lkdGg7CisJCXVpbnQzMl90IG1faGVpZ2h0OworCisJCXVpbnQzMl90IG1fbnVtX2Jsb2Nrc194OworCQl1aW50MzJfdCBtX251bV9ibG9ja3NfeTsKKwkJdWludDMyX3QgbV90b3RhbF9ibG9ja3M7CisKKwkJdWludDMyX3QgbV9maXJzdF9zbGljZV9pbmRleDsKKworCQl1aW50MzJfdCBtX3JnYl9maWxlX29mczsKKwkJdWludDMyX3QgbV9yZ2JfZmlsZV9sZW47CisJCXVpbnQzMl90IG1fYWxwaGFfZmlsZV9vZnM7CisJCXVpbnQzMl90IG1fYWxwaGFfZmlsZV9sZW47CisKKwkJYm9vbCBtX2FscGhhX2ZsYWc7CQkvLyB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgYWxwaGEgZGF0YQorCQlib29sIG1faWZyYW1lX2ZsYWc7CQkvLyB0cnVlIGlmIHRoZSBpbWFnZSBpcyBhbiBJLUZyYW1lCisJfTsKKworCXN0cnVjdCBiYXNpc3VfZmlsZV9pbmZvCisJeworCQl1aW50MzJfdCBtX3ZlcnNpb247CisJCXVpbnQzMl90IG1fdG90YWxfaGVhZGVyX3NpemU7CisKKwkJdWludDMyX3QgbV90b3RhbF9zZWxlY3RvcnM7CisJCS8vIHdpbGwgYmUgMCBmb3IgVUFTVEMgb3IgaWYgdGhlIGZpbGUgdXNlcyBnbG9iYWwgY29kZWJvb2tzCisJCXVpbnQzMl90IG1fc2VsZWN0b3JfY29kZWJvb2tfb2ZzOworCQl1aW50MzJfdCBtX3NlbGVjdG9yX2NvZGVib29rX3NpemU7CisKKwkJdWludDMyX3QgbV90b3RhbF9lbmRwb2ludHM7CisJCS8vIHdpbGwgYmUgMCBmb3IgVUFTVEMgb3IgaWYgdGhlIGZpbGUgdXNlcyBnbG9iYWwgY29kZWJvb2tzCisJCXVpbnQzMl90IG1fZW5kcG9pbnRfY29kZWJvb2tfb2ZzOworCQl1aW50MzJfdCBtX2VuZHBvaW50X2NvZGVib29rX3NpemU7CisKKwkJdWludDMyX3QgbV90YWJsZXNfb2ZzOworCQl1aW50MzJfdCBtX3RhYmxlc19zaXplOworCisJCXVpbnQzMl90IG1fc2xpY2VzX3NpemU7CisKKwkJYmFzaXNfdGV4dHVyZV90eXBlIG1fdGV4X3R5cGU7CisJCXVpbnQzMl90IG1fdXNfcGVyX2ZyYW1lOworCisJCS8vIExvdy1sZXZlbCBzbGljZSBpbmZvcm1hdGlvbiAoMSBzbGljZSBwZXIgaW1hZ2UgZm9yIGNvbG9yLW9ubHkgYmFzaXMgZmlsZXMsIDIgZm9yIGFscGhhIGJhc2lzIGZpbGVzKQorCQliYXNpc3Vfc2xpY2VfaW5mb192ZWMgbV9zbGljZV9pbmZvOworCisJCXVpbnQzMl90IG1fdG90YWxfaW1hZ2VzOwkgLy8gdG90YWwgIyBvZiBpbWFnZXMKKwkJYmFzaXN1Ojp2ZWN0b3I8dWludDMyX3Q+IG1faW1hZ2VfbWlwbWFwX2xldmVsczsgLy8gdGhlICMgb2YgbWlwbWFwIGxldmVscyBmb3IgZWFjaCBpbWFnZQorCisJCXVpbnQzMl90IG1fdXNlcmRhdGEwOworCQl1aW50MzJfdCBtX3VzZXJkYXRhMTsKKworCQliYXNpc190ZXhfZm9ybWF0IG1fdGV4X2Zvcm1hdDsgLy8gRVRDMVMsIFVBU1RDLCBldGMuCisKKwkJYm9vbCBtX3lfZmxpcHBlZDsJCQkJLy8gdHJ1ZSBpZiB0aGUgaW1hZ2Ugd2FzIFkgZmxpcHBlZAorCQlib29sIG1fZXRjMXM7CQkJCQkvLyB0cnVlIGlmIHRoZSBmaWxlIGlzIEVUQzFTCisJCWJvb2wgbV9oYXNfYWxwaGFfc2xpY2VzOwkvLyB0cnVlIGlmIHRoZSB0ZXh0dXJlIGhhcyBhbHBoYSBzbGljZXMgKGZvciBFVEMxUzogZXZlbiBzbGljZXMgUkdCLCBvZGQgc2xpY2VzIGFscGhhKQorCX07CisKKwkvLyBIaWdoLWxldmVsIHRyYW5zY29kZXIgY2xhc3Mgd2hpY2ggYWNjZXB0cyAuYmFzaXMgZmlsZSBkYXRhIGFuZCBhbGxvd3MgdGhlIGNhbGxlciB0byBxdWVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSBhbmQgdHJhbnNjb2RlIGltYWdlIGxldmVscyB0byB2YXJpb3VzIHRleHR1cmUgZm9ybWF0cy4KKwkvLyBJZiB5b3UncmUganVzdCBzdGFydGluZyBvdXQgdGhpcyBpcyB0aGUgY2xhc3MgeW91IGNhcmUgYWJvdXQuCisJY2xhc3MgYmFzaXN1X3RyYW5zY29kZXIKKwl7CisJCWJhc2lzdV90cmFuc2NvZGVyKGJhc2lzdV90cmFuc2NvZGVyJik7CisJCWJhc2lzdV90cmFuc2NvZGVyJiBvcGVyYXRvcj0gKGNvbnN0IGJhc2lzdV90cmFuc2NvZGVyJik7CisKKwlwdWJsaWM6CisJCWJhc2lzdV90cmFuc2NvZGVyKCk7CisKKwkJLy8gVmFsaWRhdGVzIHRoZSAuYmFzaXMgZmlsZS4gVGhpcyBjb21wdXRlcyBhIGNyYzE2IG92ZXIgdGhlIGVudGlyZSBmaWxlLCBzbyBpdCdzIHNsb3cuCisJCWJvb2wgdmFsaWRhdGVfZmlsZV9jaGVja3N1bXMoY29uc3Qgdm9pZCogcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgYm9vbCBmdWxsX3ZhbGlkYXRpb24pIGNvbnN0OworCisJCS8vIFF1aWNrIGhlYWRlciB2YWxpZGF0aW9uIC0gbm8gY3JjMTYgY2hlY2tzLgorCQlib29sIHZhbGlkYXRlX2hlYWRlcihjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKSBjb25zdDsKKworCQliYXNpc190ZXh0dXJlX3R5cGUgZ2V0X3RleHR1cmVfdHlwZShjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKSBjb25zdDsKKwkJYm9vbCBnZXRfdXNlcmRhdGEoY29uc3Qgdm9pZCogcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgdWludDMyX3QmIHVzZXJkYXRhMCwgdWludDMyX3QmIHVzZXJkYXRhMSkgY29uc3Q7CisKKwkJLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGltYWdlcyBpbiB0aGUgYmFzaXMgZmlsZSAoYWx3YXlzIDEgb3IgbW9yZSkuCisJCS8vIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMgZm9yIGVhY2ggaW1hZ2UgbWF5IGRpZmZlciwgYW5kIHRoYXQgaW1hZ2VzIG1heSBoYXZlIGRpZmZlcmVudCByZXNvbHV0aW9ucy4KKwkJdWludDMyX3QgZ2V0X3RvdGFsX2ltYWdlcyhjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKSBjb25zdDsKKworCQliYXNpc190ZXhfZm9ybWF0IGdldF90ZXhfZm9ybWF0KGNvbnN0IHZvaWQqIHBEYXRhLCB1aW50MzJfdCBkYXRhX3NpemUpIGNvbnN0OworCisJCS8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtaXBtYXAgbGV2ZWxzIGluIGFuIGltYWdlLgorCQl1aW50MzJfdCBnZXRfdG90YWxfaW1hZ2VfbGV2ZWxzKGNvbnN0IHZvaWQqIHBEYXRhLCB1aW50MzJfdCBkYXRhX3NpemUsIHVpbnQzMl90IGltYWdlX2luZGV4KSBjb25zdDsKKworCQkvLyBSZXR1cm5zIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IGFuIGltYWdlLiBOb3RlIHRoYXQgb3JpZ193aWR0aC9vcmlnX2hlaWdodCBtYXkgbm90IGJlIGEgbXVsdGlwbGUgb2YgNC4KKwkJYm9vbCBnZXRfaW1hZ2VfbGV2ZWxfZGVzYyhjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplLCB1aW50MzJfdCBpbWFnZV9pbmRleCwgdWludDMyX3QgbGV2ZWxfaW5kZXgsIHVpbnQzMl90JiBvcmlnX3dpZHRoLCB1aW50MzJfdCYgb3JpZ19oZWlnaHQsIHVpbnQzMl90JiB0b3RhbF9ibG9ja3MpIGNvbnN0OworCisJCS8vIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBpbWFnZS4KKwkJYm9vbCBnZXRfaW1hZ2VfaW5mbyhjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplLCBiYXNpc3VfaW1hZ2VfaW5mbyYgaW1hZ2VfaW5mbywgdWludDMyX3QgaW1hZ2VfaW5kZXgpIGNvbnN0OworCisJCS8vIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBpbWFnZSdzIG1pcG1hcCBsZXZlbC4KKwkJYm9vbCBnZXRfaW1hZ2VfbGV2ZWxfaW5mbyhjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplLCBiYXNpc3VfaW1hZ2VfbGV2ZWxfaW5mbyYgbGV2ZWxfaW5mbywgdWludDMyX3QgaW1hZ2VfaW5kZXgsIHVpbnQzMl90IGxldmVsX2luZGV4KSBjb25zdDsKKworCQkvLyBHZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYmFzaXMgZmlsZSBhbmQgbG93LWxldmVsIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggc2xpY2UuCisJCWJvb2wgZ2V0X2ZpbGVfaW5mbyhjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplLCBiYXNpc3VfZmlsZV9pbmZvJiBmaWxlX2luZm8pIGNvbnN0OworCisJCS8vIHN0YXJ0X3RyYW5zY29kaW5nKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgdHJhbnNjb2RlX3NsaWNlKCkgb3IgdHJhbnNjb2RlX2ltYWdlX2xldmVsKCkuCisJCS8vIEZvciBFVEMxUyBmaWxlcywgdGhpcyBjYWxsIGRlY29tcHJlc3NlcyB0aGUgc2VsZWN0b3IvZW5kcG9pbnQgY29kZWJvb2tzLCBzbyBpZGVhbGx5IHlvdSB3b3VsZCBvbmx5IGNhbGwgdGhpcyBvbmNlIHBlciAuYmFzaXMgZmlsZSAobm90IGVhY2ggaW1hZ2UvbWlwbWFwIGxldmVsKS4KKwkJYm9vbCBzdGFydF90cmFuc2NvZGluZyhjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKTsKKworCQlib29sIHN0b3BfdHJhbnNjb2RpbmcoKTsKKworCQkvLyBSZXR1cm5zIHRydWUgaWYgc3RhcnRfdHJhbnNjb2RpbmcoKSBoYXMgYmVlbiBjYWxsZWQuCisJCWJvb2wgZ2V0X3JlYWR5X3RvX3RyYW5zY29kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVhZHlfdG9fdHJhbnNjb2RlOyB9CisKKwkJLy8gdHJhbnNjb2RlX2ltYWdlX2xldmVsKCkgZGVjb2RlcyBhIHNpbmdsZSBtaXBtYXAgbGV2ZWwgZnJvbSB0aGUgLmJhc2lzIGZpbGUgdG8gYW55IG9mIHRoZSBzdXBwb3J0ZWQgb3V0cHV0IHRleHR1cmUgZm9ybWF0cy4KKwkJLy8gSXQnbGwgZmlyc3QgZmluZCB0aGUgc2xpY2UocykgdG8gdHJhbnNjb2RlLCB0aGVuIGNhbGwgdHJhbnNjb2RlX3NsaWNlKCkgb25lIG9yIHR3byB0aW1lcyB0byBkZWNvZGUgYm90aCB0aGUgY29sb3IgYW5kIGFscGhhIHRleHR1cmUgZGF0YSAob3IgUkcgdGV4dHVyZSBkYXRhIGZyb20gdHdvIHNsaWNlcyBmb3IgQkM1KS4KKwkJLy8gSWYgdGhlIC5iYXNpcyBmaWxlIGRvZXNuJ3QgaGF2ZSBhbHBoYSBzbGljZXMsIHRoZSBvdXRwdXQgYWxwaGEgYmxvY2tzIHdpbGwgYmUgc2V0IHRvIGZ1bGx5IG9wYXF1ZSAoYWxsIDI1NSdzKS4KKwkJLy8gQ3VycmVudGx5LCB0byBkZWNvZGUgdG8gUFZSVEMxIHRoZSBiYXNpcyB0ZXh0dXJlJ3MgZGltZW5zaW9ucyBpbiBwaXhlbHMgbXVzdCBiZSBhIHBvd2VyIG9mIDIsIGR1ZSB0byBQVlJUQzEgZm9ybWF0IHJlcXVpcmVtZW50cy4gCisJCS8vIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscyBzaG91bGQgYmUgYXQgbGVhc3QgdGhlIGltYWdlIGxldmVsJ3MgdG90YWxfYmxvY2tzIChudW1fYmxvY2tzX3ggKiBudW1fYmxvY2tzX3kpLCBvciB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCBwaXhlbHMgaWYgZm10PT1jVEZSR0JBMzIuCisJCS8vIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVsczogTnVtYmVyIG9mIGJsb2NrcyBvciBwaXhlbHMgcGVyIHJvdy4gSWYgMCwgdGhlIHRyYW5zY29kZXIgdXNlcyB0aGUgc2xpY2UncyBudW1fYmxvY2tzX3ggb3Igb3JpZ193aWR0aCAoTk9UIG51bV9ibG9ja3NfeCAqIDQpLiBJZ25vcmVkIGZvciBQVlJUQzEgKGR1ZSB0byB0ZXh0dXJlIHN3aXp6bGluZykuCisJCS8vIG91dHB1dF9yb3dzX2luX3BpeGVsczogSWdub3JlZCB1bmxlc3MgZm10IGlzIHVuY29tcHJlc3NlZCAoY1JHQkEzMiwgZXRjLikuIFRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0cHV0IHJvd3MgaW4gdGhlIG91dHB1dCBidWZmZXIuIElmIDAsIHRoZSB0cmFuc2NvZGVyIGFzc3VtZXMgdGhlIHNsaWNlJ3Mgb3JpZ19oZWlnaHQgKE5PVCBudW1fYmxvY2tzX3kgKiA0KS4KKwkJLy8gTm90ZXM6IAorCQkvLyAtIGJhc2lzdV90cmFuc2NvZGVyX2luaXQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgZmlyc3QgdG8gaW5pdGlhbGl6ZSB0aGUgdHJhbnNjb2RlciBsb29rdXAgdGFibGVzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisJCS8vIC0gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgb3V0cHV0IHRleHR1cmUgYnVmZmVyIGlzIHJlYWRhYmxlLiBJbiBzb21lIGNhc2VzIHRvIGhhbmRsZSBhbHBoYSwgdGhlIHRyYW5zY29kZXIgd2lsbCB3cml0ZSB0ZW1wb3JhcnkgZGF0YSB0byB0aGUgb3V0cHV0IHRleHR1cmUgaW4KKwkJLy8gYSBmaXJzdCBwYXNzLCB3aGljaCB3aWxsIGJlIHJlYWQgaW4gYSBzZWNvbmQgcGFzcy4KKwkJYm9vbCB0cmFuc2NvZGVfaW1hZ2VfbGV2ZWwoCisJCQljb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplLAorCQkJdWludDMyX3QgaW1hZ2VfaW5kZXgsIHVpbnQzMl90IGxldmVsX2luZGV4LAorCQkJdm9pZCogcE91dHB1dF9ibG9ja3MsIHVpbnQzMl90IG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJCXRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgZm10LAorCQkJdWludDMyX3QgZGVjb2RlX2ZsYWdzID0gMCwgdWludDMyX3Qgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzID0gMCwgYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSA9IG51bGxwdHIsIHVpbnQzMl90IG91dHB1dF9yb3dzX2luX3BpeGVscyA9IDApIGNvbnN0OworCisJCS8vIEZpbmRzIHRoZSBiYXNpcyBzbGljZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW1hZ2UvbGV2ZWwvYWxwaGEgcGFyYW1zLCBvciAtMSBpZiB0aGUgc2xpY2UgY2FuJ3QgYmUgZm91bmQuCisJCWludCBmaW5kX3NsaWNlKGNvbnN0IHZvaWQqIHBEYXRhLCB1aW50MzJfdCBkYXRhX3NpemUsIHVpbnQzMl90IGltYWdlX2luZGV4LCB1aW50MzJfdCBsZXZlbF9pbmRleCwgYm9vbCBhbHBoYV9kYXRhKSBjb25zdDsKKworCQkvLyB0cmFuc2NvZGVfc2xpY2UoKSBkZWNvZGVzIGEgc2luZ2xlIHNsaWNlIGZyb20gdGhlIC5iYXNpcyBmaWxlLiBJdCdzIGEgbG93LWxldmVsIEFQSSAtIG1vc3QgbGlrZWx5IHlvdSB3YW50IHRvIHVzZSB0cmFuc2NvZGVfaW1hZ2VfbGV2ZWwoKS4KKwkJLy8gVGhpcyBpcyBhIGxvdy1sZXZlbCBBUEksIGFuZCB3aWxsIGJlIG5lZWRlZCB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gZGVjb2RlIHNvbWUgdGV4dHVyZSBmb3JtYXRzIChsaWtlIEJDMywgQkM1LCBvciBFVEMyKS4KKwkJLy8gb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzIGlzIGp1c3QgdXNlZCBmb3IgdmVyaWZpY2F0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guCisJCS8vIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscyBzaG91bGQgYmUgYXQgbGVhc3QgdGhlIGltYWdlIGxldmVsJ3MgdG90YWxfYmxvY2tzIChudW1fYmxvY2tzX3ggKiBudW1fYmxvY2tzX3kpLCBvciB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCBwaXhlbHMgaWYgZm10PT1jVEZSR0JBMzIuCisJCS8vIG91dHB1dF9ibG9ja19zdHJpZGVfaW5fYnl0ZXM6IE51bWJlciBvZiBieXRlcyBiZXR3ZWVuIGVhY2ggb3V0cHV0IGJsb2NrLgorCQkvLyBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHM6IE51bWJlciBvZiBibG9ja3Mgb3IgcGl4ZWxzIHBlciByb3cuIElmIDAsIHRoZSB0cmFuc2NvZGVyIHVzZXMgdGhlIHNsaWNlJ3MgbnVtX2Jsb2Nrc194IG9yIG9yaWdfd2lkdGggKE5PVCBudW1fYmxvY2tzX3ggKiA0KS4gSWdub3JlZCBmb3IgUFZSVEMxIChkdWUgdG8gdGV4dHVyZSBzd2l6emxpbmcpLgorCQkvLyBvdXRwdXRfcm93c19pbl9waXhlbHM6IElnbm9yZWQgdW5sZXNzIGZtdCBpcyBjUkdCQTMyLiBUaGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCByb3dzIGluIHRoZSBvdXRwdXQgYnVmZmVyLiBJZiAwLCB0aGUgdHJhbnNjb2RlciBhc3N1bWVzIHRoZSBzbGljZSdzIG9yaWdfaGVpZ2h0IChOT1QgbnVtX2Jsb2Nrc195ICogNCkuCisJCS8vIE5vdGVzOgorCQkvLyAtIGJhc2lzdV90cmFuc2NvZGVyX2luaXQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgZmlyc3QgdG8gaW5pdGlhbGl6ZSB0aGUgdHJhbnNjb2RlciBsb29rdXAgdGFibGVzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisJCWJvb2wgdHJhbnNjb2RlX3NsaWNlKGNvbnN0IHZvaWQqIHBEYXRhLCB1aW50MzJfdCBkYXRhX3NpemUsIHVpbnQzMl90IHNsaWNlX2luZGV4LAorCQkJdm9pZCogcE91dHB1dF9ibG9ja3MsIHVpbnQzMl90IG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJCWJsb2NrX2Zvcm1hdCBmbXQsIHVpbnQzMl90IG91dHB1dF9ibG9ja19zdHJpZGVfaW5fYnl0ZXMsIHVpbnQzMl90IGRlY29kZV9mbGFncyA9IDAsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IDAsIGJhc2lzdV90cmFuc2NvZGVyX3N0YXRlKiBwU3RhdGUgPSBudWxscHRyLCB2b2lkKiBwQWxwaGFfYmxvY2tzID0gbnVsbHB0ciwKKwkJCXVpbnQzMl90IG91dHB1dF9yb3dzX2luX3BpeGVscyA9IDAsIGludCBjaGFubmVsMCA9IC0xLCBpbnQgY2hhbm5lbDEgPSAtMSkgY29uc3Q7CisKKwkJc3RhdGljIHZvaWQgd3JpdGVfb3BhcXVlX2FscGhhX2Jsb2NrcygKKwkJCXVpbnQzMl90IG51bV9ibG9ja3NfeCwgdWludDMyX3QgbnVtX2Jsb2Nrc195LAorCQkJdm9pZCogcE91dHB1dF9ibG9ja3MsIGJsb2NrX2Zvcm1hdCBmbXQsCisJCQl1aW50MzJfdCBibG9ja19zdHJpZGVfaW5fYnl0ZXMsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyk7CisKKwkJdm9pZCBzZXRfZ2xvYmFsX2NvZGVib29rcyhjb25zdCBiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlciogcEdsb2JhbF9jb2RlYm9vaykgeyBtX2xvd2xldmVsX2V0YzFzX2RlY29kZXIuc2V0X2dsb2JhbF9jb2RlYm9va3MocEdsb2JhbF9jb2RlYm9vayk7IH0KKwkJY29uc3QgYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIqIGdldF9nbG9iYWxfY29kZWJvb2tzKCkgY29uc3QgeyByZXR1cm4gbV9sb3dsZXZlbF9ldGMxc19kZWNvZGVyLmdldF9nbG9iYWxfY29kZWJvb2tzKCk7IH0KKworCQljb25zdCBiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlciYgZ2V0X2xvd2xldmVsX2V0YzFzX2RlY29kZXIoKSBjb25zdCB7IHJldHVybiBtX2xvd2xldmVsX2V0YzFzX2RlY29kZXI7IH0KKwkJYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXImIGdldF9sb3dsZXZlbF9ldGMxc19kZWNvZGVyKCkgeyByZXR1cm4gbV9sb3dsZXZlbF9ldGMxc19kZWNvZGVyOyB9CisKKwkJY29uc3QgYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXImIGdldF9sb3dsZXZlbF91YXN0Y19kZWNvZGVyKCkgY29uc3QgeyByZXR1cm4gbV9sb3dsZXZlbF91YXN0Y19kZWNvZGVyOyB9CisJCWJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyJiBnZXRfbG93bGV2ZWxfdWFzdGNfZGVjb2RlcigpIHsgcmV0dXJuIG1fbG93bGV2ZWxfdWFzdGNfZGVjb2RlcjsgfQorCisJcHJpdmF0ZToKKwkJbXV0YWJsZSBiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlciBtX2xvd2xldmVsX2V0YzFzX2RlY29kZXI7CisJCW11dGFibGUgYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXIgbV9sb3dsZXZlbF91YXN0Y19kZWNvZGVyOworCisJCWJvb2wgbV9yZWFkeV90b190cmFuc2NvZGU7CisKKwkJaW50IGZpbmRfZmlyc3Rfc2xpY2VfaW5kZXgoY29uc3Qgdm9pZCogcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgdWludDMyX3QgaW1hZ2VfaW5kZXgsIHVpbnQzMl90IGxldmVsX2luZGV4KSBjb25zdDsKKworCQlib29sIHZhbGlkYXRlX2hlYWRlcl9xdWljayhjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKSBjb25zdDsKKwl9OworCisJLy8gYmFzaXN1X3RyYW5zY29kZXJfaW5pdCgpIE1VU1QgYmUgY2FsbGVkIGJlZm9yZSBhIC5iYXNpcyBmaWxlIGNhbiBiZSB0cmFuc2NvZGVkLgorCXZvaWQgYmFzaXN1X3RyYW5zY29kZXJfaW5pdCgpOworCQkKKwllbnVtIGRlYnVnX2ZsYWdzX3QKKwl7CisJCWNEZWJ1Z0ZsYWdWaXNDUnMgPSAxLAorCQljRGVidWdGbGFnVmlzQkMxU2VscyA9IDIsCisJCWNEZWJ1Z0ZsYWdWaXNCQzFFbmRwb2ludHMgPSA0CisJfTsKKwl1aW50MzJfdCBnZXRfZGVidWdfZmxhZ3MoKTsKKwl2b2lkIHNldF9kZWJ1Z19mbGFncyh1aW50MzJfdCBmKTsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKwkvLyBPcHRpb25hbCAuS1RYMiBmaWxlIGZvcm1hdCBzdXBwb3J0CisJLy8gS1RYMiByZWFkaW5nIG9wdGlvbmFsbHkgcmVxdWlyZXMgbWluaXogb3IgWnN0ZCBkZWNvbXByZXNzb3JzIGZvciBzdXBlcmNvbXByZXNzZWQgVUFTVEMgZmlsZXMuCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorI2lmIEJBU0lTRF9TVVBQT1JUX0tUWDIKKyNwcmFnbWEgcGFjayhwdXNoKQorI3ByYWdtYSBwYWNrKDEpCisJc3RydWN0IGt0eDJfaGVhZGVyCisJeworCQl1aW50OF90IG1faWRlbnRpZmllclsxMl07CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV92a19mb3JtYXQ7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV90eXBlX3NpemU7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9waXhlbF93aWR0aDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3BpeGVsX2hlaWdodDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3BpeGVsX2RlcHRoOworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fbGF5ZXJfY291bnQ7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9mYWNlX2NvdW50OworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fbGV2ZWxfY291bnQ7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9zdXBlcmNvbXByZXNzaW9uX3NjaGVtZTsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX2RmZF9ieXRlX29mZnNldDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX2RmZF9ieXRlX2xlbmd0aDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX2t2ZF9ieXRlX29mZnNldDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX2t2ZF9ieXRlX2xlbmd0aDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw4PiBtX3NnZF9ieXRlX29mZnNldDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw4PiBtX3NnZF9ieXRlX2xlbmd0aDsKKwl9OworCisJc3RydWN0IGt0eDJfbGV2ZWxfaW5kZXgKKwl7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8OD4gbV9ieXRlX29mZnNldDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw4PiBtX2J5dGVfbGVuZ3RoOworCQliYXNpc3U6OnBhY2tlZF91aW50PDg+IG1fdW5jb21wcmVzc2VkX2J5dGVfbGVuZ3RoOworCX07CisKKwlzdHJ1Y3Qga3R4Ml9ldGMxc19nbG9iYWxfZGF0YV9oZWFkZXIKKwl7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gbV9lbmRwb2ludF9jb3VudDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDwyPiBtX3NlbGVjdG9yX2NvdW50OworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fZW5kcG9pbnRzX2J5dGVfbGVuZ3RoOworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fc2VsZWN0b3JzX2J5dGVfbGVuZ3RoOworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fdGFibGVzX2J5dGVfbGVuZ3RoOworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fZXh0ZW5kZWRfYnl0ZV9sZW5ndGg7CisJfTsKKworCXN0cnVjdCBrdHgyX2V0YzFzX2ltYWdlX2Rlc2MKKwl7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9pbWFnZV9mbGFnczsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3JnYl9zbGljZV9ieXRlX29mZnNldDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3JnYl9zbGljZV9ieXRlX2xlbmd0aDsKKwkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX2FscGhhX3NsaWNlX2J5dGVfb2Zmc2V0OworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fYWxwaGFfc2xpY2VfYnl0ZV9sZW5ndGg7CisJfTsKKworCXN0cnVjdCBrdHgyX2FuaW1kYXRhCisJeworCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fZHVyYXRpb247CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV90aW1lc2NhbGU7CisJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9sb29wY291bnQ7CisJfTsKKyNwcmFnbWEgcGFjayhwb3ApCisKKwljb25zdCB1aW50MzJfdCBLVFgyX1ZLX0ZPUk1BVF9VTkRFRklORUQgPSAwOworCWNvbnN0IHVpbnQzMl90IEtUWDJfS0RGX0RGX01PREVMX1VBU1RDID0gMTY2OworCWNvbnN0IHVpbnQzMl90IEtUWDJfS0RGX0RGX01PREVMX0VUQzFTID0gMTYzOworCWNvbnN0IHVpbnQzMl90IEtUWDJfSU1BR0VfSVNfUF9GUkFNRSA9IDI7CisJY29uc3QgdWludDMyX3QgS1RYMl9VQVNUQ19CTE9DS19TSVpFID0gMTY7CisJY29uc3QgdWludDMyX3QgS1RYMl9NQVhfU1VQUE9SVEVEX0xFVkVMX0NPVU5UID0gMTY7IC8vIHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29uc3RyYWludCBhbmQgY2FuIGJlIGluY3JlYXNlZAorCisJLy8gVGhlIEtUWDIgdHJhbnNmZXIgZnVuY3Rpb25zIHN1cHBvcnRlZCBieSBLVFgyCisJY29uc3QgdWludDMyX3QgS1RYMl9LSFJfREZfVFJBTlNGRVJfTElORUFSID0gMTsKKwljb25zdCB1aW50MzJfdCBLVFgyX0tIUl9ERl9UUkFOU0ZFUl9TUkdCID0gMjsKKworCWVudW0ga3R4Ml9zdXBlcmNvbXByZXNzaW9uCisJeworCQlLVFgyX1NTX05PTkUgPSAwLAorCQlLVFgyX1NTX0JBU0lTTFogPSAxLAorCQlLVFgyX1NTX1pTVEFOREFSRCA9IDIKKwl9OworCisJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19rdHgyX2ZpbGVfaWRlbnRpZmllclsxMl07CisKKwllbnVtIGt0eDJfZGZfY2hhbm5lbF9pZAorCXsKKwkJS1RYMl9ERl9DSEFOTkVMX0VUQzFTX1JHQiA9IDBVLAorCQlLVFgyX0RGX0NIQU5ORUxfRVRDMVNfUlJSID0gM1UsCisJCUtUWDJfREZfQ0hBTk5FTF9FVEMxU19HR0cgPSA0VSwKKwkJS1RYMl9ERl9DSEFOTkVMX0VUQzFTX0FBQSA9IDE1VSwKKworCQlLVFgyX0RGX0NIQU5ORUxfVUFTVENfREFUQSA9IDBVLAorCQlLVFgyX0RGX0NIQU5ORUxfVUFTVENfUkdCID0gMFUsCisJCUtUWDJfREZfQ0hBTk5FTF9VQVNUQ19SR0JBID0gM1UsCisJCUtUWDJfREZfQ0hBTk5FTF9VQVNUQ19SUlIgPSA0VSwKKwkJS1RYMl9ERl9DSEFOTkVMX1VBU1RDX1JSUkcgPSA1VSwKKwkJS1RYMl9ERl9DSEFOTkVMX1VBU1RDX1JHID0gNlUsCisJfTsKKworCWlubGluZSBjb25zdCBjaGFyKiBrdHgyX2dldF9ldGMxc19kZl9jaGFubmVsX2lkX3N0cihrdHgyX2RmX2NoYW5uZWxfaWQgaWQpCisJeworCQlzd2l0Y2ggKGlkKQorCQl7CisJCWNhc2UgS1RYMl9ERl9DSEFOTkVMX0VUQzFTX1JHQjogcmV0dXJuICJSR0IiOworCQljYXNlIEtUWDJfREZfQ0hBTk5FTF9FVEMxU19SUlI6IHJldHVybiAiUlJSIjsKKwkJY2FzZSBLVFgyX0RGX0NIQU5ORUxfRVRDMVNfR0dHOiByZXR1cm4gIkdHRyI7CisJCWNhc2UgS1RYMl9ERl9DSEFOTkVMX0VUQzFTX0FBQTogcmV0dXJuICJBQUEiOworCQlkZWZhdWx0OiBicmVhazsKKwkJfQorCQlyZXR1cm4gIj8iOworCX0KKworCWlubGluZSBjb25zdCBjaGFyKiBrdHgyX2dldF91YXN0Y19kZl9jaGFubmVsX2lkX3N0cihrdHgyX2RmX2NoYW5uZWxfaWQgaWQpCisJeworCQlzd2l0Y2ggKGlkKQorCQl7CisJCWNhc2UgS1RYMl9ERl9DSEFOTkVMX1VBU1RDX1JHQjogcmV0dXJuICJSR0IiOworCQljYXNlIEtUWDJfREZfQ0hBTk5FTF9VQVNUQ19SR0JBOiByZXR1cm4gIlJHQkEiOworCQljYXNlIEtUWDJfREZfQ0hBTk5FTF9VQVNUQ19SUlI6IHJldHVybiAiUlJSIjsKKwkJY2FzZSBLVFgyX0RGX0NIQU5ORUxfVUFTVENfUlJSRzogcmV0dXJuICJSUlJHIjsKKwkJY2FzZSBLVFgyX0RGX0NIQU5ORUxfVUFTVENfUkc6IHJldHVybiAiUkciOworCQlkZWZhdWx0OiBicmVhazsKKwkJfQorCQlyZXR1cm4gIj8iOworCX0KKworCWVudW0ga3R4Ml9kZl9jb2xvcl9wcmltYXJpZXMKKwl7CisJCUtUWDJfREZfUFJJTUFSSUVTX1VOU1BFQ0lGSUVEID0gMCwKKwkJS1RYMl9ERl9QUklNQVJJRVNfQlQ3MDkgPSAxLAorCQlLVFgyX0RGX1BSSU1BUklFU19TUkdCID0gMSwKKwkJS1RYMl9ERl9QUklNQVJJRVNfQlQ2MDFfRUJVID0gMiwKKwkJS1RYMl9ERl9QUklNQVJJRVNfQlQ2MDFfU01QVEUgPSAzLAorCQlLVFgyX0RGX1BSSU1BUklFU19CVDIwMjAgPSA0LAorCQlLVFgyX0RGX1BSSU1BUklFU19DSUVYWVogPSA1LAorCQlLVFgyX0RGX1BSSU1BUklFU19BQ0VTID0gNiwKKwkJS1RYMl9ERl9QUklNQVJJRVNfQUNFU0NDID0gNywKKwkJS1RYMl9ERl9QUklNQVJJRVNfTlRTQzE5NTMgPSA4LAorCQlLVFgyX0RGX1BSSU1BUklFU19QQUw1MjUgPSA5LAorCQlLVFgyX0RGX1BSSU1BUklFU19ESVNQTEFZUDMgPSAxMCwKKwkJS1RYMl9ERl9QUklNQVJJRVNfQURPQkVSR0IgPSAxMQorCX07CisKKwlpbmxpbmUgY29uc3QgY2hhcioga3R4Ml9nZXRfZGZfY29sb3JfcHJpbWFyaWVzX3N0cihrdHgyX2RmX2NvbG9yX3ByaW1hcmllcyBwKQorCXsKKwkJc3dpdGNoIChwKQorCQl7CisJCWNhc2UgS1RYMl9ERl9QUklNQVJJRVNfVU5TUEVDSUZJRUQ6IHJldHVybiAiVU5TUEVDSUZJRUQiOworCQljYXNlIEtUWDJfREZfUFJJTUFSSUVTX0JUNzA5OiByZXR1cm4gIkJUNzA5IjsKKwkJY2FzZSBLVFgyX0RGX1BSSU1BUklFU19CVDYwMV9FQlU6IHJldHVybiAiRUJVIjsgCisJCWNhc2UgS1RYMl9ERl9QUklNQVJJRVNfQlQ2MDFfU01QVEU6IHJldHVybiAiU01QVEUiOworCQljYXNlIEtUWDJfREZfUFJJTUFSSUVTX0JUMjAyMDogcmV0dXJuICJCVDIwMjAiOworCQljYXNlIEtUWDJfREZfUFJJTUFSSUVTX0NJRVhZWjogcmV0dXJuICJDSUVYWVoiOworCQljYXNlIEtUWDJfREZfUFJJTUFSSUVTX0FDRVM6IHJldHVybiAiQUNFUyI7CisJCWNhc2UgS1RYMl9ERl9QUklNQVJJRVNfQUNFU0NDOiByZXR1cm4gIkFDRVNDQyI7IAorCQljYXNlIEtUWDJfREZfUFJJTUFSSUVTX05UU0MxOTUzOiByZXR1cm4gIk5UU0MxOTUzIjsKKwkJY2FzZSBLVFgyX0RGX1BSSU1BUklFU19QQUw1MjU6IHJldHVybiAiUEFMNTI1IjsKKwkJY2FzZSBLVFgyX0RGX1BSSU1BUklFU19ESVNQTEFZUDM6IHJldHVybiAiRElTUExBWVAzIjsKKwkJY2FzZSBLVFgyX0RGX1BSSU1BUklFU19BRE9CRVJHQjogcmV0dXJuICJBRE9CRVJHQiI7CisJCWRlZmF1bHQ6IGJyZWFrOworCQl9CisJCXJldHVybiAiPyI7CisJfQkKKworCS8vIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIDJEIHRleHR1cmUgImltYWdlIiBpbiBhIEtUWDIgZmlsZS4KKwlzdHJ1Y3Qga3R4Ml9pbWFnZV9sZXZlbF9pbmZvCisJeworCQkvLyBUaGUgbWlwbWFwIGxldmVsIGluZGV4ICgwPWxhcmdlc3QpLCB0ZXh0dXJlIGFycmF5IGxheWVyIGluZGV4LCBhbmQgY3ViZW1hcCBmYWNlIGluZGV4IG9mIHRoZSBpbWFnZS4KKwkJdWludDMyX3QgbV9sZXZlbF9pbmRleDsKKwkJdWludDMyX3QgbV9sYXllcl9pbmRleDsKKwkJdWludDMyX3QgbV9mYWNlX2luZGV4OworCisJCS8vIFRoZSBpbWFnZSdzIGFjdHVhbCAob3IgdGhlIG9yaWdpbmFsIHNvdXJjZSBpbWFnZSdzKSB3aWR0aC9oZWlnaHQgaW4gcGl4ZWxzLCB3aGljaCBtYXkgbm90IGJlIGRpdmlzaWJsZSBieSA0IHBpeGVscy4KKwkJdWludDMyX3QgbV9vcmlnX3dpZHRoOworCQl1aW50MzJfdCBtX29yaWdfaGVpZ2h0OworCisJCS8vIFRoZSBpbWFnZSdzIHBoeXNpY2FsIHdpZHRoL2hlaWdodCwgd2hpY2ggd2lsbCBhbHdheXMgYmUgZGl2aXNpYmxlIGJ5IDQgcGl4ZWxzLgorCQl1aW50MzJfdCBtX3dpZHRoOworCQl1aW50MzJfdCBtX2hlaWdodDsKKworCQkvLyBUaGUgdGV4dHVyZSdzIGRpbWVuc2lvbnMgaW4gNHg0IHRleGVsIGJsb2Nrcy4KKwkJdWludDMyX3QgbV9udW1fYmxvY2tzX3g7CisJCXVpbnQzMl90IG1fbnVtX2Jsb2Nrc195OworCisJCS8vIFRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzCisJCXVpbnQzMl90IG1fdG90YWxfYmxvY2tzOworCisJCS8vIHRydWUgaWYgdGhlIGltYWdlIGhhcyBhbHBoYSBkYXRhCisJCWJvb2wgbV9hbHBoYV9mbGFnOworCisJCS8vIHRydWUgaWYgdGhlIGltYWdlIGlzIGFuIEktRnJhbWUuIEN1cnJlbnRseSwgZm9yIEVUQzFTIHRleHR1cmVzLCB0aGUgZmlyc3QgZnJhbWUgd2lsbCBhbHdheXMgYmUgYW4gSS1GcmFtZSwgYW5kIHN1YnNlcXVlbnQgZnJhbWVzIHdpbGwgYWx3YXlzIGJlIFAtRnJhbWVzLgorCQlib29sIG1faWZyYW1lX2ZsYWc7CisJfTsKKwkJCisJLy8gVGhyZWFkLXNwZWNpZmljIEVUQzFTL3N1cGVyY29tcHJlc3NlZCBVQVNUQyB0cmFuc2NvZGVyIHN0YXRlLiAoSWYgeW91J3JlIG5vdCBkb2luZyBtdWx0aXRocmVhZGluZyB0cmFuc2NvZGluZyB5b3UgY2FuIGlnbm9yZSB0aGlzLikKKwlzdHJ1Y3Qga3R4Ml90cmFuc2NvZGVyX3N0YXRlCisJeworCQliYXNpc3Q6OmJhc2lzdV90cmFuc2NvZGVyX3N0YXRlIG1fdHJhbnNjb2Rlcl9zdGF0ZTsKKwkJYmFzaXN1Ojp1aW50OF92ZWMgbV9sZXZlbF91bmNvbXBfZGF0YTsKKwkJaW50IG1fdW5jb21wX2RhdGFfbGV2ZWxfaW5kZXg7CisKKwkJdm9pZCBjbGVhcigpCisJCXsKKwkJCW1fdHJhbnNjb2Rlcl9zdGF0ZS5jbGVhcigpOworCQkJbV9sZXZlbF91bmNvbXBfZGF0YS5jbGVhcigpOworCQkJbV91bmNvbXBfZGF0YV9sZXZlbF9pbmRleCA9IC0xOworCQl9CisJfTsKKworCS8vIFRoaXMgY2xhc3MgaXMgcXVpdGUgc2ltaWxhciB0byBiYXNpc3VfdHJhbnNjb2Rlci4gSXQgdHJlYXRzIEtUWDIgZmlsZXMgYXMgYSBzaW1wbGUgY29udGFpbmVyIGZvciBFVEMxUy9VQVNUQyB0ZXh0dXJlIGRhdGEuCisJLy8gSXQgZG9lcyBub3Qgc3VwcG9ydCAxRCBvciAzRCB0ZXh0dXJlcy4KKwkvLyBJdCBvbmx5IHN1cHBvcnRzIDJEIGFuZCBjdWJlbWFwIHRleHR1cmVzLCB3aXRoIG9yIHdpdGhvdXQgbWlwbWFwcywgdGV4dHVyZSBhcnJheXMgb2YgMkQvY3ViZW1hcCB0ZXh0dXJlcywgYW5kIHRleHR1cmUgdmlkZW8gZmlsZXMuIAorCS8vIEl0IG9ubHkgc3VwcG9ydHMgcmF3IG5vbi1zdXBlcmNvbXByZXNzZWQgVUFTVEMsIEVUQzFTLCBVQVNUQytac3RkLCBvciBVQVNUQyt6bGliIGNvbXByZXNzZWQgZmlsZXMuCisJLy8gREZEIChEYXRhIEZvcm1hdCBEZXNjcmlwdG9yKSBwYXJzaW5nIGlzIHB1cnBvc2VseSBhcyBzaW1wbGUgYXMgcG9zc2libGUuIAorCS8vIElmIHlvdSBuZWVkIHRvIGtub3cgaG93IHRvIGludGVycHJldCB0aGUgdGV4dHVyZSBjaGFubmVscyB5b3UnbGwgbmVlZCB0byBwYXJzZSB0aGUgREZEIHlvdXJzZWxmIGFmdGVyIGNhbGxpbmcgZ2V0X2RmZCgpLgorCWNsYXNzIGt0eDJfdHJhbnNjb2RlcgorCXsKKwlwdWJsaWM6CisJCWt0eDJfdHJhbnNjb2RlcigpOworCisJCS8vIEZyZWVzIGFsbCBhbGxvY2F0aW9ucywgcmVzZXRzIG9iamVjdC4KKwkJdm9pZCBjbGVhcigpOworCisJCS8vIGluaXQoKSBwYXJzZXMgdGhlIEtUWDIgaGVhZGVyLCBsZXZlbCBpbmRleCBhcnJheSwgREZELCBhbmQga2V5IHZhbHVlcywgYnV0IG5vdGhpbmcgZWxzZS4KKwkJLy8gSW1wb3J0YW50bHksIGl0IGRvZXMgbm90IHBhcnNlIG9yIGRlY29tcHJlc3MgdGhlIEVUQzFTIGdsb2JhbCBzdXBlcmNvbXByZXNzZWQgZGF0YSwgc28gc29tZSB0aGluZ3MgKGxpa2Ugd2hpY2ggZnJhbWVzIGFyZSBJL1AtRnJhbWVzKSB3b24ndCBiZSBhdmFpbGFibGUgdW50aWwgc3RhcnRfdHJhbnNjb2RpbmcoKSBpcyBjYWxsZWQuCisJCS8vIFRoaXMgbWV0aG9kIGhvbGRzIGEgcG9pbnRlciB0byB0aGUgZmlsZSBkYXRhIHVudGlsIGNsZWFyKCkgaXMgY2FsbGVkLgorCQlib29sIGluaXQoY29uc3Qgdm9pZCogcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSk7CisKKwkJLy8gUmV0dXJucyB0aGUgZGF0YS9zaXplIHBhc3NlZCB0byBpbml0KCkuCisJCWNvbnN0IHVpbnQ4X3QqIGdldF9kYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YTsgfQorCQl1aW50MzJfdCBnZXRfZGF0YV9zaXplKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhX3NpemU7IH0KKworCQkvLyBSZXR1cm5zIHRoZSBLVFgyIGhlYWRlci4gVmFsaWQgYWZ0ZXIgaW5pdCgpLgorCQljb25zdCBrdHgyX2hlYWRlciYgZ2V0X2hlYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1faGVhZGVyOyB9CisKKwkJLy8gUmV0dXJucyB0aGUgS1RYMiBsZXZlbCBpbmRleCBhcnJheS4gVGhlcmUgd2lsbCBiZSBvbmUgZW50cnkgZm9yIGVhY2ggbWlwbWFwIGxldmVsLiBWYWxpZCBhZnRlciBpbml0KCkuCisJCWNvbnN0IGJhc2lzdTo6dmVjdG9yPGt0eDJfbGV2ZWxfaW5kZXg+JiBnZXRfbGV2ZWxfaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xldmVsczsgfQorCisJCS8vIFJldHVybnMgdGhlIHRleHR1cmUncyB3aWR0aCBpbiB0ZXhlbHMuIEFsd2F5cyBub24temVybywgbWlnaHQgbm90IGJlIGRpdmlzaWJsZSBieSA0LiBWYWxpZCBhZnRlciBpbml0KCkuCisJCXVpbnQzMl90IGdldF93aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1faGVhZGVyLm1fcGl4ZWxfd2lkdGg7IH0KKworCQkvLyBSZXR1cm5zIHRoZSB0ZXh0dXJlJ3MgaGVpZ2h0IGluIHRleGVscy4gQWx3YXlzIG5vbi16ZXJvLCBtaWdodCBub3QgYmUgZGl2aXNpYmxlIGJ5IDQuIFZhbGlkIGFmdGVyIGluaXQoKS4KKwkJdWludDMyX3QgZ2V0X2hlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGVhZGVyLm1fcGl4ZWxfaGVpZ2h0OyB9CisKKwkJLy8gUmV0dXJucyB0aGUgdGV4dHVyZSdzIG51bWJlciBvZiBtaXBtYXAgbGV2ZWxzLiBBbHdheXMgcmV0dXJucyAxIG9yIGhpZ2hlci4gVmFsaWQgYWZ0ZXIgaW5pdCgpLgorCQl1aW50MzJfdCBnZXRfbGV2ZWxzKCkgY29uc3QgeyByZXR1cm4gbV9oZWFkZXIubV9sZXZlbF9jb3VudDsgfQorCisJCS8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmYWNlcy4gUmV0dXJucyAxIGZvciAyRCB0ZXh0dXJlcyBhbmQgb3IgNiBmb3IgY3ViZW1hcHMuIFZhbGlkIGFmdGVyIGluaXQoKS4KKwkJdWludDMyX3QgZ2V0X2ZhY2VzKCkgY29uc3QgeyByZXR1cm4gbV9oZWFkZXIubV9mYWNlX2NvdW50OyB9CisKKwkJLy8gUmV0dXJucyAwIG9yIHRoZSBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSB0ZXh0dXJlIGFycmF5IG9yIHRleHR1cmUgdmlkZW8uIFZhbGlkIGFmdGVyIGluaXQoKS4KKwkJdWludDMyX3QgZ2V0X2xheWVycygpIGNvbnN0IHsgcmV0dXJuIG1faGVhZGVyLm1fbGF5ZXJfY291bnQ7IH0KKworCQkvLyBSZXR1cm5zIGNFVEMxUyBvciBjVUFTVEM0eDQuIFZhbGlkIGFmdGVyIGluaXQoKS4KKwkJYmFzaXN0OjpiYXNpc190ZXhfZm9ybWF0IGdldF9mb3JtYXQoKSBjb25zdCB7IHJldHVybiBtX2Zvcm1hdDsgfSAKKworCQlib29sIGlzX2V0YzFzKCkgY29uc3QgeyByZXR1cm4gZ2V0X2Zvcm1hdCgpID09IGJhc2lzdDo6YmFzaXNfdGV4X2Zvcm1hdDo6Y0VUQzFTOyB9CisKKwkJYm9vbCBpc191YXN0YygpIGNvbnN0IHsgcmV0dXJuIGdldF9mb3JtYXQoKSA9PSBiYXNpc3Q6OmJhc2lzX3RleF9mb3JtYXQ6OmNVQVNUQzR4NDsgfQorCisJCS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgRVRDMVMgZmlsZSBoYXMgdHdvIHBsYW5lcyAodHlwaWNhbGx5IFJHQkEsIG9yIFJSUkcpLCBvciB0cnVlIGlmIHRoZSBVQVNUQyBmaWxlIGhhcyBhbHBoYSBkYXRhLiBWYWxpZCBhZnRlciBpbml0KCkuCisJCXVpbnQzMl90IGdldF9oYXNfYWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2hhc19hbHBoYTsgfQorCisJCS8vIFJldHVybnMgdGhlIGVudGlyZSBEYXRhIEZvcm1hdCBEZXNjcmlwdG9yIChERkQpIGZyb20gdGhlIEtUWDIgZmlsZS4gVmFsaWQgYWZ0ZXIgaW5pdCgpLgorCQkvLyBTZWUgaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvRGF0YUZvcm1hdC9zcGVjcy8xLjMvZGF0YWZvcm1hdC4xLjMuaHRtbCNfdGhlX2tocm9ub3NfZGF0YV9mb3JtYXRfZGVzY3JpcHRvcl9vdmVydmlldworCQljb25zdCBiYXNpc3U6OnVpbnQ4X3ZlYyYgZ2V0X2RmZCgpIGNvbnN0IHsgcmV0dXJuIG1fZGZkOyB9CisKKwkJLy8gU29tZSBiYXNpYyBERkQgYWNjZXNzb3JzLiBWYWxpZCBhZnRlciBpbml0KCkuCisJCXVpbnQzMl90IGdldF9kZmRfY29sb3JfbW9kZWwoKSBjb25zdCB7IHJldHVybiBtX2RmZF9jb2xvcl9tb2RlbDsgfQorCisJCS8vIFJldHVybnMgdGhlIERGRCBjb2xvciBwcmltYXJ5LgorCQkvLyBXZSBkbyBub3QgdmFsaWRhdGUgdGhlIGNvbG9yIHByaW1hcmllcywgc28gdGhlIHJldHVybmVkIHZhbHVlIG1heSBub3QgYmUgaW4gdGhlIGt0eDJfZGZfY29sb3JfcHJpbWFyaWVzIGVudW0uCisJCWt0eDJfZGZfY29sb3JfcHJpbWFyaWVzIGdldF9kZmRfY29sb3JfcHJpbWFyaWVzKCkgY29uc3QgeyByZXR1cm4gbV9kZmRfY29sb3JfcHJpbXM7IH0KKwkJCisJCS8vIFJldHVybnMgS1RYMl9LSFJfREZfVFJBTlNGRVJfTElORUFSIG9yIEtUWDJfS0hSX0RGX1RSQU5TRkVSX1NSR0IuCisJCXVpbnQzMl90IGdldF9kZmRfdHJhbnNmZXJfZnVuYygpIGNvbnN0IHsgcmV0dXJuIG1fZGZkX3RyYW5zZmVyX2Z1bmM7IH0KKworCQl1aW50MzJfdCBnZXRfZGZkX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gbV9kZmRfZmxhZ3M7IH0KKworCQkvLyBSZXR1cm5zIDEgKEVUQzFTL1VBU1RDKSBvciAyIChFVEMxUyB3aXRoIGFuIGludGVybmFsIGFscGhhIGNoYW5uZWwpLgorCQl1aW50MzJfdCBnZXRfZGZkX3RvdGFsX3NhbXBsZXMoKSBjb25zdCB7IHJldHVybiBtX2RmZF9zYW1wbGVzOwl9CisJCQorCQkvLyBSZXR1cm5zIHRoZSBjaGFubmVsIG1hcHBpbmcgZm9yIGVhY2ggREZEICJzYW1wbGUiLiBVQVNUQyBhbHdheXMgaGFzIDEgc2FtcGxlLCBFVEMxUyBjYW4gaGF2ZSBvbmUgb3IgdHdvLiAKKwkJLy8gTm90ZSB0aGUgcmV0dXJuZWQgdmFsdWUgU0hPVUxEIGJlIG9uZSBvZiB0aGUga3R4Ml9kZl9jaGFubmVsX2lkIGVudW1zLCBidXQgd2UgZG9uJ3QgdmFsaWRhdGUgdGhhdC4gCisJCS8vIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBkZWNpZGUgd2hhdCB0byBkbyBpZiB0aGUgdmFsdWUgaXNuJ3QgaW4gdGhlIGVudW0uCisJCWt0eDJfZGZfY2hhbm5lbF9pZCBnZXRfZGZkX2NoYW5uZWxfaWQwKCkgY29uc3QgeyByZXR1cm4gbV9kZmRfY2hhbjA7IH0KKwkJa3R4Ml9kZl9jaGFubmVsX2lkIGdldF9kZmRfY2hhbm5lbF9pZDEoKSBjb25zdCB7IHJldHVybiBtX2RmZF9jaGFuMTsgfQorCisJCS8vIEtleSB2YWx1ZSBmaWVsZCBkYXRhLgorCQlzdHJ1Y3Qga2V5X3ZhbHVlCisJCXsKKwkJCS8vIFRoZSBrZXkgZmllbGQgaXMgVVRGOCBhbmQgYWx3YXlzIHplcm8gdGVybWluYXRlZC4KKwkJCWJhc2lzdTo6dWludDhfdmVjIG1fa2V5OworCisJCQkvLyBUaGUgdmFsdWUgbWF5IGJlIGVtcHR5LiBJdCBjb25zaXN0cyBvZiByYXcgYnl0ZXMgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgemVybyB0ZXJtaW5hdGVkLgorCQkJYmFzaXN1Ojp1aW50OF92ZWMgbV92YWx1ZTsKKworCQkJYm9vbCBvcGVyYXRvcjwgKGNvbnN0IGtleV92YWx1ZSYgcmhzKSBjb25zdCB7IHJldHVybiBzdHJjbXAoKGNvbnN0IGNoYXIqKW1fa2V5LmRhdGEoKSwgKGNvbnN0IGNoYXIgKilyaHMubV9rZXkuZGF0YSgpKSA8IDA7IH0KKwkJfTsKKwkJdHlwZWRlZiBiYXNpc3U6OnZlY3RvcjxrZXlfdmFsdWU+IGtleV92YWx1ZV92ZWM7CisKKwkJLy8gUmV0dXJucyB0aGUgYXJyYXkgb2Yga2V5LXZhbHVlIGVudHJpZXMuIFRoaXMgbWF5IGJlIGVtcHR5LiBWYWxpZCBhZnRlciBpbml0KCkuCisJCS8vIFRoZSBvcmRlciBvZiBrZXkgdmFsdWVzIGZpZWxkcyBpbiB0aGlzIGFycmF5IGV4YWN0bHkgbWF0Y2hlcyB0aGUgb3JkZXIgdGhleSB3ZXJlIHN0b3JlZCBpbiB0aGUgZmlsZS4gVGhlIGtleXMgYXJlIHN1cHBvc2VkIHRvIGJlIHNvcnRlZCBieSB0aGVpciBVbmljb2RlIGNvZGUgcG9pbnRzLgorCQljb25zdCBrZXlfdmFsdWVfdmVjJiBnZXRfa2V5X3ZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fa2V5X3ZhbHVlczsgfQorCisJCWNvbnN0IGJhc2lzdTo6dWludDhfdmVjICpmaW5kX2tleShjb25zdCBzdGQ6OnN0cmluZyYga2V5X25hbWUpIGNvbnN0OworCisJCS8vIExvdy1sZXZlbCBFVEMxUyBzcGVjaWZpYyBhY2Nlc3NvcnMKKworCQkvLyBSZXR1cm5zIHRoZSBFVEMxUyBnbG9iYWwgc3VwZXJjb21wcmVzc2lvbiBkYXRhIGhlYWRlciwgd2hpY2ggaXMgb25seSB2YWxpZCBhZnRlciBzdGFydF90cmFuc2NvZGluZygpIGlzIGNhbGxlZC4KKwkJY29uc3Qga3R4Ml9ldGMxc19nbG9iYWxfZGF0YV9oZWFkZXImIGdldF9ldGMxc19oZWFkZXIoKSBjb25zdCB7IHJldHVybiBtX2V0YzFzX2hlYWRlcjsgfQorCisJCS8vIFJldHVybnMgdGhlIGFycmF5IG9mIEVUQzFTIGltYWdlIGRlc2NyaXB0b3JzLCB3aGljaCBpcyBvbmx5IHZhbGlkIGFmdGVyIGdldF9ldGMxc19pbWFnZV9kZXNjcygpIGlzIGNhbGxlZC4KKwkJY29uc3QgYmFzaXN1Ojp2ZWN0b3I8a3R4Ml9ldGMxc19pbWFnZV9kZXNjPiYgZ2V0X2V0YzFzX2ltYWdlX2Rlc2NzKCkgY29uc3QgeyByZXR1cm4gbV9ldGMxc19pbWFnZV9kZXNjczsgfQorCisJCS8vIE11c3QgaGF2ZSBjYWxsZWQgc3RhcnRUcmFuc2NvZGluZygpIGZpcnN0CisJCXVpbnQzMl90IGdldF9ldGMxc19pbWFnZV9kZXNjc19pbWFnZV9mbGFncyh1aW50MzJfdCBsZXZlbF9pbmRleCwgdWludDMyX3QgbGF5ZXJfaW5kZXgsIHVpbnQzMl90IGZhY2VfaW5kZXgpIGNvbnN0OworCisJCS8vIGlzX3ZpZGVvKCkgaXMgb25seSB2YWxpZCBhZnRlciBzdGFydF90cmFuc2NvZGluZygpIGlzIGNhbGxlZC4KKwkJLy8gRm9yIEVUQzFTIGRhdGEsIGlmIHRoaXMgcmV0dXJucyB0cnVlIHlvdSBtdXN0IGN1cnJlbnRseSB0cmFuc2NvZGUgdGhlIGZpbGUgZnJvbSBmaXJzdCB0byBsYXN0IGZyYW1lLCBpbiBvcmRlciwgd2l0aG91dCBza2lwcGluZyBhbnkgZnJhbWVzLgorCQlib29sIGlzX3ZpZGVvKCkgY29uc3QgeyByZXR1cm4gbV9pc192aWRlbzsgfQorCQkJCQorCQkvLyBzdGFydF90cmFuc2NvZGluZygpIE1VU1QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRyYW5zY29kZV9pbWFnZSgpLgorCQkvLyBUaGlzIG1ldGhvZCBkZWNvbXByZXNzZXMgdGhlIEVUQzFTIGdsb2JhbCBlbmRwb2ludC9zZWxlY3RvciBjb2RlYm9va3MsIHdoaWNoIGlzIG5vdCBmcmVlLCBzbyB0cnkgdG8gYXZvaWQgY2FsbGluZyBpdCBleGNlc3NpdmVseS4KKwkJYm9vbCBzdGFydF90cmFuc2NvZGluZygpOworCQkJCQkJCQkKKwkJLy8gZ2V0X2ltYWdlX2xldmVsX2luZm8oKSBiZSBjYWxsZWQgYWZ0ZXIgaW5pdCgpLCBidXQgdGhlIG1faWZyYW1lX2ZsYWcncyB3b24ndCBiZSB2YWxpZCB1bnRpbCBzdGFydF90cmFuc2NvZGluZygpIGlzIGNhbGxlZC4KKwkJLy8gWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSBjYWxsaW5nIHRyYW5zY29kZV9pbWFnZV9sZXZlbCgpIHRvIHJldHJpZXZlIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtaXBtYXAgbGV2ZWwncyBkaW1lbnNpb25zLCBldGMuCisJCWJvb2wgZ2V0X2ltYWdlX2xldmVsX2luZm8oa3R4Ml9pbWFnZV9sZXZlbF9pbmZvJiBsZXZlbF9pbmZvLCB1aW50MzJfdCBsZXZlbF9pbmRleCwgdWludDMyX3QgbGF5ZXJfaW5kZXgsIHVpbnQzMl90IGZhY2VfaW5kZXgpIGNvbnN0OworCisJCS8vIHRyYW5zY29kZV9pbWFnZV9sZXZlbCgpIHRyYW5zY29kZXMgYSBzaW5nbGUgMkQgdGV4dHVyZSBvciBjdWJlbWFwIGZhY2UgZnJvbSB0aGUgS1RYMiBmaWxlLgorCQkvLyBJbnRlcm5hbGx5IGl0IHVzZXMgdGhlIHNhbWUgbG93LWxldmVsIHRyYW5zY29kZSBBUEkncyBhcyBiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsKCkuCisJCS8vIElmIHRoZSBmaWxlIGlzIFVBU1RDIGFuZCBpcyBzdXBlcmNvbXByZXNzZWQgd2l0aCBac3RhbmRhcmQsIGFuZCB0aGUgZmlsZSBpcyBhIHRleHR1cmUgYXJyYXkgb3IgY3ViZW1hcCwgaXQncyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBlYWNoIG1pcG1hcCBsZXZlbCBpcyAKKwkJLy8gY29tcGxldGVseSB0cmFuc2NvZGVkIGJlZm9yZSBzd2l0Y2hpbmcgdG8gYW5vdGhlciBsZXZlbC4gRXZlcnkgdGltZSB0aGUgbWlwbWFwIGxldmVsIGlzIGNoYW5nZWQgYWxsIHN1cGVyY29tcHJlc3NlZCBsZXZlbCBkYXRhIG11c3QgYmUgZGVjb21wcmVzc2VkIHVzaW5nIFpzdGFuZGFyZCBhcyBhIHNpbmdsZSB1bml0LgorCQkvLyBDdXJyZW50bHkgRVRDMVMgdmlkZW9zIG11c3QgYWx3YXlzIGJlIHRyYW5zY29kZWQgZnJvbSBmaXJzdCB0byBsYXN0IGZyYW1lIChvciBLVFgyICJsYXllciIpLCBpbiBvcmRlciwgd2l0aCBubyBza2lwcGluZyBvZiBmcmFtZXMuCisJCS8vIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMgbm90IHRocmVhZCBzYWZlIHVubGVzcyB5b3Ugc3BlY2lmeSBhIHBvaW50ZXIgdG8gYSB1c2VyIGFsbG9jYXRlZCB0aHJlYWQtc3BlY2lmaWMgdHJhbnNjb2Rlcl9zdGF0ZSBzdHJ1Y3QuCisJCWJvb2wgdHJhbnNjb2RlX2ltYWdlX2xldmVsKAorCQkJdWludDMyX3QgbGV2ZWxfaW5kZXgsIHVpbnQzMl90IGxheWVyX2luZGV4LCB1aW50MzJfdCBmYWNlX2luZGV4LAorCQkJdm9pZCogcE91dHB1dF9ibG9ja3MsIHVpbnQzMl90IG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJCWJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCBmbXQsCisJCQl1aW50MzJfdCBkZWNvZGVfZmxhZ3MgPSAwLCB1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAwLCB1aW50MzJfdCBvdXRwdXRfcm93c19pbl9waXhlbHMgPSAwLCBpbnQgY2hhbm5lbDAgPSAtMSwgaW50IGNoYW5uZWwxID0gLTEsCisJCQlrdHgyX3RyYW5zY29kZXJfc3RhdGUgKnBTdGF0ZSA9IG51bGxwdHIpOworCQkJCQorCXByaXZhdGU6CisJCWNvbnN0IHVpbnQ4X3QqIG1fcERhdGE7CisJCXVpbnQzMl90IG1fZGF0YV9zaXplOworCisJCWt0eDJfaGVhZGVyIG1faGVhZGVyOworCQliYXNpc3U6OnZlY3RvcjxrdHgyX2xldmVsX2luZGV4PiBtX2xldmVsczsKKwkJYmFzaXN1Ojp1aW50OF92ZWMgbV9kZmQ7CisJCWtleV92YWx1ZV92ZWMgbV9rZXlfdmFsdWVzOworCQkKKwkJa3R4Ml9ldGMxc19nbG9iYWxfZGF0YV9oZWFkZXIgbV9ldGMxc19oZWFkZXI7CisJCWJhc2lzdTo6dmVjdG9yPGt0eDJfZXRjMXNfaW1hZ2VfZGVzYz4gbV9ldGMxc19pbWFnZV9kZXNjczsKKworCQliYXNpc3Q6OmJhc2lzX3RleF9mb3JtYXQgbV9mb3JtYXQ7CisJCQkJCQorCQl1aW50MzJfdCBtX2RmZF9jb2xvcl9tb2RlbDsKKwkJa3R4Ml9kZl9jb2xvcl9wcmltYXJpZXMgbV9kZmRfY29sb3JfcHJpbXM7CisJCXVpbnQzMl90IG1fZGZkX3RyYW5zZmVyX2Z1bmM7CisJCXVpbnQzMl90IG1fZGZkX2ZsYWdzOworCQl1aW50MzJfdCBtX2RmZF9zYW1wbGVzOworCQlrdHgyX2RmX2NoYW5uZWxfaWQgbV9kZmRfY2hhbjAsIG1fZGZkX2NoYW4xOworCQkJCQkJCQkKKwkJYmFzaXN0OjpiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlciBtX2V0YzFzX3RyYW5zY29kZXI7CisJCWJhc2lzdDo6YmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXIgbV91YXN0Y190cmFuc2NvZGVyOworCQkJCQorCQlrdHgyX3RyYW5zY29kZXJfc3RhdGUgbV9kZWZfdHJhbnNjb2Rlcl9zdGF0ZTsKKworCQlib29sIG1faGFzX2FscGhhOworCQlib29sIG1faXNfdmlkZW87CisKKwkJYm9vbCBkZWNvbXByZXNzX2xldmVsX2RhdGEodWludDMyX3QgbGV2ZWxfaW5kZXgsIGJhc2lzdTo6dWludDhfdmVjJiB1bmNvbXBfZGF0YSk7CisJCWJvb2wgZGVjb21wcmVzc19ldGMxc19nbG9iYWxfZGF0YSgpOworCQlib29sIHJlYWRfa2V5X3ZhbHVlcygpOworCX07CisKKyNlbmRpZiAvLyBCQVNJU0RfU1VQUE9SVF9LVFgyCisKKwkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zY29kZXIgd2FzIGNvbXBpbGVkIHdpdGggS1RYMiBzdXBwb3J0LgorCWJvb2wgYmFzaXN1X3RyYW5zY29kZXJfc3VwcG9ydHNfa3R4MigpOworCisJLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc2NvZGVyIHdhcyBjb21waWxlZCB3aXRoIFpzdGFuZGFyZCBzdXBwb3J0LgorCWJvb2wgYmFzaXN1X3RyYW5zY29kZXJfc3VwcG9ydHNfa3R4Ml96c3RkKCk7CisKK30gLy8gbmFtZXNwYWNlIGJhc2lzdQorCisvKioqKiBlbmRlZCBpbmxpbmluZyBiYXNpc3VfdHJhbnNjb2Rlci5oICoqKiovCisjaW5jbHVkZSA8bGltaXRzLmg+CisvKioqKiBzdGFydCBpbmxpbmluZyBiYXNpc3VfY29udGFpbmVyc19pbXBsLmggKioqKi8KKy8vIGJhc2lzdV9jb250YWluZXJzX2ltcGwuaAorLy8gRG8gbm90IGluY2x1ZGUgZGlyZWN0bHkKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6NDEyNykgLy8gd2FybmluZyBDNDEyNzogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAorI2VuZGlmCisKK25hbWVzcGFjZSBiYXNpc3UKK3sKKyAgIGJvb2wgZWxlbWVudGFsX3ZlY3Rvcjo6aW5jcmVhc2VfY2FwYWNpdHkodWludDMyX3QgbWluX25ld19jYXBhY2l0eSwgYm9vbCBncm93X2hpbnQsIHVpbnQzMl90IGVsZW1lbnRfc2l6ZSwgb2JqZWN0X21vdmVyIHBNb3ZlciwgYm9vbCBub2ZhaWwpCisgICB7CisgICAgICBhc3NlcnQobV9zaXplIDw9IG1fY2FwYWNpdHkpOworCisgICAgICBpZiAoc2l6ZW9mKHZvaWQgKikgPT0gc2l6ZW9mKHVpbnQ2NF90KSkKKyAgICAgICAgIGFzc2VydChtaW5fbmV3X2NhcGFjaXR5IDwgKDB4NDAwMDAwMDAwVUxMIC8gZWxlbWVudF9zaXplKSk7CisgICAgICBlbHNlCisgICAgICAgICBhc3NlcnQobWluX25ld19jYXBhY2l0eSA8ICgweDdGRkYwMDAwVSAvIGVsZW1lbnRfc2l6ZSkpOworCisgICAgICBpZiAobV9jYXBhY2l0eSA+PSBtaW5fbmV3X2NhcGFjaXR5KQorICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIHNpemVfdCBuZXdfY2FwYWNpdHkgPSBtaW5fbmV3X2NhcGFjaXR5OworICAgICAgaWYgKChncm93X2hpbnQpICYmICghaGVscGVyczo6aXNfcG93ZXJfb2ZfMigodWludDY0X3QpbmV3X2NhcGFjaXR5KSkpCisgICAgICB7CisgICAgICAgICBuZXdfY2FwYWNpdHkgPSAoc2l6ZV90KWhlbHBlcnM6Om5leHRfcG93MigodWludDY0X3QpbmV3X2NhcGFjaXR5KTsKKworICAgICAgICAgYXNzZXJ0KG5ld19jYXBhY2l0eSAmJiAobmV3X2NhcGFjaXR5ID4gbV9jYXBhY2l0eSkpOworCisgICAgICAgICBpZiAobmV3X2NhcGFjaXR5IDwgbWluX25ld19jYXBhY2l0eSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChub2ZhaWwpCisgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInZlY3RvciB0b28gbGFyZ2VcbiIpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgY29uc3Qgc2l6ZV90IGRlc2lyZWRfc2l6ZSA9IGVsZW1lbnRfc2l6ZSAqIG5ld19jYXBhY2l0eTsKKyAgICAgIHNpemVfdCBhY3R1YWxfc2l6ZSA9IDA7CisgICAgICBpZiAoIXBNb3ZlcikKKyAgICAgIHsKKyAgICAgICAgIHZvaWQqIG5ld19wID0gcmVhbGxvYyhtX3AsIGRlc2lyZWRfc2l6ZSk7CisgICAgICAgICBpZiAoIW5ld19wKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKG5vZmFpbCkKKyAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3ByaW50Zl9zKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ2ZWN0b3I6IHJlYWxsb2MoKSBmYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyIsICh1aW50MzJfdClkZXNpcmVkX3NpemUpOworI2Vsc2UKKyAgICAgICAgICAgIHNwcmludGYoYnVmLCAidmVjdG9yOiByZWFsbG9jKCkgZmFpbGVkIGFsbG9jYXRpbmcgJXUgYnl0ZXMiLCAodWludDMyX3QpZGVzaXJlZF9zaXplKTsKKyNlbmRpZgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGJ1Zik7CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgfQorCisjaWYgQkFTSVNVX1ZFQ1RPUl9ERVRFUk1JTklTVElDCisgICAgICAgICBhY3R1YWxfc2l6ZSA9IGRlc2lyZWRfc2l6ZTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgICAgICBhY3R1YWxfc2l6ZSA9IF9tc2l6ZShuZXdfcCk7CisjZWxpZiBIQVNfTUFMTE9DX1VTQUJMRV9TSVpFCisgICAgICAgICBhY3R1YWxfc2l6ZSA9IG1hbGxvY191c2FibGVfc2l6ZShuZXdfcCk7CisjZWxzZQorICAgICAgICAgYWN0dWFsX3NpemUgPSBkZXNpcmVkX3NpemU7CisjZW5kaWYKKyAgICAgICAgIG1fcCA9IG5ld19wOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdm9pZCogbmV3X3AgPSBtYWxsb2MoZGVzaXJlZF9zaXplKTsKKyAgICAgICAgIGlmICghbmV3X3ApCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAobm9mYWlsKQorICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzcHJpbnRmX3MoYnVmLCBzaXplb2YoYnVmKSwgInZlY3RvcjogbWFsbG9jKCkgZmFpbGVkIGFsbG9jYXRpbmcgJXUgYnl0ZXMiLCAodWludDMyX3QpZGVzaXJlZF9zaXplKTsKKyNlbHNlCisgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgInZlY3RvcjogbWFsbG9jKCkgZmFpbGVkIGFsbG9jYXRpbmcgJXUgYnl0ZXMiLCAodWludDMyX3QpZGVzaXJlZF9zaXplKTsKKyNlbmRpZgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGJ1Zik7CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgfQorCisjaWYgQkFTSVNVX1ZFQ1RPUl9ERVRFUk1JTklTVElDCisgICAgICAgICBhY3R1YWxfc2l6ZSA9IGRlc2lyZWRfc2l6ZTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgICAgICBhY3R1YWxfc2l6ZSA9IF9tc2l6ZShuZXdfcCk7CisjZWxpZiBIQVNfTUFMTE9DX1VTQUJMRV9TSVpFCisgICAgICAgICBhY3R1YWxfc2l6ZSA9IG1hbGxvY191c2FibGVfc2l6ZShuZXdfcCk7CisjZWxzZQorICAgICAgICAgYWN0dWFsX3NpemUgPSBkZXNpcmVkX3NpemU7CisjZW5kaWYKKworICAgICAgICAgKCpwTW92ZXIpKG5ld19wLCBtX3AsIG1fc2l6ZSk7CisKKyAgICAgICAgIGlmIChtX3ApCisgICAgICAgICAgICBmcmVlKG1fcCk7CisgICAgICAgICAKKyAgICAgICAgIG1fcCA9IG5ld19wOworICAgICAgfQorCisgICAgICBpZiAoYWN0dWFsX3NpemUgPiBkZXNpcmVkX3NpemUpCisgICAgICAgICBtX2NhcGFjaXR5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFjdHVhbF9zaXplIC8gZWxlbWVudF9zaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIG1fY2FwYWNpdHkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obmV3X2NhcGFjaXR5KTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyNpZiBCQVNJU1VfSEFTSE1BUF9URVNUCisKKyNkZWZpbmUgSEFTSE1BUF9URVNUX1ZFUklGWShjKSBkbyB7IGlmICghKGMpKSBoYW5kbGVfaGFzaG1hcF90ZXN0X3ZlcmlmeV9mYWlsdXJlKF9fTElORV9fKTsgfSB3aGlsZSgwKQorCisgICBzdGF0aWMgdm9pZCBoYW5kbGVfaGFzaG1hcF90ZXN0X3ZlcmlmeV9mYWlsdXJlKGludCBsaW5lKQorICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJIQVNITUFQX1RFU1RfVkVSSUZZKCkgZmFpbGQgb24gbGluZSAlaVxuIiwgbGluZSk7CisgICAgICBhYm9ydCgpOworICAgfQorCisgICBjbGFzcyBjb3VudGVkX29iagorICAgeworICAgcHVibGljOgorICAgICAgY291bnRlZF9vYmoodWludDMyX3QgdiA9IDApIDoKKyAgICAgICAgIG1fdmFsKHYpCisgICAgICB7CisgICAgICAgICBtX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGNvdW50ZWRfb2JqKGNvbnN0IGNvdW50ZWRfb2JqJiBvYmopIDoKKyAgICAgICAgIG1fdmFsKG9iai5tX3ZhbCkKKyAgICAgIHsKKyAgICAgICAgIG1fY291bnQrKzsKKyAgICAgIH0KKworICAgICAgfmNvdW50ZWRfb2JqKCkKKyAgICAgIHsKKyAgICAgICAgIGFzc2VydChtX2NvdW50ID4gMCk7CisgICAgICAgICBtX2NvdW50LS07CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB1aW50MzJfdCBtX2NvdW50OworCisgICAgICB1aW50MzJfdCBtX3ZhbDsKKworICAgICAgb3BlcmF0b3Igc2l6ZV90KCkgY29uc3QgeyByZXR1cm4gbV92YWw7IH0KKworICAgICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBjb3VudGVkX29iaiYgcmhzKSBjb25zdCB7IHJldHVybiBtX3ZhbCA9PSByaHMubV92YWw7IH0KKyAgICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgdWludDMyX3QgcmhzKSBjb25zdCB7IHJldHVybiBtX3ZhbCA9PSByaHM7IH0KKworICAgfTsKKworICAgdWludDMyX3QgY291bnRlZF9vYmo6Om1fY291bnQ7CisKKyAgIHN0YXRpYyB1aW50MzJfdCB1cmFuZDMyKCkKKyAgIHsKKyAgICAgIHVpbnQzMl90IGEgPSByYW5kKCk7CisgICAgICB1aW50MzJfdCBiID0gcmFuZCgpIDw8IDE1OworICAgICAgdWludDMyX3QgYyA9IHJhbmQoKSA8PCAoMzIgLSAxNSk7CisgICAgICByZXR1cm4gYSBeIGIgXiBjOworICAgfQorCisgICBzdGF0aWMgaW50IGlyYW5kMzIoaW50IGwsIGludCBoKQorICAgeworICAgICAgYXNzZXJ0KGwgPCBoKTsKKyAgICAgIGlmIChsID49IGgpCisgICAgICAgICByZXR1cm4gbDsKKworICAgICAgdWludDMyX3QgcmFuZ2UgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaCAtIGwpOworCisgICAgICB1aW50MzJfdCBybmQgPSB1cmFuZDMyKCk7CisKKyAgICAgIHVpbnQzMl90IHJuZF9yYW5nZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigoKCh1aW50NjRfdClyYW5nZSkgKiAoKHVpbnQ2NF90KXJuZCkpID4+IDMyVSk7CisKKyAgICAgIGludCByZXN1bHQgPSBsICsgcm5kX3JhbmdlOworICAgICAgYXNzZXJ0KChyZXN1bHQgPj0gbCkgJiYgKHJlc3VsdCA8IGgpKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisKKyAgIHZvaWQgaGFzaF9tYXBfdGVzdCgpCisgICB7CisgICAgICB7CisgICAgICAgICBiYXNpc3U6Omhhc2hfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4gazsKKyAgICAgICAgIGJhc2lzdTo6aGFzaF9tYXA8dWludDY0X3QsIHVpbnQ2NF90PiBsOworICAgICAgICAgc3RkOjpzd2FwKGssIGwpOworCisgICAgICAgICBrLmJlZ2luKCk7CisgICAgICAgICBrLmVuZCgpOworICAgICAgICAgay5jbGVhcigpOworICAgICAgICAgay5lbXB0eSgpOworICAgICAgICAgay5lcmFzZSgwKTsKKyAgICAgICAgIGsuaW5zZXJ0KDAsIDEpOworICAgICAgICAgay5maW5kKDApOworICAgICAgICAgay5nZXRfZXF1YWxzKCk7CisgICAgICAgICBrLmdldF9oYXNoZXIoKTsKKyAgICAgICAgIGsuZ2V0X3RhYmxlX3NpemUoKTsKKyAgICAgICAgIGsucmVzZXQoKTsKKyAgICAgICAgIGsucmVzZXJ2ZSgxKTsKKyAgICAgICAgIGsgPSBsOworICAgICAgICAgay5zZXRfZXF1YWxzKGwuZ2V0X2VxdWFscygpKTsKKyAgICAgICAgIGsuc2V0X2hhc2hlcihsLmdldF9oYXNoZXIoKSk7CisgICAgICAgICBrLmdldF90YWJsZV9zaXplKCk7CisgICAgICB9CisKKyAgICAgIHVpbnQzMl90IHNlZWQgPSAwOworICAgICAgZm9yICg7IDsgKQorICAgICAgeworICAgICAgICAgc2VlZCsrOworCisgICAgICAgICB0eXBlZGVmIGJhc2lzdTo6aGFzaF9tYXA8Y291bnRlZF9vYmosIGNvdW50ZWRfb2JqPiBteV9oYXNoX21hcDsKKyAgICAgICAgIG15X2hhc2hfbWFwIG07CisKKyAgICAgICAgIGNvbnN0IHVpbnQzMl90IG4gPSBpcmFuZDMyKDAsIDEwMDAwMCk7CisKKyAgICAgICAgIHByaW50ZigiJXVcbiIsIG4pOworCisgICAgICAgICBzcmFuZChzZWVkKTsgLy8gcjEuc2VlZChzZWVkKTsKKworICAgICAgICAgYmFzaXN1Ojp2ZWN0b3I8aW50PiBxOworCisgICAgICAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdiA9IHVyYW5kMzIoKSAmIDB4N0ZGRkZGRkY7CisgICAgICAgICAgICBteV9oYXNoX21hcDo6aW5zZXJ0X3Jlc3VsdCByZXMgPSBtLmluc2VydChjb3VudGVkX29iaih2KSwgY291bnRlZF9vYmoodiBeIDB4ZGVhZGJlZWYpKTsKKyAgICAgICAgICAgIGlmIChyZXMuc2Vjb25kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgIHEucHVzaF9iYWNrKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBIQVNITUFQX1RFU1RfVkVSSUZZKG0uc2l6ZSgpID09IGNvdW50KTsKKworICAgICAgICAgc3JhbmQoc2VlZCk7CisKKyAgICAgICAgIG15X2hhc2hfbWFwIGNtKG0pOworICAgICAgICAgbS5jbGVhcigpOworICAgICAgICAgbSA9IGNtOworICAgICAgICAgY20ucmVzZXQoKTsKKworICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHYgPSB1cmFuZDMyKCkgJiAweDdGRkZGRkZGOworICAgICAgICAgICAgbXlfaGFzaF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbS5maW5kKGNvdW50ZWRfb2JqKHYpKTsKKyAgICAgICAgICAgIEhBU0hNQVBfVEVTVF9WRVJJRlkoaXQgIT0gbS5lbmQoKSk7CisgICAgICAgICAgICBIQVNITUFQX1RFU1RfVkVSSUZZKGl0LT5maXJzdCA9PSB2KTsKKyAgICAgICAgICAgIEhBU0hNQVBfVEVTVF9WRVJJRlkoaXQtPnNlY29uZCA9PSAodiBeIDB4ZGVhZGJlZWYpKTsKKyAgICAgICAgIH0KKworICAgICAgICAgZm9yICh1aW50MzJfdCB0ID0gMDsgdCA8IDI7IHQrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG5kID0gaXJhbmQzMigxLCBxLnNpemUoKSArIDEpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5kOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB1aW50MzJfdCBwID0gaXJhbmQzMigwLCBxLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgIGludCBrID0gcVtwXTsKKyAgICAgICAgICAgICAgIGlmIChrID49IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBxW3BdID0gLWsgLSAxOworCisgICAgICAgICAgICAgICAgICBib29sIHMgPSBtLmVyYXNlKGNvdW50ZWRfb2JqKGspKTsKKyAgICAgICAgICAgICAgICAgIEhBU0hNQVBfVEVTVF9WRVJJRlkocyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHR5cGVkZWYgYmFzaXN1OjpoYXNoX21hcDx1aW50MzJfdCwgZW1wdHlfdHlwZT4gdWludF9oYXNoX3NldDsKKyAgICAgICAgICAgIHVpbnRfaGFzaF9zZXQgczsKKworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHEuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgdiA9IHFbaV07CisKKyAgICAgICAgICAgICAgIGlmICh2ID49IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBteV9oYXNoX21hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtLmZpbmQoY291bnRlZF9vYmoodikpOworICAgICAgICAgICAgICAgICAgSEFTSE1BUF9URVNUX1ZFUklGWShpdCAhPSBtLmVuZCgpKTsKKyAgICAgICAgICAgICAgICAgIEhBU0hNQVBfVEVTVF9WRVJJRlkoaXQtPmZpcnN0ID09ICh1aW50MzJfdCl2KTsKKyAgICAgICAgICAgICAgICAgIEhBU0hNQVBfVEVTVF9WRVJJRlkoaXQtPnNlY29uZCA9PSAoKHVpbnQzMl90KXYgXiAweGRlYWRiZWVmKSk7CisKKyAgICAgICAgICAgICAgICAgIHMuaW5zZXJ0KHYpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbXlfaGFzaF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbS5maW5kKGNvdW50ZWRfb2JqKC12IC0gMSkpOworICAgICAgICAgICAgICAgICAgSEFTSE1BUF9URVNUX1ZFUklGWShpdCA9PSBtLmVuZCgpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgZm91bmRfY291bnQgPSAwOworICAgICAgICAgICAgZm9yIChteV9oYXNoX21hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtLmJlZ2luKCk7IGl0ICE9IG0uZW5kKCk7ICsraXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBIQVNITUFQX1RFU1RfVkVSSUZZKGl0LT5zZWNvbmQgPT0gKCh1aW50MzJfdClpdC0+Zmlyc3QgXiAweGRlYWRiZWVmKSk7CisKKyAgICAgICAgICAgICAgIHVpbnRfaGFzaF9zZXQ6OmNvbnN0X2l0ZXJhdG9yIGZpdChzLmZpbmQoKHVpbnQzMl90KWl0LT5maXJzdCkpOworICAgICAgICAgICAgICAgSEFTSE1BUF9URVNUX1ZFUklGWShmaXQgIT0gcy5lbmQoKSk7CisKKyAgICAgICAgICAgICAgIEhBU0hNQVBfVEVTVF9WRVJJRlkoZml0LT5maXJzdCA9PSBpdC0+Zmlyc3QpOworCisgICAgICAgICAgICAgICBmb3VuZF9jb3VudCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBIQVNITUFQX1RFU1RfVkVSSUZZKGZvdW5kX2NvdW50ID09IHMuc2l6ZSgpKTsKKyAgICAgICAgIH0KKworICAgICAgICAgSEFTSE1BUF9URVNUX1ZFUklGWShjb3VudGVkX29iajo6bV9jb3VudCA9PSBtLnNpemUoKSAqIDIpOworICAgICAgfQorICAgfQorCisjZW5kaWYgLy8gQkFTSVNVX0hBU0hNQVBfVEVTVAorCit9IC8vIG5hbWVzcGFjZSBiYXNpc3UKKy8qKioqIGVuZGVkIGlubGluaW5nIGJhc2lzdV9jb250YWluZXJzX2ltcGwuaCAqKioqLworCisjaWZuZGVmIEJBU0lTRF9JU19CSUdfRU5ESUFOCiAvLyBUT0RPOiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBPU1guIEhvdyBjYW4gdGhpcyBiZSBzbyBkaWZmaWN1bHQ/CiAvLyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9fKSB8fCBkZWZpbmVkKF9CSUdfRU5ESUFOKSB8fCBkZWZpbmVkKEJJR19FTkRJQU4pCi0vLwkjZGVmaW5lIElTX0JJR19FTkRJQU4gKDEpCisvLwkjZGVmaW5lIEJBU0lTRF9JU19CSUdfRU5ESUFOICgxKQogLy8jZWxzZQotCSNkZWZpbmUgSVNfQklHX0VORElBTiAoMCkKKwkjZGVmaW5lIEJBU0lTRF9JU19CSUdfRU5ESUFOICgwKQogLy8jZW5kaWYKICNlbmRpZgogCi0jaWZuZGVmIFVTRV9VTkFMSUdORURfV09SRF9SRUFEUwotI2RlZmluZSBVU0VfVU5BTElHTkVEX1dPUkRfUkVBRFMgKDEpCisjaWZuZGVmIEJBU0lTRF9VU0VfVU5BTElHTkVEX1dPUkRfUkVBRFMKKwkjaWZkZWYgX19FTVNDUklQVEVOX18KKwkJLy8gQ2FuJ3QgdXNlIHVuYWxpZ25lZCBsb2Fkcy9zdG9yZXMgd2l0aCBXZWJBc3NlbWJseS4KKwkJI2RlZmluZSBCQVNJU0RfVVNFX1VOQUxJR05FRF9XT1JEX1JFQURTICgwKQorCSNlbGlmIGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCQkjZGVmaW5lIEJBU0lTRF9VU0VfVU5BTElHTkVEX1dPUkRfUkVBRFMgKDEpCisJI2Vsc2UKKwkJI2RlZmluZSBCQVNJU0RfVVNFX1VOQUxJR05FRF9XT1JEX1JFQURTICgwKQorCSNlbmRpZgogI2VuZGlmCiAKICNkZWZpbmUgQkFTSVNEX1NVUFBPUlRFRF9CQVNJU19WRVJTSU9OICgweDEzKQogCisjaWZuZGVmIEJBU0lTRF9TVVBQT1JUX0tUWDIKKwkjZXJyb3IgTXVzdCBoYXZlIGRlZmluZWQgQkFTSVNEX1NVUFBPUlRfS1RYMgorI2VuZGlmCisKKyNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfS1RYMl9aU1RECisjZXJyb3IgTXVzdCBoYXZlIGRlZmluZWQgQkFTSVNEX1NVUFBPUlRfS1RYMl9aU1RECisjZW5kaWYKKwogLy8gU2V0IHRvIDEgZm9yIGZ1enogdGVzdGluZy4gVGhpcyB3aWxsIGRpc2FibGUgYWxsIENSQzE2IGNoZWNrcyBvbiBoZWFkZXJzIGFuZCBjb21wcmVzc2VkIGRhdGEuCiAjaWZuZGVmIEJBU0lTVV9OT19IRUFERVJfT1JfREFUQV9DUkMxNl9DSEVDS1MKLSNkZWZpbmUgQkFTSVNVX05PX0hFQURFUl9PUl9EQVRBX0NSQzE2X0NIRUNLUyAwCisJI2RlZmluZSBCQVNJU1VfTk9fSEVBREVSX09SX0RBVEFfQ1JDMTZfQ0hFQ0tTIDAKICNlbmRpZgogCiAjaWZuZGVmIEJBU0lTRF9TVVBQT1JUX0RYVDEKLSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfRFhUMSAxCisJI2RlZmluZSBCQVNJU0RfU1VQUE9SVF9EWFQxIDEKICNlbmRpZgogCiAjaWZuZGVmIEJBU0lTRF9TVVBQT1JUX0RYVDVBCi0jZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0RYVDVBIDEKKwkjZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0RYVDVBIDEKICNlbmRpZgogCiAvLyBEaXNhYmxlIGFsbCBCQzcgdHJhbnNjb2RlcnMgaWYgbmVjZXNzYXJ5ICh1c2VmdWwgd2hlbiBjcm9zcyBjb21waWxpbmcgdG8gSmF2YXNjcmlwdCkKICNpZiBkZWZpbmVkKEJBU0lTRF9TVVBQT1JUX0JDNykgJiYgIUJBU0lTRF9TVVBQT1JUX0JDNwogCSNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfQkM3X01PREU1Ci0JI2RlZmluZSBCQVNJU0RfU1VQUE9SVF9CQzdfTU9ERTUgMAorCQkjZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0JDN19NT0RFNSAwCiAJI2VuZGlmCiAjZW5kaWYgLy8gIUJBU0lTRF9TVVBQT1JUX0JDNwogCiAvLyBCQzcgbW9kZSA1IHN1cHBvcnRzIGJvdGggb3BhcXVlIGFuZCBvcGFxdWUrYWxwaGEgdGV4dHVyZXMsIGFuZCB1c2VzIGxlc3MgbWVtb3J5IEJDMS4KICNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfQkM3X01PREU1Ci0jZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0JDN19NT0RFNSAxCisJI2RlZmluZSBCQVNJU0RfU1VQUE9SVF9CQzdfTU9ERTUgMQogI2VuZGlmCiAKICNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfUFZSVEMxCi0jZGVmaW5lIEJBU0lTRF9TVVBQT1JUX1BWUlRDMSAxCisJI2RlZmluZSBCQVNJU0RfU1VQUE9SVF9QVlJUQzEgMQogI2VuZGlmCiAKICNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfRVRDMl9FQUNfQTgKLSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfRVRDMl9FQUNfQTggMQorCSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfRVRDMl9FQUNfQTggMQogI2VuZGlmCiAKIC8vIFNldCBCQVNJU0RfU1VQUE9SVF9VQVNUQyB0byAwIHRvIGNvbXBsZXRlbHkgZGlzYWJsZSBzdXBwb3J0IGZvciB0cmFuc2NvZGluZyBVQVNUQyBmaWxlcy4KICNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfVUFTVEMKLSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfVUFTVEMgMQorCSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfVUFTVEMgMQogI2VuZGlmCiAKICNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfQVNUQwotI2RlZmluZSBCQVNJU0RfU1VQUE9SVF9BU1RDIDEKKwkjZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0FTVEMgMQogI2VuZGlmCiAKIC8vIE5vdGUgdGhhdCBpZiBCQVNJU0RfU1VQUE9SVF9BVEMgaXMgZW5hYmxlZCwgQkFTSVNEX1NVUFBPUlRfRFhUNUEgc2hvdWxkIGFsc28gYmUgZW5hYmxlZCBmb3IgYWxwaGEgc3VwcG9ydC4KICNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfQVRDCi0jZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0FUQyAxCisJI2RlZmluZSBCQVNJU0RfU1VQUE9SVF9BVEMgMQogI2VuZGlmCiAKIC8vIFN1cHBvcnQgZm9yIEVUQzIgRUFDIFIxMSBhbmQgRVRDMiBFQUMgUkcxMQogI2lmbmRlZiBCQVNJU0RfU1VQUE9SVF9FVEMyX0VBQ19SRzExCi0jZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0VUQzJfRUFDX1JHMTEgMQorCSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfRVRDMl9FQUNfUkcxMSAxCiAjZW5kaWYKIAogLy8gSWYgQkFTSVNEX1NVUFBPUlRfQVNUQ19ISUdIRVJfT1BBUVVFX1FVQUxJVFkgaXMgMSwgb3BhcXVlIGJsb2NrcyB3aWxsIGJlIHRyYW5zY29kZWQgdG8gQVNUQyBhdCBzbGlnaHRseSBoaWdoZXIgcXVhbGl0eSAoaGlnaGVyIHRoYW4gQkMxKSwgYnV0IHRoZSB0cmFuc2NvZGVyIHRhYmxlcyB3aWxsIGJlIDJ4IGFzIGxhcmdlLgpAQCAtMTM0LDIzICs1MDg4LDIzIEBACiAjZW5kaWYKIAogI2lmbmRlZiBCQVNJU0RfU1VQUE9SVF9GWFQxCi0jZGVmaW5lIEJBU0lTRF9TVVBQT1JUX0ZYVDEgMQorCSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfRlhUMSAxCiAjZW5kaWYKIAogI2lmbmRlZiBCQVNJU0RfU1VQUE9SVF9QVlJUQzIKLSNkZWZpbmUgQkFTSVNEX1NVUFBPUlRfUFZSVEMyIDEKKwkjZGVmaW5lIEJBU0lTRF9TVVBQT1JUX1BWUlRDMiAxCiAjZW5kaWYKIAogI2lmIEJBU0lTRF9TVVBQT1JUX1BWUlRDMgotI2lmICFCQVNJU0RfU1VQUE9SVF9BVEMKLSNlcnJvciBCQVNJU0RfU1VQUE9SVF9BVEMgbXVzdCBiZSAxIGlmIEJBU0lTRF9TVVBQT1JUX1BWUlRDMiBpcyAxCi0jZW5kaWYKKwkjaWYgIUJBU0lTRF9TVVBQT1JUX0FUQworCQkjZXJyb3IgQkFTSVNEX1NVUFBPUlRfQVRDIG11c3QgYmUgMSBpZiBCQVNJU0RfU1VQUE9SVF9QVlJUQzIgaXMgMQorCSNlbmRpZgogI2VuZGlmCiAKICNpZiBCQVNJU0RfU1VQUE9SVF9BVEMKLSNpZiAhQkFTSVNEX1NVUFBPUlRfRFhUNUEKLSNlcnJvciBCQVNJU0RfU1VQUE9SVF9EWFQ1QSBtdXN0IGJlIDEgaWYgQkFTSVNEX1NVUFBPUlRfQVRDIGlzIDEKLSNlbmRpZgorCSNpZiAhQkFTSVNEX1NVUFBPUlRfRFhUNUEKKwkJI2Vycm9yIEJBU0lTRF9TVVBQT1JUX0RYVDVBIG11c3QgYmUgMSBpZiBCQVNJU0RfU1VQUE9SVF9BVEMgaXMgMQorCSNlbmRpZgogI2VuZGlmCiAKICNkZWZpbmUgQkFTSVNEX1dSSVRFX05FV19CQzdfTU9ERTVfVEFCTEVTCQkJMApAQCAtMTYxLDcgKzUxMTUsMTggQEAKICNkZWZpbmUgQkFTSVNEX1dSSVRFX05FV19FVEMyX0VBQ19SMTFfVEFCTEVTCQkwCiAKICNpZm5kZWYgQkFTSVNEX0VOQUJMRV9ERUJVR19GTEFHUwotI2RlZmluZSBCQVNJU0RfRU5BQkxFX0RFQlVHX0ZMQUdTCTAKKwkjZGVmaW5lIEJBU0lTRF9FTkFCTEVfREVCVUdfRkxBR1MJMAorI2VuZGlmCisKKy8vIElmIEtUWDIgc3VwcG9ydCBpcyBlbmFibGVkLCB3ZSBtYXkgbmVlZCBac3RkIGZvciBkZWNvbXByZXNzaW9uIG9mIHN1cGVyY29tcHJlc3NlZCBVQVNUQyBmaWxlcy4gSW5jbHVkZSB0aGlzIGhlYWRlci4KKyNpZiBCQVNJU0RfU1VQUE9SVF9LVFgyCisgICAvLyBJZiBCQVNJU0RfU1VQUE9SVF9LVFgyX1pTVEQgaXMgMCwgVUFTVEMgZmlsZXMgY29tcHJlc3NlZCB3aXRoIFpzdGQgY2Fubm90IGJlIGxvYWRlZC4KKwkjaWYgQkFTSVNEX1NVUFBPUlRfS1RYMl9aU1RECisJCS8vIFdlIG9ubHkgdXNlIHR3byBac3RkIEFQSSdzOiBaU1REX2RlY29tcHJlc3MoKSBhbmQgWlNURF9pc0Vycm9yKCkKKy8qKioqIHN0YXJ0IGlubGluaW5nIHpzdGQgKioqKi8KKyNlcnJvciBVbmFibGUgdG8gZmluZCAienN0ZCIKKy8qKioqIGVuZGVkIGlubGluaW5nIHpzdGQgKioqKi8KKwkjZW5kaWYKICNlbmRpZgogCiBuYW1lc3BhY2UgYmFzaXN1CkBAIC0yMjcsNyArNTE5Miw3IEBACiAJewogCQljcmMgPSB+Y3JjOwogCi0JCWNvbnN0IHVpbnQ4X3QqIHAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyKTsKKwkJY29uc3QgdWludDhfdCogcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihyKTsKIAkJZm9yICg7IHNpemU7IC0tc2l6ZSkKIAkJewogCQkJY29uc3QgdWludDE2X3QgcSA9ICpwKysgXiAoY3JjID4+IDgpOwpAQCAtMjM3LDMwNSArNTIwMiw3IEBACiAKIAkJcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90Pih+Y3JjKTsKIAl9Ci0KLQljb25zdCB1aW50MzJfdCBnX2dsb2JhbF9zZWxlY3Rvcl9jYltdID0KLS8qKioqIHN0YXJ0IGlubGluaW5nIGJhc2lzdV9nbG9iYWxfc2VsZWN0b3JfY2IuaCAqKioqLwotLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgQmlub21pYWwgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0weDAsIDB4NTA1LCAweDU1NTUsIDB4NUY1RiwgMHg1MDU1MDUwLCAweDUwNTVGNUYsIDB4NTBBQUE1NTEsIDB4RkFBNUE1QUEsIDB4NkFBQTUwOTUsIDB4NDFFNkZCQUIsIDB4MTlBRTk5RjUsIDB4MTA1N0FBQTQsIDB4NTQwMDVBMUEsIDB4NDQ1OUFFQUYsIDB4NTYwMTVCLCAweEJBQTlBNTU0LAotMHg0MzM1RTVFMCwgMHhEOUZFNUZCQiwgMHgyNTI1MjU2QSwgMHg5QUU4OTIsIDB4QzBENUZBRjUsIDB4NUJBNUU2NDEsIDB4N0VERUM4QjgsIDB4QkI2NzEyMTEsIDB4NEM5ODQ0RUUsIDB4RUUwNDI0MTUsIDB4RTU2NjNFQUUsIDB4OTA5MDkwOTEsIDB4QUFBNDVBRkYsIDB4MTU1NTZFMUQsIDB4QTY5NTkxOTUsIDB4NEJGRjhCRiwKLTB4NTE2NkFBRiwgMHgxNTQ5MDA2NSwgMHg2RjVCQUZBRiwgMHhGRjAwRkYwMCwgMHhEOTY5NTZBQSwgMHgxNUFGNkIsIDB4RkY1QTAwQUEsIDB4RTBFNTU3QUEsIDB4MUE2RjE5QkQsIDB4Njk2NTU1NTUsIDB4RDA1MDAxNTgsIDB4RUVFREQ4OTQsIDB4RTRFNEZFLCAweEM3MUI3QjEwLCAweDU1QUE1QUFGLCAweDUwQUE1OUJFLAotMHhFNEU5OTBFNCwgMHg1MzUzQjYzQiwgMHhGRUU1RDBFNCwgMHg5NkFGMDUxQSwgMHgzQ0M5NUE2LCAweDcwQjVBNDBELCAweDk1MDQxOTZFLCAweDRBMEJEN0EzLCAweDExQjg5NTkyLCAweEFBRkY0MDk1LCAweDU1QTVENEUwLCAweEJCQTU1MDUwLCAweDExMTE2NjYsIDB4QTU1NDQwMDAsIDB4RUQ5OTQ0NDQsIDB4NUE1NkJGLAotMHg5NEE5NTRCOSwgMHhGQjY1MTAwMCwgMHg2MDRFNjMzRSwgMHgxNDI5MUExNSwgMHg1Njk2NTk1NiwgMHhCOEUwRDBDMCwgMHg1QTU2NUE1NSwgMHg2NUE2MUE2QSwgMHhFNDkwRjk5MCwgMHhDQTg3QUFGNSwgMHg2MDYwQTBCLCAweDI0QzIzMTQzLCAweDU1QUE5QTQwLCAweDUwNUUxNjA1LCAweENFQzA0ODZFLCAweDE1NkU1NUVBLAotMHg3OTk3OEIwQiwgMHg0NTk1RjUzQywgMHg0MDVDNEFGNywgMHhDMTg5N0Q3NSwgMHhENUY0MEJBNiwgMHg5NTQ0NDAxNywgMHgxNEFENjkzNSwgMHg4N0M3QTdCRCwgMHg0QTRFODU5NywgMHhGRjFEN0U1NSwgMHg0NTE0MDBGOSwgMHgxMTEyMjc3QiwgMHg5QTA1OTBGOCwgMHg1M0UzNDkyRSwgMHhFNTkwRTk5NSwgMHg3RTczMEE5QSwKLTB4OTI5Njk3RTcsIDB4MkU3ODE2MDksIDB4RTIyMzE3QTEsIDB4RURFOUQ4ODQsIDB4RERENzVDREQsIDB4QUYxQjZGMUEsIDB4RTY5MDkwNDcsIDB4QTc3REFENUQsIDB4MTg0QzBENUQsIDB4RkFCNTYwMTAsIDB4NUVBNEYxRDAsIDB4MTExNjZCNkIsIDB4RjUxQTdBRDYsIDB4Rjc5OTUwRjQsIDB4MUI2QjFCMTEsIDB4OUE2RDY0NjksCi0weDQ0MTk5N0UsIDB4NDU0Njg2OUEsIDB4OTVBQTY5NjUsIDB4MTU1QTZBLCAweDZFNjhCMEU2LCAweDVBNTVBNjY1LCAweDFCMDUxNjA1LCAweDYwMUQ4QkU2LCAweEJEMkYxQjA2LCAweDQwOUE0MjlCLCAweDIzMjcyNzIxLCAweEIwNzQ1NEE5LCAweDdFNjZBM0ExLCAweDFCNkE1NTAwLCAweEEwRTBGNUE2LCAweEJGNUEwNTAwLAotMHg1NUE1QTlBOSwgMHg5OUQ5RTk5NSwgMHhFNDQwNTY2RiwgMHg2NTUwQkU5OSwgMHgyMjY3Nzc3QiwgMHhGQTUwRkU1MCwgMHhBNjU3QjQ0MSwgMHhCNEUyOTM0MywgMHg1NTUwOTBFNSwgMHg0NTQ2NUI2QiwgMHhFNjU0RTYsIDB4RUE5MDQ2OUIsIDB4MkUwNUQyRjQsIDB4OTk1OTQ0NDQsIDB4RjFDMjA3NDYsIDB4Mjk1QUQyRTAsCi0weEY5OTBFQTk1LCAweDgwNDQ1OUFFLCAweEE5OTk5ODk0LCAweDFGNDFFNEE1LCAweDQwNDBFNUU1LCAweDU0ODFFMUYyLCAweDJBRkY1OUYxLCAweDZCNkIxNzEyLCAweEE3MTMxMDUxLCAweEY5NDA2RjE2LCAweDFCMkI1QjlFLCAweDU4N0UwRjJGLCAweDU0N0UxOTE5LCAweEQwRjU2NDVCLCAweEIxQjFCMUIsIDB4NTc1NkE0RkUsCi0weDQ2QTlCOTY1LCAweDE1MjlGOTlELCAweEU0OTBFNDkwLCAweDQ0OTVGRSwgMHg5ODVFMEIwNiwgMHg1RkQyRDIzQSwgMHg1RDBFOTVBLCAweEY2OTEwM0Y0LCAweDQwMjk3OTAsIDB4MUIwNjJGMUIsIDB4RUU1OTQ1MDAsIDB4QjY1MzlCNUEsIDB4MTA2MTY1QkEsIDB4RDI2QjdDOEQsIDB4OEIyQTI1QTUsIDB4NTVFQUQ1RTMsCi0weDQzMUZCOEUxLCAweEJFQjRFNjQ2LCAweDlBNUE0NTQ1LCAweDUwMTVBNkIsIDB4OTBENEI4M0QsIDB4REI4QTk5QTQsIDB4OUU4OTQ5MDUsIDB4REQ3RDExMDEsIDB4QTk1RTAwQkYsIDB4NTc5RkE1QTUsIDB4QTI5MkQxNDUsIDB4OTMyOTJDOTYsIDB4RjlBOTk1QTUsIDB4QkZFOEE0NTAsIDB4Qjk5MEQxNUIsIDB4NDVEMUUwMUEsCi0weDRCRDNGNzY3LCAweEYyNDM0NzlBLCAweDdFNDIwOTI3LCAweEY5RTVFMDkwLCAweEExQzg2OUYsIDB4MjUzQTM2LCAweDlCQUI1NjlBLCAweDQxNDcwMzFGLCAweEEwNTlBRkUsIDB4RTBENjU5MEYsIDB4RDVFQUQ1RTYsIDB4OUE0QjQ2NDEsIDB4NUFBQTQ0MDYsIDB4NTVFQTkwRTQsIDB4MTAxNzlCQzQsIDB4NDQ0ODU5OTksCi0weDUxNTYyNTNFLCAweDFGMjlFMDU0LCAweENEREFBNzczLCAweDU2MDFBQjA1LCAweDk0RkM5NEMwLCAweDExNjE2NkJCLCAweEJGOTY0MDA2LCAweDQxNDE5NkVCLCAweDg0OThEOUVELCAweEI1RTA4Njg3LCAweEJENTY0MTUwLCAweDJCOEQ5REY4LCAweDdGMTIwMTdFLCAweDkwOTA0NzQ3LCAweDUwQjU2QUIsIDB4REJEMTk0OTAsCi0weEJCNUE1NjU5LCAweEJBRjQwRTQsIDB4NkQ2NDkwMTQsIDB4MUQyOTE2NkYsIDB4NDE0RjNENzUsIDB4NkY5Mjk1NDAsIDB4NTY1QUFGMDUsIDB4QkQ5ODg0RTUsIDB4RjUzNDJBMjUsIDB4MTU3OTE1QUUsIDB4MUEwNTVBNTUsIDB4OTAxOUExOUYsIDB4NjRCOTZBMDUsIDB4MzU2ODlDQ0MsIDB4OTk2MDEyRTIsIDB4NTI1MjY3N0IsCi0weDE1NkFBNDAxLCAweDI1QkNFNDgzLCAweEFBNjY1NTU1LCAweEQ2QUY0QjBGLCAweDNGNEJCREUwLCAweDk0MDRBOUFGLCAweEE1OTBGOUU0LCAweDgxOTFBNUZELCAweDU2ODE5MEI0LCAweDU5MUE2NjE2LCAweDkyQzExRDNFLCAweDk3RDJFNUZDLCAweEY1QTU1QTZGLCAweEJFRTA5NjlCLCAweDg5MThCNENBLCAweEUwOTE1Mzk3LAotMHg1MjQzNDcyRiwgMHg5NUVBNDA1NSwgMHg1NUU2RTBBNCwgMHg5QUVCRDE4MSwgMHhGNEEyNTM1NywgMHgxMTExNTY2NiwgMHhGRTQ1RkYwQSwgMHg4QkM3RDJFMSwgMHg4MDA1NTZCQiwgMHg3NTdENkE5NiwgMHhGQTkwOUE1QiwgMHg2ODk2MkZEQiwgMHhFQjAwNTZBQSwgMHg2OTk3MDI0MSwgMHhBQTU4QUQ2NCwgMHhDNEQ5REVENSwKLTB4NUE1QkYyRjAsIDB4QkQwOTA1QjQsIDB4MTk3RDc4MDEsIDB4ODk4N0VEQzQsIDB4RkY0MDU2NUEsIDB4NDYwOTc4QTQsIDB4RTQwNjdGRTQsIDB4NURBMjMxNTMsIDB4QjkwNTY1QUUsIDB4NUUxNEI5NDYsIDB4NEUzNTg3OUYsIDB4QzcyRjg2NjYsIDB4MTgxNjQ3MkYsIDB4OUE1QTQ5NDksIDB4NjRBMEQxRTUsIDB4QzcwMjVCMUEsCi0weDFCMDYxQjU1LCAweEZGQUEwNTFCLCAweEFGNURFREExLCAweEFBOTU1MDk0LCAweDY2NTk5NjVBLCAweDk5QTk1REFELCAweDk0NTBBNUE1LCAweEE1NTBBNTk1LCAweDY5MTRCOTUwLCAweEVGNDU0OTQ0LCAweDkwNkJCOTkwLCAweEQ2ODA5NDRCLCAweEUwOTE0NjFCLCAweDUzNjNCN0JCLCAweEYwNzQzOTA2LCAweDY2NTY2QTY5LAotMHg0Qjg1RDBCQywgMHg0MEU0OTRBNSwgMHgxMTYxQjZCNiwgMHg1MTlCRDU5LCAweDU5OTg0MDEsIDB4MTY1MUYyNkIsIDB4NTcwOUJCMUIsIDB4NkFFMUQxQjksIDB4RDE5Mjk3QkYsIDB4MUE2OUZFRTQsIDB4NjA2NkI1QSwgMHg3NEE1NjQ5MSwgMHhCNDY2MTE1MSwgMHg1NTkxOTFBNCwgMHg5Njc1NkE2OCwgMHhGNUM3OTFBNiwKLTB4MjAyOTdBMTUsIDB4NkI2NjAxMDAsIDB4MzEzMTc3QTIsIDB4NTUwNTQxNTAsIDB4NkE5Njk2NjksIDB4RjBCODIxMTEsIDB4NTU1QTY5OTYsIDB4QjY2NjI5NUEsIDB4MUVBOTU0NDEsIDB4NkExNjZCQTUsIDB4OEMxODU2NkQsIDB4Mjc5NzI3OEEsIDB4ODJBNTUyQkQsIDB4Rjk2NEJEMTQsIDB4NDE1NDA2NjgsIDB4NTA3ODc4NUEsCi0weDU3NTRGRSwgMHhGOUUwRTVGQSwgMHgxNTQ1M0QzRiwgMHg1QTk2OTlBOSwgMHhEOTg1NDE0NywgMHg4NDk0OTRFOSwgMHgxREMzOTczNCwgMHg2N0U3OTdCMywgMHgxMDcwNjZGLCAweEFFRDk5ODZDLCAweEFCNTY0MTQwLCAweDlCNTFBNkI3LCAweDVGRDNFMkY0LCAweDVBNTQyOUY5LCAweEY5QTA1MTYxLCAweDVBNUE2OTY1LAotMHhEREQ4ODQ4NCwgMHhGQTUwRkE1NSwgMHg5MEU1RTRGQSwgMHg2QkYxNjZCLCAweDY1NjY2NjVBLCAweEU0NTBBNkU1LCAweEVCNDVBQTA0LCAweERBOUE0NjQ2LCAweEQ3QTM3MjM1LCAweDExNDMxQjk3LCAweEQ0MUQ2RTY0LCAweEQzRDNBMUEwLCAweDVENTQwRTksIDB4NjI3Nzc3QkIsIDB4NTA1NEE0QkUsIDB4NTkzQTA1RUQsCi0weDJFQkU0NTRCLCAweDFBQkExMDE1LCAweDdDNjRCNDYwLCAweEMzNThCNDdGLCAweDE3NkY0MjkzLCAweEE2RTQxN0FCLCAweEY2MTE3NTZFLCAweDFGNDBENDk5LCAweDg0ODg1RDVGLCAweDJGMEI5QjlCLCAweDE0QkUwNSwgMHhFNTkxOTU5MCwgMHgxMDFCMTQ2RSwgMHg3QjI2MTE5MCwgMHhEQzk2RjhCMCwgMHhGNDYwMjU3RSwKLTB4MzRCMEFGQzAsIDB4RUI5MTQwRkUsIDB4QzVDNTg5REQsIDB4MUY2RDY4NjUsIDB4RjUxMDAxOTUsIDB4QUY1NjA2MDcsIDB4NTA1MDY2QjUsIDB4N0U1OTA5OTksIDB4MTNFMTkwRTQsIDB4QTU2QUJENTksIDB4QzIxQjY4RDcsIDB4RTU5NEU0LCAweEY2NTc2RTUwLCAweEZGQTc1MUQxLCAweDE5QTE3OUNCLCAweDI3MjY3OTcsCi0weEExOTMxQzdDLCAweEUxRDkwRjFCLCAweDdGMkIyNTEwLCAweDZBRjkwMDU1LCAweDVGMUU0Qzg4LCAweEU0MTA3NTdBLCAweDk1NzAyMjEyLCAweDdCNzYyMTAwLCAweDFCMDVCRjZBLCAweDE2RjA1QUIsIDB4RERDNUM5QzksIDB4NzJCRTU5NCwgMHhFNDkwRTU1NSwgMHhDNUU1MDEwNiwgMHg4MTZEQUMxNiwgMHg1NTQwRkE5MCwKLTB4MTU2NjA1RkYsIDB4M0IzNzI2MjEsIDB4MkI1N0E2N0QsIDB4NkM2NjFFMTYsIDB4MUU5N0E5MTcsIDB4RTZFMkQzODMsIDB4MUI0MEY5MUIsIDB4RDlBNjMzMzMsIDB4MzRFMTg2MjksIDB4QTcxNjE2RTksIDB4ODQ5NDZEOTksIDB4MUI2OTA2QUYsIDB4RUZERTg5MDQsIDB4ODhGNTI0NzAsIDB4NTBFOTkwRjgsIDB4NDE4MkUxQjQsCi0weEJBRTE4NjVCLCAweEY0OEU0RjQsIDB4NjRBMDUxN0YsIDB4QTFGNDU5MDIsIDB4MTIxNzdCRjUsIDB4NDY1RUJEOTEsIDB4MzdBNzQ3LCAweEYwQTUxMDYsIDB4NEM0RThBNSwgMHg2Mjc3OUU2NSwgMHhERTQ5NDk4OSwgMHg3QjY3OTZEMSwgMHhDNUM1QzU4QSwgMHhFNDc4NkIwNywgMHg2RjA3RTBGOSwgMHg1NTU0QTU1MCwKLTB4OTU1NTkzMzMsIDB4NzQ3QTZCNSwgMHhBNEE0NTUwMCwgMHhFOTk4NDQ0LCAweEY1OTY2MzcxLCAweDExMTExNkJCLCAweDc4M0E2NzksIDB4OTU0MDlBRkYsIDB4RkY5NjkwRTQsIDB4NjA3NDNFQkQsIDB4MUM1QTkwRkQsIDB4MkIwNTFFRTksIDB4NUI3QTE2MjQsIDB4RUI0MTU3MDEsIDB4MUI2QjAxNTUsIDB4OUJDQjg1ODYsCi0weDU5OUU1QzUxLCAweDUxMDA2NEJFLCAweDUwRkE2MDYwLCAweDE2MDY2QjVCLCAweDU0REE4OUQ1LCAweEEwMTQ2OEI1LCAweEMxNjU1RTUsIDB4NTVGRjY2NTcsIDB4RTQ5ODVFOSwgMHhENzM4QkUyNywgMHg2OTM4RDQ1MCwgMHg0N0QwRTRGRSwgMHg0ODU4OTg2RSwgMHhFNzkzNDMxRSwgMHgxQTA1RkZGRCwgMHgxODkzOTE0MSwKLTB4MTVFRTQ2MjAsIDB4NzlFNDUxNTEsIDB4NjYzQUE1NTYsIDB4RDEyNjZERDksIDB4N0UwNjU1RTAsIDB4QjZBNzY3NkQsIDB4NTRBOTZBQTUsIDB4MTY2NDA5MkIsIDB4NTY1MTdBQTAsIDB4RDY0MDJDQjgsIDB4NDBBNzc3M0MsIDB4NTU0RjA2NDYsIDB4NDg4RDVGMkYsIDB4RTRFNDkwOTUsIDB4MUM3Q0I0RTAsIDB4N0MyNzUyOUEsCi0weEY2RkFBMTUxLCAweENDNzM1OEQ2LCAweEU4NDA2RDE1LCAweDZFMDc0QjVGLCAweDYzODM1OUY3LCAweEQ0RTlBODhDLCAweEU4ODgwNTBGLCAweEU2NTQ2QTBCLCAweEI5OTA0RUJELCAweDc1NTA2MUFGLCAweEEzNzEyODVDLCAweEU5NUExOTA0LCAweENBREQwNDJELCAweDc1N0Y2RUQ2LCAweEU0QTkxRjA2LCAweDZENUQwOTA5LAotMHhFNDk1NTlCOCwgMHhGNEIwNTY5QiwgMHg4NDU0QjVCOSwgMHgyMTYxQjVCNiwgMHg4NTVBQURFRSwgMHg1NzVCMDU0NCwgMHhCRkU0RDA4NiwgMHhFNDg0Q0JFQiwgMHhGOUY1NDI2RiwgMHhDQzY1MzM2NiwgMHhBMzUyNDY1NiwgMHg5QTU5ODlFNCwgMHgxMDQ1MTQ2NiwgMHg3MUYxNjU1LCAweDlCOTBBNEVELCAweDE0NTk5RkYsCi0weDk2NjZBQTkxLCAweDVBOTlBOTQ1LCAweDk2ODVDRDhGLCAweEI4NTA2QTkxLCAweEI0MjdFMEY4LCAweDUwQTk5MEZFLCAweEE1RkE5MDkwLCAweDYwRDREQTgwLCAweDI4RTM1Q0IzLCAweDU1RTRBQSwgMHhEMjBCNTVBNCwgMHhFMTVGODYsIDB4MzZFNjk5NUUsIDB4NTQwMzZGRkYsIDB4QTc5RDIyNTAsIDB4QkExMUE1MDAsCi0weDQwNDYwM0FDLCAweDY0MTA2NUEwLCAweDlERDg0QTBBLCAweDk2OUIwNjFCLCAweDM2NzM3MzEzLCAweDdCNjU2MzFBLCAweEE0RTRDMDk5LCAweDk1OTA0NDhGLCAweEQ1N0YwNjgwLCAweDYwOTREODZELCAweDE1RDhFM0JELCAweDc1N0Y3REQ3LCAweEI0NUI4NTQsIDB4NjU2MEZBOTgsIDB4N0E4MDU2MzcsIDB4RDY4NDE2QkIsCi0weDdCNzY3MTMxLCAweDkwRjlFOEZFLCAweEE0RTU0MDQ1LCAweEUwNDExRjZFLCAweEQ1N0Q3RERELCAweDMzQ0IxQzMzLCAweDU4QUREMDEwLCAweDlCMUZBNUM2LCAweEE0MDFCRTk1LCAweEE5NTBGOTk0LCAweEE4NTE5NzFFLCAweDMzQ0MzM0NDLCAweDEwRjBCMTY0LCAweDE1MUE2RjAxLCAweDc4QjU2NjBDLCAweDMzMzMzMjI1LAotMHg0MTE2MjQwMiwgMHg1RjA1MDZDQiwgMHhGRDk2MTY2RiwgMHhFNDQxNzY0MywgMHg1NkE1MUE5NCwgMHg1MzIzQkZFQSwgMHhEMTJERDEyRCwgMHhBOTk5OTU5QSwgMHg1NDdDNjQ4MiwgMHg0OTlFRTY1MiwgMHg0QUM3RDFFNSwgMHgyRDNEQUQwNywgMHg2QjE3MTIwMSwgMHhBRjA2NTg1NCwgMHhENkM0ODkxRCwgMHhDQzczOUNFNywKLTB4OUQ2OTI2NjMsIDB4M0U0MTU5N0MsIDB4RjM4MzE0QkIsIDB4MTE1MEE0RjQsIDB4RTFFNTBGQSwgMHhGNEQ2MEI2RiwgMHg1QTU0RTU5MCwgMHgyMjdBQjVGMCwgMHg3M0EzRDdGQywgMHhENzQyMEE1OSwgMHgxMjAxNUE1OSwgMHg0RjE5OTlENSwgMHhBOTBFRTQ0QSwgMHgxMDY1QjlCNSwgMHhEMTA1MzNFMywgMHhCQTkxODQwOSwKLTB4RTU0MDlGRUYsIDB4NDU0OTA0N0YsIDB4NkI1N0E2QTUsIDB4RTk0NjkxQUEsIDB4MTExQTZFN0UsIDB4NDU0OTZCQSwgMHg0OUZEOTk5LCAweDQxNEQ1QjhELCAweEFCMTBFRjVFLCAweEU5ODc4NTA1LCAweDhDOTEwNDk5LCAweEMwQzVEQTNFLCAweDZGMUI3Mjk4LCAweDE3N0Q3OEQwLCAweDY4N0I1NjY1LCAweDNGNDcwMzUzLAotMHgxNDQxQTU5MCwgMHhFMTk2NUY2RiwgMHg1QTVCNEE4RCwgMHg0N0Q3Qzk4LCAweEQxNDA0MTE1LCAweEI4OUEwNTNGLCAweDhDNDA5NUZFLCAweDQ4NjFFMDU1LCAweDNCNDE3NjA3LCAweEY5RTBFNEUwLCAweDY1QjA1MDYsIDB4OTM2MzMyMzYsIDB4QUEwN0E1RTQsIDB4Nzc3NDcwODAsIDB4Nzc2MTYwRjAsIDB4MTY3MkIwNSwKLTB4QTU0RTA0MjgsIDB4NTIwQTk2MjUsIDB4RTU4MTA2NSwgMHg5MEM3NkQ3NiwgMHgyMTU3QjJCMywgMHg1QzVCRTA2LCAweDE1MUE1QTAxLCAweEE5RDVDMDgxLCAweENCQ0Q5ODU0LCAweEZERDEwNjFGLCAweEI2NjExMUIxLCAweDlEQzNEN0IwLCAweDY1MEE3NjQyLCAweDgwOTU3MzRELCAweEQwNTIwMTFCLCAweEUwQTE0NzlCLAotMHg5NTAxQkZGOCwgMHhFOUQ5QkQwRCwgMHg3QTAxNzkyNSwgMHg2OUE2NzM3MywgMHg0MUUwRTU1NywgMHg1Rjg0NDEyNCwgMHhFQUIwNjk1RSwgMHg1NjZCNTA0MCwgMHhDQ0M5RDY5MywgMHhBNzk2ODRERSwgMHg2QjVCQzNDMSwgMHg5NTk1NjY3QiwgMHg5QzMzQ0E1QywgMHg4OTg0QzVDNSwgMHg0NTlCQkRFOSwgMHgxRjEwQTVGNCwKLTB4MjJBNTVBQSwgMHg5N0MzNDMwRCwgMHhBQTU2OUE1NSwgMHg1NTJFMUUwMCwgMHhEM0MzQzc4QiwgMHg4MkM3NTIxRSwgMHg1QjA2MDVFQSwgMHg1RkY2OTI2OCwgMHhEMDgxNDYwQiwgMHhFNDUxN0YwNiwgMHg0NDQ4QzlDRSwgMHgyRjY5Rjk0MCwgMHg0NzZEQTQ3MCwgMHg5Rjk2RkUxMiwgMHg0RDhEOUU4RSwgMHg2QTZBMTZCNSwKLTB4MUQwNUJFNjYsIDB4ODRGNUJELCAweDY5MUUxQjQxLCAweEUwOTM5QjE3LCAweDE1OTA1OUFBLCAweDFFNTc5MkI5LCAweDI1QTcwMUE1LCAweDQzOTE2MkUsIDB4RTk5NDA3N0MsIDB4NUNDMzk2QUEsIDB4MUQwRDlBQTUsIDB4NEE0QTU5OEQsIDB4MUI2RjE1NkIsIDB4MUExQjBGNDAsIDB4MzRDQjM0Q0IsIDB4NkY1NDJFLAotMHgzMkNDNzM5QywgMHg5NEVCOTY2OSwgMHhEQThENEUxRCwgMHhDNkM1QzQ2RSwgMHgxMDE1MkIzRiwgMHg4Nzg3RjlGOSwgMHg1RTQyRDA2NCwgMHg2OTlCMDVFOSwgMHg3MDMwMjk1RSwgMHg0OTVFMDlCRSwgMHhFRTE5MTAxNiwgMHg4MDFEMkQ1NiwgMHgzQTAwOTlGOSwgMHhFQTA5MDU5RSwgMHg1QkFCNTEwMCwgMHgzOTNENDlDLAotMHgxMEUxNURDMiwgMHhCMDU2REQ0LCAweDM1MzY5MTUsIDB4RTBDMTg3MTksIDB4RUI5NjQwOTAsIDB4NjE3MjcyNywgMHhGRDU5MDBGQSwgMHhEMTBCNzhEMSwgMHgzMzMzMjYyNiwgMHg1MEY5OTBGOSwgMHg3ODYwMEE1QiwgMHhFMkI1NDAxQiwgMHhBRTVFOTQwNCwgMHhGMkNGMEMwLCAweDlFOUQ4MDgwLCAweDg0RTRGNEY5LAotMHg0MUYwRTU5RiwgMHg5MDc4N0UxMiwgMHhFNEUxOTE0MywgMHg3NjFENjcwNiwgMHg2NTYwQkNFNSwgMHgxMzRBOUJEMywgMHgyMzc2ODk5NSwgMHgyMkFERjYsIDB4NDM0QTVDNzIsIDB4RDQ5ODU0NDQsIDB4NzA5MzZCRkYsIDB4QUI1NEUwRTcsIDB4NDVFN0E2ODIsIDB4N0E3ODZEOTAsIDB4Rjg1NDZBMDAsIDB4NUY1RTQ1NDAsCi0weDk5OUE2NTFFLCAweEY5RTI5N0ZELCAweEFGODZFNSwgMHhEMDBCNkU1NCwgMHg1NDQyODc4QSwgMHg1MEU5NDBBNSwgMHg2MUY2QUYxLCAweDQ3OTcwMUFBLCAweEFFNDU1RTVELCAweDY1NjAxMjNFLCAweDIyRDE3NjI1LCAweDgzMDcxQjY0LCAweEY5NDYwMjUxLCAweDVGNEIwNjRBLCAweDg3NDI0MTdDLCAweDVGODlDNTFBLAotMHgxNEEyOUY1MCwgMHg1MDEzQkY2QiwgMHg3NjM5NTY3NiwgMHg1NEE1OTBGOSwgMHg0MDkxNUFBNywgMHhFQjk1RTA0MSwgMHg3RTU2MDUwNCwgMHg2NUI5RTREMSwgMHgzRjYzQTU5NCwgMHgxNzQ0ODIxNiwgMHgxQTRGODdGMSwgMHhGOTkwRTY5NiwgMHhFQ0U4OUE1MCwgMHgyMjY2QjE3LCAweDZBOTU5QTk4LCAweDUwRjUwMDFBLAotMHhCRjA1NkE1NSwgMHg3NDQ3MEZGRSwgMHg2NTI1MTAxMSwgMHg5RjdENjU5NywgMHg1MUJCOTYyLCAweEEwRDA0Mjk3LCAweEEyNTdGMEQxLCAweDVCMTU2OUQ1LCAweDRGNDA5NTlFLCAweEVDNUQxRDBELCAweDUxQTFBLCAweDFERjU2NDYyLCAweEM0NDkxQTZGLCAweDRCNEE1NUVGLCAweEZENzQxRDVGLCAweEUxNTI2NzEzLAotMHg4NzUxNTNFMiwgMHg5NzUyQTJFMiwgMHhFRkRBODUwNCwgMHhGMEU4NDc1NiwgMHhFMEExOTZFOSwgMHg1RkFGNUM0MCwgMHg5QTMzNTlDQywgMHhFMDU2MDYyRSwgMHhCMDdCNzFENywgMHg1OTY2NDc1RCwgMHg2NjE2MTEwMCwgMHg0NDRBMDE1MSwgMHhEQUM3RDZGNSwgMHhGQkU4RTMxNCwgMHgzNTA5ODUxMiwgMHgxQTdGNzY5MCwKLTB4QUY5NzAxNTgsIDB4NjY2QTY5OTYsIDB4RDFEMTA5MzgsIDB4NzQyOTY5QiwgMHg0NTQyQTVGRSwgMHg2RUJFNTBBMSwgMHg4MTZFNzk1NSwgMHg2NEUxRDBDMSwgMHgxMDUxNTZBQSwgMHg2QTlBRDBGNSwgMHhCNDkwOUUyRSwgMHg1NUE2QTk1OSwgMHg0NUI0OTk5RiwgMHgzMjY2Q0MyNiwgMHg5QjkxNUVFLCAweDk3NjlFNThCLAotMHgyRUY1OTk2OCwgMHgzRjJGMDcxMSwgMHg3OTc5ODQ2OSwgMHg2MTYxQjZCNiwgMHhBNzk1MDRCMSwgMHg5QjkyQTM1MSwgMHg2MUMwODU3MywgMHhBQjFCNjU2RiwgMHgzNzI3MTYwMSwgMHhFNDg0MDk3OSwgMHg0NUQxQzFEQSwgMHhBNEM0OTYxQiwgMHg1OUE3RjJGMCwgMHhFQTlGQzE0NywgMHg2MzUzNjJCMCwgMHg5NTYxRUFGLAotMHg2QjY3NjJBMSwgMHg1ODVBNDNEMywgMHg4NDg0ODE5RiwgMHhEMUMzMEQ1RCwgMHgyMTIzMTAxRCwgMHhBMEY4RTRGOSwgMHg2MzY3NjIyMCwgMHgxN0VCNkE1LCAweDkwRTYzRjI3LCAweEREMjU2MDQ1LCAweDdCNjZBMUEwLCAweDY0MTQzRjYsIDB4NDFENDc5RDcsIDB4RjE1MjBGODIsIDB4MTJCNDQ2ODcsIDB4MTUwNEJFMUEsCi0weDkwRTQ1NDAxLCAweEM0Qzk4RTRGLCAweDkxOTA5N0MsIDB4QTdBNTI5MTksIDB4QjlCNjIzMTMsIDB4OTY5NUMwODksIDB4MzBDNUU2QkQsIDB4QUE1NTY2OUIsIDB4RDE5RjA2NDUsIDB4MTE1MEUyRkYsIDB4MzYyMTMxMjEsIDB4MUYxRjBBMDUsIDB4MkEzMTUwOTksIDB4MkExRTA0MTQsIDB4QTNFM0QwNCwgMHhENTk5Mjg1MSwKLTB4MTlBNTZBNDUsIDB4NUQwNjY5RTUsIDB4QTdDMUY4QzAsIDB4ODREMUU1QUEsIDB4NzI5MkE0NjQsIDB4OTA0MEY1RTQsIDB4RjE4NTQwNSwgMHgxRkFFNDUwOSwgMHhGOTE2OTBCRSwgMHg1NTQwQTU0MCwgMHhBMUQyODc0QiwgMHg1NjBCNjVGOCwgMHhDMjA3RTFFNiwgMHg2NDZEMEY5LCAweDVBMTQ0MCwgMHhCQjQ1NDExNiwKLTB4MTM1OTcyNDIsIDB4NDEzQTQ1MDQsIDB4NjZFN0QyRDIsIDB4NjFEQTY5NTAsIDB4NTE5REYwQTAsIDB4RDI5MjZFQjQsIDB4QTU4MzA2MEIsIDB4MjQ3RTE1ODcsIDB4RTUwNTkwQkQsIDB4RUZGNTAxNDYsIDB4NjI1MkI3MjIsIDB4NEI5QUY1NTIsIDB4NDI0NDVBNSwgMHg1RDA4NDREMCwgMHhEN0MxRDE4LCAweDZCNTM5MDAsCi0weDdERDY4NDM0LCAweEU2OTY0MjQ3LCAweEUwQTUwQjUsIDB4NzI2MzUzNDcsIDB4NjY5QTZCMDYsIDB4OTE1NDlBNjUsIDB4OEYwOTdDQTUsIDB4ODQ5NDU4RUMsIDB4RjlCMDkyNzUsIDB4NzEzOTBENUEsIDB4NDc4QkM5RDYsIDB4NUQ1NzlBQTUsIDB4OUVEMDg2MDUsIDB4Q0ExQzM1RDMsIDB4MTAyOTY2OSwgMHgxMzQ0RkVBNywKLTB4NUI0NjhCODcsIDB4QTdGMjk5OTAsIDB4NjBCREI4NTUsIDB4MzQzMEI1NzQsIDB4NTQ0NDYxRkYsIDB4QzVDOTU1MEUsIDB4NjlFNzE2QTcsIDB4MTEyMzM2LCAweDNGMTFEMkQ3LCAweDJGMDc5NkU0LCAweEI1MjUwQjAwLCAweDMzQ0MzM0RELCAweDIwMzU3Njc2LCAweDdCNkY5MjcyLCAweDExNEIwOUJCLCAweEE3RjZDOTg3LAotMHgzMjk1OTgzMywgMHg0MEQyNUJCNiwgMHgxMzE3MDM1MywgMHhENTJFNTk0OSwgMHg5MzYyNjUzOCwgMHg0MzQ0OUE1NiwgMHg2NTU4OTBCQSwgMHgyRjU2ODExQiwgMHhFNUU0Qzg4LCAweEE2MDc5NTAwLCAweEE0RjkwNTA3LCAweDY0NjBBMDU1LCAweEU5OTA5MDZELCAweDE1NkY1NkFDLCAweDU0Q0YwMCwgMHgxODFENUEwQSwKLTB4N0MwOUU5NDcsIDB4QUQ5RTg5OEMsIDB4RkY5MTQyMTIsIDB4NjkzM0E3Q0MsIDB4QjI5MzVCMkUsIDB4NDQ1NEQ4QTIsIDB4QTZBNTYwQjYsIDB4NTE5RTIwNzUsIDB4NTc1RkE2QTUsIDB4QjhCMDY5MTYsIDB4NTk4QjQ3MUIsIDB4MTA2ODZBRDEsIDB4NDVFQTAxNzAsIDB4RDA0NzBCOUIsIDB4M0I1MTFFMEIsIDB4NTNENzlEMCwKLTB4Q0JDQUM1QzUsIDB4REFENTRDRDAsIDB4MzU0MkVFNzksIDB4QjRBRDRGRCwgMHg2NDJERkYwMSwgMHhCOTkxMDlCOSwgMHhFMTkxOUI5RiwgMHg5N0I4NDE2MiwgMHhFOTk1NDYwQSwgMHgxMDYwRjVGNSwgMHgxNjZEQkNGMSwgMHg0MjE0OTU3QSwgMHg2QzYwNjI2LCAweDUwRkU0RjBCLCAweEI0NjY0NzBBLCAweDgwODU5NkUyLAotMHg3MEQxNDQwRCwgMHg4MTg2MTdCNiwgMHhDOEU4RERFRCwgMHg0MDQ0MzQ3NCwgMHgxMDNFMDc1MCwgMHgxNTU5QTksIDB4MTZFMjlGRiwgMHg1NEZFMDQ0NywgMHgzNENBQjI1QywgMHg5QjMwNzU2QSwgMHhCMEU3NEIwNSwgMHhFMTkwNTFELCAweDQwMkU3NDUwLCAweEY1RTBEMUFCLCAweDg3OTc5QjVGLCAweDg3MDdCQTcxLAotMHg5MEI0QTQ5MSwgMHgxQTJGNTMwMSwgMHg2QzQ0RDMxOCwgMHg4QUMwQTFGNCwgMHg1QTZGMDMwNiwgMHhFMTE1OTA5MCwgMHhGOUE1NDE4MywgMHg0Q0M3MzIxQywgMHg3RTY0ODY4QiwgMHhGREU2MDU4MiwgMHg0QkU3NzAxNCwgMHgxQjkwMkQwMSwgMHgxMDREOEZBNywgMHgxNkE3Q0QsIDB4OTQ2OTM5MTIsIDB4NjJFNzU5QSwKLTB4NTk0QkE5MDYsIDB4NUQwMjM3NDcsIDB4REY5NzU3QUQsIDB4OTczNjRDQ0EsIDB4RkEwMTEyNjUsIDB4MTJFMTYxMTYsIDB4N0E2MTU2MDAsIDB4NTAxMTk2RjksIDB4NTA2N0UyNDcsIDB4MkE3NUIwNzAsIDB4QkMwMTk2QkUsIDB4MTlGRDg5MDcsIDB4Q0E4NTExQUUsIDB4N0I2NzEyMTAsIDB4QjhGMDk2NkYsIDB4NjAwQUU1RjQsCi0weDQxNDY4NThFLCAweEE1NzlDMTI0LCAweDE5RjI2QzEzLCAweDIzMjA3NzYsIDB4NTk1QkY5MDAsIDB4RkIwNTkwNTUsIDB4NkZENkU0NjAsIDB4ODZDQUQ1RCwgMHg5NDgxNTNBNSwgMHhDNkM1NDZGRiwgMHhFMTk5QUQ1QSwgMHg2NTZBNTY2QSwgMHg4MTI1Njk5NCwgMHg3QzI4NTQwMCwgMHgzN0NENkEzNywgMHg0Q0Y0RTFCLAotMHhEMTgxRTBCNSwgMHg5MEY4OUY0NiwgMHg1QUQyRDA3MiwgMHhGMUY0NEQ0LCAweEI1RTA5MUM2LCAweEZGOTBFNzY0LCAweDY1NkI5OTY1LCAweDgzMzQ3MUM3LCAweEU2NDcwNzAwLCAweDUyMUE1MTcsIDB4NTY2MjBCRiwgMHg3QTY0NThDOSwgMHg1NjY5NTlBNiwgMHg1QTVGRjNEMiwgMHhEMDUwMDYzRiwgMHg5QUMxN0MzOSwKLTB4QzFGMDNEMTksIDB4RTc5MzkzNDMsIDB4MzUzMTI0MDQsIDB4NzY2NzEyMjMsIDB4QTBEMDU4MDQsIDB4N0I3NzMyNjIsIDB4NUUyRTY0NjUsIDB4RTY4NjA1MTksIDB4REU5MDlCNUEsIDB4QjVDMDk0RTQsIDB4QUYwMTlCMTUsIDB4MUE1NzAyN0YsIDB4Nzg3NEU3RDMsIDB4QjM1Njc0QSwgMHhEMDg1NEZCNiwgMHg5MTY1MDlGRCwKLTB4NDMxRjkxRkYsIDB4OUI2MDU0MjAsIDB4NTY2OTc4QjQsIDB4RThEMTA0MkQsIDB4MjUzMzA3NCwgMHhFQzkwNDQ0MywgMHhENDA0QTREMSwgMHhCOTk4NDk0NSwgMHg0MzUxODFFNiwgMHhERkQwNTIwQSwgMHgzN0ZDNjFELCAweDE1NDBGQTk0LCAweDg3NkRCODUzLCAweDlENjg2QzlELCAweDVEN0RFNjQyLCAweDU1NkE2NjY5LAotMHg2QjE2NkYwNSwgMHhGMEYwNjYxNiwgMHhFNDkwMDUxRiwgMHgxNDdCMDYwNiwgMHhGRDc2RDlEOSwgMHgzQjgxNEU1RCwgMHgxNkU2NDYwLCAweDkxRjA1NDA2LCAweDM3NDQ0RDM0LCAweDFCMTdCRjAwLCAweEE4NDY1QTA1LCAweDEyNDI5RDFDLCAweDc5NzUzOTM1LCAweDYzOTI5MUY0LCAweDY3NjFGMEY0LCAweEJDNzg5NDYwLAotMHhGODkwRDc5RSwgMHg1NDc4MDc0MywgMHgxMTMxMzY3QiwgMHhENjQ4N0M2NCwgMHg4RTU4MkU0RiwgMHg2QTk3MkE2NSwgMHgxQkE2RDBFNSwgMHgxN0Q2MDA3QSwgMHg4MjU5MDcyNywgMHg5NUQwRkEsIDB4MTU0MEU0N0UsIDB4NTZCOTFBMEIsIDB4OEE4NUM0RDQsIDB4OUY4MjA1RTQsIDB4ODBENEM1OEIsIDB4NzVEM0U2NDcsCi0weDU5NTZEOTY2LCAweDc0RUQ0NTAwLCAweDE2N0VBNDQwLCAweDI1NUUxOTEsIDB4MzE4MTE1MTUsIDB4ODI5OTlEREYsIDB4MTE2NzBCQjgsIDB4MkJEQUQ5NjUsIDB4NUFBNTY2OUEsIDB4NTVCRjEwNUEsIDB4ODg0OTZFNTksIDB4NUFGNTY2MDAsIDB4NDg1OEU3NTEsIDB4RjQ4MTFCQjksIDB4QjUwMUE3QjAsIDB4MTFCMjZEQiwKLTB4NzY3Qzk4ODcsIDB4NjAyRDc3MDMsIDB4MTIxOUY4RkQsIDB4NDY0Mjk3RCwgMHhGRjA2REI5NSwgMHgxNTZBMDRCRiwgMHg1MDUwQTM5QywgMHgzNUNBNEY5NCwgMHg3RjAwRUYxQiwgMHg2ODM1MzI3MywgMHgxNTA2NjNCNiwgMHg3OTY2NjE5MCwgMHhEQTY1MDY0NywgMHhBOTYyOTU5QSwgMHg5NkU1OTZGRiwgMHg1MzdFMTdBMywKLTB4NTdGOUU0NDAsIDB4MTAxNDU4RkYsIDB4QTRENEU0NDEsIDB4MTg5OEM0RTAsIDB4N0UxODk0ODEsIDB4QjZDNzE5MDQsIDB4OUE5NUVEREQsIDB4OTQ0NDQ5RkYsIDB4NjFFNEM5OTcsIDB4NTJERjhGNSwgMHg2QTUxRjQ2RSwgMHg5MTQ1QUQsIDB4RDlBOERERDIsIDB4ODc4NEU2M0QsIDB4RkY1QjkwNkUsIDB4Mjk5OEE1NTksCi0weENDQ0M2NjMzLCAweEI5NTRDMEQwLCAweDcwQjU2NjNCLCAweDUzMUM4QjI1LCAweEZGQkEwMTkxLCAweEY0RTM1QjkwLCAweDQwRkY3MTUwLCAweDFGMDc1QUU1LCAweEQwMDE1QkZGLCAweERDQzNENkRCLCAweDRFNTRBMDdGLCAweDdFOTY0N0EsIDB4QTE5RDRFMSwgMHg1MTUwNDQwNCwgMHhFN0Q2OEE4QSwgMHhBRjEwQTQ1MCwKLTB4NzFCNzExODQsIDB4Nzk5NDBBMEUsIDB4ODIxQjE5NkUsIDB4NTA0MTNBNUIsIDB4NTcwNzk2MkQsIDB4RDFCNjM5NjIsIDB4ODE5REVERTQsIDB4RUVDNUNCNTQsIDB4MjUxREJBRCwgMHg1MEJENkQxRCwgMHgyMDk3NkU3NCwgMHhEREM5OEE0RiwgMHg0NTEwNzlFOSwgMHg2OTE0NkUsIDB4Njg1OTAzMTEsIDB4ODA0NUE5RjQsCi0weEVFQzU4Qjk2LCAweDk4Q0NDOTk2LCAweDk0Nzg0NDUxLCAweEU2RDYwMTVCLCAweDMwMzVCOTUsIDB4MTJFMzlGNiwgMHg1MEVFNDA1OCwgMHg0RDFDNzRBMCwgMHhBNDI5MTUwNSwgMHg5MzZCNjdENCwgMHgyQUMxNDQ5RCwgMHhBNDAxNUE2RCwgMHhBRkNCNDQxNCwgMHg3NEE1MDAzOCwgMHhERUQwNTFDOCwgMHgzNDdCNzZEQSwKLTB4ODE3RUQwMUIsIDB4REQyRDc5RDIsIDB4NUExQTAxMUIsIDB4QTA0MEY1NTYsIDB4NTQwMjQ2QjgsIDB4RjJCNDVBMDYsIDB4NkE0OTk5QjQsIDB4NEI2N0QwQkYsIDB4MzE2MTQ3MDEsIDB4NDU2Qzg0QzEsIDB4QjhGNDgxNEMsIDB4RkYwMDk2NjksIDB4NEY0QTQ5OTksIDB4OTA3RDk1QUIsIDB4QjdBNDk0MDIsIDB4NTI2RTYxRCwKLTB4NUE5NTQyRDMsIDB4Rjg3OTI2MDYsIDB4QTkxMzU2OSwgMHgzMTkzNTM0QiwgMHg3QTYxRDA3NCwgMHg1MUE0NTJFMywgMHg0MEU0OTBFNSwgMHg0MTA2Mzc3LCAweDQwNEExNzA5LCAweDE1NjI3MjcsIDB4QzBCODk5OTYsIDB4NDQ0MDc4MUUsIDB4NzhGQTkwNTMsIDB4NUQxRTAwRTgsIDB4MUMzQzc1RDAsIDB4RDU4MUFCMDUsCi0weDg1QzU4QTQsIDB4NDRFNDkwRTQsIDB4Q0Q5NENEQ0EsIDB4QjI1MkU2RDYsIDB4MUZDMzQ1QUIsIDB4NDBDNUI5MDUsIDB4MjY2OTM4NTEsIDB4RUMzNzQxRCwgMHgxQjU4NjlCLCAweEExNjE1MTAsIDB4RTA2MTk3N0IsIDB4OEE1ODA1MTAsIDB4RDk2MEQ1NTQsIDB4QjUzRTA5MSwgMHgxNEI5MDBGQSwgMHgzRTA5NDY1OSwKLTB4NjA5MDkwNiwgMHhFNkI0N0MxNywgMHhFQ0VDOTg0MCwgMHhGOUE0MDVGQSwgMHg5MEY5OTRGQSwgMHgyQjc1MEE1LCAweDgwM0IzRDI1LCAweDE0QUU0MDVGLCAweDZGOTdFMEZELCAweENEMzRFMzhDLCAweERFRDBENEFGLCAweDk2RDFDMDM4LCAweDUxRTc4MTg3LCAweDkzRDdDQUNELCAweEQ0RDA1MkE3LCAweEU2NTU4QjRGLAotMHhGNjAyNTc2NiwgMHhFNTQwNzRCMCwgMHg2NjEzMjUyQywgMHgyNTdBNzUsIDB4MUIxMjY2QjUsIDB4Rjk1NkUwQjYsIDB4NDREM0UzQjksIDB4QzVDNUU5RTYsIDB4RUJENjk1OTksIDB4OUY5MUQwRjgsIDB4QjBBMDUyNTMsIDB4NkUwRjE3NjEsIDB4NDI1RkU0ODAsIDB4QTVBMDUxRkYsIDB4QjEzODREQzcsIDB4MUNFMzFDRDMsCi0weEVCRjY3MDFCLCAweDZCMTUyOTk4LCAweDM1QTYyNTEwLCAweEQxNDBFNUU2LCAweDkwNzA3OTFELCAweDNDQTZEMSwgMHhEQUM5ODk4NSwgMHg5MDkxN0U5NywgMHgxOUJDRjkxLCAweEQwQzdDQkM3LCAweEI1NDY2QjM3LCAweEIxMTFEMjVCLCAweDlBMjk5NzhDLCAweDMxOTZDNTAsIDB4Q0FDNUMxRkYsIDB4NEY0QTQxOTIsCi0weEIxNEU3MDhCLCAweEQ1RTk1OEQzLCAweDczNzQ3RTI0LCAweEVERTBENkEyLCAweDFCOTE0MzZFLCAweDc5MjUyNTExLCAweENCQzU4QzQ0LCAweDdFNjRGODkwLCAweDlGMDVCOUY0LCAweDFCNTVFMEQwLCAweDIxRDFFOTY5LCAweEY0NTU4MDI4LCAweEY5RTVDM0MyLCAweDE5NzQzMjVCLCAweDZBOTRFMEYwLCAweEQxMDFBNUJELAotMHgxQTE3MDc1LCAweDVCMkQ3OEUxLCAweDE3MTk0ODA3LCAweEY1QzI0QjFELCAweEZBNDBFNjU1LCAweDdBMDk1NTE1LCAweEUxMDZGOTkzLCAweDU2NUExMTAzLCAweDVBNTRGNkUwLCAweEY1RTAwMTZFLCAweEQ2Q0JDNUMxLCAweEY5NDBFNjk2LCAweEFFMzE2RDkwLCAweDZBMTQ2QTAwLCAweDlCOTZFOUU0LCAweDYzNTFEODZGLAotMHg1QTQ2Njk5NSwgMHhENDQ2MEI4QSwgMHgyQ0MzNzQ0RSwgMHg5OTY2NjY5NiwgMHgyMDI1N0FCRiwgMHhBM0YyOTU1LCAweEQ1RDA5MTlBLCAweDU0NDQ0ODU5LCAweEZDNUM2MDZGLCAweEE2NjUzNzQ5LCAweDMwNkU2OTYsIDB4MjUyOEJENzAsIDB4QTA3QkNFNSwgMHhGMEE0NjY2MiwgMHhEQzY0OTQ0MCwgMHg5OUM3ODc0QSwKLTB4NjU2Q0JFQiwgMHg1MTUxQTY3QiwgMHg2MERCNEIwNSwgMHhEMTQ0NDEwNywgMHg1MTRCNzQsIDB4MTY1MDI1QSwgMHg1QjVBMTEwMSwgMHg3MTAxMTc5QSwgMHhEMDlBMDcwQiwgMHg1MEEwOTZCRiwgMHg0N0E5NTIxRCwgMHg0QjJENzQ5MiwgMHgzRjBGMUI1MywgMHgxOTQxQUJGRiwgMHg3QjY2NjExMSwgMHhEM0MzNDVCQSwKLTB4MUNBOUQ2LCAweEUxODM1OUI5LCAweDE1OTBFNkY4LCAweEY0Mjg1OTAyLCAweEJGMUI5MkQwLCAweDFCRTc2RCwgMHgyQTU1ODJDMywgMHg4OTc5MTY0QiwgMHgzQzcyMUI0MCwgMHgzM0MwQ0YzMCwgMHgyREQyMUVFMSwgMHhFOUQzMDcwNywgMHgxOTJERjY1LCAweDFCOTJFN0M1LCAweDMzMzMzNjY5LCAweDFFMDU2MEY0LAotMHhGQjUzMDM0QiwgMHg5NjZBNjY5OSwgMHg2Rjk3OTdBNywgMHhFRjQ2OUJEQiwgMHgxOTQzRjVGNiwgMHgxREE3QzcwQSwgMHg3NDc0MUU5RSwgMHhGNTcwOTk2NywgMHg1MjBCNzRGMSwgMHg0NzQxRkJBQiwgMHhEQTY3MTJCOSwgMHhDQkM2QzFEMCwgMHg2N0UyRDY0LCAweDVFMDNCNjI1LCAweEMwODhEOUQ1LCAweEY4OTAwNUZBLAotMHg1QTI1MTZBQSwgMHhFNUM3RDlENiwgMHg2OUZFNTA5NiwgMHg0MzVCRTBEMSwgMHg3MTkzREI4LCAweDlDQ0M5OTY3LCAweDU0NjEzMzAxLCAweDQ2MTIxMUJDLCAweDczMEM2RkFCLCAweDYwNTBBNUIxLCAweDdFQjkxMTQxLCAweDZBMTUyRjAwLCAweDY5NjY1QUU1LCAweEFFNTc4MEY4LCAweDdEMDZGOTAsIDB4MjAzMkQ1MTAsCi0weDRFMDc0NkQxLCAweEE2OUMzM0NDLCAweDFBNDYyNjE2LCAweDM2QzZDNkM2LCAweEZGQTU5RDFGLCAweDlCNkQ3NEYxLCAweDExOTc5MDdFLCAweDY1NkE5OTk1LCAweDkxNzQyRTQ4LCAweEQwMDUzOEY1LCAweDQ0MTU0MiwgMHg0MEQyNDY5QiwgMHhGRjU5OTksIDB4MTVBOTk2NkEsIDB4OTQ4NDFFRjksIDB4QTU2NTFEMUYsCi0weENDOUM2NjMzLCAweDJGN0QxMDdFLCAweDlCODE0MTFGLCAweDlFNTlBNjY5LCAweDVFOTcwMDA3LCAweDdFMkUxRjAzLCAweDI5QjVGMjQ0LCAweDg2QzVENDgsIDB4NTQ4NTgxQjQsIDB4Rjk1NUNGNDQsIDB4RTM1Q0IyQ0QsIDB4QTk1NkI2RDcsIDB4RTBFNjkxMjUsIDB4MTk2OUM1OUQsIDB4NTUwMDk5RUYsIDB4NjhEOTlGMjQsCi0weDVGQTY1MDEwLCAweDJCMTI1NkZELCAweEY4MjQ0MTQ3LCAweDFENTY0NzBDLCAweDIxNjJBNzYsIDB4NjJGMTY1MTAsIDB4QUE1NTY5OTUsIDB4NTQwNjY5LCAweDE0QzI5NzI2LCAweDQ3OTBGQzAsIDB4MkNDMTlCNDQsIDB4NkNENzc1OUQsIDB4RDdGNjQxNDAsIDB4NDI1RjgxRTQsIDB4NTAzNDM0OEQsIDB4NjUwOTU5NjYsCi0weDcyNjFCMEY1LCAweEFGNTY4MUQxLCAweDkzNUE0MDUxLCAweDUyNjI3NjdCLCAweDU5NUVDMkU4LCAweERCNzQzODQ3LCAweDNDNjBBNTEzLCAweEMyMUYzOTkxLCAweENCMzRDNzM4LCAweEQxOUFFOTk1LCAweEI5MTcxNzgxLCAweDExMDdBQjY2LCAweDVGQzBENzkwLCAweDIwNzBGMUY2LCAweDZFNUUxQTA5LCAweEI1NDA3RTVFLAotMHg1MDU0OTRFQSwgMHhFNDcwMzU1NiwgMHhGODkwOTk5RSwgMHhBNjVCRjU5NSwgMHgyOTE5QTdGLCAweDQ5REQzODgwLCAweDk0RUY5NjBBLCAweDE4M0QxOTA2LCAweDE1MDBGOUY5LCAweDlERUU0NTA5LCAweEY1RkE2MzEzLCAweEUwNTI2ODUwLCAweEJGRTYwMDA1LCAweEYxNkU2ODUsIDB4RjkwMDY1QTUsIDB4OTE2QUY4NTksCi0weEZGNjA4NDU0LCAweEU2QkY1MDk0LCAweDgxRDFFMEZBLCAweEExOUZGOTEsIDB4NjBENTlDRDksIDB4Mzk1MjQyNzQsIDB4RDc5OTRGNCwgMHgzNjI5NUM4RCwgMHhFMDUwMzk0NSwgMHgyRDg1QzU0NSwgMHhEMTUwMDY1OCwgMHgyMjE3MjYzNSwgMHgzMzhDNTYyNiwgMHhERTgxMjUwNiwgMHhEQjU3RThEMCwgMHhFOUQ5NTVGNiwKLTB4OUY2Qzk0RTYsIDB4OTYzNkNDMzMsIDB4MkExQTM1NDIsIDB4Rjk1RDgwRjUsIDB4RDQyNjZGNDIsIDB4MUM5RTVGOSwgMHg3NEExQzMwRSwgMHg2QjE2QTA1MCwgMHhGQjAzNTA2QSwgMHg0MjE4QjQ2OSwgMHg5NEQxNDIyRCwgMHg0MjdEMzUzMSwgMHhDMjVCQUQ0MCwgMHg2NjkyQjI5MiwgMHg1QTUwRTlBNSwgMHg3MTdDRDRDMywKLTB4NzE5MzhGNTksIDB4NTE0NzQwMEEsIDB4NDFCQzZFQjUsIDB4RDRBMEQ0RTQsIDB4MUQwRTVGQSwgMHhGNjg2OUYwNiwgMHhBN0UzNTI1MiwgMHhGNEQxNDIxQiwgMHhBNDg5NERFNywgMHgyRDk0NkIxQSwgMHhEMEZGQzY4NCwgMHgxN0MyOTFFNCwgMHg3RjUyNTAwMCwgMHgxNTg0ODEzOSwgMHg2Njk2NjlBNSwgMHhBN0E3NjM1MywKLTB4QTk5Njk2NkEsIDB4MkZFMTU1QzAsIDB4MUUxRTQyRDYsIDB4NENCMTk5NzYsIDB4MTEwM0JFNjksIDB4NTc2OTkwODIsIDB4NzE2MjRBRiwgMHhFMTQ0NUEwOSwgMHg5NjlBNDUwNCwgMHg1NjAyOTU1RSwgMHg1QTE1NDhFNCwgMHg1QjA3NDMxNCwgMHg3NEE2Q0U2NiwgMHg5MDM4MTUyRSwgMHhEOEM0NTU0RiwgMHgzRUJCMDY1NywKLTB4QThBNjU2NjksIDB4QjlCNTYwMTAsIDB4OTZCOTJEODYsIDB4RTlEOUNDQTQsIDB4MzNERTY5QTcsIDB4NUM4Q0Q4RTQsIDB4RjVEMTQwMUEsIDB4NEI1OUE0NkIsIDB4Q0QyNThEMDcsIDB4RjNDM0E0NzUsIDB4MTA1REZDMkUsIDB4Rjc5MjkxNDAsIDB4QTRBNDUwRkUsIDB4NUI0NTk4LCAweDE3MTM3Qjc1LCAweDFCMDVGMDgyLAotMHhENjI0NzREMSwgMHg2NzNBQjUwMCwgMHhBOTQ2MEI1RSwgMHg0NzAyNUFEMSwgMHg2RTY2OTVEOSwgMHgxMjYyQjZGNiwgMHg2QUU2NTE5MCwgMHg2NkE2OTQ5OSwgMHhEMDk5M0E3NiwgMHgyMjMyMTcyNywgMHg1NUMwQzU2RiwgMHg2RjdEMUU0MywgMHgzNTJGNTNFLCAweDZBRDY2NjJGLCAweDYyNzEzNjIzLCAweDk0ODQ4NEY5LAotMHgyNzE2MUUwNCwgMHhFOTk2MDY1QiwgMHhGRUQwNDExRSwgMHg4QkM1OUE0QiwgMHg2ODlFNEIwMSwgMHg0MDQ2N0U3RSwgMHg1NTBFMEY4LCAweDE4MzJENzhELCAweDZDRUM5NTgwLCAweDZBOUU4RjZFLCAweDUzNDBENEIxLCAweDE0NDlDNkQsIDB4MjIxNjM1MzAsIDB4QjRGNkMzQzYsIDB4QUQwMURBOTUsIDB4NjU2RjA1MUUsCi0weDgxNTExNjdCLCAweEEwQzM5NjZCLCAweDQwRjg1QjE1LCAweERENEI4RDJBLCAweDI0QkI2NjcsIDB4NTJFMTkzRiwgMHg1NkE3MDE5QiwgMHgxMjYyNTUwNCwgMHgxMUExNjI5NywgMHg0QjU5MDY2QywgMHg1OUU5OTBBMCwgMHhBNDVDMEIwMCwgMHg5MkMzNEIzRiwgMHhEMDZGNjMyNSwgMHhDNjhEMThCOSwgMHg3NDc4M0MzMCwKLTB4RUE1OEM1Q0QsIDB4MTQyMTUxRjcsIDB4REE2NDlFMDQsIDB4REE5NTA2MDIsIDB4NkU2NDE1MTAsIDB4QTcyNDkxNDQsIDB4RjQ2QTFGRiwgMHhBOTUwRjYxMSwgMHg3NTJFMUZDLCAweDdBNDYwNTUxLCAweEI4RTBENkQxLCAweEU5RDA5MTUxLCAweEM3NDVBMTA0LCAweDIwNzJFNjg3LCAweDlGODcwMTA1LCAweDY1QTBGMUZCLAotMHhEMEQ1MDBGOSwgMHgxQTkwMUZFMSwgMHg2RjRFOTQwMSwgMHgzMzMyMjU1OCwgMHg1MjUzMjczMiwgMHhEQjE2Qjc4MiwgMHhCQUE1NjA0NiwgMHhCQ0ExOTM5NiwgMHg0MTFCMzlCNywgMHhEQzg0NzE4NCwgMHgzMUM4QjM2NCwgMHg2QTY2OTA2RSwgMHgzRjg1RDhGMCwgMHgzNkVCNDM5MywgMHhENTE4OTg1LCAweDM0MzkyRjQ3LAotMHgxRkNGNEU5NiwgMHhGNEEwNUUwNiwgMHhCRDVCMTAyQywgMHhGRjA1NkE2NSwgMHg1NjFCQjYwMSwgMHhBQ0M1MEE1MSwgMHhBMzczMzIzNSwgMHg3RTFCNTNFMiwgMHg1MjUxQTBFNSwgMHhFMDc4MTU2RiwgMHgxRjU2RTc5MCwgMHhBOTk2NUQ1OSwgMHhFMDk0OUM3RCwgMHhEODdENTYwQSwgMHhEMDY0OUNFRCwgMHgxMDY1QTQ3RSwKLTB4MjU3Q0U0QzMsIDB4RTI0MDk1OTcsIDB4NzFENDkyMjAsIDB4MjUzOTI5RiwgMHg0NzY3M0VDQSwgMHg3MTZCNTFGMywgMHg0QzFDNDhDNSwgMHhDN0MxNTIwQiwgMHg3QjU5MzA2MCwgMHg0Rjg4NDkxRSwgMHhBNTY2QTk1NiwgMHg3NzY3QTM0LCAweDY1MTQ5QTAwLCAweEI2RDc1QTVGLCAweDk2QTc1N0E2LCAweEEwNTA2MTdCLAotMHhCMDA3RDE0MSwgMHgxMkEzNzdCMCwgMHhDNEU4RDVGNSwgMHhFMEM3NEI5NSwgMHhDMTNDMDZGOSwgMHg3OTk2MjEzRCwgMHg5QUM2OEY0NSwgMHg2NTQ2MEI5NSwgMHg5OUE3QzI5MiwgMHg4ODlDOUM2QywgMHhBNEVERDQ0MCwgMHhCMDY5M0RGLCAweEZGNTBFNDkwLCAweDUwN0E5NzcsIDB4RTQxNDdFRDAsIDB4ODBGMTk1MDUsCi0weEZDQzUwNjZFLCAweDc0QjY0MzE5LCAweDEwM0ExRUM2LCAweEIyODg1MDdFLCAweDU2QTc3OUEwLCAweDdDOTA1NkFBLCAweDM4MTI5NEZELCAweDVEMTk0RUMxLCAweEYwQzE5QjFGLCAweEQ2MEExREUxLCAweDk0QzBDNERGLCAweDdFNjY4MjRCLCAweDY5NjcwNjY3LCAweDQ2MTUyMEM3LCAweDc0NjYwNzFGLCAweDk2RkQxQTAwLAotMHgxMEM0RUE2NSwgMHg5M0RFMDQ1LCAweDZGMDFFMkU1LCAweEIxOTY5NDYsIDB4NTA0MjQ2QUQsIDB4QjQ1RTBGNCwgMHhBQkYxMTk0LCAweDg0Qzk0RDVBLCAweDExMUQyN0UsIDB4RjY5NTFCQkQsIDB4RTA4MTE2NkIsIDB4NTY2OTk5NjUsIDB4QTFGMTZDNTQsIDB4NDYxMDdBNjQsIDB4ODIxQzM0OTEsIDB4ODhEODZFNUIsCi0weEU1RDJDN0NCLCAweDUyMDM0MzJGLCAweEU2MTYzMzJCLCAweEY5ODU0OTM4LCAweEQyNzM2NzQyLCAweDY3MTA2MUY3LCAweDkyNDhCREI4LCAweDU0NDEwNkUyLCAweDYxMzQyODBELCAweEM2NUUwOTFELCAweDU1OTlFODYwLCAweEVDQzI0NUI0LCAweEZFNDU2NEUwLCAweEQ1MDBGNEY0LCAweDU5RkRDMEVELCAweDQ0NTMwMzc2LAotMHhCMTUyNzY3RSwgMHg2QTA3NDM1MSwgMHhDNTY1REUsIDB4QUQ5OTU4NDQsIDB4NTdGMUQwOTksIDB4QjI1MkQ0ODQsIDB4RDE5ODREOEUsIDB4NTE5NkE2NiwgMHgyQzU5RTE2NywgMHhDMEU5MDU1RiwgMHhGRDE5NkYwNiwgMHhGNUYwQzFDNywgMHhGQUQwNTE1MiwgMHgyMTI2RTBGNSwgMHhFOUY0MjkxMSwgMHhDODMzOTg5NSwKLTB4OEQ0MDVCRCwgMHg1MEU5NDM3NywgMHg0NDNBRjk0NSwgMHg1MDExMjkzQywgMHg3NkEyOTdBRCwgMHgxRUU0NDBDNSwgMHgzNURBRDlBMCwgMHhBNDQxOTU5MCwgMHgxNjVCQTYxOSwgMHhGNjBCOUE2NSwgMHgxRjg5NDQ0QSwgMHg3MUIwMjU1LCAweDQ3NkRGMEE2LCAweDYxRDRBMUEsIDB4NDY5RjlEQjAsIDB4MzIzNTVDOEMsCi0weDg2MDkxRDQ2LCAweEU3OTUwNjBCLCAweDIyOTYzMDVDLCAweDZFNDFGODAsIDB4RjQ5MEU1OTQsIDB4RjRFMjU2OTksIDB4QkY2NUFDNTAsIDB4NEE3RTc1REIsIDB4MTAxNUY0NTgsIDB4QjA0QUNEOUUsIDB4RUU1NDc4RjQsIDB4N0Y2MzBDNTMsIDB4NEU0OUY1RjAsIDB4Q0RBMzMxOUMsIDB4QkUxMTZEMjAsIDB4NDU4OUQ5RTksCi0weDc0MzU0MzRCLCAweEZERDk2NjU2LCAweDVGNjgxRTQsIDB4OTlBRDFDNTAsIDB4NTUyQTU0MDEsIDB4NjhGMDQ1NDksIDB4NzNCNjZEMiwgMHgxRjg2RDEwMSwgMHhEMDQxMTYwQiwgMHhGOTA2RkZBNSwgMHg2ODk2NzZERSwgMHg1RjQ3ODBCRCwgMHhGMDkzOUFBNSwgMHgxRjBCNUY0MCwgMHg1MDFCM0YsIDB4QThDMTkzQjUsCi0weDhDNzNDQzMzLCAweEUyNEY3Q0QzLCAweDkwOTBBNTY1LCAweEE5OTBENTlBLCAweEExQzE0ODc3LCAweDk0NkQ4MTgwLCAweEY4MzQzMTI0LCAweDE0QzFFOTE1LCAweDQ5MTlDQkE1LCAweEZGNTVEMDAxLCAweEY0RTE1MkEyLCAweDQ2Njg3RUYwLCAweEYwNUFCRDQ4LCAweEI3QjM3NDYwLCAweDE0NzRDNTgsIDB4OTRFNDkwRTgsCi0weEI5RTQ0MTgzLCAweDc4RDMyREUxLCAweEM4RTQ0ODlGLCAweDVCREFBNDVCLCAweEI1NjEwMTQ3LCAweDUxNjJBNUY5LCAweDVENjE5MUM4LCAweDQ1OTVDMEE2LCAweEE1N0RDOTk2LCAweDZEOUQwRDFFLCAweEY1OEJDNzY3LCAweDFBMEU1NTA5LCAweDQwOUJEMkQ3LCAweEZGNUMxMzUsIDB4MzNCNzU3OSwgMHhFRjAzNTYwMCwKLTB4Nzc5MTUyQiwgMHg1MEIwOTFCNywgMHgzNjNBMzE2MiwgMHg0OTEwNjlEQiwgMHg5QzRFMEM1RiwgMHg5NDVBMUIxMiwgMHg1NDkwRkYwMCwgMHhCNUEwQjQwMCwgMHgxRjgyRDY0QSwgMHhCMkM3NDI2LCAweDMyOUNEQTczLCAweEE5OTk1QUE1LCAweEY2NTg3NkI0LCAweDFFNEU4OTBFLCAweDg1N0FCNTc2LCAweEE1MkUwNTQsCi0weDFEMTFEODhDLCAweEEzNTg5NUIwLCAweDZGMTk2ODkwLCAweEM3MTQzRTcwLCAweDZCRTQwMUZFLCAweDExMUJBOTYxLCAweDY2MDcwQUY1LCAweDVGMDcxMzBGLCAweEExNTA2MUI2LCAweDhDNzNDRDMyLCAweDZDNjQ4MUQ2LCAweDZBRDVBNkMxLCAweDE0QTU4NzJDLCAweDQ2QjkwQkU0LCAweEU1NTg2OTQ2LCAweDMxNjNDNThDLAotMHgxNDMxQjU1MCwgMHg5MUU5NEYwOSwgMHg2NkY1QzI0QiwgMHhFRTQwNDYxRSwgMHg5NzU5Mzk5MiwgMHgxOUUwNTlGNCwgMHg5NEY5MkUwNSwgMHg4Q0M0NDVFQSwgMHg0MDNENjRBNywgMHhCMEZFNUQ4LCAweDlDOUI1QzAwLCAweDdFREVEOUE0LCAweDdDRDM5M0I1LCAweEYxQTUwREEsIDB4MzcyQjQwNzcsIDB4QkY5MDQ2RTcsCi0weDU2MjYxRTZELCAweDUxMjMyNTcwLCAweDQwMTUzQ0FCLCAweDlCNkY2NzEyLCAweDUxQzAxNjBBLCAweEI5OTAwNTJGLCAweDM3ODhCOTU1LCAweDU1NTA2NEEwLCAweDZGMEI1QjA1LCAweDk3NzY2NjZCLCAweEFBMDY5QjQ1LCAweEFGRjgxNDQwLCAweDkxRTRERTFBLCAweDgwRDVDOUM2LCAweDFFOUU1REE0LCAweDJCNjVCNDUwLAotMHgxMjEzMzYyQiwgMHhENzY2NjU0QSwgMHg0NjEzNDZDLCAweDE5N0IyNDQxLCAweDVGOTU0N0VCLCAweDE1QUYwNTA2LCAweDQ2NEM4RDlELCAweDQwMjE5NTdBLCAweEZFNTRFNDEzLCAweDEzMjk1MDM1LCAweDE0NUUwRDIsIDB4NEQ0ODU0RTksIDB4QkU1MDkxOUIsIDB4QTc2Q0Y5NDAsIDB4OTFFMTQwNkUsIDB4OUE2NTVBOUEsCi0weDNFNjUwMDVBLCAweDFDMEI2NjY2LCAweDI2MTFBQzU3LCAweEJFN0QxNDQyLCAweDMxMUUzRkMsIDB4QTQ4NTgxODUsIDB4NkU1NEQyQTEsIDB4OTE0MEE1REUsIDB4ODQ0RUM4NSwgMHhGNEE4MTU0MCwgMHgxMTU5QkY5LCAweDI4OTZEMDdELCAweEQ1RTY5MEVBLCAweDQwQTQ3RDQ3LCAweDZGNjcyQzE2LCAweEYxNjExMjE3LAotMHhFNDA5NkY2NSwgMHg2MjFEMDVFRiwgMHg5MDQwOTc5RiwgMHhDMUM1Q0E0NiwgMHg1Qjk2MDZCNSwgMHg1MTAxNzY3QSwgMHg0NDhDOTU2OCwgMHhFNDk4M0QxMiwgMHhDQkM4QjVFOSwgMHgxQjE1RTQwMiwgMHhFMUM2MEUxNSwgMHg0NEU2ODQxOSwgMHg5MEQ0OERDLCAweDdBOTA0MkJCLCAweDE1MTI4NUQsIDB4Njc2QjI2MTMsCi0weDEyMTY0NEI0LCAweDkyMEY1MkUzLCAweDU2REUwOUUsIDB4NkU2NjA3QTQsIDB4NUU1NjBCMEUsIDB4QzIwQjc2MTYsIDB4QUY0NjQxNDYsIDB4OEM1QzI4MzUsIDB4NDc0QkMyQzYsIDB4QkM2NDE5Q0EsIDB4NUM0MzUzRjAsIDB4MzEzOTI1NDcsIDB4NTA0Mjk1QUEsIDB4Q0M1OTMzNjMsIDB4MUMwQzZEQkEsIDB4NEQ3MUI3RiwKLTB4Q0M1OTM2MzMsIDB4RTcxQTI1MEIsIDB4RThDQzU5OUQsIDB4ODk0RkE2OTUsIDB4NEVDMzUxM0UsIDB4MzlDMEM2NDUsIDB4N0I1MjYwMzQsIDB4RjkxRTJFMDYsIDB4MUE2NjM2OTksIDB4MjAyNTk5RUYsIDB4QzFEMUUxOTUsIDB4NzVFNjAwRkYsIDB4RDBEMUVDREMsIDB4RDZEQjYwNTAsIDB4RTBFNTAxNkYsIDB4RjA5MTBCMTUsCi0weEQ2OEM2OTE3LCAweDZGMUEzRDAwLCAweEY1RDYxQkE2LCAweDMzNkQxQ0E1LCAweDc4ODg5NDFELCAweDc4RDA5MTJELCAweEUxRDFDMzRDLCAweDU5MkU0QzQxLCAweDE1MzlGODA0LCAweEZCMDE5NjUwLCAweEQ1RTUwNjA5LCAweEU4QzU1M0Y5LCAweDQxMUJFQkQsIDB4RTU4MEQxREEsIDB4MUNBQ0Q2OTMsIDB4QUYxNUJDRTEsCi0weDExMDQ5MDlDLCAweDRCM0I0Njg2LCAweEIzQTMxMjUxLCAweDUwRjU2NjUsIDB4MUQ0RUMxRDMsIDB4MjgzMEQ3MTIsIDB4NDAxRjA0NzUsIDB4QzA4OUQ0REQsIDB4QjI0MjU3MDEsIDB4NDAwNzZGNjUsIDB4QTk1MEY1QTQsIDB4OUY5OTkwQkYsIDB4NzAyMTQ0MzEsIDB4MjI3NTNDMzEsIDB4Q0M3MzY5RDksIDB4RTk5MTkwNjEsCi0weEY0NUExRjEsIDB4QkQwNjkwRDAsIDB4NzlBNkMxODAsIDB4MkZERDEwNUEsIDB4NTg0Mjk2Q0EsIDB4MTE2RjkwNkUsIDB4NTg0ODRDNUMsIDB4REY5QjEwRTYsIDB4NTE4NDQ4NkQsIDB4RTlEODlEOTAsIDB4NjlCMDVFRDIsIDB4RDk4NDFEMkIsIDB4QzJDNkM1RTYsIDB4Rjg4OTQ3Q0QsIDB4OTA2OTY0NjksIDB4QzVDMEM2REYsCi0weDY3N0IwNjQwLCAweDRCNDc5QkM1LCAweDgzRDFCODExLCAweDVCNDdFNDQwLCAweDFBNDE5REVBLCAweDNERDhENEE5LCAweDg3NTJCMEYzLCAweEQxRDE4MTg5LCAweENDQTYzMkNDLCAweDcyNUNDQjczLCAweDYzMjVDQzMzLCAweDE0NDY0QTI1LCAweDU0MTAzMDNGLCAweEY4QzEyRjg1LCAweDM5RDIwNUU1LCAweEZFODUwNTQ5LAotMHhDNjg3MTBCNSwgMHg0NzFGNzg0MiwgMHhEMzRBNEM2QywgMHg0NzQyRDE4OCwgMHhCRkQ1MEE0NCwgMHgxOTg3Nzc3QywgMHg1QjYxQzEyLCAweEIyNTMwNjc3LCAweEQ5OTVBOTE2LCAweDc1QjQ5NkEwLCAweDMxRTYxRTcsIDB4NTM5MzlERUQsIDB4NTE3MDVCMDAsIDB4QkE1QTQwNDYsIDB4RkYxNEE0LCAweDI1OTlEQ0Y4LAotMHg3RDQ3RjAyRSwgMHg5Qjk1OTA2NCwgMHhEQ0Q0RTAxNCwgMHgzOEMyMkREMSwgMHg2NTY0N0M4OCwgMHhENDYwNjA2NiwgMHgzNTUxRTBEMiwgMHhEMDYxNTdGRSwgMHgxMTMxMjYwQiwgMHg4QjgxRTQ1NCwgMHgxRTE4NjVGRiwgMHgxOTY2QTUyNCwgMHg0QjQ2ODREOCwgMHgzNDUwRjFCNiwgMHhFNEZFNDFEMSwgMHgxRDMxRjFFNiwKLTB4QzQ3QzFGNEEsIDB4OTQ2NTZBQiwgMHg0NUQxMDFCLCAweEI2ODFCNzEyLCAweDlCRDA5MjE1LCAweDc3OTI0MTU0LCAweEZDRUNENEEwLCAweEYwRjFDNzJELCAweDc0RDA4MzRGLCAweEU0OTA4MTE3LCAweDY1RTAzNjVDLCAweDk1NUEwOUVGLCAweDZFNzQ0MzQ5LCAweEY0NjkyQjEzLCAweDM0NzUwRjZFLCAweDk0RDE5OEE5LAotMHg4MzlDMkRCMiwgMHhFRDkyOTU4MCwgMHhFQTYwOUU2NSwgMHgxQTE1RjhEMSwgMHhGRTAwRDZBRCwgMHhENURDMDE0MSwgMHhEOTBEMzk5NSwgMHg2RTY2NDBFRCwgMHhBOUI0NDNDRiwgMHhFNTA2ODFEOSwgMHgzRjcwNTY1OSwgMHg1RjVFNDg0NCwgMHg5QTI1NEE1QiwgMHgyNjYxODE5NSwgMHg4Qjk0NURBRCwgMHhERkQ0RTQ5MCwKLTB4Njc0MzUyQzAsIDB4OTk2N0MxQzAsIDB4NTk5MEU5OTUsIDB4REVDNTQ0QkEsIDB4QTdEQTQ0NCwgMHgxNjQ1N0U4LCAweDE0MkRGRTA0LCAweEE0RDVDMDg0LCAweDEzMTcyNTM5LCAweDg0RkMzNTkwLCAweEE5NzM0NzQ4LCAweEZFMDdGNDUxLCAweDQyMTE5QUVELCAweDhGMDg3OTE2LCAweDEzQTY1RDEsIDB4ODI4NTZFNzUsCi0weDM1MTFCMUI5LCAweEE2MUJEMDE4LCAweDg2MTlCODkzLCAweDQwQkQ4OUU1LCAweDlBMTVGNjQwLCAweDQwNTI0NjRGLCAweDlEODdDMUUwLCAweDk3MkM1OEYwLCAweDg0RDhFRDU0LCAweEU2NEQ5QzVELCAweEY0MjE1MDJGLCAweEYyNDg2NCwgMHg1OUI4QTE1NCwgMHg5QTI1OTZERiwgMHgxNDQxRTZGQSwgMHgxQkU0NkY5MCwKLTB4QTg5MTUwNTEsIDB4QTVCNjI2MTEsIDB4RjU4Mjg0MUQsIDB4ODI1MzYyQjcsIDB4NTVGMzY3RSwgMHg0MTUyNjNCRCwgMHgzRTQ2MzkzMCwgMHg2ODc1NEEwNiwgMHgxMTE3RjI4MCwgMHg4QjE2Qjg1NSwgMHhFQzc1RTFDNCwgMHhBMDc3MTExNywgMHg2NjlEQjg1MCwgMHg2RDE3MTIzOCwgMHg0NzE2NzIxMywgMHg5MEIyMTc0NiwKLTB4RDkyNjQ5QzgsIDB4Q0FDNkM2RjEsIDB4RTM5MkM3NjksIDB4NjBFNzkzOUIsIDB4MTQxMzA0NzUsIDB4NTYwMDFBN0QsIDB4RjY1NzAyOEYsIDB4NkY2ODE5RSwgMHgyOTk3NEMzMywgMHg0OUE1N0M1QywgMHhENTkwRTg5MCwgMHg2RkYxMTE2LCAweDEzMkI3NjY1LCAweEEwQzYwQjU2LCAweDk4NDRERjQxLCAweEExQjEwM0UsCi0weDQ0ODQ1RUVGLCAweEE2RDJGNUQ1LCAweDU1RkE0NjAwLCAweEJGNjExMjY0LCAweDZBRDUzNjEwLCAweEVENTk0QTExLCAweENGQzE1MDE1LCAweDk2MjY0MjQ3LCAweEE0RjFEM0RBLCAweDI1N0VDMTY2LCAweEI4RDZDMTE0LCAweEVBOTBDRjRGLCAweDZENUE4MDQsIDB4M0YwNjk1RTgsIDB4OUM5MEJDRTksIDB4QUI0NzAxRDEsCi0weDEzNjM1N0I1LCAweDk5NEQ5RTBFLCAweDEyMTY1MkIyLCAweDZEOUZEMjYxLCAweDVDQ0M5NzMzLCAweDg3M0I5NUU1LCAweDkwNUU5QzgwLCAweEEwNTFCQTZGLCAweDVGNDc4NTg5LCAweDE5N0FEMTlBLCAweDUwMDE1REU5LCAweDVCQUU0MTJGLCAweDQxMTExNjJCLCAweDczOEYzODYsIDB4RTQ4MzVCQUUsIDB4NUI1NUEyRDAsCi0weDVFNEIwMzgsIDB4RjlGOTEwMTQsIDB4OEZDQkQxRTEsIDB4RDk4QjQ3NDMsIDB4Qjk5NTVEQUYsIDB4QzUzNzNEQ0QsIDB4QkQxQzgxMTQsIDB4MjUwNTMyRjEsIDB4MjQ1MDRFMEUsIDB4NjJEN0M1MCwgMHhFOEQ0NDE1NCwgMHhBODk0NDA0NCwgMHg5RDY2OTk5NSwgMHg1MzBDNkZGQSwgMHg2NTE2N0JBNywgMHhFNjQxQkUsCi0weDgxMUFCNUQyLCAweEQxOEE5RDA5LCAweDZGMDY0MDQ1LCAweEJGOTAyOTkxLCAweEM1NEYwN0ZGLCAweEY2OTYyQjExLCAweEE0ODE5RkRCLCAweDYwRjQ2QTU0LCAweEU0NTE4MTVCLCAweDdDMTk3QiwgMHg5RDQ0REEwQywgMHg4Njk2NDBGRiwgMHgxOEM0NEQxOCwgMHg0MDI0N0Y2NiwgMHg1MjIxRjcxMSwgMHg1MTAxOTZGRiwKLTB4MzUzMjYxRUYsIDB4NDQ0OTBFMEUsIDB4Rjk5NEU5NTYsIDB4OTI2QzQ1QkYsIDB4N0Q5Njg1NUYsIDB4ODRENEM5OEEsIDB4RTA2QkY0NTYsIDB4QzIxQjE2NDEsIDB4NEI1Q0I0OTMsIDB4REE5MEQzNjYsIDB4RTg5NjRENDQsIDB4MTk3Qzc1REEsIDB4RDZENDYzMzMsIDB4NDY1RTc4QTEsIDB4MTk0MjQ2MUUsIDB4QzEzNTY2NTYsCi0weDU4RDYzMUNDLCAweEQ3NzMzODRDLCAweDRBOTk0MEU1LCAweEEwRjk3NDE0LCAweDUzNTMyMzI3LCAweDc4MTA3QUI1LCAweDNDMDkxQkE1LCAweEE2NDY5MTQ0LCAweDQ0RTQ1ODQxLCAweEM1MEQ1ODQyLCAweDRBMTk5Njc4LCAweDQ2MzY1REY4LCAweDU0NjNFODcsIDB4OEQyQzExNTEsIDB4RkY1ODk1LCAweDJGRDIzMUM4LAotMHg2QzlDRDJCMywgMHhENzQyNDNCMiwgMHhDNDQwOUNERSwgMHhCOEUwNDExRiwgMHgyNjY3MEYwNSwgMHg1QjY2OTdBOSwgMHg1NTQ2NEEyQiwgMHgyRTBGNTY5QSwgMHg0NjYwRTI1QiwgMHhGRTUwMDcxNSwgMHg5QzY4MzUzMiwgMHhDQjBDNTk0OSwgMHg4MDZDNjU5MiwgMHg2NzlCMDE1NiwgMHhGRTAwNUYxNSwgMHhBNTQwRkU1MCwKLTB4MUYyODE1MTAsIDB4OTA2RDRGMDAsIDB4NTcwNTJDODAsIDB4QTk1QkMwQjUsIDB4NkM5OEM1Q0IsIDB4NDQ1ODFFNEUsIDB4QUQ5RDQ4NDYsIDB4ODM1MkM3REIsIDB4QjIxRTUwRDksIDB4RUI0NjA3QjcsIDB4OTlBQzlDNzcsIDB4MTUwOUQ5RkMsIDB4NTQ2MDEzM0UsIDB4NDI0NEVFNUEsIDB4RUY1QTI1OUEsIDB4MzQzOTQ2MUIsCi0weDZCOTQwQjA1LCAweDU5RTk0NDg0LCAweDUwNjJCNDVFLCAweDg1OUI5MzYzLCAweEZERTQ4MTk0LCAweDMyNTM2MkQyLCAweEU0NjBGQjQ2LCAweEQ3OEI5OEU3LCAweDY0QTNEMzQ2LCAweEU1QjA2Mjc3LCAweDlGNjU1QTQxLCAweDY3NkI1MzAyLCAweEVBOTUwQjdELCAweEZEMTU4QSwgMHg3NzUzNjJCNCwgMHg3NUMyMTkzOCwKLTB4ODYxRUI5RDIsIDB4NTg5NTMyQ0MsIDB4MTAyNTE5MEIsIDB4RDQ2QjA2RkYsIDB4QjUwRTdDNDQsIDB4Q0REN0EzNzIsIDB4QjVCOTYxMDAsIDB4RjJCNDkxQTEsIDB4NUU5OTYwRjQsIDB4RjFDQzU4MkUsIDB4ODlDOTk1NzUsIDB4N0FBMTQ3NUYsIDB4N0I2NkMxMjQsIDB4RDBENjgxRUYsIDB4NDQxNTZFMDgsIDB4OEYxRjEwNTYsCi0weDZFNjdEMjQwLCAweDlBNEM0OTUxLCAweEQ0NTFFNEE3LCAweEVBOTQxQjEzLCAweDdFNDcwMDcwLCAweDg1NDIyRTdGLCAweDVCOTY5MEZFLCAweERFMDZFNjI2LCAweEM4ODU0QTE1LCAweDVBMDVFRDRELCAweDgwRjQ2RTFCLCAweDkwMTFGMzAyLCAweDQ0OTNEMkQ4LCAweEU1MEQ5RDY4LCAweEZCNzY0NDAwLCAweDY0RDE4MTZGLAotMHg5OTY1QTYxNiwgMHhCRjAxMTgxMSwgMHgxNTVCMDI1MiwgMHgzRDlEQTQxMSwgMHg1OEQ5NkQ5MCwgMHg1RkFDMTRGLCAweDM0RTA5RjQ3LCAweDc0NzAzMDNELCAweDM1MzE2RTVCLCAweDg0NzgyRDE5LCAweDYwNzRCMTE0LCAweERGODUxMjRGLCAweDVCNDdCNzIzLCAweDkxMzI3NjczLCAweDMxQTNDNTQ4LCAweDZEMDRGOSwKLTB4NjVEQTYyQ0MsIDB4Nzc5QjYyNzAsIDB4OTAzNzY5OSwgMHhENTlBMDYxQiwgMHhEMTQwRjVEMCwgMHg1NDZGMDRFNSwgMHgxOTdBNjE5MywgMHgxNTBGNDZGQSwgMHhFMDU5MjE1MSwgMHg1NEE5RDBEQiwgMHhBQTU1RDg1MSwgMHg1MDYxNkY2NCwgMHgzNTMwNzk5NCwgMHgxMTk4QzcyRiwgMHg0NzJFNzlEMSwgMHhGRjAxOTgxLAotMHhGNjE5NUFGRiwgMHg1OEU2NjIxOSwgMHg2OUQzRDY3QywgMHgzMzk1QzgzMiwgMHg1REEzMURGRiwgMHhENjZFNzU4MywgMHg4MDI5NzlENywgMHgxQzQxOTgwNSwgMHhBNTk2OTE2QSwgMHg2QTQ2NDQxNCwgMHg2NDcwMjU0NywgMHhEMzFBQjcwNCwgMHg5MUU2QzIxQiwgMHg0MUFGNTUsIDB4QzYwMERGNjQsIDB4MkQxNjI5NjAsCi0weEQwRDlBQzY0LCAweDkyMUM2Mzc4LCAweEQwMDUxQzE4LCAweENDMjY5NjlDLCAweDNDODU2ODk5LCAweDU2QTlEM0EzLCAweEM4Q0NEOTY2LCAweEI0MjU1MkUyLCAweEZGMDU1QjVCLCAweDRBQzdFNjQxLCAweEU3NDdEMERELCAweDQ1QTVGNzVELCAweEZEOTYwMjA1LCAweEE2MDM5MUZELCAweDVFQUQ4NDg0LCAweDEzRDBFNTYzLAotMHgxMTAxMUJCRiwgMHhGNEE0NDE0LCAweENCNUQwOTM5LCAweDFENkRFODA0LCAweDJENkRGODUwLCAweEI3RTExNDMxLCAweDhCMjUzNDEwLCAweDI0RDdBOTE4LCAweEE2NTkxRjZBLCAweEZBMDU0NSwgMHgxMEQzNDIxQSwgMHg0RTRDRTQ1MywgMHg5OUM0OEMzRCwgMHg3MUQxQzBGLCAweEI0Qjk0MDQ1LCAweEUwODE1RDA1LAotMHg5RDg1NDIxNCwgMHhGNUYwNjEzNiwgMHgxQTU4RkQxNSwgMHg0NzQyQTY1MCwgMHg3RTY2NDY0QSwgMHhDQUM1RDFGMiwgMHg5OUE5MTQ0MSwgMHhCMDYxMTVGQiwgMHhDMEY0MzUyMiwgMHg5Q0U5Q0RDOCwgMHg1OUVBNDA0RSwgMHg1QjQyQTcwNywgMHgxNjkxNEJELCAweDg3MkRGMDg3LCAweDQxMTRBRTlFLCAweDNCMTI4NEZFLAotMHg1RTVFNTgwOCwgMHg0NjgwRDY2QywgMHgzNjQyNDZDMiwgMHg2NUMyNDYyRSwgMHg0MjFDNzhBMSwgMHgxRUI4RDVFQSwgMHgyOEYyNEM1NSwgMHg1MDIxNjcwQiwgMHg5MEJENzg3NSwgMHg3MTM4NUNDQSwgMHhFN0YwNzQxMSwgMHgxRjExQTM2NiwgMHg1RkRGQjg1MiwgMHg0QzRERTA1QSwgMHg5RTBEOUFENiwgMHhFMDk1M0M4NCwKLTB4RTVDQzA2NDEsIDB4RTAxQkY0MDYsIDB4NTFFNDA3MkEsIDB4NEQ2NkI4QjUsIDB4MjcyREFEMDQsIDB4RjJDMzk4NkQsIDB4NkQ2ODAxNTgsIDB4NDY0QjA3NTUsIDB4NTUwMDQ3RkIsIDB4NzRCNDFEMSwgMHhBRjU4Njc2QywgMHg3QTY1NTI0MSwgMHg2NEI5NTA1QiwgMHg0RDFENEQ4RCwgMHhGRkE1OTA5QiwgMHgyRjA3NTRDMSwKLTB4NDA1MjI1NkQsIDB4QjlENjg2MDksIDB4NjY2MTVFQiwgMHg4QTNENjREMSwgMHgyMzkyRDFFNSwgMHhGMEExNUFCRCwgMHhGNzM3NUIwMSwgMHg2OTkyOTFBMSwgMHg2MDdEMDE1NCwgMHg2RjE5Q0RDNiwgMHg4NjlEQUM1MSwgMHgxMTE2NDcyNiwgMHhCMEI1MEIxQSwgMHg5NTUwRTMyMCwgMHgyNTdGRjQ1MCwgMHgzMjY0NjY5QSwKLTB4REY1RDQwNUIsIDB4ODE5ODU1RTcsIDB4NkI5N0MwQTQsIDB4ODgzOTQ5NDUsIDB4QkNGMTQ0MTEsIDB4NkVENDk5LCAweDU3MDE5M0UzLCAweEZBMzQ2NDAxLCAweEY0NzkwOTUsIDB4RTZFNjg1MEIsIDB4QjJGMTYxNSwgMHg5NUUyMTYwLCAweDE0NEQ4QTNELCAweDM5MzJEMTg2LCAweDVCNjRGODAxLCAweDFGMDc0NkU3LAotMHgxNDQzRUY5OCwgMHhFODQ0NEU0OSwgMHg0NzQwRUI1MCwgMHhCOTAzNUI1OCwgMHhEM0QyMUIzRSwgMHhCODc2NzY5OSwgMHg2N0Q3ODM2NiwgMHhCRDExODdDQiwgMHg2QzVDMEMxQywgMHg5MDZEM0UxMywgMHg5RTFFNkM0OSwgMHg0MDA1OThFRCwgMHg1MjkxMDZGRCwgMHhCNEMxMEQyRCwgMHg3NDBEQzMzNCwgMHhFOTk0NThBMCwKLTB4OTRDOEQ1NzIsIDB4RDdEMTgyMjgsIDB4MTNFNTY2RSwgMHgxQkMzRDYyOSwgMHg2MzEzNjE3MiwgMHg1MUExQjEwLCAweEYzMDVGNEUwLCAweDY3OUY2ODEzLCAweEQzODM1NkVBLCAweEQ2NjlDODU2LCAweEM1Q0U1QTQsIDB4QzczOENCNzQsIDB4NTY3REI0ODAsIDB4QTY1Rjk0NDAsIDB4RTIwNzE3NkIsIDB4OUQ1RTRBODgsCi0weDFFRkQ2NDQwLCAweDEwOTU3MzhBLCAweEYwMDU2NDZFLCAweDE5RTE4NzAsIDB4RUM0ODE1NDUsIDB4MkU1OTgxMDUsIDB4NTVGNzQzOUYsIDB4REJEQjQxQTEsIDB4RTY0Rjk5NSwgMHg2QTkxNjRBOSwgMHhBNTE5MUUwNCwgMHhGNEQxNDEzQywgMHg2NDZFQTA1NiwgMHhFMzkxMTI2MywgMHgyMDExN0E2NSwgMHhGOTA1OTMwNCwKLTB4NDgzNjY3NTQsIDB4MTIxNjZCNjcsIDB4ODY4QTY3NywgMHg0NkRCODBDMCwgMHgxODc4RDY5QSwgMHg2MEQyNkRDMSwgMHg0MDVFRTgwNCwgMHg4NEQ5OTBCRiwgMHhEQUQ1NDYwNiwgMHhEOTMzNjVDQywgMHg5M0IyOTcxQiwgMHgzMTI2OTE1MSwgMHg1RjBFNThDMiwgMHgxOUI5NjM5MCwgMHhBMUFENDQ0LCAweDkwMjg2RDk0LAotMHhCMUQxMEI3RSwgMHg0MEZBQTQ1MSwgMHg4Mjc2ODE1RSwgMHg4NjY5RjQwMCwgMHhCNUE2MUIxMiwgMHg2NUZDOUI4LCAweDQ0NkFBNTUsIDB4QTExRDgzNzgsIDB4QUQ5RjQ0NjgsIDB4MjEyNjZFMUUsIDB4ODY4NTQ0RkMsIDB4Njc1MjAzMTgsIDB4ODU4REQwRUIsIDB4ODZENDkwNkYsIDB4NTFEM0E5QTYsIDB4OTc2Nzg1N0UsCi0weEQ2Qzk5QzY4LCAweDMzQ0MyNjY3LCAweDY2MDc5NUY0LCAweEQxRjEwMTU1LCAweDg2RDkwRDE2LCAweEU2NkExNjAzLCAweEY1Rjg2NDQwLCAweEU5OEU0NTA0LCAweDE3NDI0QjlBLCAweEIwODM5RjU5LCAweEU3MDQzOEYwLCAweDQzMkE3NTYwLCAweDkyRDg5RkM1LCAweDM3QzQyMzk5LCAweDExNjE3NTcwLCAweDI0OTYwNUJFLAotMHgxMDFCRTI2NSwgMHhFRTkwNTA1MywgMHg0NTQwREE1OSwgMHg5NzI5QTRGRiwgMHhFRTg1MDYwNywgMHg5RkQxNTI0OCwgMHg1MEU1QjMyMywgMHg3NTc5Rjk0NiwgMHg0OTg0NTlBRiwgMHg5MTlDMkMxRSwgMHg2QUQ3ODM3NCwgMHhCMTY0NzQyMSwgMHg5RUUwQjYwMywgMHhBNkQzNUU5LCAweDk2Njk2QzlFLCAweDU4N0E1MDAzLAotMHg0OTQ1NEE5LCAweDZENkQ5MzkzLCAweEM5ODY3N0U5LCAweDQwOTVDMkVGLCAweDlDNjA4NTA1LCAweDE1OTQwQzJDLCAweDVCNjBEMkRCLCAweDFDODE1MUE5LCAweDYwRjQ5MUQyLCAweDJCNjcwNDUzLCAweDRGMTk2NEJBLCAweEI0NDMwQjUxLCAweEE5ODYwNDU0LCAweEIwRTQxRTQ2LCAweDE0MDZCN0UzLCAweDU2MjcwMUU0LAotMHgyMEQxRjZBMSwgMHg1MzUyQTk2NiwgMHg2NEUxRDYyRiwgMHg5MkM2RUQwNywgMHhGODgyNTYxQiwgMHg5OTE5NUEwNCwgMHhDOTM0RTNBQywgMHhEOUI5MTgxMCwgMHg0NzRCMDRGNCwgMHgzRDlBNjYsIDB4Q0E5QzEwQUYsIDB4RTE5NDI5MTYsIDB4QTEyNTM1NSwgMHgzMjI5NUM4QywgMHg2NzVBNjRFMSwgMHg5RDkwNjQ5NCwKLTB4NkM2MEVCMUYsIDB4Nzg3NEMxQkMsIDB4MUNCNTMwMzgsIDB4NTZEMEY5RDEsIDB4QjFFQjk1NCwgMHg3Qzc4MTU0MCwgMHg1MzIzNjE5RSwgMHg2RkUwNTVBOSwgMHhFNzQ0MEQyMiwgMHg3NDMxQTM0NywgMHg2RjFCRTE0NiwgMHgxMDE1QkYwMCwgMHg2MjM4MTkwNSwgMHg3MDI1QjQ0MCwgMHgxNzZBRjA1MCwgMHg1RDI3MEVGMSwKLTB4NDZBRjRDMTgsIDB4NEI4NkQ5RUQsIDB4OEIxNzcwMTAsIDB4RkFEMDk2MDYsIDB4QkZBMTVFNTAsIDB4NDcwMUQ3MkQsIDB4QTI5OEE1NUUsIDB4ODY1Q0E5NTAsIDB4OUI1QjEyMjcsIDB4RTBCOTE3NSwgMHhGNDgxRjFGQywgMHg3RTVEMDQ0MCwgMHgxQTY5N0ZFNSwgMHhERTg0QzVGMCwgMHhGOTk3NTMwMywgMHg0Q0I0NkM1NCwKLTB4M0VEMEQ2NjYsIDB4RTZCMDcwNjUsIDB4RjA2NjEyNjMsIDB4MTE3QzkzQTAsIDB4RDU2REI0RTEsIDB4MkU1RTBFNUQsIDB4ODczREUxMUYsIDB4NTUxMjQxM0UsIDB4NUU5Q0U0MDQsIDB4QjRDMTBCN0YsIDB4Rjk5MEU5NTYsIDB4ODRDOTVFOTUsIDB4QjVFMDRCMUYsIDB4ODY4MTVCQTUsIDB4N0E1Q0IyNkMsIDB4NDJGNDFGOTEsCi0weEY0NTkyRTAzLCAweEY1MUYxMzAwLCAweDk5RDc4MTBGLCAweEIxNjA1MUE3LCAweDVCNTdCMDNFLCAweEVFNTkwQjU1LCAweEMwMTRGREQ2LCAweEY5QzA0NTA1LCAweDFBNjY5NjY5LCAweDk4NEM1Rjg0LCAweDFBNkZEMkUzLCAweDFBMDc1RTUsIDB4RDgwRTQ1MEMsIDB4RDY2OTQyQjYsIDB4RDA1MEUzMUYsIDB4QkE2MDU0NDAsCi0weDUwRTc4NTZBLCAweDQwNkU1M0VGLCAweEYwMTE5MUIsIDB4QkYwNTUyNDMsIDB4OUIyNUU5RTcsIDB4Rjg5MkExNTcsIDB4MkQ1OTg5NTcsIDB4ODU4OTZCNiwgMHhFRjQ0NTg0QiwgMHgxNzA2NjdGQiwgMHhEMTAxN0YzOCwgMHhDRUM1ODY4NywgMHg0NDNDNkM5OSwgMHhCNUI4M0QzLCAweEZEMDVEOTFCLCAweEE2RDcyREQzLAotMHg2Qzk4RDlEMCwgMHhENjY5OTBFMCwgMHhERTg1MEIwRiwgMHhFOTk2NDYwOSwgMHg4NjA1Qjk0QiwgMHg2REMwRDE5NiwgMHhCMTk0QTUsIDB4NkYxMzQyNEQsIDB4OUVEMTMyMTUsIDB4NzA2NDI0OUYsIDB4NTc1MUUwQjAsIDB4MTY2RjI2RDYsIDB4NTU5RUMyRjgsIDB4RTEyQzVDNzEsIDB4NTk4OThEMTUsIDB4QkMwMTVBMDUsCi0weDkwRDE4QjBGLCAweEIwRTg2NDlDLCAweDE3MEI5OEQwLCAweDgxODFGNDkxLCAweEQ5OTA0OThDLCAweDc2MzEyOTI1LCAweDkzQjUzNDAyLCAweENDMUM0QjU0LCAweDJGM0Y1MDA2LCAweDU2RUM0RjEwLCAweDFBRTUwMUU0LCAweDZGNEQ0MERCLCAweEEzNTI1RDY5LCAweDEzMjlFNDkxLCAweDQwMEFGOTk1LCAweDJENUM0ODA2LAotMHhCMDkxNjY3RCwgMHhDQzZDMTYyNywgMHg0MjVDRDlFQywgMHhGNTUyOTMxQSwgMHhBNkQ0NjU4MCwgMHhGNEFFNTBFMCwgMHgxOTc5OTA5QSwgMHhGMTc1MDA1OCwgMHgzMzY1Q0NEOSwgMHhCQTE2NjUwMCwgMHg4Njc3OTczOSwgMHg2N0YyNjExLCAweDU1MTA5QTBCLCAweDUxMDE2QTY1LCAweDExNjBCQkYsIDB4NUE2QzE0MDEsCi0weEM0REM5OTg0LCAweDMzNTM0MjQ0LCAweDQwNTcxMTNBLCAweEYxRjQzMUMxLCAweEY4QTQ0QkU1LCAweDFBOTc2ODUxLCAweEI5QjVDMjhGLCAweEZFMDk5NDU0LCAweEIwNjVCOEI1LCAweEMwMjE3NzA3LCAweEYzODMxQkQxLCAweDk3NTc0MDFCLCAweDFEMjkzNTgwLCAweDdBOTUxMjAwLCAweDIwNjE1QUY1LCAweDYyNzI3NTcsCi0weEUwRkMyOTA3LCAweEQ4NjBCNUMxLCAweDk4NUY4OUMsIDB4QzI1QzJDNUYsIDB4N0Y5NDFDMDEsIDB4QTk1QTQ1MEEsIDB4NDREODlBOTUsIDB4Q0UxQzBDNTgsIDB4MTk0MTg0RjksIDB4NTc5QkIzNzEsIDB4OTAxMTFGNDAsIDB4NUYwMzcwNzUsIDB4QkI1MTY5OTYsIDB4NEVDOTc5MSwgMHhDQ0VDOUM0NCwgMHg1RDg0MDRGOCwKLTB4NDhGRTlEMSwgMHg0NzkyRTNFMiwgMHg2RjM1RTM4MSwgMHg1RjAzNTBGQiwgMHhGRjZDNTYsIDB4NjA1MEE1RjcsIDB4NTg5NjI1QzksIDB4OEY3OTA2MUQsIDB4MTFEMDQyMUYsIDB4OTA2MUYxODQsIDB4NTA0NjYyQkUsIDB4OEZDN0QxOTAsIDB4QjQ0MDQ2MjcsIDB4RUExRjFCMDMsIDB4QUY1OUQwRUEsIDB4NzlFNTBFMDQsCi0weENGODA0NDVELCAweDQxOTFEMzhCLCAweDhGNTEzMjgsIDB4NjY1M0UyODIsIDB4OEM1QzM1NzMsIDB4OTBFMDU5MjksIDB4QzU5MTBEMkIsIDB4QUU0NzlENDYsIDB4MkY3QzE2MTAsIDB4MjRCMTYzN0UsIDB4Q0IwMDFGNTUsIDB4MTE4Mzg0QjUsIDB4QTM0MjE3MTAsIDB4QUEwNzI1RjQsIDB4RTlDMDk1OUEsIDB4RTVFNzQxMTQsCi0weDRBNDRDQjI1LCAweDE3NjNCRDkwLCAweDFCMDk1NDA0LCAweENGMDlEMDk1LCAweDVCODM0NEFDLCAweEM1QzBGOUQxLCAweEE3NjE1NDQxLCAweEU5OTA0NzRCLCAweDYzNTM2NzIzLCAweDFFMzA1QkE2LCAweEU1NkIwNjZCLCAweENBODE3OTE2LCAweDlGNzk4NTc4LCAweEQ3NjkyRTA2LCAweDU2RjAxNDgxLCAweDM3MjE1MTAwLAotMHgxNzExMTQwMSwgMHhGODkwRjk1NSwgMHhBNjhENjhENiwgMHhENjRBMDZGMCwgMHg5RjY1RDlEMiwgMHhCRTkwMDk1RiwgMHg5OTY3MDcyRiwgMHhFMDFDOTQ3QiwgMHgxMjIzNTcwOSwgMHg1ODlERkQsIDB4QkIxNTRBNDEsIDB4MkQ1REMwMUYsIDB4QzU4QjVDMDgsIDB4Q0I2NERDNEMsIDB4OUY5MzkzQUMsIDB4NzMwMzQ2N0UsCi0weDU5OUVDOTg0LCAweDQ2RTExMUZDLCAweDdBNjc5NDA0LCAweEE5MDY0N0ZCLCAweDQwRUU5NDlBLCAweDc3MDc2RTA4LCAweDEwNzM2NDIzLCAweDUzRDkwQUIsIDB4MUY1MTBCQiwgMHg4NUNDMjUzQSwgMHhBQTkwNTY2NiwgMHg0NUVDMEI0LCAweDgzNTEyMUYxLCAweDJFNUE0MjQ3LCAweDFEODY2NEEwLCAweDUxNDQyQ0UwLAotMHhERDg4NDUxRSwgMHhFODVDMDExMywgMHhGQTQwOTYwMSwgMHhBNDIxMTYyNywgMHg0NTlGNTBCQSwgMHg5ODRDNDU4QSwgMHhFNjVBNjBENywgMHg5NTgxNDNCMiwgMHhEMzgzNUJGQSwgMHhGNzI3RjExMCwgMHg0RjA3NDM1NCwgMHgxMTExM0QzRCwgMHgxNTU4MzEyQiwgMHhGRjA4RTZENiwgMHg4OUJDNTkxMCwgMHg5OUY5OTI4NywKLTB4NDBENDE4M0YsIDB4REE2NkE1NTAsIDB4QTQ1Q0UyNzksIDB4N0Y5N0EyNTEsIDB4QjFCMDI1RiwgMHg3MDc3MjI2NSwgMHhGMEUyMUUxNiwgMHhFNzk5NTlCNSwgMHg0OTY2NjlDNiwgMHhFQ0QwMDcxNiwgMHg1NjE5RUNFMSwgMHg2RTVDMTFGLCAweDExMDFGRkY4LCAweDU1QTAxRENCLCAweEE1MDUzOTcwLCAweDNENDQ4ODU1LAotMHg5RjkyRTU0MCwgMHgzNUI4QTREMCwgMHg4NDExOUNBNywgMHg1NDI5NDA2RiwgMHg5MEUwNUI1NiwgMHgzNzUyRTFEOCwgMHhFMUI0MkQ4NywgMHg5NDU0QjBGMSwgMHhERDM4MjUwNSwgMHgxOTA0RUQ2RiwgMHhEOTREMEM1OCwgMHg3QzUyMDMxRiwgMHgxNEIwNjcwNiwgMHg3OTkyODc5OSwgMHg0MDE0OUJDNywgMHhFOURDRDZEMCwKLTB4MTA0RjREMSwgMHhEOTY2MzQ0OCwgMHhCRDg1RDAwMywgMHgzNThDQ0RBMywgMHg2NkY1NDEyQiwgMHg2RTY1MDY2QSwgMHg2RTE5QjE2MSwgMHg1NUQxQUE1MCwgMHg3ODVDOUQzMCwgMHgxNjI1MzBCRSwgMHg3QUU2NDU0OCwgMHhBNTFCOUIwRSwgMHhGOUE1NjQwMCwgMHgzMkNFMzVEQiwgMHgxNzI4NTM3MCwgMHhCMDExN0I3NiwKLTB4N0NFMDQ3NDEsIDB4OUQwQzUxQTQsIDB4QkYwMDRENTUsIDB4QUFENUFDMTEsIDB4NjU5OUNCNDEsIDB4RkJEMDk0NDQsIDB4OTM2MjkxRTUsIDB4MkQ1RUEwNTYsIDB4MTEyOTY1NkEsIDB4N0ZDMDk1MDYsIDB4RDQ0MTQ5QzgsIDB4QkE3NTAzNTIsIDB4RDI0MzE5NDMsIDB4Nzk2N0UxODIsIDB4QjgxM0M0OTcsIDB4MjQyMTk0NjUsCi0weEM0M0M5MTY5LCAweDZGRDgxNDgzLCAweDYxNTJFM0MsIDB4NTk5NDdCNiwgMHgyN0Y5MEQxMiwgMHg1NDA0NkQyQSwgMHhENTIxMzA5QiwgMHhFNjY1MzkyMSwgMHg5MTY0RjRGMSwgMHgxNTIxRkI0QSwgMHg2MUM1NEMzOCwgMHg0MTY0ODRCRiwgMHgyNzc2QjExRiwgMHg1OUE5RDg4NCwgMHhFRDgwNkI1NCwgMHgxQkIwRDU5QiwKLTB4NEU4RDkxQTEsIDB4NzgyRkQxMzEsIDB4QzA1QTAzNzcsIDB4N0ExMjExMjYsIDB4REZDNUQwRTAsIDB4RUY4NTlFMDUsIDB4N0JCNjA1MTUsIDB4NUREMjZEODksIDB4MkUyOTExNTcsIDB4OUYyRjM1MzAsIDB4QzA4MTU2QTksIDB4NkQ5MUNEQzUsIDB4RjE1NDgxMTcsIDB4QjUyNTE3RkUsIDB4MjA1M0U5NDcsIDB4QUI1Nzg1QzUsCi0weDQ3OUE5MUUwLCAweDlGOTBGRTAxLCAweDMxMjQ4NERFLCAweDQ0MUJDMUE1LCAweDY2QjUwMUY1LCAweEM0NjE3QTVCLCAweDkxNkJCMEY0LCAweDIwNjU3QzdBLCAweEUyNTM5MEZGLCAweDFGMzg2MUI0LCAweDU1MDU4NkFGLCAweDZCODU5OUQ0LCAweDlGNDI5NEVDLCAweEY0RDQ4MTQ3LCAweEQwOTY1MjMzLCAweDFFMDVDRkVELAotMHg1OTE3NjkwMywgMHgyRDI5NzZDLCAweENEMzMzMzhDLCAweDE0NDFFNEFELCAweDQxOTZDMDg4LCAweEY2MDc5NDAzLCAweDk2OURDMDMwLCAweDY0OTkwRDI5LCAweDI0NTNGMzcyLCAweDg2NTg5MDlCLCAweDQ1ODA0NkZCLCAweDExQTE4NUM0LCAweDU4RkMxMTQ0LCAweDMxRTY0MUEsIDB4OEU0NzcwOUUsIDB4RjE2MTEyNzcsCi0weDYxRjkwN0EsIDB4QjcxMDBGNUMsIDB4NUExNzBCMTksIDB4MTYwNTU3RSwgMHg1NUIzOUQwLCAweEMwQzU1NkVGLCAweEJCRjUwMjk5LCAweEQxRDIzRTEyLCAweDY5NTg4NTQzLCAweDQ1NDY4OTAsIDB4OTBGQTQxMTUsIDB4MTFDNUVEOCwgMHg2OEI3NDc4OSwgMHhDMDZGMDExNywgMHgxNzI3OTBBRCwgMHg2MDZEQUM1NCwKLTB4OEQ0ODgxNTQsIDB4ODQ0NEVDOTgsIDB4OUE2NTkyRDMsIDB4RTVFMTUwNDAsIDB4REIwMzE3NjIsIDB4MkYwOTk0NTAsIDB4NDA0RjBGNUEsIDB4MUQwOUU5RjQsIDB4NTYwNDVFMUYsIDB4RjlDOTlGMDAsIDB4MTM2QzY1OTksIDB4QjBDMzZFOTEsIDB4MUMyODM1QjAsIDB4NjBCRTZCNSwgMHg0NjJGQjREMSwgMHhDQjE5QjZENywKLTB4NkM0OEM0RDksIDB4RDBEMTlCNjksIDB4QTVFNTQ0RkMsIDB4RTQ4NTFFMzEsIDB4NDFFNDY0QjgsIDB4NTlDNkY5RDQsIDB4RjBBNjUyN0UsIDB4NTMzM0QxRTAsIDB4NDg2MkY2MDYsIDB4NzIzNzA2MzEsIDB4QzJCNDkwQzUsIDB4NDY0M0RFNUMsIDB4NTRGOUM0ODksIDB4RkM1MjZDNDAsIDB4QjBBNTY4OTUsIDB4NDVDMUMxMzQsCi0weDc2OEYxOTgxLCAweDZFMjk1MDA1LCAweDk1MEI2OTY0LCAweDRCNENENUU5LCAweEVCMTMxMjQ1LCAweDQ0N0Y4NDQsIDB4MTMxQjFENzYsIDB4OTk5ODFBNywgMHg1MDBCMUYwQSwgMHg5MTAxMUIxQiwgMHg2NEU2NDcwOSwgMHhBNDVDODE0NSwgMHhCNTMwMDFEMSwgMHhEQjQ2Mjg4NSwgMHhCRTA2RDAxNSwgMHg0ODU4NTQxQiwKLTB4NkM4NkMzQjUsIDB4NzBBMTk2N0IsIDB4OTY5QjA0MTQsIDB4RUY0ODVDMDQsIDB4N0ZFMTUxQzEsIDB4RUJFN0Y0NDQsIDB4NTM0MTk5MEIsIDB4NzFENTgwNjAsIDB4RjVBNjFFMTAsIDB4NzlGMkM1MywgMHhFNUU0MUYwMCwgMHhCRkY0NTA1LCAweEUwMUJCNEU5LCAweEJGRTM5MDVELCAweERCNzY2NEQwLCAweDk1NkEwNjVCLAotMHgxMjg5NEUxLCAweEJGMTRCNDAxLCAweDMwRjdBOTcsIDB4QTg1Qzk3RTAsIDB4RjQwNjQzRTksIDB4Rjg1MDY3MDYsIDB4OUI5QjA2QUIsIDB4NUFBMDU5OTUsIDB4NDU0NDhFM0QsIDB4RTFEMTkwN0YsIDB4MjRGNEMyMkMsIDB4ODJDMjk1OUEsIDB4QkYwNjUyNDMsIDB4ODc4NTgxMkQsIDB4OUE5NEE5MTYsIDB4MzE1QjJDNjAsCi0weDUyMzI5MUQ5LCAweEYyOTkxNjA5LCAweDI4MzA1NzlDLCAweDk5OTk3M0NDLCAweDRCMTRDMDk4LCAweEMxQzUwNTMsIDB4RDFDMUM2OEEsIDB4NjRCNjdGMywgMHhEMDlCODAxRCwgMHg2QTdDMTA0NCwgMHg0ODU4MDk1NCwgMHg4NTlGMDk1QSwgMHg0NjUzMzYyMCwgMHg1OTJDODUyRCwgMHhBNTQxOTE0MSwgMHg0RDE2QTFEMCwKLTB4QjBCMTUzQiwgMHhFMTk0NEU0QSwgMHgyMTM3MTYzMywgMHhDRUM5QzRFNCwgMHhBNUQ3MEUwOCwgMHg0RTRDNERELCAweDU5MUNBQzA0LCAweDVCMDIxREJDLCAweDk5NjdDQzMzLCAweDgxQzBFNUZELCAweEY2NTFDMTA0LCAweDk2Njc2MEM5LCAweDk1RTEzMDNDLCAweEVDNUM2NDQwLCAweDUwQkY5RjQsIDB4MzU2MUMzMUUsCi0weDQ1QTA5NkFELCAweEZGOTI1MDBCLCAweEY2NTk4OTA0LCAweDE5RjlDNTBCLCAweDYwQzY0RDE4LCAweEQ2NDA1ODRGLCAweDIxOTRFMUYzLCAweEYwMzExNjNELCAweDEwMUI1NkUwLCAweERFNTkyMURBLCAweEJGMDFGRDEsIDB4NzA2RkQ5NCwgMHgzNENCMzBDRSwgMHhCODU3MDYxQywgMHg1MjI1QjYwOSwgMHhDNDNDMzEzNSwKLTB4QzAzQjkzNTAsIDB4RjAwMTY3NkYsIDB4RjBDMTg3NjcsIDB4NjYxMTM5MUIsIDB4NEY4OUE0NiwgMHgxRjQyNDQxQSwgMHg2NDlGMEY0NiwgMHhCNUUwMDE1RSwgMHg3OTY2ODMwRSwgMHg5NzQwRjRGNywgMHhDOENDNDQ1MSwgMHg1OUJENDA0QiwgMHhDQzk0MzVFMSwgMHgzQjE1QjJBMCwgMHgxMjNDMTYwNywgMHg1OTQ2OEQ5MCwKLTB4NDBFMEQ3NDksIDB4MTRDMUY0NkUsIDB4NDQ4QkQ2QTksIDB4NjU5QUY1NTYsIDB4NTBFNzQzNUIsIDB4QUVEMjkzM0MsIDB4NTYwNTEzMDgsIDB4Q0UxNDZFNTAsIDB4MUM5MDRGMTAsIDB4RUM0ODVFMEQsIDB4MTY5QTkzNkMsIDB4NTE2MzM2MDUsIDB4REI1N0E4MzAsIDB4NjI5NTdBQiwgMHhGNEYxNDQ0OCwgMHg0NUNBRDVELAotMHg2OTVDQzAwNiwgMHgxMDQ2MDZCOSwgMHg4MUQxRDg2RCwgMHg4NjQ5RjA1MCwgMHgyMEQxREI1NiwgMHhFNUU1M0NDMCwgMHhDQjQ3MDI1NiwgMHhDNjI5RTQ5NCwgMHg0OTM4NUY4RiwgMHg2NTA1NkUzMSwgMHg5Qzg2RjA5NSwgMHhDOENDOTg2NSwgMHg4NjlEODExOCwgMHhEMTAyMUYxMSwgMHg4N0RBRDFFMiwgMHhBRjA0RDUwMCwKLTB4NDUxODQ2NCwgMHhCODU3QjA4NSwgMHg0NTA1RTgzNCwgMHhCMUUyNUYwNCwgMHhEOEREOTA4NCwgMHgzNTk3OEMzMywgMHgxMUE2NDI1NywgMHg5OTFBMUU0MSwgMHg2NkIwNjc1MiwgMHhCQUY0MTQ0MywgMHhCRDRBNDU0NCwgMHhENjc1M0I2NiwgMHhDQUM2QzYzOSwgMHgxNTQ0ODBGRCwgMHg5OUQxOUJDLCAweDU0NkVFNDQyLAotMHhEMEMwMTkzRSwgMHg3NDkxRTIxRiwgMHgyNEIwQjNDNywgMHhGOTgxRDUwMSwgMHg3NDQzOEI1OCwgMHg1NEM0NzM5MSwgMHg5RUREMTE4MCwgMHhFNjk3ODc0RiwgMHgyRTQxRjhFNSwgMHg0NjhGREQ5LCAweDRGMUU0MzlDLCAweDU1NDJFQjgxLCAweEE1NTRGQUUwLCAweDFFNDNFMkIwLCAweDYwNkQ1ODk4LCAweDY1ODdDNEU4LAotMHg2Qjg2QzUxMSwgMHg2MDUwQTZEMywgMHgxQzUyMzQ4NSwgMHhGMjUzMDM5NiwgMHg0QTJENTg4NCwgMHg2RkQwOTE5MywgMHgyOTk3OEY4NCwgMHhGRTQ5MDk5OSwgMHg5MTg5Njc1RSwgMHg5OTI3NzQwMSwgMHhERDZGMjQ5NCwgMHg4Q0QzOTM0NCwgMHhCNTc4M0Q5LCAweEM4NTlFRSwgMHhBQzcwMTUwMywgMHg4RkMxRDdFMSwKLTB4QTA4NTQzMTcsIDB4RDA5RTg0NDQsIDB4NDUxMEYyQkQsIDB4RUQ0ODRDRDQsIDB4REU1RDBDMUMsIDB4QzA4NTQzNjcsIDB4RDE2NDIxMzQsIDB4NTAzODc2RSwgMHg3QzA0NkE1RSwgMHhFNTY0NDAzNSwgMHgzRDA0MzE3MywgMHg1REU4OTkxLCAweEE2MDNENkQwLCAweDcwNjQ0QjFCLCAweDQxQzNGNTUsIDB4Nzk5RUM1MCwKLTB4NUMxRDAwNUEsIDB4QjU0MDI3QkIsIDB4NTAxNzAzRkIsIDB4Q0U1RTJEODQsIDB4QzI0ODc3NkIsIDB4MzRDMzFEQjEsIDB4RDA4MTQ2RjYsIDB4NjE5NEQ0ODgsIDB4OTAyRDk1REYsIDB4NTYyMzk2OTksIDB4Nzk1NjY5OTYsIDB4NDYzNjY3OTcsIDB4MjA3NUI0NDksIDB4RTYxOTkwNEIsIDB4RjFGQzQ5MUQsIDB4NDAyNjkyNUYsCi0weDg1Q0U5OTQsIDB4QzYyRDY1MUIsIDB4RTBGNTBCNCwgMHg2MDk3NkY1NSwgMHg1Qjc3MDZBNiwgMHg0OTQ3MUY0MSwgMHhGNkQ5MTM1MiwgMHg1NTFBMDYyRiwgMHg0MTQ1Q0ZDQSwgMHg1NUIxNDIzNCwgMHhBQkYxMjUzMSwgMHhCOTE1RjBGNCwgMHg4QUM3RTI3NSwgMHg0Njc5QzEyRiwgMHhFMjEzNTNFQywgMHg2OTM2MDJBNSwKLTB4NEJDMjU2QUIsIDB4NDYzRDY0QTYsIDB4NUU3QzZCOCwgMHgxNDM5ODNGMCwgMHgzNjQ2ODcxQSwgMHg2MDFEMUZFLCAweDRENDYwMUZDLCAweEI0ODlEMERGLCAweEY3ODE0MDQ2LCAweEU1QTUwQkE3LCAweEIzNEExMTYsIDB4NzA3QzQxNTEsIDB4ODA0NDY2QkIsIDB4Q0Y0NTBDNUMsIDB4MTMyOUI5RjQsIDB4RkU0MDA2NTUsCi0weEY0QTE0MzFCLCAweDUxRDMyMDJELCAweDc0QjBBNDQ0LCAweEE2RjE2MTIsIDB4NkM1ODRDOEMsIDB4QzAxNEY2NjUsIDB4RDM5ODI5NTcsIDB4MzZDMTM2RDEsIDB4NUM0NUNDRDAsIDB4OUY0NTk4ODIsIDB4OTFBNzUzQTIsIDB4QTk3NTJDNEMsIDB4NDIxQjQyOTcsIDB4Nzc2QTIzMTMsIDB4MzUzOTc5MDYsIDB4NDgwNjU3NjIsCi0weDExMjlCNDQwLCAweEFGNDEwQjVELCAweDdGOTU4MkQyLCAweDRCNTFFNjUwLCAweDg5MUQwRDc3LCAweEU1OTkwOUU1LCAweDcwNUQyMzRCLCAweEMzREE5MDU1LCAweEYxQjExNTAxLCAweDQ0QkM5NEQ5LCAweDFGQTU1QzQ4LCAweDJBNDIyNjU3LCAweEM0MTA5MUExLCAweDE4OTcwRTc0LCAweDc2OTkwOTksIDB4MTA2MTZBRDcsCi0weDFBRTE5RjEwLCAweDQ3NUE2QzMxLCAweEEyNzI1N0U5LCAweEM0ODQ1ODJDLCAweEQ2OTk2NjVBLCAweDE3Qzk0QzE4LCAweEUxNTY5QiwgMHgxMTg1NUFCRiwgMHhBNTgwRDYwNywgMHg2NEMxOEI3RSwgMHg3MDMwQTYwNSwgMHgyQjM2NjBEMCwgMHgxNjVCRTEwMywgMHg4MDlFMTg2NywgMHg0NzQwN0ZENywgMHgzNEU0ODU4QiwKLTB4OTBFRDc0MEIsIDB4MUI0M0MyRjUsIDB4RjQ1MTUyN0MsIDB4NTcyM0UxQzUsIDB4RTFEMTA2NUIsIDB4QTUxQTlERjQsIDB4N0YwOTlBODUsIDB4NDE1NzAzMEIsIDB4MUQ5RjYwQjgsIDB4QzExNDkxRkQsIDB4RkU4NTBBNTUsIDB4Qjk5MDQzMUYsIDB4QTBDNzhEMTYsIDB4NkY1QTRENDAsIDB4RkU0NDExRSwgMHgzNDQyNkI1NiwKLTB4NTAxNEZFMEYsIDB4QkQ1REM1MUEsIDB4QzYzNjM3QzMsIDB4RTFCNDU5QjIsIDB4RkE4NzFCMDUsIDB4NDU0NEQwQUQsIDB4RTVFNTA5M0QsIDB4MzMwNkM1REQsIDB4NDdDMzM0ODQsIDB4NkYxRTE0NiwgMHhFNDk3NEYxLCAweERENDgwNTBGLCAweEFCMTUxRTEyLCAweDUxNjlGQzkyLCAweDUwNTVCMjdBLCAweEQxNDJBRDVDLAotMHg0QjE2QjBGNCwgMHgzMTJCQzk1NSwgMHg3NUIxMEZDLCAweDRBOUUwNDU4LCAweEE2NUQzNENFLCAweDkwRDM2NkNGLCAweDEwMDk5RDI5LCAweDhCMzU4NDE5LCAweDg3RDJCNURBLCAweDMxMTYyRUY1LCAweEY2MTk4OUM1LCAweDFGNDM0MUY4LCAweEJDNEM2RDlDLCAweDExQTc1OSwgMHg5NTUzQTIxLCAweENGQzQxNTMwLAotMHgxRjA1QjYxMCwgMHg1QjJGNjRDMCwgMHgxMTdGMTEyNCwgMHhGM0QyNEQ5LCAweDQ0NDQ3ODc0LCAweDc0MzUxQTA2LCAweDY0QzQ4OTc5LCAweDYzQzE4NUIsIDB4OTFGMDk0QTQsIDB4NEUxRDFDNDgsIDB4OTY5MTAzQUUsIDB4OUNGQzYwNjcsIDB4MkZDOTQwNDUsIDB4RUQzODQ0QzQsIDB4Njc2QzkzNUIsIDB4NkUyMDkxQjUsCi0weDJEOTc0NEVDLCAweDZBMTExMjI3LCAweDc4REI5MEU1LCAweDgwNDU1ODdFLCAweEM0RTQ1OTFFLCAweDQ3OUJFMUUwLCAweDVCNjY3NDk5LCAweDUwRTA0OTNFLCAweEZCNTQ4MTlDLCAweDQzMTQ5MUY4LCAweEQzRUY1MEUwLCAweDczNjM5MjYsIDB4NTBGRjY0NDAsIDB4NDREQzZDOUQsIDB4RjZEOTk2NUEsIDB4NTQ4NDk5LAotMHgxNTBBMTQwMywgMHhDNzMyNENDNywgMHhBRkYwNDc0QiwgMHhCNDc5OTY2RSwgMHhBRDlFNTQ1MSwgMHhGOTkxM0M0MSwgMHgxRjA5QjQ2LCAweDNFMzU0NjFFLCAweEEwQzY2QzEwLCAweEE0RDFEMTAzLCAweEEwNTQ3MEI0LCAweDZGMUEzNTMxLCAweDQwNDdCMkY1LCAweDExNDcyQ0UwLCAweDNBRTQxNjMxLCAweEZEMzZBOTA1LAotMHhGNDQzNkY5MSwgMHg0QTQxOTc2NiwgMHg1MDY5OUU2NywgMHg1NDA4RDkzRCwgMHgxMTI3MTFBRiwgMHhGNTAwNjQyRiwgMHgxNjBCRDY2QSwgMHgxMUIwQkZFLCAweEMyQzU1Q0ExLCAweDMxQ0Y4NTksIDB4QzZDOTU0MDEsIDB4RDlDMEU1QzEsIDB4RTQ2MDU2QUUsIDB4RjVFMzA3MTAsIDB4QTVGRjAxNTAsIDB4NDQ1NDIwM0YsCi0weEI2NjYwOTU5LCAweDI1MjI3NzYsIDB4MkQ1ODY5NzAsIDB4NzM3MDc1NywgMHg2MDk1MzMxNywgMHg4MUU3MDcyRCwgMHg2ODE0OUU2LCAweDY1MzgzNCwgMHgzNjNEOUQ4MSwgMHhCNDI5MTEzRiwgMHg1NjZDMDI1OCwgMHg1MUY5MkYwMCwgMHhFMTlDNTgxMiwgMHgxMUZCMTUwLCAweDU5QTY1MjAwLCAweDI3NzVFMEY0LAotMHgxMDY3NTJBMywgMHg3NTc0MzI2LCAweDVDQzM0NzM5LCAweERBRDU0ODA1LCAweDVFOTM2QkM3LCAweENGQ0FDNUM5LCAweDJGQzQyNTU1LCAweEQwNjk5NEMwLCAweDVDQUM3NDAwLCAweDVEODREMDc0LCAweDZENjY4NjA0LCAweEU1MEIxOUJELCAweEU3OTY5RjU1LCAweEZGOTI1MDA1LCAweDY1QjI2NkIsIDB4NDc0MzAzNUUsCi0weDk3MkM0NEM3LCAweDVBQjQ3MjYwLCAweDc3MTIzNTgwLCAweEQ5MkRCNDA0LCAweDQ1MUJCOEQxLCAweEI5NEI0NDQ3LCAweDlCOTU1MjEwLCAweEEyNTM4MTUsIDB4NzlBQzUxODQsIDB4RTNEMTBDNUMsIDB4NDUyNDEwRkIsIDB4REZEM0ExNDgsIDB4RTAzMzZFNDYsIDB4NEUyODc1OTksIDB4MTJCNzUwQTksIDB4REFDMERFNDcsCi0weEMxODQ1OUE5LCAweEM3NjRDRDMwLCAweDIzMzQ2NzVFLCAweEY2NDkwREI4LCAweDQ5MTcyNjc5LCAweDY1OUI2OTk0LCAweDdBOTEyNjkxLCAweEIyQjc2MDc0LCAweEI5RTU4NzA0LCAweENDMzNEOUE5LCAweDIwN0Y2QTcsIDB4QzQwNUY4MDEsIDB4NTYwMjk3Q0YsIDB4NDgxNDBFNUYsIDB4QzQ0RTY3NkEsIDB4QjE5MURFRCwKLTB4MTEwMzVGNjAsIDB4NUIxRjYwQjQsIDB4QTRFQjE0NDMsIDB4NUE2QzA2RTYsIDB4MTkxNUFFOSwgMHgzM0NEMjY5NiwgMHg4NzlGNDQ0NCwgMHhENDQyMTcwQiwgMHhDOUM5RDlENiwgMHhBMUQ0QzEyNCwgMHhDNDAzNjZCNywgMHgyMjQ5N0U5LCAweENEMThEN0Y5LCAweDk5RkQxMTFBLCAweDlGNkI1M0ExLCAweEUwNTFBQkZDLAotMHhCQzEwMDcxRCwgMHhBNTY2QTc1OSwgMHg2REJDNUU1LCAweDRBOURBODUxLCAweDIyNjZCMTUsIDB4MTIzRDZFOUIsIDB4NjZFMDU0NDksIDB4RDEwRDM4NzAsIDB4MTcwNkU0NjIsIDB4QUYwQjlCNTEsIDB4RTAxMDlENkMsIDB4RjE0NDg2MUIsIDB4ODEzRUQwMUIsIDB4QjY0OTZDMTAsIDB4MUVEMDA3NjgsIDB4NjA3NDdDMTAsCi0weDQ2NDk0Mzc2LCAweDVFNEMxMEIwLCAweDU3M0Q1OTA2LCAweDVBMDJFNUZFLCAweEIzRTAwNUYyLCAweEMwNUM0RjQ1LCAweERCRDU4OTgyLCAweDZEMTMxNzFGLCAweDk3NDFGQTAwLCAweDYxREI4NTIsIDB4OEQ0NkQyOTksIDB4NDc0MjFFNEQsIDB4NzRBOTRFNiwgMHg0REEzMUNEMywgMHg2ODE2MDJGRiwgMHhDNjc5NjJENywKLTB4MTU2MEJCQSwgMHhGODg0OUQ4NSwgMHg3REQ2RDVCOCwgMHg1QjZCNDY0MCwgMHg0NDFBMzQ5RiwgMHg2MUIzNjAxRiwgMHhENTUwRTJEMywgMHhDRjE4MTExQiwgMHg5NzY3MzMzMywgMHhDNTk5MDlFNCwgMHg1N0RBRTg0MCwgMHhCQjkxMEU1LCAweDE0NDQ4NEY5LCAweEE4NUMyNTExLCAweDQwOTJENUVBLCAweDg5OTEwMzkxLAotMHg3RDM4NTUwMCwgMHgzRDFEMjE3NiwgMHg4MDJGRDQxQiwgMHhBNUQ5NDg5MCwgMHg2NTZFOTA5OSwgMHhFNjY5MDZFNiwgMHg0MzMxQTJENSwgMHg0NDc4RTI1QiwgMHhFNzhDNDFELCAweDM1NjVEOTc5LCAweDQxNDcxMzNCLCAweDg5QzZDNjRBLCAweDQ1QzlDRENGLCAweDUzMjMxNUZBLCAweDNFNUEwRDA0LCAweEIxMTFEQkZDLAotMHg2MzE2MkZGNywgMHg5RTBCOUNEMCwgMHhBNzU4RTQ2QiwgMHhBMDk3NDIxRiwgMHhBRTU0NDI2MiwgMHhBNTlBNURERCwgMHgzNzMyMjYxRCwgMHg3MTczNjc5MCwgMHg4ODk1QTE3MywgMHg2ODc0NzBCMSwgMHg1N0U1NjRGRSwgMHg2QTc2NTQwNCwgMHhGNUUyMTQ4MiwgMHg2NjcxNTBFMSwgMHhDMEE3NjREOSwgMHg4OTk1MEMxNCwKLTB4Mzc1NjkxMkIsIDB4MzkxMzQ5OSwgMHg2RkI1NTNDMywgMHgyOTkyMDk5NSwgMHg3NTBFQzczOCwgMHhDMzVDNjk5MiwgMHhBQTU1RTQwNCwgMHhDQjRCMDc1MywgMHgyMDM5NjE1NiwgMHhEQjA0RjRDMSwgMHg3ODc2ODI1RiwgMHhENTYyMzE5QSwgMHg1OTJEMTIxQiwgMHhGOTM2MDk1NiwgMHg0NzgxMUI0NywgMHhEOUJENTg4NCwKLTB4MTcwQTM1RSwgMHg4NDRFRTU5QSwgMHg4Njg0RUREQSwgMHg0MDVGMTAwMCwgMHg4MTM2NDFBNywgMHgxNzY2ODFBMiwgMHg3REJFNjQ0MCwgMHg4N0M2QTU0LCAweEM0ODVEOTA1LCAweDFBQjA4MTFELCAweERCQTU5MjkxLCAweEZBNTI4MTdDLCAweDM5ODFFNUYwLCAweDUxMDlGRUU1LCAweEMxMjg0NTU3LCAweDU3M0IyNzAzLAotMHgzMDY0MDY1OSwgMHhGMUQzRTk5NywgMHg5MDYyNTNCNywgMHg5MDc2QzNGRCwgMHhDQTM0RDM1QywgMHhGNDgxNDkxQywgMHg1OTc2QTRDMCwgMHgzRkYxMTQ0LCAweDI2MTcwNjQ5LCAweDE5NkI5MDY1LCAweDkwNjkzRDA5LCAweEYwMjExQTE3LCAweEFGMDE2REQ0LCAweDRFNDQ5QzQ4LCAweDZGOUE4NEY0LCAweEI0NDQ5ODE4LAotMHg2MDZEQjE0NCwgMHg5MTZCOTdBNiwgMHhFQkQwRkQxOSwgMHhBQTA4RDU0MSwgMHhENzFCRTUwNSwgMHgxRTY1MDdBRiwgMHgzRTRCMTM2MSwgMHhGMzkxNjE5LCAweDQyNjRCQzUwLCAweDYwNTYzMzIxLCAweDRBMzcwNjE3LCAweDQzNjQ1MkU3LCAweEJFMTA3NjA0LCAweEREQTlDMThFLCAweEJGNUIwMzcxLCAweDkwNkYxMTA3LAotMHg1NUM1QzgzQywgMHgzMTM2NDc4MiwgMHg2OEREOUYxLCAweEY5OTYwN0U2LCAweDI5OTYzNjdFLCAweDVBRjQ0NTgsIDB4OTY1ODJEMzAsIDB4QzRFNEQ5OEEsIDB4RTY4NzE5QkUsIDB4MjBDNTZDNjQsIDB4NUE1NTAyNDYsIDB4Qjc1OUIwNzksIDB4NjQ0MzlCRkIsIDB4QjEyNDBEMkUsIDB4MjcxMzUwQjIsIDB4NDMxNEFGNTYsCi0weEE5OTk4RDcyLCAweDVFOEQxNDgxLCAweEI2NUQ3MjUzLCAweDY2OTM5MkI4LCAweEYwOTE5QjZDLCAweDlGOTc5MERELCAweDYwOTc5ODM4LCAweDNENjI1MTY4LCAweDEyMTk2RDU4LCAweDU5RTk0NDhBLCAweDMwNTQ3QzkyLCAweDhFMzE3NTkwLCAweDdCOTU0ODQzLCAweDMyM0Q0OTA3LCAweDVBNEQ1MzA4LCAweEQxMDQ5MERCLAotMHg5MkNFNDUxMSwgMHhCOTM1MzEyNSwgMHhBOTFGNDA1MCwgMHhEQzQ4NUQwOCwgMHgyRjExNzQyLCAweEI5QjQwOTBGLCAweEQwOTg5MUZGLCAweDk1MDM5MzYsIDB4ODBFMzUwNUYsIDB4RUQ5OTQwNUYsIDB4RUE5MDU4REUsIDB4NTUwMTlGQzAsIDB4OUExRjQxMkMsIDB4NDcxNjYwREEsIDB4RjREMEM1MDUsIDB4NDkyNjY2NkQsCi0weDQxOTFDM0VGLCAweDFBMDUyNkY1LCAweDU1Rjg4OUM3LCAweEQzM0NDNzM4LCAweDdBNjZDNjAxLCAweEY3MDFDNjYyLCAweDZFOTUzOTA2LCAweDZFNjU1OUFELCAweDE2MjZDNTdBLCAweEUwMDc1MjY2LCAweDY3MDY5QTVCLCAweEE1RjcwNDAxLCAweDQ3Nzg2MDkwLCAweDgxMTFDNTNCLCAweEI0NjQwQjFBLCAweDI2OUQ1REFFLAotMHg1MEM0QTQ3NCwgMHgyQTk0OTg3RCwgMHg0NEMwNTIyNiwgMHg2MTE0NDIzRiwgMHhCODQ3NEYxRCwgMHg4RTBFMDVEOCwgMHg4N0I0MEZEMiwgMHgxRjQzOTJGRCwgMHgxNzBFOTk1LCAweDE1NjNERTAsIDB4NkY5QUM1Q0EsIDB4NzUyQTBEMUQsIDB4RkYwQTQ0RDAsIDB4N0ZEMEQzNjYsIDB4NTFBNjJFMDUsIDB4RDBENUU4REUsCi0weDU2MTEzRjMwLCAweEU0MDU2RDg3LCAweEFCM0I1MTAwLCAweDQ2NTM5QzYsIDB4N0Y2NzYyOTAsIDB4Qjg1MTEzMEQsIDB4RjVFMDkxODMsIDB4NjRBQzVEMkQsIDB4NTVGOTQwNEIsIDB4RTI1NkY5NzcsIDB4NzA2MTc3NjAsIDB4RUU0OEU0NTAsIDB4REQ1RTM1QzgsIDB4OTRENDAwRjgsIDB4NDQ2QTA2NjcsIDB4RUE5MzUxODQsCi0weDQ2NEIwN0Y4LCAweDhDNzRCNkQ0LCAweDhEOUQ1OUE1LCAweENFQzZBREQ1LCAweDJEMDk1NkEzLCAweEE1QkE1MTAzLCAweDMxMzUzMTIzLCAweDU1RkY0MTQwLCAweEEyNDQwRjE1LCAweDg5MjY2NzkyLCAweDQ0RTFFMTU0LCAweEU1QjQxMzM4LCAweDJGQ0U5OTAxLCAweDk1RTY4MTFCLCAweDQ3NUM4NzEsIDB4QUU5RTRBNDQsCi0weDVFMEQxNDEsIDB4RTcwMkQ2NkIsIDB4NDc0NzA3RTIsIDB4NjQ4NkNCQzUsIDB4NzQ3NjAxNkUsIDB4QjFEMjlCNTYsIDB4N0EzNEM2MDUsIDB4NTE0Mjc5MDYsIDB4RTc5NjdGOTcsIDB4NjVEMjlDOTAsIDB4NTUwODFBRCwgMHhENkU2NDA0NSwgMHg2NzEzNDM2OCwgMHg5MTAxRTZERCwgMHg2ODk1Nzg0MSwgMHgzRDNENTkwOSwKLTB4RTA1MjVCQUYsIDB4MTM0QTREM0MsIDB4QzFCMTE5MDksIDB4MTY0OTNCNzYsIDB4NkI5NkQwQTAsIDB4QkYwRTc5RDYsIDB4MkM3MDk2RjksIDB4OTBGQzA0RDYsIDB4MTc0MkU0NzIsIDB4NTMxQ0ExQUMsIDB4REFEMDg2NDYsIDB4OTA2NjY2OSwgMHhBNzU4OEQ4NiwgMHg5MTNDNTRDMiwgMHg3NDJBNDUxNCwgMHgxNzExMUFCQywKLTB4REREN0VERTUsIDB4NjY5OUM0OTgsIDB4NzUzMTMxMzUsIDB4RTQ5OTVGNjQsIDB4MjU4MjY2N0UsIDB4OUM1QzRDNDgsIDB4MUQwRDEwRDksIDB4NUI0QzE2NCwgMHg0NkU2MTZDQiwgMHhEMTg0NDRCRiwgMHhFMUQ0Njk1QywgMHg0MDA5NUU5OSwgMHhFQ0UwMjk1NSwgMHhGRjQwQTQxMSwgMHg1NEQyNDIxQiwgMHhFMUM3REIwNSwKLTB4ODBFNTA5NUQsIDB4Njc0NUU5MDcsIDB4QTYxOTcwMDcsIDB4NzYwNjc0RjksIDB4MTUyMjE3MEEsIDB4NjUxODFGRiwgMHhFMEZEQTQ1LCAweDUyMUM3ODY3LCAweDZCOTFEMzgyLCAweDY1N0E4M0MxLCAweDczQzk4QzM1LCAweEIzQ0MzMUQ2LCAweDE2NEIyNTdCLCAweDZGOTYwNUY5LCAweDUyRjQ5RUI1LCAweDg3NTkyOTA3LAotMHgxQjEwRDZGOCwgMHg5NDlGRDU0LCAweDkxMDMxNUJBLCAweDQwRjA5QjQ3LCAweEI3NjFDMTQ0LCAweDZEMDM5RDUsIDB4NTlCMTEzRiwgMHhFNUM2RDksIDB4MTc2OTkwRkIsIDB4OTBGOEE0NjUsIDB4NkRCOEQxNDQsIDB4NDU1MkUzOTIsIDB4Qzk0Mzk2QjksIDB4MzYzMTVBOTcsIDB4N0U4NzQyMTUsIDB4NDAxMTZGNkYsCi0weERGMTkzNDAxLCAweDcwNjg5MzE3LCAweDdFMDIxNzQwLCAweEQ1QzA0NEJELCAweEYxNjM2RTk0LCAweDVCMEQzNEExLCAweDEwMjdGNjg5LCAweDQ0QTQ1NTkwLCAweEQ0NDMwMzVGLCAweEQ3QTQ0MThDLCAweEQ5NDlGNDgwLCAweDg0QzFFMTU0LCAweDYwOTA5NjZFLCAweDQwQjU2QzFFLCAweDk2NjlDNTQwLCAweEE2MzA1NTA1LAotMHgxNjY3RTI0NCwgMHhDMjQ1ODg1RCwgMHhENTA0QTVFLCAweEE0RjBDNTQ5LCAweDM1ODQ3MkE4LCAweEM0MTRCRjIwLCAweDQzMzY5NzI5LCAweEIxMTEyNzExLCAweDc4NjQ0MzUyLCAweDgxMUNCODU2LCAweDZGOTc5MkYwLCAweDFFMUU0MTk1LCAweDYyQzU4QzE0LCAweDI2MTlEM0EyLCAweDk5ODA1NkJELCAweDY1M0YzNDEwLAotMHg5MTkxODRFNCwgMHg2NDkwNkQ2QywgMHhFM0Q3OTk2LCAweDQ3NjYwNTYzLCAweDUwQTkxRjAzLCAweDQ5RjhDNUNCLCAweEZFMTUyMzVFLCAweDk3ODM0NTEsIDB4NzE2MjU3QjcsIDB4MUFCNTM1MSwgMHgxNzEwREM4NCwgMHgzRkEwMUQ1QSwgMHg5ODQ0QUQ2NCwgMHhFNEQ5MDFCQywgMHhFRTU0NjM1MiwgMHhGOTU0Nzk4NywKLTB4RjY4MzRCNDcsIDB4QjY1MUY2RCwgMHhFMDlDOTA0NSwgMHhFNDkxNDI0RSwgMHg5NEY5MDUwQiwgMHg3REE2MDkxRCwgMHhCNUMxNEQ3NCwgMHgxMjNBNjk5RCwgMHgxRjQxM0NDMywgMHg5RjQzNDE1OCwgMHg1NUQ4QzhDNCwgMHg1MTEwNkZGLCAweEQzNkNCMUMsIDB4MTU0MUZDRTEsIDB4QzMzNDRFRDMsIDB4M0UyOUQ5MDUsCi0weDE1MEE2NTc5LCAweDUwMjQ3NUEsIDB4NDU0QjBGMDQsIDB4NjU5MDI3MjIsIDB4OUVBMDU1LCAweDI2NTY4Q0M1LCAweDdFQjE0NDMsIDB4NDIxODZGOTYsIDB4MTMyMzU3QTksIDB4NzQwOTFGMTMsIDB4RUU1NTQ4MEYsIDB4N0EwQjRBNDUsIDB4RjAxQTg2MzcsIDB4OTM3RDY4RDUsIDB4RTI2MTExMTUsIDB4OEE4NTM2NjMsCi0weDYwRDI5NUFCLCAweDE5NDY0NjFBLCAweEJCNTE5MEExLCAweDZENTE0MjE4LCAweDdDNjQ4MkNGLCAweDg3NTlBQ0M4LCAweDdFODZDODA1LCAweDQyRDM3NTVGLCAweEY0QzEwNTI5LCAweDQ3MUYxNDAwLCAweDUzOTQyMzhDLCAweDExMkQ1NEE4LCAweDU1RTQ1MEY4LCAweERDMjE5MUJBLCAweEE1RjkzMDExLCAweDFBMjE1OUY1LAotMHg0MDUxQTI5NywgMHg2NjA2Njk5OSwgMHhBNjQ0QzA1OCwgMHg1NEVDOTE0OCwgMHhGQUZCMDE0NiwgMHgxMTUwRkNFQywgMHg0MTQxRDE3MSwgMHhGMDlGMDQ0NCwgMHg0ODhFNUUwRSwgMHgzRDE5MEYxMCwgMHg0MDZFNDA1RiwgMHhGRTk5MDRBRCwgMHgxMDFGNUM2RiwgMHg0NTRCMDkzQiwgMHg0MDk0NkMxRiwgMHhGMEI5NjZELAotMHhDMTY0NjREQiwgMHg5MUUyRDZGOSwgMHg5Nzc4OTA3NCwgMHg1MzdDNUM0MCwgMHg0NEE1MzNDMywgMHg3NDEwMkIzMywgMHg0MEQ0MjVDMSwgMHhENzQ4QzkzNiwgMHg3ODY2MTlDOSwgMHg0MDkxNzk4NSwgMHg2NjU5NEMxQywgMHgyRjA1RDJEMiwgMHg4QzcxMUI0LCAweEY5NjAyNzU3LCAweDEwMTM4NTRBLCAweDdENjI5NkQwLAotMHgzRDk5QjhGMCwgMHg0OTVEMzI0MywgMHg5MTY4NjRCRSwgMHg0RTQzQjk0NywgMHhFNzU2QTExMCwgMHhBOEQwOUQ3RCwgMHhCRjYyNTA5NSwgMHhDMUQ0OEY4NywgMHg4QkQ0NzA5OSwgMHhEQjYzMTMxNSwgMHhFNTQxMzlBMCwgMHhFNERDOUM2MywgMHg4NDZDMjU0NCwgMHg0RjBFMDREMSwgMHhFMEIxNUIyNiwgMHgzMjQ5NDk5RCwKLQotfQotLyoqKiogZW5kZWQgaW5saW5pbmcgYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9jYi5oICoqKiovCi0JCTsKLQotCWNvbnN0IHVpbnQzMl90IGdfZ2xvYmFsX3NlbGVjdG9yX2NiX3NpemUgPSBzaXplb2YoZ19nbG9iYWxfc2VsZWN0b3JfY2IpIC8gc2l6ZW9mKGdfZ2xvYmFsX3NlbGVjdG9yX2NiWzBdKTsKLQotCXZvaWQgZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2s6OmluaXQodWludDMyX3QgTiwgY29uc3QgdWludDMyX3QqIHBFbnRyaWVzKQotCXsKLQkJbV9wYWxldHRlLnJlc2l6ZShOKTsKLQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE47IGkrKykKLQkJCW1fcGFsZXR0ZVtpXS5zZXRfdWludDMyKHBFbnRyaWVzW2ldKTsKLQl9Ci0KLQl2b2lkIGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rOjpwcmludF9jb2RlKEZJTEUqIHBGaWxlKQotCXsKLQkJZnByaW50ZihwRmlsZSwgIntcbiIpOwotCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9wYWxldHRlLnNpemUoKTsgaSsrKQotCQl7Ci0JCQlmcHJpbnRmKHBGaWxlLCAiMHglWCwiLCBtX3BhbGV0dGVbaV0uZ2V0X3VpbnQzMigpKTsKLQkJCWlmICgoaSAmIDE1KSA9PSAxNSkKLQkJCQlmcHJpbnRmKHBGaWxlLCAiXG4iKTsKLQkJfQotCQlmcHJpbnRmKHBGaWxlLCAiXG59XG4iKTsKLQl9Ci0KKwkJCiAJZW51bSBldGNfY29uc3RhbnRzCiAJewogCQljRVRDMUJ5dGVzUGVyQmxvY2sgPSA4VSwKQEAgLTI2MzcsOCArNzMwNCw4IEBACiAJCXVpbnQzMl90IG1fYmFzZTsKIAkJdWludDMyX3QgbV90YWJsZTsKIAkJdWludDMyX3QgbV9tdWx0aXBsaWVyOwotCQlzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX3NlbGVjdG9yczsKLQkJc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9zZWxlY3RvcnNfdGVtcDsKKwkJYmFzaXN1Ojp2ZWN0b3I8dWludDhfdD4gbV9zZWxlY3RvcnM7CisJCWJhc2lzdTo6dmVjdG9yPHVpbnQ4X3Q+IG1fc2VsZWN0b3JzX3RlbXA7CiAJfTsKIAogCXN0YXRpYyB1aW50NjRfdCBwYWNrX2VhY19hOF9leGhhdXN0aXZlKHBhY2tfZWFjX2E4X3Jlc3VsdHMmIHJlc3VsdHMsIGNvbnN0IHVpbnQ4X3QqIHBQaXhlbHMsIHVpbnQzMl90IG51bV9waXhlbHMpCkBAIC0zMDM0LDggKzc3MDEsOCBAQAogCQl1aW50MzJfdCBtX2Jhc2U7CiAJCXVpbnQzMl90IG1fdGFibGU7CiAJCXVpbnQzMl90IG1fbXVsdGlwbGllcjsKLQkJc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9zZWxlY3RvcnM7Ci0JCXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fc2VsZWN0b3JzX3RlbXA7CisJCWJhc2lzdTo6dmVjdG9yPHVpbnQ4X3Q+IG1fc2VsZWN0b3JzOworCQliYXNpc3U6OnZlY3Rvcjx1aW50OF90PiBtX3NlbGVjdG9yc190ZW1wOwogCX07CiAKIAlzdGF0aWMgdWludDY0X3QgcGFja19lYWNfcjExX2V4aGF1c3RpdmUocGFja19lYWNfcjExX3Jlc3VsdHMmIHJlc3VsdHMsIGNvbnN0IHVpbnQ4X3QqIHBQaXhlbHMsIHVpbnQzMl90IG51bV9waXhlbHMpCkBAIC0zMTkzLDEzICs3ODYwLDE0IEBACiAjaWYgQkFTSVNEX1NVUFBPUlRfVUFTVEMKIAl2b2lkIHVhc3RjX2luaXQoKTsKICNlbmRpZgorCisJc3RhdGljIGJvb2wgZ190cmFuc2NvZGVyX2luaXRpYWxpemVkOwogCQkKIAkvLyBMaWJyYXJ5IGdsb2JhbCBpbml0aWFsaXphdGlvbi4gUmVxdWlyZXMgfjkgbWlsbGlzZWNvbmRzIHdoZW4gY29tcGlsZWQgYW5kIGV4ZWN1dGVkIG5hdGl2ZWx5IG9uIGEgQ29yZSBpNyAyLjIgR0h6LgogCS8vIElmIHRoaXMgaXMgdG9vIHNsb3csIHRoZXNlIGNvbXB1dGVkIHRhYmxlcyBjYW4gZWFzaWxreSBiZSBtb3ZlZCB0byBiZSBjb21waWxlZCBpbi4KIAl2b2lkIGJhc2lzdV90cmFuc2NvZGVyX2luaXQoKQogCXsKLQkJc3RhdGljIGJvb2wgc19pbml0aWFsaXplZDsKLQkJaWYgKHNfaW5pdGlhbGl6ZWQpCisJCWlmIChnX3RyYW5zY29kZXJfaW5pdGlhbGl6ZWQpCiAgICAgICB7CiAgICAgICAgICBCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjpiYXNpc3VfdHJhbnNjb2Rlcl9pbml0OiBDYWxsZWQgbW9yZSB0aGFuIG9uY2VcbiIpOyAgICAgIAogCQkJcmV0dXJuOwpAQCAtMzMxOSw3ICs3OTg3LDcgQEAKIAkJdHJhbnNjb2Rlcl9pbml0X3B2cnRjMigpOwogI2VuZGlmCiAKLQkJc19pbml0aWFsaXplZCA9IHRydWU7CisJCWdfdHJhbnNjb2Rlcl9pbml0aWFsaXplZCA9IHRydWU7CiAJfQogCiAjaWYgQkFTSVNEX1NVUFBPUlRfRFhUMQpAQCAtNTY0MSw3ICsxMDMwOSw3IEBACiAJCWFzc2VydChudW1fYml0cyA8IDMyKTsKIAkJYXNzZXJ0KHZhbCA8ICgxVUxMIDw8IG51bV9iaXRzKSk7CiAKLQkJdWludDMyX3QgbWFzayA9ICgxIDw8IG51bV9iaXRzKSAtIDE7CisJCXVpbnQzMl90IG1hc2sgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKDFVTEwgPDwgbnVtX2JpdHMpIC0gMSk7CiAKIAkJd2hpbGUgKG51bV9iaXRzKQogCQl7CkBAIC03ODczLDcgKzEyNTQxLDcgQEAKIAogCQl3aGlsZSAodG90YWxfYml0cykKIAkJewotCQkJY29uc3QgdWludDMyX3QgYml0c190b193cml0ZSA9IHN0ZDo6bWluPGludD4odG90YWxfYml0cywgOCAtIChiaXRfcG9zICYgNykpOworCQkJY29uc3QgdWludDMyX3QgYml0c190b193cml0ZSA9IGJhc2lzdTo6bWluaW11bTxpbnQ+KHRvdGFsX2JpdHMsIDggLSAoYml0X3BvcyAmIDcpKTsKIAogCQkJcEJ5dGVzW2JpdF9wb3MgPj4gM10gfD0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUgPDwgKGJpdF9wb3MgJiA3KSk7CiAKQEAgLTEyMTExLDcgKzE2Nzc5LDcgQEAKIAogCQkJCQl1aW50MzJfdCBtID0gKGxlICogNSArIGhlICogMykgLyA4OwogCi0JCQkJCWludCBlcnIgPSBsYWJzKChpbnQpdiAtIChpbnQpbSk7CisJCQkJCWludCBlcnIgPSAoaW50KWxhYnMoKGludCl2IC0gKGludCltKTsKIAkJCQkJaWYgKGVyciA8IGxvd2VzdF9lcnIpCiAJCQkJCXsKIAkJCQkJCWxvd2VzdF9lcnIgPSBlcnI7CkBAIC0xMjEzNCw3ICsxNjgwMiw3IEBACiAJCQkJdWludDMyX3QgbGUgPSAobCA8PCAxKTsKIAkJCQlsZSA9IChsZSA8PCA0KSB8IGxlOwogCi0JCQkJaW50IGVyciA9IGxhYnMoKGludCl2IC0gKGludClsZSk7CisJCQkJaW50IGVyciA9IChpbnQpbGFicygoaW50KXYgLSAoaW50KWxlKTsKIAkJCQlpZiAoZXJyIDwgbG93ZXN0X2VycikKIAkJCQl7CiAJCQkJCWxvd2VzdF9lcnIgPSBlcnI7CkBAIC0xMjE1Niw3ICsxNjgyNCw3IEBACiAJCQkJdWludDMyX3QgaGUgPSAoaCA8PCAxKSB8IDE7CiAJCQkJaGUgPSAoaGUgPDwgNCkgfCBoZTsKIAotCQkJCWludCBlcnIgPSBsYWJzKChpbnQpdiAtIChpbnQpaGUpOworCQkJCWludCBlcnIgPSAoaW50KWxhYnMoKGludCl2IC0gKGludCloZSk7CiAJCQkJaWYgKGVyciA8IGxvd2VzdF9lcnIpCiAJCQkJewogCQkJCQlsb3dlc3RfZXJyID0gZXJyOwpAQCAtMTIxODUsNyArMTY4NTMsNyBAQAogCiAJCQkJCXVpbnQzMl90IG0gPSAobGUgKiA1ICsgaGUgKiAzKSAvIDg7CiAKLQkJCQkJaW50IGVyciA9IGxhYnMoKGludCl2IC0gKGludCltKTsKKwkJCQkJaW50IGVyciA9IChpbnQpbGFicygoaW50KXYgLSAoaW50KW0pOwogCQkJCQlpZiAoZXJyIDwgbG93ZXN0X2VycikKIAkJCQkJewogCQkJCQkJbG93ZXN0X2VyciA9IGVycjsKQEAgLTEyMjE1LDcgKzE2ODgzLDcgQEAKIAogCQkJCQl1aW50MzJfdCBtID0gKGxlICogNSArIGhlICogMykgLyA4OwogCi0JCQkJCWludCBlcnIgPSBsYWJzKChpbnQpdiAtIChpbnQpbSk7CisJCQkJCWludCBlcnIgPSAoaW50KWxhYnMoKGludCl2IC0gKGludCltKTsKIAkJCQkJaWYgKGVyciA8IGxvd2VzdF9lcnIpCiAJCQkJCXsKIAkJCQkJCWxvd2VzdF9lcnIgPSBlcnI7CkBAIC0xMjIzMSw4ICsxNjg5OSw4IEBACiAJfQogI2VuZGlmIC8vIEJBU0lTRF9TVVBQT1JUX1BWUlRDMgogCi0JYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyKGNvbnN0IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKiBwR2xvYmFsX3NlbF9jb2RlYm9vaykgOgotCQltX3BHbG9iYWxfc2VsX2NvZGVib29rKHBHbG9iYWxfc2VsX2NvZGVib29rKSwKKwliYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6YmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIoKSA6CisJCW1fcEdsb2JhbF9jb2RlYm9vayhudWxscHRyKSwKIAkJbV9zZWxlY3Rvcl9oaXN0b3J5X2J1Zl9zaXplKDApCiAJewogCX0KQEAgLTEyMjQxLDYgKzE2OTA5LDExIEBACiAJCXVpbnQzMl90IG51bV9lbmRwb2ludHMsIGNvbnN0IHVpbnQ4X3QqIHBFbmRwb2ludHNfZGF0YSwgdWludDMyX3QgZW5kcG9pbnRzX2RhdGFfc2l6ZSwKIAkJdWludDMyX3QgbnVtX3NlbGVjdG9ycywgY29uc3QgdWludDhfdCogcFNlbGVjdG9yc19kYXRhLCB1aW50MzJfdCBzZWxlY3RvcnNfZGF0YV9zaXplKQogCXsKKwkJaWYgKG1fcEdsb2JhbF9jb2RlYm9vaykKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6ZGVjb2RlX3BhbGV0dGVzOiBmYWlsIDExXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQogCQliaXR3aXNlX2RlY29kZXIgc3ltX2NvZGVjOwogCiAJCWh1ZmZtYW5fZGVjb2RpbmdfdGFibGUgY29sb3I1X2RlbHRhX21vZGVsMCwgY29sb3I1X2RlbHRhX21vZGVsMSwgY29sb3I1X2RlbHRhX21vZGVsMiwgaW50ZW5fZGVsdGFfbW9kZWw7CkBAIC0xMjI4Myw3ICsxNjk1Niw3IEBACiAKIAkJY29uc3QgYm9vbCBlbmRwb2ludHNfYXJlX2dyYXlzY2FsZSA9IHN5bV9jb2RlYy5nZXRfYml0cygxKSAhPSAwOwogCi0JCW1fZW5kcG9pbnRzLnJlc2l6ZShudW1fZW5kcG9pbnRzKTsKKwkJbV9sb2NhbF9lbmRwb2ludHMucmVzaXplKG51bV9lbmRwb2ludHMpOwogCiAJCWNvbG9yMzIgcHJldl9jb2xvcjUoMTYsIDE2LCAxNiwgMCk7CiAJCXVpbnQzMl90IHByZXZfaW50ZW4gPSAwOwpAQCAtMTIyOTEsOCArMTY5NjQsOCBAQAogCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX2VuZHBvaW50czsgaSsrKQogCQl7CiAJCQl1aW50MzJfdCBpbnRlbl9kZWx0YSA9IHN5bV9jb2RlYy5kZWNvZGVfaHVmZm1hbihpbnRlbl9kZWx0YV9tb2RlbCk7Ci0JCQltX2VuZHBvaW50c1tpXS5tX2ludGVuNSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpbnRlbl9kZWx0YSArIHByZXZfaW50ZW4pICYgNyk7Ci0JCQlwcmV2X2ludGVuID0gbV9lbmRwb2ludHNbaV0ubV9pbnRlbjU7CisJCQltX2xvY2FsX2VuZHBvaW50c1tpXS5tX2ludGVuNSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpbnRlbl9kZWx0YSArIHByZXZfaW50ZW4pICYgNyk7CisJCQlwcmV2X2ludGVuID0gbV9sb2NhbF9lbmRwb2ludHNbaV0ubV9pbnRlbjU7CiAKIAkJCWZvciAodWludDMyX3QgYyA9IDA7IGMgPCAoZW5kcG9pbnRzX2FyZV9ncmF5c2NhbGUgPyAxVSA6IDNVKTsgYysrKQogCQkJewpAQCAtMTIzMDYsMjEgKzE2OTc5LDIxIEBACiAKIAkJCQlpbnQgdiA9IChwcmV2X2NvbG9yNVtjXSArIGRlbHRhKSAmIDMxOwogCi0JCQkJbV9lbmRwb2ludHNbaV0ubV9jb2xvcjVbY10gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2KTsKKwkJCQltX2xvY2FsX2VuZHBvaW50c1tpXS5tX2NvbG9yNVtjXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYpOwogCiAJCQkJcHJldl9jb2xvcjVbY10gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2KTsKIAkJCX0KIAogCQkJaWYgKGVuZHBvaW50c19hcmVfZ3JheXNjYWxlKQogCQkJewotCQkJCW1fZW5kcG9pbnRzW2ldLm1fY29sb3I1WzFdID0gbV9lbmRwb2ludHNbaV0ubV9jb2xvcjVbMF07Ci0JCQkJbV9lbmRwb2ludHNbaV0ubV9jb2xvcjVbMl0gPSBtX2VuZHBvaW50c1tpXS5tX2NvbG9yNVswXTsKKwkJCQltX2xvY2FsX2VuZHBvaW50c1tpXS5tX2NvbG9yNVsxXSA9IG1fbG9jYWxfZW5kcG9pbnRzW2ldLm1fY29sb3I1WzBdOworCQkJCW1fbG9jYWxfZW5kcG9pbnRzW2ldLm1fY29sb3I1WzJdID0gbV9sb2NhbF9lbmRwb2ludHNbaV0ubV9jb2xvcjVbMF07CiAJCQl9CiAJCX0KIAogCQlzeW1fY29kZWMuc3RvcCgpOwogCi0JCW1fc2VsZWN0b3JzLnJlc2l6ZShudW1fc2VsZWN0b3JzKTsKKwkJbV9sb2NhbF9zZWxlY3RvcnMucmVzaXplKG51bV9zZWxlY3RvcnMpOwogCQkKIAkJaWYgKCFzeW1fY29kZWMuaW5pdChwU2VsZWN0b3JzX2RhdGEsIHNlbGVjdG9yc19kYXRhX3NpemUpKQogCQl7CkBAIC0xMjMzNCw1MCArMTcwMDcsOCBAQAogCiAJCWlmICh1c2VkX2dsb2JhbF9zZWxlY3Rvcl9jYikKIAkJewotCQkJLy8gZ2xvYmFsIHNlbGVjdG9yIHBhbGV0dGUKLQkJCXVpbnQzMl90IHBhbF9iaXRzID0gc3ltX2NvZGVjLmdldF9iaXRzKDQpOwotCQkJdWludDMyX3QgbW9kX2JpdHMgPSBzeW1fY29kZWMuZ2V0X2JpdHMoNCk7Ci0KLQkJCWJhc2lzdDo6aHVmZm1hbl9kZWNvZGluZ190YWJsZSBtb2RfbW9kZWw7Ci0JCQlpZiAobW9kX2JpdHMpCi0JCQl7Ci0JCQkJaWYgKCFzeW1fY29kZWMucmVhZF9odWZmbWFuX3RhYmxlKG1vZF9tb2RlbCkpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgNlxuIik7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCFtb2RfbW9kZWwuaXNfdmFsaWQoKSkKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCA2YVxuIik7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fc2VsZWN0b3JzOyBpKyspCi0JCQl7Ci0JCQkJdWludDMyX3QgcGFsX2luZGV4ID0gMDsKLQkJCQlpZiAocGFsX2JpdHMpCi0JCQkJCXBhbF9pbmRleCA9IHN5bV9jb2RlYy5nZXRfYml0cyhwYWxfYml0cyk7Ci0KLQkJCQl1aW50MzJfdCBtb2RfaW5kZXggPSAwOwotCQkJCWlmIChtb2RfYml0cykKLQkJCQkJbW9kX2luZGV4ID0gc3ltX2NvZGVjLmRlY29kZV9odWZmbWFuKG1vZF9tb2RlbCk7Ci0KLQkJCQlpZiAocGFsX2luZGV4ID49IG1fcEdsb2JhbF9zZWxfY29kZWJvb2stPnNpemUoKSkKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCA3elxuIik7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQljb25zdCBldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZShtX3BHbG9iYWxfc2VsX2NvZGVib29rLT5nZXRfZW50cnkocGFsX2luZGV4LCBldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyKG1vZF9pbmRleCkpKTsKLQotCQkJCS8vIFRPRE86IE9wdGltaXplIHRoaXMKLQkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJbV9zZWxlY3RvcnNbaV0uc2V0X3NlbGVjdG9yKHgsIHksIGVbeCArIHkgKiA0XSk7Ci0KLQkJCQltX3NlbGVjdG9yc1tpXS5pbml0X2ZsYWdzKCk7Ci0JCQl9CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGdsb2JhbCBzZWxlY3RvciBjb2RlYm9va3MgYXJlIHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTEyMzg1LDE0NiArMTcwMTYsNzAgQEAKIAogCQkJaWYgKHVzZWRfaHlicmlkX3NlbGVjdG9yX2NiKQogCQkJewotCQkJCWNvbnN0IHVpbnQzMl90IHBhbF9iaXRzID0gc3ltX2NvZGVjLmdldF9iaXRzKDQpOwotCQkJCWNvbnN0IHVpbnQzMl90IG1vZF9iaXRzID0gc3ltX2NvZGVjLmdldF9iaXRzKDQpOworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogaHlicmlkIGdsb2JhbCBzZWxlY3RvciBjb2RlYm9va3MgYXJlIHVuc3VwcG9ydGVkXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQkJCisJCQljb25zdCBib29sIHVzZWRfcmF3X2VuY29kaW5nID0gKHN5bV9jb2RlYy5nZXRfYml0cygxKSA9PSAxKTsKIAotCQkJCWJhc2lzdDo6aHVmZm1hbl9kZWNvZGluZ190YWJsZSB1c2VzX2dsb2JhbF9jYl9iaXRmbGFnc19tb2RlbDsKLQkJCQlpZiAoIXN5bV9jb2RlYy5yZWFkX2h1ZmZtYW5fdGFibGUodXNlc19nbG9iYWxfY2JfYml0ZmxhZ3NfbW9kZWwpKQorCQkJaWYgKHVzZWRfcmF3X2VuY29kaW5nKQorCQkJeworCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fc2VsZWN0b3JzOyBpKyspCiAJCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgN1xuIik7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCF1c2VzX2dsb2JhbF9jYl9iaXRmbGFnc19tb2RlbC5pc192YWxpZCgpKQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6ZGVjb2RlX3BhbGV0dGVzOiBmYWlsIDdhXG4iKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWJhc2lzdDo6aHVmZm1hbl9kZWNvZGluZ190YWJsZSBnbG9iYWxfbW9kX2luZGljZXNfbW9kZWw7Ci0JCQkJaWYgKG1vZF9iaXRzKQotCQkJCXsKLQkJCQkJaWYgKCFzeW1fY29kZWMucmVhZF9odWZmbWFuX3RhYmxlKGdsb2JhbF9tb2RfaW5kaWNlc19tb2RlbCkpCisJCQkJCWZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyBqKyspCiAJCQkJCXsKLQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCA4XG4iKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoIWdsb2JhbF9tb2RfaW5kaWNlc19tb2RlbC5pc192YWxpZCgpKQotCQkJCQl7Ci0JCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgOGFcbiIpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQorCQkJCQkJdWludDMyX3QgY3VyX2J5dGUgPSBzeW1fY29kZWMuZ2V0X2JpdHMoOCk7CiAKLQkJCQl1aW50MzJfdCBjdXJfdXNlc19nbG9iYWxfY2JfYml0ZmxhZ3MgPSAwOwotCQkJCXVpbnQzMl90IHVzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzX3JlbWFpbmluZyA9IDA7Ci0KLQkJCQlmb3IgKHVpbnQzMl90IHEgPSAwOyBxIDwgbnVtX3NlbGVjdG9yczsgcSsrKQotCQkJCXsKLQkJCQkJaWYgKCF1c2VzX2dsb2JhbF9jYl9iaXRmbGFnc19yZW1haW5pbmcpCi0JCQkJCXsKLQkJCQkJCWN1cl91c2VzX2dsb2JhbF9jYl9iaXRmbGFncyA9IHN5bV9jb2RlYy5kZWNvZGVfaHVmZm1hbih1c2VzX2dsb2JhbF9jYl9iaXRmbGFnc19tb2RlbCk7Ci0KLQkJCQkJCXVzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzX3JlbWFpbmluZyA9IDg7Ci0JCQkJCX0KLQkJCQkJdXNlc19nbG9iYWxfY2JfYml0ZmxhZ3NfcmVtYWluaW5nLS07Ci0KLQkJCQkJY29uc3QgYm9vbCB1c2VkX2dsb2JhbF9jYl9mbGFnID0gKGN1cl91c2VzX2dsb2JhbF9jYl9iaXRmbGFncyAmIDEpICE9IDA7Ci0JCQkJCWN1cl91c2VzX2dsb2JhbF9jYl9iaXRmbGFncyA+Pj0gMTsKLQotCQkJCQlpZiAodXNlZF9nbG9iYWxfY2JfZmxhZykKLQkJCQkJewotCQkJCQkJY29uc3QgdWludDMyX3QgcGFsX2luZGV4ID0gcGFsX2JpdHMgPyBzeW1fY29kZWMuZ2V0X2JpdHMocGFsX2JpdHMpIDogMDsKLQkJCQkJCWNvbnN0IHVpbnQzMl90IG1vZF9pbmRleCA9IG1vZF9iaXRzID8gc3ltX2NvZGVjLmRlY29kZV9odWZmbWFuKGdsb2JhbF9tb2RfaW5kaWNlc19tb2RlbCkgOiAwOwotCi0JCQkJCQlpZiAocGFsX2luZGV4ID49IG1fcEdsb2JhbF9zZWxfY29kZWJvb2stPnNpemUoKSkKLQkJCQkJCXsKLQkJCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgOGJcbiIpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQotCQkJCQkJY29uc3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGUobV9wR2xvYmFsX3NlbF9jb2RlYm9vay0+Z2V0X2VudHJ5KHBhbF9pbmRleCwgZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllcihtb2RfaW5kZXgpKSk7Ci0KLQkJCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQkJCQkJbV9zZWxlY3RvcnNbcV0uc2V0X3NlbGVjdG9yKHgsIHksIGVbeCArIHkgKiA0XSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgaisrKQotCQkJCQkJewotCQkJCQkJCXVpbnQzMl90IGN1cl9ieXRlID0gc3ltX2NvZGVjLmdldF9iaXRzKDgpOwotCi0JCQkJCQkJZm9yICh1aW50MzJfdCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQkJCQkJbV9zZWxlY3RvcnNbcV0uc2V0X3NlbGVjdG9yKGssIGosIChjdXJfYnl0ZSA+PiAoayAqIDIpKSAmIDMpOwotCQkJCQkJfQorCQkJCQkJZm9yICh1aW50MzJfdCBrID0gMDsgayA8IDQ7IGsrKykKKwkJCQkJCQltX2xvY2FsX3NlbGVjdG9yc1tpXS5zZXRfc2VsZWN0b3IoaywgaiwgKGN1cl9ieXRlID4+IChrICogMikpICYgMyk7CiAJCQkJCX0KIAotCQkJCQltX3NlbGVjdG9yc1txXS5pbml0X2ZsYWdzKCk7CisJCQkJCW1fbG9jYWxfc2VsZWN0b3JzW2ldLmluaXRfZmxhZ3MoKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJY29uc3QgYm9vbCB1c2VkX3Jhd19lbmNvZGluZyA9IChzeW1fY29kZWMuZ2V0X2JpdHMoMSkgPT0gMSk7Ci0KLQkJCQlpZiAodXNlZF9yYXdfZW5jb2RpbmcpCisJCQkJaWYgKCFzeW1fY29kZWMucmVhZF9odWZmbWFuX3RhYmxlKGRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbCkpCiAJCQkJewotCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX3NlbGVjdG9yczsgaSsrKQorCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgMTBcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQkJaWYgKChudW1fc2VsZWN0b3JzID4gMSkgJiYgKCFkZWx0YV9zZWxlY3Rvcl9wYWxfbW9kZWwuaXNfdmFsaWQoKSkpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgMTBhXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJCXVpbnQ4X3QgcHJldl9ieXRlc1s0XSA9IHsgMCwgMCwgMCwgMCB9OworCisJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9zZWxlY3RvcnM7IGkrKykKKwkJCQl7CisJCQkJCWlmICghaSkKIAkJCQkJewogCQkJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKIAkJCQkJCXsKIAkJCQkJCQl1aW50MzJfdCBjdXJfYnl0ZSA9IHN5bV9jb2RlYy5nZXRfYml0cyg4KTsKLQotCQkJCQkJCWZvciAodWludDMyX3QgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJCQkJCW1fc2VsZWN0b3JzW2ldLnNldF9zZWxlY3RvcihrLCBqLCAoY3VyX2J5dGUgPj4gKGsgKiAyKSkgJiAzKTsKLQkJCQkJCX0KLQotCQkJCQkJbV9zZWxlY3RvcnNbaV0uaW5pdF9mbGFncygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmICghc3ltX2NvZGVjLnJlYWRfaHVmZm1hbl90YWJsZShkZWx0YV9zZWxlY3Rvcl9wYWxfbW9kZWwpKQotCQkJCQl7Ci0JCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgMTBcbiIpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKChudW1fc2VsZWN0b3JzID4gMSkgJiYgKCFkZWx0YV9zZWxlY3Rvcl9wYWxfbW9kZWwuaXNfdmFsaWQoKSkpCi0JCQkJCXsKLQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCAxMGFcbiIpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJdWludDhfdCBwcmV2X2J5dGVzWzRdID0geyAwLCAwLCAwLCAwIH07Ci0KLQkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9zZWxlY3RvcnM7IGkrKykKLQkJCQkJewotCQkJCQkJaWYgKCFpKQotCQkJCQkJewotCQkJCQkJCWZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyBqKyspCi0JCQkJCQkJewotCQkJCQkJCQl1aW50MzJfdCBjdXJfYnl0ZSA9IHN5bV9jb2RlYy5nZXRfYml0cyg4KTsKLQkJCQkJCQkJcHJldl9ieXRlc1tqXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN1cl9ieXRlKTsKLQotCQkJCQkJCQlmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCQkJCQkJbV9zZWxlY3RvcnNbaV0uc2V0X3NlbGVjdG9yKGssIGosIChjdXJfYnl0ZSA+PiAoayAqIDIpKSAmIDMpOwotCQkJCQkJCX0KLQkJCQkJCQltX3NlbGVjdG9yc1tpXS5pbml0X2ZsYWdzKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCWZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyBqKyspCi0JCQkJCQl7Ci0JCQkJCQkJaW50IGRlbHRhX2J5dGUgPSBzeW1fY29kZWMuZGVjb2RlX2h1ZmZtYW4oZGVsdGFfc2VsZWN0b3JfcGFsX21vZGVsKTsKLQotCQkJCQkJCXVpbnQzMl90IGN1cl9ieXRlID0gZGVsdGFfYnl0ZSBeIHByZXZfYnl0ZXNbal07CiAJCQkJCQkJcHJldl9ieXRlc1tqXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN1cl9ieXRlKTsKIAogCQkJCQkJCWZvciAodWludDMyX3QgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJCQkJCW1fc2VsZWN0b3JzW2ldLnNldF9zZWxlY3RvcihrLCBqLCAoY3VyX2J5dGUgPj4gKGsgKiAyKSkgJiAzKTsKKwkJCQkJCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uc2V0X3NlbGVjdG9yKGssIGosIChjdXJfYnl0ZSA+PiAoayAqIDIpKSAmIDMpOwogCQkJCQkJfQotCQkJCQkJbV9zZWxlY3RvcnNbaV0uaW5pdF9mbGFncygpOworCQkJCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uaW5pdF9mbGFncygpOworCQkJCQkJY29udGludWU7CiAJCQkJCX0KKworCQkJCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgaisrKQorCQkJCQl7CisJCQkJCQlpbnQgZGVsdGFfYnl0ZSA9IHN5bV9jb2RlYy5kZWNvZGVfaHVmZm1hbihkZWx0YV9zZWxlY3Rvcl9wYWxfbW9kZWwpOworCisJCQkJCQl1aW50MzJfdCBjdXJfYnl0ZSA9IGRlbHRhX2J5dGUgXiBwcmV2X2J5dGVzW2pdOworCQkJCQkJcHJldl9ieXRlc1tqXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN1cl9ieXRlKTsKKworCQkJCQkJZm9yICh1aW50MzJfdCBrID0gMDsgayA8IDQ7IGsrKykKKwkJCQkJCQltX2xvY2FsX3NlbGVjdG9yc1tpXS5zZXRfc2VsZWN0b3IoaywgaiwgKGN1cl9ieXRlID4+IChrICogMikpICYgMyk7CisJCQkJCX0KKwkJCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uaW5pdF9mbGFncygpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTI1OTIsNiArMTcxNDcsMTIgQEAKIAkJfQogCiAJCW1fc2VsZWN0b3JfaGlzdG9yeV9idWZfc2l6ZSA9IHN5bV9jb2RlYy5nZXRfYml0cygxMyk7CisJCS8vIENoZWNrIGZvciBib2d1cyB2YWx1ZXMuCisJCWlmICghbV9zZWxlY3Rvcl9oaXN0b3J5X2J1Zl9zaXplKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfdGFibGVzOiBmYWlsIDVcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CiAKIAkJc3ltX2NvZGVjLnN0b3AoKTsKIApAQCAtMTI1OTksNyArMTcxNjAsNyBAQAogCX0KIAogCWJvb2wgYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9zbGljZSh2b2lkKiBwRHN0X2Jsb2NrcywgdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIGNvbnN0IHVpbnQ4X3QqIHBJbWFnZV9kYXRhLCB1aW50MzJfdCBpbWFnZV9kYXRhX3NpemUsIGJsb2NrX2Zvcm1hdCBmbXQsCi0JCXVpbnQzMl90IG91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMsIGJvb2wgYmMxX2FsbG93X3RocmVlY29sb3JfYmxvY2tzLCBjb25zdCBiYXNpc19maWxlX2hlYWRlciYgaGVhZGVyLCBjb25zdCBiYXNpc19zbGljZV9kZXNjJiBzbGljZV9kZXNjLCB1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsCisJCXVpbnQzMl90IG91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMsIGJvb2wgYmMxX2FsbG93X3RocmVlY29sb3JfYmxvY2tzLCBjb25zdCBib29sIGlzX3ZpZGVvLCBjb25zdCBib29sIGlzX2FscGhhX3NsaWNlLCBjb25zdCB1aW50MzJfdCBsZXZlbF9pbmRleCwgY29uc3QgdWludDMyX3Qgb3JpZ193aWR0aCwgY29uc3QgdWludDMyX3Qgb3JpZ19oZWlnaHQsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywKIAkJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSwgYm9vbCB0cmFuc2NvZGVfYWxwaGEsIHZvaWQgKnBBbHBoYV9ibG9ja3MsIHVpbnQzMl90IG91dHB1dF9yb3dzX2luX3BpeGVscykKIAl7CiAJCS8vICdwRHN0X2Jsb2NrcycgdW51c2VkIHdoZW4gZGlzYWJsaW5nICphbGwqIGhhcmR3YXJlIHRyYW5zY29kZSBvcHRpb25zCkBAIC0xMjYwOSwyMCArMTcxNzAsMjYgQEAKIAkJQkFTSVNVX05PVEVfVU5VU0VEKHRyYW5zY29kZV9hbHBoYSk7CiAJCUJBU0lTVV9OT1RFX1VOVVNFRChwQWxwaGFfYmxvY2tzKTsKIAorCQlhc3NlcnQoZ190cmFuc2NvZGVyX2luaXRpYWxpemVkKTsKKwkJaWYgKCFnX3RyYW5zY29kZXJfaW5pdGlhbGl6ZWQpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9zbGljZTogVHJhbnNjb2RlciBub3QgZ2xvYmFsbHkgaW5pdGlhbGl6ZWQuXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCiAJCWlmICghcFN0YXRlKQogCQkJcFN0YXRlID0gJm1fZGVmX3N0YXRlOwogCi0JCWNvbnN0IGJvb2wgaXNfdmlkZW8gPSAoaGVhZGVyLm1fdGV4X3R5cGUgPT0gY0JBU0lTVGV4VHlwZVZpZGVvRnJhbWVzKTsKIAkJY29uc3QgdWludDMyX3QgdG90YWxfYmxvY2tzID0gbnVtX2Jsb2Nrc194ICogbnVtX2Jsb2Nrc195OwogCiAJCWlmICghb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzKQogCQl7CiAJCQlpZiAoYmFzaXNfYmxvY2tfZm9ybWF0X2lzX3VuY29tcHJlc3NlZChmbXQpKQotCQkJCW91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoOworCQkJCW91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IG9yaWdfd2lkdGg7CiAJCQllbHNlCiAJCQl7CiAJCQkJaWYgKGZtdCA9PSBibG9ja19mb3JtYXQ6OmNGWFQxX1JHQikKLQkJCQkJb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzID0gKHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoICsgNykgLyA4OworCQkJCQlvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAob3JpZ193aWR0aCArIDcpIC8gODsKIAkJCQllbHNlCiAJCQkJCW91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IG51bV9ibG9ja3NfeDsKIAkJCX0KQEAgLTEyNjMxLDE1ICsxNzE5OCwxNSBAQAogCQlpZiAoYmFzaXNfYmxvY2tfZm9ybWF0X2lzX3VuY29tcHJlc3NlZChmbXQpKQogCQl7CiAJCQlpZiAoIW91dHB1dF9yb3dzX2luX3BpeGVscykKLQkJCQlvdXRwdXRfcm93c19pbl9waXhlbHMgPSBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQ7CisJCQkJb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gb3JpZ19oZWlnaHQ7CiAJCX0KIAkJCi0JCXN0ZDo6dmVjdG9yPHVpbnQzMl90PiogcFByZXZfZnJhbWVfaW5kaWNlcyA9IG51bGxwdHI7CisJCWJhc2lzdTo6dmVjdG9yPHVpbnQzMl90PiogcFByZXZfZnJhbWVfaW5kaWNlcyA9IG51bGxwdHI7CiAJCWlmIChpc192aWRlbykKIAkJewogCQkJLy8gVE9ETzogQWRkIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY2FsbGVyIGhhc24ndCB0cmllZCBza2lwcGluZyBwYXN0IHAtZnJhbWVzCi0JCQljb25zdCBib29sIGFscGhhX2ZsYWcgPSAoc2xpY2VfZGVzYy5tX2ZsYWdzICYgY1NsaWNlRGVzY0ZsYWdzSGFzQWxwaGEpICE9IDA7Ci0JCQljb25zdCB1aW50MzJfdCBsZXZlbF9pbmRleCA9IHNsaWNlX2Rlc2MubV9sZXZlbF9pbmRleDsKKwkJCS8vY29uc3QgYm9vbCBhbHBoYV9mbGFnID0gKHNsaWNlX2Rlc2MubV9mbGFncyAmIGNTbGljZURlc2NGbGFnc0hhc0FscGhhKSAhPSAwOworCQkJLy9jb25zdCB1aW50MzJfdCBsZXZlbF9pbmRleCA9IHNsaWNlX2Rlc2MubV9sZXZlbF9pbmRleDsKIAogCQkJaWYgKGxldmVsX2luZGV4ID49IGJhc2lzdV90cmFuc2NvZGVyX3N0YXRlOjpjTWF4UHJldkZyYW1lTGV2ZWxzKQogCQkJewpAQCAtMTI2NDcsNyArMTcyMTQsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAotCQkJcFByZXZfZnJhbWVfaW5kaWNlcyA9ICZwU3RhdGUtPm1fcHJldl9mcmFtZV9pbmRpY2VzW2FscGhhX2ZsYWddW2xldmVsX2luZGV4XTsKKwkJCXBQcmV2X2ZyYW1lX2luZGljZXMgPSAmcFN0YXRlLT5tX3ByZXZfZnJhbWVfaW5kaWNlc1tpc19hbHBoYV9zbGljZV1bbGV2ZWxfaW5kZXhdOwogCQkJaWYgKHBQcmV2X2ZyYW1lX2luZGljZXMtPnNpemUoKSA8IHRvdGFsX2Jsb2NrcykKIAkJCQlwUHJldl9mcmFtZV9pbmRpY2VzLT5yZXNpemUodG90YWxfYmxvY2tzKTsKIAkJfQpAQCAtMTI2NjEsMTUgKzE3MjI4LDE2IEBACiAJCX0KIAogCQlhcHByb3hfbW92ZV90b19mcm9udCBzZWxlY3Rvcl9oaXN0b3J5X2J1ZihtX3NlbGVjdG9yX2hpc3RvcnlfYnVmX3NpemUpOwotCi0JCWNvbnN0IHVpbnQzMl90IFNFTEVDVE9SX0hJU1RPUllfQlVGX0ZJUlNUX1NZTUJPTF9JTkRFWCA9ICh1aW50MzJfdCltX3NlbGVjdG9ycy5zaXplKCk7Ci0JCWNvbnN0IHVpbnQzMl90IFNFTEVDVE9SX0hJU1RPUllfQlVGX1JMRV9TWU1CT0xfSU5ERVggPSBtX3NlbGVjdG9yX2hpc3RvcnlfYnVmX3NpemUgKyBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9GSVJTVF9TWU1CT0xfSU5ERVg7CisJCQkJCiAJCXVpbnQzMl90IGN1cl9zZWxlY3Rvcl9ybGVfY291bnQgPSAwOwogCiAJCWRlY29kZXJfZXRjX2Jsb2NrIGJsb2NrOwogCQltZW1zZXQoJmJsb2NrLCAwLCBzaXplb2YoYmxvY2spKTsKKwkJCQkKKwkJLy9ibG9jay5zZXRfZmxpcF9iaXQodHJ1ZSk7CisJCS8vIFNldHRpbmcgdGhlIGZsaXAgYml0IHRvIGZhbHNlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgS2hyb25vcyBLREZTLgorCQlibG9jay5zZXRfZmxpcF9iaXQoZmFsc2UpOwogCi0JCWJsb2NrLnNldF9mbGlwX2JpdCh0cnVlKTsKIAkJYmxvY2suc2V0X2RpZmZfYml0KHRydWUpOwogCiAJCXZvaWQqIHBQVlJUQ193b3JrX21lbSA9IG51bGxwdHI7CkBAIC0xMjY5NSw2ICsxNzI2MywxNiBAQAogCQlpbnQgcHJldl9lbmRwb2ludF9wcmVkX3N5bSA9IDA7CiAJCWludCBlbmRwb2ludF9wcmVkX3JlcGVhdF9jb3VudCA9IDA7CiAJCXVpbnQzMl90IHByZXZfZW5kcG9pbnRfaW5kZXggPSAwOworCQljb25zdCBlbmRwb2ludF92ZWMmIGVuZHBvaW50cyA9IG1fcEdsb2JhbF9jb2RlYm9vayA/IG1fcEdsb2JhbF9jb2RlYm9vay0+bV9sb2NhbF9lbmRwb2ludHMgOiBtX2xvY2FsX2VuZHBvaW50czsKKwkJY29uc3Qgc2VsZWN0b3JfdmVjJiBzZWxlY3RvcnMgPSBtX3BHbG9iYWxfY29kZWJvb2sgPyBtX3BHbG9iYWxfY29kZWJvb2stPm1fbG9jYWxfc2VsZWN0b3JzIDogbV9sb2NhbF9zZWxlY3RvcnM7CisJCWlmICghZW5kcG9pbnRzLnNpemUoKSB8fCAhc2VsZWN0b3JzLnNpemUoKSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX3NsaWNlOiBnbG9iYWwgY29kZWJvb2tzIG11c3QgYmUgdW5wYWNrZWQgZmlyc3RcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJY29uc3QgdWludDMyX3QgU0VMRUNUT1JfSElTVE9SWV9CVUZfRklSU1RfU1lNQk9MX0lOREVYID0gKHVpbnQzMl90KXNlbGVjdG9ycy5zaXplKCk7CisJCWNvbnN0IHVpbnQzMl90IFNFTEVDVE9SX0hJU1RPUllfQlVGX1JMRV9TWU1CT0xfSU5ERVggPSBtX3NlbGVjdG9yX2hpc3RvcnlfYnVmX3NpemUgKyBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9GSVJTVF9TWU1CT0xfSU5ERVg7CiAKIAkJZm9yICh1aW50MzJfdCBibG9ja195ID0gMDsgYmxvY2tfeSA8IG51bV9ibG9ja3NfeTsgYmxvY2tfeSsrKQogCQl7CkBAIC0xMjc5Niw4ICsxNzM3NCw4IEBACiAJCQkJCWNvbnN0IHVpbnQzMl90IGRlbHRhX3N5bSA9IHN5bV9jb2RlYy5kZWNvZGVfaHVmZm1hbihtX2RlbHRhX2VuZHBvaW50X21vZGVsKTsKIAogCQkJCQllbmRwb2ludF9pbmRleCA9IGRlbHRhX3N5bSArIHByZXZfZW5kcG9pbnRfaW5kZXg7Ci0JCQkJCWlmIChlbmRwb2ludF9pbmRleCA+PSBtX2VuZHBvaW50cy5zaXplKCkpCi0JCQkJCQllbmRwb2ludF9pbmRleCAtPSAoaW50KW1fZW5kcG9pbnRzLnNpemUoKTsKKwkJCQkJaWYgKGVuZHBvaW50X2luZGV4ID49IGVuZHBvaW50cy5zaXplKCkpCisJCQkJCQllbmRwb2ludF9pbmRleCAtPSAoaW50KWVuZHBvaW50cy5zaXplKCk7CiAJCQkJfQogCiAJCQkJcFN0YXRlLT5tX2Jsb2NrX2VuZHBvaW50X3ByZWRzW2N1cl9ibG9ja19lbmRwb2ludF9wcmVkX2FycmF5XVtibG9ja194XS5tX2VuZHBvaW50X2luZGV4ID0gKHVpbnQxNl90KWVuZHBvaW50X2luZGV4OwpAQCAtMTI4MTIsNyArMTczOTAsNyBAQAogCQkJCQl7CiAJCQkJCQljdXJfc2VsZWN0b3JfcmxlX2NvdW50LS07CiAKLQkJCQkJCXNlbGVjdG9yX3N5bSA9IChpbnQpbV9zZWxlY3RvcnMuc2l6ZSgpOworCQkJCQkJc2VsZWN0b3Jfc3ltID0gKGludClzZWxlY3RvcnMuc2l6ZSgpOwogCQkJCQl9CiAJCQkJCWVsc2UKIAkJCQkJewpAQCAtMTI4MzYsMTcgKzE3NDE0LDE3IEBACiAJCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCQl9CiAKLQkJCQkJCQlzZWxlY3Rvcl9zeW0gPSAoaW50KW1fc2VsZWN0b3JzLnNpemUoKTsKKwkJCQkJCQlzZWxlY3Rvcl9zeW0gPSAoaW50KXNlbGVjdG9ycy5zaXplKCk7CiAKIAkJCQkJCQljdXJfc2VsZWN0b3JfcmxlX2NvdW50LS07CiAJCQkJCQl9CiAJCQkJCX0KIAotCQkJCQlpZiAoc2VsZWN0b3Jfc3ltID49IChpbnQpbV9zZWxlY3RvcnMuc2l6ZSgpKQorCQkJCQlpZiAoc2VsZWN0b3Jfc3ltID49IChpbnQpc2VsZWN0b3JzLnNpemUoKSkKIAkJCQkJewogCQkJCQkJYXNzZXJ0KG1fc2VsZWN0b3JfaGlzdG9yeV9idWZfc2l6ZSA+IDApOwogCi0JCQkJCQlpbnQgaGlzdG9yeV9idWZfaW5kZXggPSBzZWxlY3Rvcl9zeW0gLSAoaW50KW1fc2VsZWN0b3JzLnNpemUoKTsKKwkJCQkJCWludCBoaXN0b3J5X2J1Zl9pbmRleCA9IHNlbGVjdG9yX3N5bSAtIChpbnQpc2VsZWN0b3JzLnNpemUoKTsKIAogCQkJCQkJaWYgKGhpc3RvcnlfYnVmX2luZGV4ID49IChpbnQpc2VsZWN0b3JfaGlzdG9yeV9idWYuc2l6ZSgpKQogCQkJCQkJewpAQCAtMTI4NzEsNyArMTc0NDksNyBAQAogCQkJCQl9CiAJCQkJfQogCi0JCQkJaWYgKChlbmRwb2ludF9pbmRleCA+PSBtX2VuZHBvaW50cy5zaXplKCkpIHx8IChzZWxlY3Rvcl9pbmRleCA+PSBtX3NlbGVjdG9ycy5zaXplKCkpKQorCQkJCWlmICgoZW5kcG9pbnRfaW5kZXggPj0gZW5kcG9pbnRzLnNpemUoKSkgfHwgKHNlbGVjdG9yX2luZGV4ID49IHNlbGVjdG9ycy5zaXplKCkpKQogCQkJCXsKIAkJCQkJLy8gVGhlIGZpbGUgaXMgY29ycnVwdGVkIG9yIHdlJ3ZlIGdvdCBhIGJ1Zy4KIAkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX3NsaWNlOiBpbnZhbGlkIGRhdGFzdHJlYW0gKDUpXG4iKTsKQEAgLTEyODk1LDggKzE3NDczLDggQEAKIAkJCQl9CiAjZW5kaWYKIAotCQkJCWNvbnN0IGVuZHBvaW50KiBwRW5kcG9pbnRzID0gJm1fZW5kcG9pbnRzW2VuZHBvaW50X2luZGV4XTsKLQkJCQljb25zdCBzZWxlY3RvciogcFNlbGVjdG9yID0gJm1fc2VsZWN0b3JzW3NlbGVjdG9yX2luZGV4XTsKKwkJCQljb25zdCBlbmRwb2ludCogcEVuZHBvaW50cyA9ICZlbmRwb2ludHNbZW5kcG9pbnRfaW5kZXhdOworCQkJCWNvbnN0IHNlbGVjdG9yKiBwU2VsZWN0b3IgPSAmc2VsZWN0b3JzW3NlbGVjdG9yX2luZGV4XTsKIAogCQkJCXN3aXRjaCAoZm10KQogCQkJCXsKQEAgLTEzMDAwLDggKzE3NTc4LDggQEAKIAogCQkJCQljb25zdCB1aW50MTZfdCogcEFscGhhX2Jsb2NrID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KHN0YXRpY19jYXN0PHVpbnQ4X3QqPihwQWxwaGFfYmxvY2tzKSArIChibG9ja194ICsgYmxvY2tfeSAqIG51bV9ibG9ja3NfeCkgKiBzaXplb2YodWludDMyX3QpKTsKIAotCQkJCQljb25zdCBlbmRwb2ludCogcEFscGhhX2VuZHBvaW50cyA9ICZtX2VuZHBvaW50c1twQWxwaGFfYmxvY2tbMF1dOwotCQkJCQljb25zdCBzZWxlY3RvciogcEFscGhhX3NlbGVjdG9yID0gJm1fc2VsZWN0b3JzW3BBbHBoYV9ibG9ja1sxXV07CisJCQkJCWNvbnN0IGVuZHBvaW50KiBwQWxwaGFfZW5kcG9pbnRzID0gJmVuZHBvaW50c1twQWxwaGFfYmxvY2tbMF1dOworCQkJCQljb25zdCBzZWxlY3RvciogcEFscGhhX3NlbGVjdG9yID0gJnNlbGVjdG9yc1twQWxwaGFfYmxvY2tbMV1dOwogCiAJCQkJCWNvbnN0IGNvbG9yMzImIGFscGhhX2Jhc2VfY29sb3IgPSBwQWxwaGFfZW5kcG9pbnRzLT5tX2NvbG9yNTsKIAkJCQkJY29uc3QgdWludDMyX3QgYWxwaGFfaW50ZW5fdGFibGUgPSBwQWxwaGFfZW5kcG9pbnRzLT5tX2ludGVuNTsKQEAgLTEzMDYwLDcgKzE3NjM4LDcgQEAKIAkJCQl7CiAjaWYgQkFTSVNEX1NVUFBPUlRfQVNUQwogCQkJCQl2b2lkKiBwRHN0X2Jsb2NrID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHBEc3RfYmxvY2tzKSArIChibG9ja194ICsgYmxvY2tfeSAqIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscykgKiBvdXRwdXRfYmxvY2tfb3JfcGl4ZWxfc3RyaWRlX2luX2J5dGVzOwotCQkJCQljb252ZXJ0X2V0YzFzX3RvX2FzdGNfNHg0KHBEc3RfYmxvY2ssIHBFbmRwb2ludHMsIHBTZWxlY3RvciwgdHJhbnNjb2RlX2FscGhhLCAmbV9lbmRwb2ludHNbMF0sICZtX3NlbGVjdG9yc1swXSk7CisJCQkJCWNvbnZlcnRfZXRjMXNfdG9fYXN0Y180eDQocERzdF9ibG9jaywgcEVuZHBvaW50cywgcFNlbGVjdG9yLCB0cmFuc2NvZGVfYWxwaGEsICZlbmRwb2ludHNbMF0sICZzZWxlY3RvcnNbMF0pOwogI2Vsc2UKIAkJCQkJYXNzZXJ0KDApOwogI2VuZGlmCkBAIC0xMzEwNiw3ICsxNzY4NCw3IEBACiAKIAkJCQkJdm9pZCogcERzdF9ibG9jayA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihwRHN0X2Jsb2NrcykgKyAoYmxvY2tfeCArIGJsb2NrX3kgKiBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpICogb3V0cHV0X2Jsb2NrX29yX3BpeGVsX3N0cmlkZV9pbl9ieXRlczsKIAkJCQkJCQkJCQkKLQkJCQkJY29udmVydF9ldGMxc190b19wdnJ0YzJfcmdiYShwRHN0X2Jsb2NrLCBwRW5kcG9pbnRzLCBwU2VsZWN0b3IsICZtX2VuZHBvaW50c1swXSwgJm1fc2VsZWN0b3JzWzBdKTsKKwkJCQkJY29udmVydF9ldGMxc190b19wdnJ0YzJfcmdiYShwRHN0X2Jsb2NrLCBwRW5kcG9pbnRzLCBwU2VsZWN0b3IsICZlbmRwb2ludHNbMF0sICZzZWxlY3RvcnNbMF0pOwogI2VuZGlmCiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTEzMjM0LDcgKzE3ODEyLDcgQEAKIAkJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyBpKyspCiAJCQkJCQl7CiAJCQkJCQkJcGFja2VkX2NvbG9yc1tpXSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PigobXVsXzgoY29sb3JzW2ldLnIsIDMxKSA8PCAxMSkgfCAobXVsXzgoY29sb3JzW2ldLmcsIDYzKSA8PCA1KSB8IG11bF84KGNvbG9yc1tpXS5iLCAzMSkpOwotCQkJCQkJCWlmIChJU19CSUdfRU5ESUFOKQorCQkJCQkJCWlmIChCQVNJU0RfSVNfQklHX0VORElBTikKIAkJCQkJCQkJcGFja2VkX2NvbG9yc1tpXSA9IGJ5dGVzd2FwX3VpbnQxNihwYWNrZWRfY29sb3JzW2ldKTsKIAkJCQkJCX0KIAkJCQkJfQpAQCAtMTMyNDMsNyArMTc4MjEsNyBAQAogCQkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7IGkrKykKIAkJCQkJCXsKIAkJCQkJCQlwYWNrZWRfY29sb3JzW2ldID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KChtdWxfOChjb2xvcnNbaV0uYiwgMzEpIDw8IDExKSB8IChtdWxfOChjb2xvcnNbaV0uZywgNjMpIDw8IDUpIHwgbXVsXzgoY29sb3JzW2ldLnIsIDMxKSk7Ci0JCQkJCQkJaWYgKElTX0JJR19FTkRJQU4pCisJCQkJCQkJaWYgKEJBU0lTRF9JU19CSUdfRU5ESUFOKQogCQkJCQkJCQlwYWNrZWRfY29sb3JzW2ldID0gYnl0ZXN3YXBfdWludDE2KHBhY2tlZF9jb2xvcnNbaV0pOwogCQkJCQkJfQogCQkJCQl9CkBAIC0xMzI4NCwxMiArMTc4NjIsMTIgQEAKIAkJCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCBtYXhfeDsgeCsrKQogCQkJCQkJewogCQkJCQkJCXVpbnQxNl90IGN1ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihwRHN0X3BpeGVscylbeF07Ci0JCQkJCQkJaWYgKElTX0JJR19FTkRJQU4pCisJCQkJCQkJaWYgKEJBU0lTRF9JU19CSUdfRU5ESUFOKQogCQkJCQkJCQljdXIgPSBieXRlc3dhcF91aW50MTYoY3VyKTsKIAogCQkJCQkJCWN1ciA9IChjdXIgJiAweEYpIHwgcGFja2VkX2NvbG9yc1socyA+PiAoeCAqIDIpKSAmIDNdOwogCQkJCQkJCQotCQkJCQkJCWlmIChJU19CSUdfRU5ESUFOKQorCQkJCQkJCWlmIChCQVNJU0RfSVNfQklHX0VORElBTikKIAkJCQkJCQkJY3VyID0gYnl0ZXN3YXBfdWludDE2KGN1cik7CiAKIAkJCQkJCQlyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4ocERzdF9waXhlbHMpW3hdID0gY3VyOwpAQCAtMTMzMTUsNyArMTc4OTMsNyBAQAogCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgaSsrKQogCQkJCQl7CiAJCQkJCQlwYWNrZWRfY29sb3JzW2ldID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KChtdWxfOChjb2xvcnNbaV0uciwgMTUpIDw8IDEyKSB8IChtdWxfOChjb2xvcnNbaV0uZywgMTUpIDw8IDgpIHwgKG11bF84KGNvbG9yc1tpXS5iLCAxNSkgPDwgNCkgfCAweEYpOwotCQkJCQkJaWYgKElTX0JJR19FTkRJQU4pCisJCQkJCQlpZiAoQkFTSVNEX0lTX0JJR19FTkRJQU4pCiAJCQkJCQkJcGFja2VkX2NvbG9yc1tpXSA9IGJ5dGVzd2FwX3VpbnQxNihwYWNrZWRfY29sb3JzW2ldKTsKIAkJCQkJfQogCkBAIC0xMzM0Niw3ICsxNzkyNCw3IEBACiAJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyBpKyspCiAJCQkJCXsKIAkJCQkJCXBhY2tlZF9jb2xvcnNbaV0gPSBtdWxfOChjb2xvcnNbaV0uZywgMTUpOwotCQkJCQkJaWYgKElTX0JJR19FTkRJQU4pCisJCQkJCQlpZiAoQkFTSVNEX0lTX0JJR19FTkRJQU4pCiAJCQkJCQkJcGFja2VkX2NvbG9yc1tpXSA9IGJ5dGVzd2FwX3VpbnQxNihwYWNrZWRfY29sb3JzW2ldKTsKIAkJCQkJfQogCkBAIC0xMzM5OCw3ICsxNzk3Niw3IEBACiAJCWlmIChmbXQgPT0gYmxvY2tfZm9ybWF0OjpjUFZSVEMxXzRfUkdCKQogCQkJZml4dXBfcHZydGMxXzRfbW9kdWxhdGlvbl9yZ2IoKGRlY29kZXJfZXRjX2Jsb2NrKilwUFZSVENfd29ya19tZW0sIHBQVlJUQ19lbmRwb2ludHMsIHBEc3RfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSk7CiAJCWVsc2UgaWYgKGZtdCA9PSBibG9ja19mb3JtYXQ6OmNQVlJUQzFfNF9SR0JBKQotCQkJZml4dXBfcHZydGMxXzRfbW9kdWxhdGlvbl9yZ2JhKChkZWNvZGVyX2V0Y19ibG9jayopcFBWUlRDX3dvcmtfbWVtLCBwUFZSVENfZW5kcG9pbnRzLCBwRHN0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBBbHBoYV9ibG9ja3MsICZtX2VuZHBvaW50c1swXSwgJm1fc2VsZWN0b3JzWzBdKTsKKwkJCWZpeHVwX3B2cnRjMV80X21vZHVsYXRpb25fcmdiYSgoZGVjb2Rlcl9ldGNfYmxvY2sqKXBQVlJUQ193b3JrX21lbSwgcFBWUlRDX2VuZHBvaW50cywgcERzdF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQWxwaGFfYmxvY2tzLCAmZW5kcG9pbnRzWzBdLCAmc2VsZWN0b3JzWzBdKTsKICNlbmRpZiAvLyBCQVNJU0RfU1VQUE9SVF9QVlJUQzEKIAogCQlpZiAocFBWUlRDX3dvcmtfbWVtKQpAQCAtMTM0MDYsMjkgKzE3OTg0LDY3OCBAQAogCiAJCXJldHVybiB0cnVlOwogCX0KKworCWJvb2wgYmFzaXNfdmFsaWRhdGVfb3V0cHV0X2J1ZmZlcl9zaXplKHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgdGFyZ2V0X2Zvcm1hdCwKKwkJdWludDMyX3Qgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLAorCQl1aW50MzJfdCBvcmlnX3dpZHRoLCB1aW50MzJfdCBvcmlnX2hlaWdodCwKKwkJdWludDMyX3Qgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLAorCQl1aW50MzJfdCBvdXRwdXRfcm93c19pbl9waXhlbHMsCisJCXVpbnQzMl90IHRvdGFsX3NsaWNlX2Jsb2NrcykKKwl7CisJCWlmIChiYXNpc190cmFuc2NvZGVyX2Zvcm1hdF9pc191bmNvbXByZXNzZWQodGFyZ2V0X2Zvcm1hdCkpCisJCXsKKwkJCS8vIEFzc3VtZSB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBvcmlnX3dpZHRoIGJ5IG9yaWdfaGVpZ2h0CisJCQlpZiAoIW91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscykKKwkJCQlvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSBvcmlnX3dpZHRoOworCisJCQlpZiAoIW91dHB1dF9yb3dzX2luX3BpeGVscykgCisJCQkJb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gb3JpZ19oZWlnaHQ7CisKKwkJCS8vIE5vdyBtYWtlIHN1cmUgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoLCBvciB3ZSdsbCBvdmVyd3JpdGUgbWVtb3J5LgorCQkJaWYgKG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscyA8IChvdXRwdXRfcm93c19pbl9waXhlbHMgKiBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzIDwgKG91dHB1dF9yb3dzX2luX3BpeGVscyAqIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscylcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICh0YXJnZXRfZm9ybWF0ID09IHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkZYVDFfUkdCKQorCQl7CisJCQljb25zdCB1aW50MzJfdCBudW1fYmxvY2tzX2Z4dDFfeCA9IChvcmlnX3dpZHRoICsgNykgLyA4OworCQkJY29uc3QgdWludDMyX3QgbnVtX2Jsb2Nrc19meHQxX3kgPSAob3JpZ19oZWlnaHQgKyAzKSAvIDQ7CisJCQljb25zdCB1aW50MzJfdCB0b3RhbF9ibG9ja3NfZnh0MSA9IG51bV9ibG9ja3NfZnh0MV94ICogbnVtX2Jsb2Nrc19meHQxX3k7CisKKwkJCWlmIChvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMgPCB0b3RhbF9ibG9ja3NfZnh0MSkKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscyA8IHRvdGFsX2Jsb2Nrc19meHQxXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAob3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzIDwgdG90YWxfc2xpY2VfYmxvY2tzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzIDwgdHJhbnNjb2RlX2ltYWdlXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJYm9vbCBiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlKAorCQkJdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCB0YXJnZXRfZm9ybWF0LAorCQkJdm9pZCogcE91dHB1dF9ibG9ja3MsIHVpbnQzMl90IG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJCWNvbnN0IHVpbnQ4X3QqIHBDb21wcmVzc2VkX2RhdGEsIHVpbnQzMl90IGNvbXByZXNzZWRfZGF0YV9sZW5ndGgsCisJCQl1aW50MzJfdCBudW1fYmxvY2tzX3gsIHVpbnQzMl90IG51bV9ibG9ja3NfeSwgdWludDMyX3Qgb3JpZ193aWR0aCwgdWludDMyX3Qgb3JpZ19oZWlnaHQsIHVpbnQzMl90IGxldmVsX2luZGV4LAorCQkJdWludDMyX3QgcmdiX29mZnNldCwgdWludDMyX3QgcmdiX2xlbmd0aCwgdWludDMyX3QgYWxwaGFfb2Zmc2V0LCB1aW50MzJfdCBhbHBoYV9sZW5ndGgsCisJCQl1aW50MzJfdCBkZWNvZGVfZmxhZ3MsCisJCQlib29sIGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcywKKwkJCWJvb2wgaXNfdmlkZW8sCisJCQl1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsCisJCQliYXNpc3VfdHJhbnNjb2Rlcl9zdGF0ZSogcFN0YXRlLAorCQkJdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKQorCXsKKwkJaWYgKCgodWludDY0X3QpcmdiX29mZnNldCArIHJnYl9sZW5ndGgpID4gKHVpbnQ2NF90KWNvbXByZXNzZWRfZGF0YV9sZW5ndGgpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogc291cmNlIGRhdGEgYnVmZmVyIHRvbyBzbWFsbCAoY29sb3IpXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmIChhbHBoYV9sZW5ndGgpCisJCXsKKwkJCWlmICgoKHVpbnQ2NF90KWFscGhhX29mZnNldCArIGFscGhhX2xlbmd0aCkgPiAodWludDY0X3QpY29tcHJlc3NlZF9kYXRhX2xlbmd0aCkKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHNvdXJjZSBkYXRhIGJ1ZmZlciB0b28gc21hbGwgKGFscGhhKVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJYXNzZXJ0KCFiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpOworCQl9CisKKwkJaWYgKCh0YXJnZXRfZm9ybWF0ID09IHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMV80X1JHQikgfHwgKHRhcmdldF9mb3JtYXQgPT0gdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUFZSVEMxXzRfUkdCQSkpCisJCXsKKwkJCWlmICgoIWJhc2lzdTo6aXNfcG93MihudW1fYmxvY2tzX3ggKiA0KSkgfHwgKCFiYXNpc3U6OmlzX3BvdzIobnVtX2Jsb2Nrc195ICogNCkpKQorCQkJeworCQkJCS8vIFBWUlRDMSBvbmx5IHN1cHBvcnRzIHBvd2VyIG9mIDIgZGltZW5zaW9ucworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogUFZSVEMxIG9ubHkgc3VwcG9ydHMgcG93ZXIgb2YgMiBkaW1lbnNpb25zXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlpZiAoKHRhcmdldF9mb3JtYXQgPT0gdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUFZSVEMxXzRfUkdCQSkgJiYgKCFiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpKQorCQl7CisJCQkvLyBTd2l0Y2ggdG8gUFZSVEMxIFJHQiBpZiB0aGUgaW5wdXQgZG9lc24ndCBoYXZlIGFscGhhLgorCQkJdGFyZ2V0X2Zvcm1hdCA9IHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMV80X1JHQjsKKwkJfQorCQkJCQorCQljb25zdCBib29sIHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzID0gKGRlY29kZV9mbGFncyAmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cykgIT0gMDsKKwkJY29uc3QgdWludDMyX3QgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsID0gYmFzaXNfZ2V0X2J5dGVzX3Blcl9ibG9ja19vcl9waXhlbCh0YXJnZXRfZm9ybWF0KTsKKwkJY29uc3QgdWludDMyX3QgdG90YWxfc2xpY2VfYmxvY2tzID0gbnVtX2Jsb2Nrc194ICogbnVtX2Jsb2Nrc195OworCisJCWlmICghYmFzaXNfdmFsaWRhdGVfb3V0cHV0X2J1ZmZlcl9zaXplKHRhcmdldF9mb3JtYXQsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLCB0b3RhbF9zbGljZV9ibG9ja3MpKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IG91dHB1dCBidWZmZXIgc2l6ZSB0b28gc21hbGxcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJYm9vbCBzdGF0dXMgPSBmYWxzZTsKKworCQljb25zdCB1aW50OF90KiBwRGF0YSA9IHBDb21wcmVzc2VkX2RhdGEgKyByZ2Jfb2Zmc2V0OworCQl1aW50MzJfdCBkYXRhX2xlbiA9IHJnYl9sZW5ndGg7CisJCWJvb2wgaXNfYWxwaGFfc2xpY2UgPSBmYWxzZTsKKworCQkvLyBJZiB0aGUgY2FsbGVyIHdhbnRzIHVzIHRvIHRyYW5zY29kZSB0aGUgbWlwIGxldmVsJ3MgYWxwaGEgZGF0YSwgdGhlbiB1c2UgdGhlIG5leHQgc2xpY2UuCisJCWlmICgoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKSAmJiAodHJhbnNjb2RlX2FscGhhX2RhdGFfdG9fb3BhcXVlX2Zvcm1hdHMpKQorCQl7CisJCQlwRGF0YSA9IHBDb21wcmVzc2VkX2RhdGEgKyBhbHBoYV9vZmZzZXQ7CisJCQlkYXRhX2xlbiA9IGFscGhhX2xlbmd0aDsKKwkJCWlzX2FscGhhX3NsaWNlID0gdHJ1ZTsKKwkJfQorCisJCXN3aXRjaCAodGFyZ2V0X2Zvcm1hdCkKKwkJeworCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkVUQzFfUkdCOgorCQl7CisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleF90b19kZWNvZGUsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0VUQzEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwRGF0YSwgZGF0YV9sZW4sIGJsb2NrX2Zvcm1hdDo6Y0VUQzEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGlzX3ZpZGVvLCBpc19hbHBoYV9zbGljZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQkJCQkJCisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIEVUQzEgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkMxX1JHQjoKKwkJeworI2lmICFCQVNJU0RfU1VQUE9SVF9EWFQxCisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IEJDMS9EWFQxIHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKyNlbHNlCisJCQkvLyBzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXhfdG9fZGVjb2RlLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwRGF0YSwgZGF0YV9sZW4sIGJsb2NrX2Zvcm1hdDo6Y0JDMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCB0cnVlLCBpc192aWRlbywgaXNfYWxwaGFfc2xpY2UsIGxldmVsX2luZGV4LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIGZhbHNlLCBudWxscHRyLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOworCQkJaWYgKCFzdGF0dXMpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBCQzEgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzRfUjoKKwkJeworI2lmICFCQVNJU0RfU1VQUE9SVF9EWFQ1QQorCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiBCQzQvRFhUNUEgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2Vsc2UKKwkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4X3RvX2RlY29kZSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQkM0LCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcERhdGEsIGRhdGFfbGVuLCBibG9ja19mb3JtYXQ6OmNCQzQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGlzX3ZpZGVvLCBpc19hbHBoYV9zbGljZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIEJDNCBmYWlsZWRcbiIpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMV80X1JHQjoKKwkJeworI2lmICFCQVNJU0RfU1VQUE9SVF9QVlJUQzEKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogUFZSVEMxIDQgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2Vsc2UKKwkJCS8vIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyBpcyBhY3R1YWxseSBpZ25vcmVkIGJlY2F1c2Ugd2UncmUgdHJhbnNjb2RpbmcgdG8gUFZSVEMxLiAoUHJpbnQgYSBkZXYgd2FybmluZyBpZiBpdCdzICE9IDA/KQorCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXhfdG9fZGVjb2RlLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNQVlJUQzFfNF9SR0IsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwRGF0YSwgZGF0YV9sZW4sIGJsb2NrX2Zvcm1hdDo6Y1BWUlRDMV80X1JHQiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGlzX2FscGhhX3NsaWNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gUFZSVEMxIDQgUkdCIGZhaWxlZFxuIik7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUFZSVEMxXzRfUkdCQToKKwkJeworI2lmICFCQVNJU0RfU1VQUE9SVF9QVlJUQzEKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogUFZSVEMxIDQgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2Vsc2UKKwkJCWFzc2VydChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpOworCQkJYXNzZXJ0KGFscGhhX2xlbmd0aCk7CisKKwkJCS8vIFRlbXAgYnVmZmVyIHRvIGhvbGQgYWxwaGEgYmxvY2sgZW5kcG9pbnQvc2VsZWN0b3IgaW5kaWNlcworCQkJYmFzaXN1Ojp2ZWN0b3I8dWludDMyX3Q+IHRlbXBfYmxvY2tfaW5kaWNlcyh0b3RhbF9zbGljZV9ibG9ja3MpOworCisJCQkvLyBGaXJzdCB0cmFuc2NvZGUgYWxwaGEgZGF0YSB0byB0ZW1wIGJ1ZmZlcgorCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCAmdGVtcF9ibG9ja19pbmRpY2VzWzBdLCB0b3RhbF9zbGljZV9ibG9ja3MsIGJsb2NrX2Zvcm1hdDo6Y0luZGljZXMsIHNpemVvZih1aW50MzJfdCksIGRlY29kZV9mbGFncywgcFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XS5tX251bV9ibG9ja3NfeCwgcFN0YXRlKTsKKwkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZSgmdGVtcF9ibG9ja19pbmRpY2VzWzBdLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIGFscGhhX29mZnNldCwgYWxwaGFfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNJbmRpY2VzLCBzaXplb2YodWludDMyX3QpLCBmYWxzZSwgaXNfdmlkZW8sIHRydWUsIGxldmVsX2luZGV4LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgbnVtX2Jsb2Nrc194LCBwU3RhdGUsIGZhbHNlLCBudWxscHRyLCAwKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gUFZSVEMxIDQgUkdCQSBmYWlsZWQgKDApXG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgaXMgYWN0dWFsbHkgaWdub3JlZCBiZWNhdXNlIHdlJ3JlIHRyYW5zY29kaW5nIHRvIFBWUlRDMS4gKFByaW50IGEgZGV2IHdhcm5pbmcgaWYgaXQncyAhPSAwPykKKwkJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUFZSVEMxXzRfUkdCQSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCAmdGVtcF9ibG9ja19pbmRpY2VzWzBdKTsKKwkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgcmdiX29mZnNldCwgcmdiX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjUFZSVEMxXzRfUkdCQSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGZhbHNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgJnRlbXBfYmxvY2tfaW5kaWNlc1swXSwgMCk7CisJCQkJaWYgKCFzdGF0dXMpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIFBWUlRDMSA0IFJHQkEgZmFpbGVkICgxKVxuIik7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM3X1JHQkE6CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM3X0FMVDoKKwkJeworI2lmICFCQVNJU0RfU1VQUE9SVF9CQzdfTU9ERTUKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogQkM3IHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKyNlbHNlCisJCQlhc3NlcnQoYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsID09IDE2KTsKKwkJCS8vIFdlIHVzZWQgdG8gc3VwcG9ydCB0cmFuc2NvZGluZyBqdXN0IGFscGhhIHRvIEJDNyAtIGJ1dCBpcyB0aGF0IHVzZWZ1bCBhdCBhbGw/CisKKwkJCS8vIEZpcnN0IHRyYW5zY29kZSB0aGUgY29sb3Igc2xpY2UuIFRoZSBjQkM3X001X0NPTE9SIHRyYW5zY29kZXIgd2lsbCBvdXRwdXQgb3BhcXVlIG1vZGUgNSBibG9ja3MuCisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQkM3X001X0NPTE9SLCAxNiwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgcmdiX29mZnNldCwgcmdiX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjQkM3X001X0NPTE9SLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgZmFsc2UsIGxldmVsX2luZGV4LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIGZhbHNlLCBudWxscHRyLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOworCisJCQlpZiAoKHN0YXR1cykgJiYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykpCisJCQl7CisJCQkJLy8gTm93IHRyYW5zY29kZSB0aGUgYWxwaGEgc2xpY2UuIFRoZSBjQkM3X001X0FMUEhBIHRyYW5zY29kZXIgd2lsbCBub3cgY2hhbmdlIHRoZSBvcGFxdWUgbW9kZSA1IGJsb2NrcyB0byBibG9ja3Mgd2l0aCBhbHBoYS4KKwkJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCArIDEsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDN19NNV9BTFBIQSwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyBhbHBoYV9vZmZzZXQsIGFscGhhX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjQkM3X001X0FMUEhBLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgdHJ1ZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQl9CisKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkM3IGZhaWxlZCAoMClcbiIpOworCQkJfQorCisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRVRDMl9SR0JBOgorCQl7CisjaWYgIUJBU0lTRF9TVVBQT1JUX0VUQzJfRUFDX0E4CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IEVUQzIgRUFDIEE4IHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKyNlbHNlCisJCQlhc3NlcnQoYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsID09IDE2KTsKKworCQkJaWYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykKKwkJCXsKKwkJCQkvLyBGaXJzdCBkZWNvZGUgdGhlIGFscGhhIGRhdGEgCisJCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19BOCwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyBhbHBoYV9vZmZzZXQsIGFscGhhX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjRVRDMl9FQUNfQTgsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGlzX3ZpZGVvLCB0cnVlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvL3dyaXRlX29wYXF1ZV9hbHBoYV9ibG9ja3MocFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XS5tX251bV9ibG9ja3NfeCwgcFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XS5tX251bV9ibG9ja3NfeSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMl9FQUNfQTgsIDE2LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpOworCQkJCWJhc2lzdV90cmFuc2NvZGVyOjp3cml0ZV9vcGFxdWVfYWxwaGFfYmxvY2tzKG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwT3V0cHV0X2Jsb2NrcywgYmxvY2tfZm9ybWF0OjpjRVRDMl9FQUNfQTgsIDE2LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpOworCQkJCXN0YXR1cyA9IHRydWU7CisJCQl9CisKKwkJCWlmIChzdGF0dXMpCisJCQl7CisJCQkJLy8gTm93IGRlY29kZSB0aGUgY29sb3IgZGF0YQorCQkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCAodWludDhfdCopcE91dHB1dF9ibG9ja3MgKyA4LCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0VUQzEsIDE2LCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKKwkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UoKHVpbnQ4X3QgKilwT3V0cHV0X2Jsb2NrcyArIDgsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgcmdiX29mZnNldCwgcmdiX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjRVRDMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGZhbHNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCQlpZiAoIXN0YXR1cykKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMiBSR0IgZmFpbGVkXG4iKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBFVEMyIEEgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzNfUkdCQToKKwkJeworI2lmICFCQVNJU0RfU1VQUE9SVF9EWFQxCisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IERYVDEgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2VsaWYgIUJBU0lTRF9TVVBQT1JUX0RYVDVBCisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IERYVDVBIHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKyNlbHNlCisJCQlhc3NlcnQoYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsID09IDE2KTsKKwkJCQkJCQorCQkJLy8gRmlyc3QgZGVjb2RlIHRoZSBhbHBoYSBkYXRhIAorCQkJaWYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykKKwkJCXsKKwkJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCArIDEsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDNCwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyBhbHBoYV9vZmZzZXQsIGFscGhhX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjQkM0LCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgdHJ1ZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYmFzaXN1X3RyYW5zY29kZXI6OndyaXRlX29wYXF1ZV9hbHBoYV9ibG9ja3MobnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBPdXRwdXRfYmxvY2tzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpOworCQkJCXN0YXR1cyA9IHRydWU7CisJCQl9CisKKwkJCWlmIChzdGF0dXMpCisJCQl7CisJCQkJLy8gTm93IGRlY29kZSB0aGUgY29sb3IgZGF0YS4gRm9yYmlkIDMgY29sb3IgYmxvY2tzLCB3aGljaCBhcmVuJ3QgYWxsb3dlZCBpbiBCQzMuCisJCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsICh1aW50OF90KilwT3V0cHV0X2Jsb2NrcyArIDgsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQkMxLCAxNiwgZGVjb2RlX2ZsYWdzIHwgY0RlY29kZUZsYWdzQkMxRm9yYmlkVGhyZWVDb2xvckJsb2Nrcywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZSgodWludDhfdCAqKXBPdXRwdXRfYmxvY2tzICsgOCwgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyByZ2Jfb2Zmc2V0LCByZ2JfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNCQzEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGlzX3ZpZGVvLCBmYWxzZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQkJaWYgKCFzdGF0dXMpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIEJDMyBSR0IgZmFpbGVkXG4iKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBCQzMgQSBmYWlsZWRcbiIpOworCQkJfQorCisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM1X1JHOgorCQl7CisjaWYgIUJBU0lTRF9TVVBQT1JUX0RYVDVBCisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IERYVDVBIHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKyNlbHNlCisJCQlhc3NlcnQoYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsID09IDE2KTsKKworCQkJLy9ib29sIHRyYW5zY29kZV9zbGljZSh2b2lkKiBwRHN0X2Jsb2NrcywgdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIGNvbnN0IHVpbnQ4X3QqIHBJbWFnZV9kYXRhLCB1aW50MzJfdCBpbWFnZV9kYXRhX3NpemUsIGJsb2NrX2Zvcm1hdCBmbXQsCisJCQkJLy8JdWludDMyX3Qgb3V0cHV0X2Jsb2NrX29yX3BpeGVsX3N0cmlkZV9pbl9ieXRlcywgYm9vbCBiYzFfYWxsb3dfdGhyZWVjb2xvcl9ibG9ja3MsIGNvbnN0IGJvb2wgaXNfdmlkZW8sIGNvbnN0IGJvb2wgaXNfYWxwaGFfc2xpY2UsIGNvbnN0IHVpbnQzMl90IGxldmVsX2luZGV4LCBjb25zdCB1aW50MzJfdCBvcmlnX3dpZHRoLCBjb25zdCB1aW50MzJfdCBvcmlnX2hlaWdodCwgdWludDMyX3Qgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzID0gMCwKKwkJCQkvLwliYXNpc3VfdHJhbnNjb2Rlcl9zdGF0ZSogcFN0YXRlID0gbnVsbHB0ciwgYm9vbCBhc3RjX3RyYW5zY29kZV9hbHBoYSA9IGZhbHNlLCB2b2lkKiBwQWxwaGFfYmxvY2tzID0gbnVsbHB0ciwgdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gMCk7CisKKwkJCS8vIERlY29kZSB0aGUgUiBkYXRhIChhY3R1YWxseSB0aGUgZ3JlZW4gY2hhbm5lbCBvZiB0aGUgY29sb3IgZGF0YSBzbGljZSBpbiB0aGUgYmFzaXMgZmlsZSkKKwkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKKwkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyByZ2Jfb2Zmc2V0LCByZ2JfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNCQzQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGlzX3ZpZGVvLCBmYWxzZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQlpZiAoc3RhdHVzKQorCQkJeworCQkJCWlmIChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpCisJCQkJeworCQkJCQkvLyBEZWNvZGUgdGhlIEcgZGF0YSAoYWN0dWFsbHkgdGhlIGdyZWVuIGNoYW5uZWwgb2YgdGhlIGFscGhhIGRhdGEgc2xpY2UgaW4gdGhlIGJhc2lzIGZpbGUpCisJCQkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4ICsgMSwgKHVpbnQ4X3QqKXBPdXRwdXRfYmxvY2tzICsgOCwgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKKwkJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKCh1aW50OF90ICopcE91dHB1dF9ibG9ja3MgKyA4LCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIGFscGhhX29mZnNldCwgYWxwaGFfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNCQzQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGlzX3ZpZGVvLCB0cnVlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCQkJaWYgKCFzdGF0dXMpCisJCQkJCXsKKwkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkM1IDEgZmFpbGVkXG4iKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQliYXNpc3VfdHJhbnNjb2Rlcjo6d3JpdGVfb3BhcXVlX2FscGhhX2Jsb2NrcyhudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgKHVpbnQ4X3QqKXBPdXRwdXRfYmxvY2tzICsgOCwgYmxvY2tfZm9ybWF0OjpjQkM0LCAxNiwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzKTsKKwkJCQkJc3RhdHVzID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBCQzUgY2hhbm5lbCAwIGZhaWxlZFxuIik7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQVNUQ180eDRfUkdCQToKKwkJeworI2lmICFCQVNJU0RfU1VQUE9SVF9BU1RDCisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IEFTVEMgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2Vsc2UKKwkJCWFzc2VydChieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwgPT0gMTYpOworCisJCQlpZiAoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKQorCQkJeworCQkJCS8vIEZpcnN0IGRlY29kZSB0aGUgYWxwaGEgZGF0YSB0byB0aGUgb3V0cHV0ICh3ZSdyZSB1c2luZyB0aGUgb3V0cHV0IHRleHR1cmUgYXMgYSB0ZW1wIGJ1ZmZlciBoZXJlKS4KKwkJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCArIDEsICh1aW50OF90KilwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNJbmRpY2VzLCAxNiwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIGFscGhhX29mZnNldCwgYWxwaGFfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNJbmRpY2VzLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgdHJ1ZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQkJaWYgKHN0YXR1cykKKwkJCQl7CisJCQkJCS8vIE5vdyBkZWNvZGUgdGhlIGNvbG9yIGRhdGEgYW5kIHRyYW5zY29kZSB0byBBU1RDLiBUaGUgdHJhbnNjb2RlciBmdW5jdGlvbiB3aWxsIHJlYWQgdGhlIGFscGhhIHNlbGVjdG9yIGRhdGEgZnJvbSB0aGUgb3V0cHV0IHRleHR1cmUgYXMgaXQgY29udmVydHMgYW5kCisJCQkJCS8vIHRyYW5zY29kZSBib3RoIHRoZSBhbHBoYSBhbmQgY29sb3IgZGF0YSBhdCB0aGUgc2FtZSB0aW1lIHRvIEFTVEMuCisJCQkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNBU1RDXzR4NCwgMTYsIGRlY29kZV9mbGFncyB8IGNEZWNvZGVGbGFnc091dHB1dEhhc0FscGhhSW5kaWNlcywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgcmdiX29mZnNldCwgcmdiX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjQVNUQ180eDQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGlzX3ZpZGVvLCBmYWxzZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgdHJ1ZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0FTVENfNHg0LCAxNiwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHJnYl9vZmZzZXQsIHJnYl9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y0FTVENfNHg0LCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgZmFsc2UsIGxldmVsX2luZGV4LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIGZhbHNlLCBudWxscHRyLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOworCisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIEFTVEMgZmFpbGVkICgwKVxuIik7CisJCQl9CisKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZBVENfUkdCOgorCQl7CisjaWYgIUJBU0lTRF9TVVBQT1JUX0FUQworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiBBVEMgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2Vsc2UKKwkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4X3RvX2RlY29kZSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQVRDX1JHQiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKKwkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBEYXRhLCBkYXRhX2xlbiwgYmxvY2tfZm9ybWF0OjpjQVRDX1JHQiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGlzX2FscGhhX3NsaWNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQVRDX1JHQiBmYWlsZWRcbiIpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkFUQ19SR0JBOgorCQl7CisjaWYgIUJBU0lTRF9TVVBQT1JUX0FUQworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiBBVEMgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2VsaWYgIUJBU0lTRF9TVVBQT1JUX0RYVDVBCisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IERYVDVBIHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKyNlbHNlCisJCQlhc3NlcnQoYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsID09IDE2KTsKKworCQkJLy8gRmlyc3QgZGVjb2RlIHRoZSBhbHBoYSBkYXRhIAorCQkJaWYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykKKwkJCXsKKwkJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCArIDEsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDNCwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyBhbHBoYV9vZmZzZXQsIGFscGhhX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjQkM0LCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgdHJ1ZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYmFzaXN1X3RyYW5zY29kZXI6OndyaXRlX29wYXF1ZV9hbHBoYV9ibG9ja3MobnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBPdXRwdXRfYmxvY2tzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpOworCQkJCXN0YXR1cyA9IHRydWU7CisJCQl9CisKKwkJCWlmIChzdGF0dXMpCisJCQl7CisJCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsICh1aW50OF90KilwT3V0cHV0X2Jsb2NrcyArIDgsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQVRDX1JHQiwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZSgodWludDhfdCAqKXBPdXRwdXRfYmxvY2tzICsgOCwgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyByZ2Jfb2Zmc2V0LCByZ2JfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNBVENfUkdCLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgZmFsc2UsIGxldmVsX2luZGV4LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIGZhbHNlLCBudWxscHRyLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOworCQkJCWlmICghc3RhdHVzKQorCQkJCXsKKwkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBBVEMgUkdCIGZhaWxlZFxuIik7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQVRDIEEgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZQVlJUQzJfNF9SR0I6CisJCXsKKyNpZiAhQkFTSVNEX1NVUFBPUlRfUFZSVEMyCisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IFBWUlRDMiB1bnN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisjZWxzZQorCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXhfdG9fZGVjb2RlLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNQVlJUQzJfNF9SR0IsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwRGF0YSwgZGF0YV9sZW4sIGJsb2NrX2Zvcm1hdDo6Y1BWUlRDMl80X1JHQiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGlzX2FscGhhX3NsaWNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gY1BWUlRDMl80X1JHQiBmYWlsZWRcbiIpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMl80X1JHQkE6CisJCXsKKyNpZiAhQkFTSVNEX1NVUFBPUlRfUFZSVEMyCisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IFBWUlRDMiB1bnN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisjZWxzZQorCQkJaWYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykKKwkJCXsKKwkJCQkvLyBGaXJzdCBkZWNvZGUgdGhlIGFscGhhIGRhdGEgdG8gdGhlIG91dHB1dCAod2UncmUgdXNpbmcgdGhlIG91dHB1dCB0ZXh0dXJlIGFzIGEgdGVtcCBidWZmZXIgaGVyZSkuCisJCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCAodWludDhfdCopcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjSW5kaWNlcywgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKKwkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgYWxwaGFfb2Zmc2V0LCBhbHBoYV9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y0luZGljZXMsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGlzX3ZpZGVvLCB0cnVlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCQlpZiAoIXN0YXR1cykKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gZmFpbGVkXG4iKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gTm93IGRlY29kZSB0aGUgY29sb3IgZGF0YSBhbmQgdHJhbnNjb2RlIHRvIFBWUlRDMiBSR0JBLiAKKwkJCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y1BWUlRDMl80X1JHQkEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzIHwgY0RlY29kZUZsYWdzT3V0cHV0SGFzQWxwaGFJbmRpY2VzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyByZ2Jfb2Zmc2V0LCByZ2JfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNQVlJUQzJfNF9SR0JBLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgZmFsc2UsIGxldmVsX2luZGV4LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIHRydWUsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNQVlJUQzJfNF9SR0IsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHJnYl9vZmZzZXQsIHJnYl9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y1BWUlRDMl80X1JHQiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGZhbHNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKworCQkJaWYgKCFzdGF0dXMpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBjUFZSVEMyXzRfUkdCQSBmYWlsZWRcbiIpOworCQkJfQorCisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUkdCQTMyOgorCQl7CisJCQkvLyBSYXcgMzJicHAgcGl4ZWxzLCBkZWNvZGVkIGluIHRoZSB1c3VhbCByYXN0ZXIgb3JkZXIgKE5PVCBibG9jayBvcmRlcikgaW50byBhbiBpbWFnZSBpbiBtZW1vcnkuCisKKwkJCS8vIEZpcnN0IGRlY29kZSB0aGUgYWxwaGEgZGF0YSAKKwkJCWlmIChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpCisJCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNBMzIsIHNpemVvZih1aW50MzJfdCksIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIGFscGhhX29mZnNldCwgYWxwaGFfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNBMzIsIHNpemVvZih1aW50MzJfdCksIGZhbHNlLCBpc192aWRlbywgdHJ1ZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQllbHNlCisJCQkJc3RhdHVzID0gdHJ1ZTsKKworCQkJaWYgKHN0YXR1cykKKwkJCXsKKwkJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzID8gYmxvY2tfZm9ybWF0OjpjUkdCMzIgOiBibG9ja19mb3JtYXQ6OmNSR0JBMzIsIHNpemVvZih1aW50MzJfdCksIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHJnYl9vZmZzZXQsIHJnYl9sZW5ndGgsIGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcyA/IGJsb2NrX2Zvcm1hdDo6Y1JHQjMyIDogYmxvY2tfZm9ybWF0OjpjUkdCQTMyLCBzaXplb2YodWludDMyX3QpLCBmYWxzZSwgaXNfdmlkZW8sIGZhbHNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCQlpZiAoIXN0YXR1cykKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gUkdCQTMyIFJHQiBmYWlsZWRcbiIpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIFJHQkEzMiBBIGZhaWxlZFxuIik7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUkdCNTY1OgorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkJHUjU2NToKKwkJeworCQkJLy8gUmF3IDE2YnBwIHBpeGVscywgZGVjb2RlZCBpbiB0aGUgdXN1YWwgcmFzdGVyIG9yZGVyIChOT1QgYmxvY2sgb3JkZXIpIGludG8gYW4gaW1hZ2UgaW4gbWVtb3J5LgorCisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleF90b19kZWNvZGUsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIChmbXQgPT0gdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUkdCNTY1KSA/IGJsb2NrX2Zvcm1hdDo6Y1JHQjU2NSA6IGJsb2NrX2Zvcm1hdDo6Y0JHUjU2NSwgc2l6ZW9mKHVpbnQxNl90KSwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBEYXRhLCBkYXRhX2xlbiwgKHRhcmdldF9mb3JtYXQgPT0gdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUkdCNTY1KSA/IGJsb2NrX2Zvcm1hdDo6Y1JHQjU2NSA6IGJsb2NrX2Zvcm1hdDo6Y0JHUjU2NSwgc2l6ZW9mKHVpbnQxNl90KSwgZmFsc2UsIGlzX3ZpZGVvLCBpc19hbHBoYV9zbGljZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIFJHQjU2NSBSR0IgZmFpbGVkXG4iKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZSR0JBNDQ0NDoKKwkJeworCQkJLy8gUmF3IDE2YnBwIHBpeGVscywgZGVjb2RlZCBpbiB0aGUgdXN1YWwgcmFzdGVyIG9yZGVyIChOT1QgYmxvY2sgb3JkZXIpIGludG8gYW4gaW1hZ2UgaW4gbWVtb3J5LgorCisJCQkvLyBGaXJzdCBkZWNvZGUgdGhlIGFscGhhIGRhdGEgCisJCQlpZiAoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKQorCQkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4ICsgMSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUkdCQTQ0NDRfQUxQSEEsIHNpemVvZih1aW50MTZfdCksIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIGFscGhhX29mZnNldCwgYWxwaGFfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNSR0JBNDQ0NF9BTFBIQSwgc2l6ZW9mKHVpbnQxNl90KSwgZmFsc2UsIGlzX3ZpZGVvLCB0cnVlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWVsc2UKKwkJCQlzdGF0dXMgPSB0cnVlOworCisJCQlpZiAoc3RhdHVzKQorCQkJeworCQkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMgPyBibG9ja19mb3JtYXQ6OmNSR0JBNDQ0NF9DT0xPUiA6IGJsb2NrX2Zvcm1hdDo6Y1JHQkE0NDQ0X0NPTE9SX09QQVFVRSwgc2l6ZW9mKHVpbnQxNl90KSwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgcmdiX29mZnNldCwgcmdiX2xlbmd0aCwgYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzID8gYmxvY2tfZm9ybWF0OjpjUkdCQTQ0NDRfQ09MT1IgOiBibG9ja19mb3JtYXQ6OmNSR0JBNDQ0NF9DT0xPUl9PUEFRVUUsIHNpemVvZih1aW50MTZfdCksIGZhbHNlLCBpc192aWRlbywgZmFsc2UsIGxldmVsX2luZGV4LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIGZhbHNlLCBudWxscHRyLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOworCQkJCWlmICghc3RhdHVzKQorCQkJCXsKKwkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0JBNDQ0NCBSR0IgZmFpbGVkXG4iKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0JBNDQ0NCBBIGZhaWxlZFxuIik7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRlhUMV9SR0I6CisJCXsKKyNpZiAhQkFTSVNEX1NVUFBPUlRfRlhUMQorCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiBGWFQxIHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKyNlbHNlCisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleF90b19kZWNvZGUsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0ZYVDFfUkdCLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcERhdGEsIGRhdGFfbGVuLCBibG9ja19mb3JtYXQ6OmNGWFQxX1JHQiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGlzX2FscGhhX3NsaWNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRlhUMV9SR0IgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZFVEMyX0VBQ19SMTE6CisJCXsKKyNpZiAhQkFTSVNEX1NVUFBPUlRfRVRDMl9FQUNfUkcxMQorCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiBFQUNfUkcxMSB1bnN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisjZWxzZQorCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXhfdG9fZGVjb2RlLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19SMTEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwRGF0YSwgZGF0YV9sZW4sIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfRUFDX1IxMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGlzX2FscGhhX3NsaWNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMl9FQUNfUjExIGZhaWxlZFxuIik7CisJCQl9CisKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZFVEMyX0VBQ19SRzExOgorCQl7CisjaWYgIUJBU0lTRF9TVVBQT1JUX0VUQzJfRUFDX1JHMTEKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogRUFDX1JHMTEgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2Vsc2UKKwkJCWFzc2VydChieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwgPT0gMTYpOworCisJCQlpZiAoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKQorCQkJeworCQkJCS8vIEZpcnN0IGRlY29kZSB0aGUgYWxwaGEgZGF0YSB0byBHCisJCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCAodWludDhfdCopcE91dHB1dF9ibG9ja3MgKyA4LCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfRUFDX1IxMSwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZSgodWludDhfdCAqKXBPdXRwdXRfYmxvY2tzICsgOCwgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyBhbHBoYV9vZmZzZXQsIGFscGhhX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjRVRDMl9FQUNfUjExLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBpc192aWRlbywgdHJ1ZSwgbGV2ZWxfaW5kZXgsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgZmFsc2UsIG51bGxwdHIsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYmFzaXN1X3RyYW5zY29kZXI6OndyaXRlX29wYXF1ZV9hbHBoYV9ibG9ja3MobnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksICh1aW50OF90KilwT3V0cHV0X2Jsb2NrcyArIDgsIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfRUFDX1IxMSwgMTYsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyk7CisJCQkJc3RhdHVzID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYgKHN0YXR1cykKKwkJCXsKKwkJCQkvLyBOb3cgZGVjb2RlIHRoZSBjb2xvciBkYXRhIHRvIFIKKwkJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMl9FQUNfUjExLCAxNiwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHJnYl9vZmZzZXQsIHJnYl9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfRUFDX1IxMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaXNfdmlkZW8sIGZhbHNlLCBsZXZlbF9pbmRleCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBmYWxzZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCQlpZiAoIXN0YXR1cykKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMl9FQUNfUjExIFIgZmFpbGVkXG4iKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBFVEMyX0VBQ19SMTEgRyBmYWlsZWRcbiIpOworCQkJfQorCisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCWFzc2VydCgwKTsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogSW52YWxpZCBmbXRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJfQorCisJCXJldHVybiBzdGF0dXM7CisJfQogCQogCWJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjpiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2RlcigpCiAJewogCX0KIAogCWJvb2wgYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXI6OnRyYW5zY29kZV9zbGljZSh2b2lkKiBwRHN0X2Jsb2NrcywgdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIGNvbnN0IHVpbnQ4X3QqIHBJbWFnZV9kYXRhLCB1aW50MzJfdCBpbWFnZV9kYXRhX3NpemUsIGJsb2NrX2Zvcm1hdCBmbXQsCi0JCXVpbnQzMl90IG91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMsIGJvb2wgYmMxX2FsbG93X3RocmVlY29sb3JfYmxvY2tzLCBjb25zdCBiYXNpc19maWxlX2hlYWRlciYgaGVhZGVyLCBjb25zdCBiYXNpc19zbGljZV9kZXNjJiBzbGljZV9kZXNjLCB1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsCisgICAgICAgIHVpbnQzMl90IG91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMsIGJvb2wgYmMxX2FsbG93X3RocmVlY29sb3JfYmxvY2tzLCBib29sIGhhc19hbHBoYSwgY29uc3QgdWludDMyX3Qgb3JpZ193aWR0aCwgY29uc3QgdWludDMyX3Qgb3JpZ19oZWlnaHQsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywKIAkJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSwgdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLCBpbnQgY2hhbm5lbDAsIGludCBjaGFubmVsMSwgdWludDMyX3QgZGVjb2RlX2ZsYWdzKQogCXsKIAkJQkFTSVNVX05PVEVfVU5VU0VEKHBTdGF0ZSk7CiAJCUJBU0lTVV9OT1RFX1VOVVNFRChiYzFfYWxsb3dfdGhyZWVjb2xvcl9ibG9ja3MpOwogCisJCWFzc2VydChnX3RyYW5zY29kZXJfaW5pdGlhbGl6ZWQpOworCQlpZiAoIWdfdHJhbnNjb2Rlcl9pbml0aWFsaXplZCkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX3NsaWNlOiBUcmFuc2NvZGVyIG5vdCBnbG9iYWxseSBpbml0aWFsaXplZC5cbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKICNpZiBCQVNJU0RfU1VQUE9SVF9VQVNUQwogCQljb25zdCB1aW50MzJfdCB0b3RhbF9ibG9ja3MgPSBudW1fYmxvY2tzX3ggKiBudW1fYmxvY2tzX3k7CiAKIAkJaWYgKCFvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpCiAJCXsKIAkJCWlmIChiYXNpc19ibG9ja19mb3JtYXRfaXNfdW5jb21wcmVzc2VkKGZtdCkpCi0JCQkJb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzID0gc2xpY2VfZGVzYy5tX29yaWdfd2lkdGg7CisJCQkJb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzID0gb3JpZ193aWR0aDsKIAkJCWVsc2UKIAkJCXsKIAkJCQlpZiAoZm10ID09IGJsb2NrX2Zvcm1hdDo6Y0ZYVDFfUkdCKQotCQkJCQlvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAoc2xpY2VfZGVzYy5tX29yaWdfd2lkdGggKyA3KSAvIDg7CisJCQkJCW91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IChvcmlnX3dpZHRoICsgNykgLyA4OwogCQkJCWVsc2UKIAkJCQkJb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzID0gbnVtX2Jsb2Nrc194OwogCQkJfQpAQCAtMTM0MzcsNyArMTg2NjQsNyBAQAogCQlpZiAoYmFzaXNfYmxvY2tfZm9ybWF0X2lzX3VuY29tcHJlc3NlZChmbXQpKQogCQl7CiAJCQlpZiAoIW91dHB1dF9yb3dzX2luX3BpeGVscykKLQkJCQlvdXRwdXRfcm93c19pbl9waXhlbHMgPSBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQ7CisJCQkJb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gb3JpZ19oZWlnaHQ7CiAJCX0KIAogCQl1aW50MzJfdCB0b3RhbF9leHBlY3RlZF9ibG9ja19ieXRlcyA9IHNpemVvZih1YXN0Y19ibG9jaykgKiB0b3RhbF9ibG9ja3M7CkBAIC0xMzQ1MCw3ICsxODY3Nyw3IEBACiAJCWNvbnN0IHVhc3RjX2Jsb2NrKiBwU291cmNlX2Jsb2NrID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1YXN0Y19ibG9jayAqPihwSW1hZ2VfZGF0YSk7CiAKIAkJY29uc3QgYm9vbCBoaWdoX3F1YWxpdHkgPSAoZGVjb2RlX2ZsYWdzICYgY0RlY29kZUZsYWdzSGlnaFF1YWxpdHkpICE9IDA7Ci0JCWNvbnN0IGJvb2wgZnJvbV9hbHBoYSA9ICgoaGVhZGVyLm1fZmxhZ3MgJiBjQkFTSVNIZWFkZXJGbGFnSGFzQWxwaGFTbGljZXMpICE9IDApICYmCShkZWNvZGVfZmxhZ3MgJiBjRGVjb2RlRmxhZ3NUcmFuc2NvZGVBbHBoYURhdGFUb09wYXF1ZUZvcm1hdHMpICE9IDA7CisJCWNvbnN0IGJvb2wgZnJvbV9hbHBoYSA9IGhhc19hbHBoYSAmJiAoZGVjb2RlX2ZsYWdzICYgY0RlY29kZUZsYWdzVHJhbnNjb2RlQWxwaGFEYXRhVG9PcGFxdWVGb3JtYXRzKSAhPSAwOwogCiAJCWJvb2wgc3RhdHVzID0gZmFsc2U7CiAJCWlmICgoZm10ID09IGJsb2NrX2Zvcm1hdDo6Y1BWUlRDMV80X1JHQikgfHwgKGZtdCA9PSBibG9ja19mb3JtYXQ6OmNQVlJUQzFfNF9SR0JBKSkKQEAgLTEzNTMxLDcgKzE4NzU4LDcgQEAKIAkJCQkJewogCQkJCQkJaWYgKGNoYW5uZWwwIDwgMCkKIAkJCQkJCQljaGFubmVsMCA9IDA7Ci0JCQkJCQlpZiAoY2hhbm5lbDEgPCAzKQorCQkJCQkJaWYgKGNoYW5uZWwxIDwgMCkKIAkJCQkJCQljaGFubmVsMSA9IDM7CiAJCQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfdWFzdGNfdG9fZXRjMl9lYWNfcmcxMSgqcFNvdXJjZV9ibG9jaywgcERzdF9ibG9jaywgaGlnaF9xdWFsaXR5LCBjaGFubmVsMCwgY2hhbm5lbDEpOwogCQkJCQkJYnJlYWs7CkBAIC0xMzY0Nyw4ICsxODg3NCw2IEBACiAJCUJBU0lTVV9OT1RFX1VOVVNFRChjaGFubmVsMSk7CiAJCUJBU0lTVV9OT1RFX1VOVVNFRChvdXRwdXRfcm93c19pbl9waXhlbHMpOwogCQlCQVNJU1VfTk9URV9VTlVTRUQob3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzKTsKLQkJQkFTSVNVX05PVEVfVU5VU0VEKHNsaWNlX2Rlc2MpOwotCQlCQVNJU1VfTk9URV9VTlVTRUQoaGVhZGVyKTsKIAkJQkFTSVNVX05PVEVfVU5VU0VEKG91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMpOwogCQlCQVNJU1VfTk9URV9VTlVTRUQoZm10KTsKIAkJQkFTSVNVX05PVEVfVU5VU0VEKGltYWdlX2RhdGFfc2l6ZSk7CkBAIC0xMzY2MCw5ICsxODg4NSwyODUgQEAKIAkJcmV0dXJuIGZhbHNlOwogI2VuZGlmCiAJfQorCQkKKwlib29sIGJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2UoCisJCXRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgdGFyZ2V0X2Zvcm1hdCwKKwkJdm9pZCogcE91dHB1dF9ibG9ja3MsIHVpbnQzMl90IG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJY29uc3QgdWludDhfdCogcENvbXByZXNzZWRfZGF0YSwgdWludDMyX3QgY29tcHJlc3NlZF9kYXRhX2xlbmd0aCwKKwkJdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIHVpbnQzMl90IG9yaWdfd2lkdGgsIHVpbnQzMl90IG9yaWdfaGVpZ2h0LCB1aW50MzJfdCBsZXZlbF9pbmRleCwKKwkJdWludDMyX3Qgc2xpY2Vfb2Zmc2V0LCB1aW50MzJfdCBzbGljZV9sZW5ndGgsCisJCXVpbnQzMl90IGRlY29kZV9mbGFncywKKwkJYm9vbCBoYXNfYWxwaGEsCisJCWJvb2wgaXNfdmlkZW8sCisJCXVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUqIHBTdGF0ZSwKKwkJdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLAorCQlpbnQgY2hhbm5lbDAsIGludCBjaGFubmVsMSkKKwl7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChpc192aWRlbyk7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChsZXZlbF9pbmRleCk7CisKKwkJaWYgKCgodWludDY0X3Qpc2xpY2Vfb2Zmc2V0ICsgc2xpY2VfbGVuZ3RoKSA+ICh1aW50NjRfdCljb21wcmVzc2VkX2RhdGFfbGVuZ3RoKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHNvdXJjZSBkYXRhIGJ1ZmZlciB0b28gc21hbGxcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CQorCisJCWlmICgodGFyZ2V0X2Zvcm1hdCA9PSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZQVlJUQzFfNF9SR0IpIHx8ICh0YXJnZXRfZm9ybWF0ID09IHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMV80X1JHQkEpKQorCQl7CisJCQlpZiAoKCFiYXNpc3U6OmlzX3BvdzIobnVtX2Jsb2Nrc194ICogNCkpIHx8ICghYmFzaXN1Ojppc19wb3cyKG51bV9ibG9ja3NfeSAqIDQpKSkKKwkJCXsKKwkJCQkvLyBQVlJUQzEgb25seSBzdXBwb3J0cyBwb3dlciBvZiAyIGRpbWVuc2lvbnMKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IFBWUlRDMSBvbmx5IHN1cHBvcnRzIHBvd2VyIG9mIDIgZGltZW5zaW9uc1xuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJaWYgKCh0YXJnZXRfZm9ybWF0ID09IHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMV80X1JHQkEpICYmICghaGFzX2FscGhhKSkKKwkJeworCQkJLy8gU3dpdGNoIHRvIFBWUlRDMSBSR0IgaWYgdGhlIGlucHV0IGRvZXNuJ3QgaGF2ZSBhbHBoYS4KKwkJCXRhcmdldF9mb3JtYXQgPSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZQVlJUQzFfNF9SR0I7CisJCX0KKworCQljb25zdCBib29sIHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzID0gKGRlY29kZV9mbGFncyAmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cykgIT0gMDsKKwkJY29uc3QgdWludDMyX3QgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsID0gYmFzaXNfZ2V0X2J5dGVzX3Blcl9ibG9ja19vcl9waXhlbCh0YXJnZXRfZm9ybWF0KTsKKwkJY29uc3QgdWludDMyX3QgdG90YWxfc2xpY2VfYmxvY2tzID0gbnVtX2Jsb2Nrc194ICogbnVtX2Jsb2Nrc195OworCisJCWlmICghYmFzaXNfdmFsaWRhdGVfb3V0cHV0X2J1ZmZlcl9zaXplKHRhcmdldF9mb3JtYXQsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLCB0b3RhbF9zbGljZV9ibG9ja3MpKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IG91dHB1dCBidWZmZXIgc2l6ZSB0b28gc21hbGxcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQkJCisJCWJvb2wgc3RhdHVzID0gZmFsc2U7CisKKwkJLy8gVUFTVEM0eDQKKwkJc3dpdGNoICh0YXJnZXRfZm9ybWF0KQorCQl7CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRVRDMV9SR0I6CisJCXsKKwkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNFVEMxLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHNsaWNlX29mZnNldCwgc2xpY2VfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNFVEMxLAorCQkJCWJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGhhc19hbHBoYSwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBvdXRwdXRfcm93c19pbl9waXhlbHMsIGNoYW5uZWwwLCBjaGFubmVsMSk7CisJCQkJCisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIEVUQzEgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRVRDMl9SR0JBOgorCQl7CisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMl9SR0JBLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHNsaWNlX29mZnNldCwgc2xpY2VfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNFVEMyX1JHQkEsCisJCQkJYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaGFzX2FscGhhLCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG91dHB1dF9yb3dzX2luX3BpeGVscywgY2hhbm5lbDAsIGNoYW5uZWwxKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMiBmYWlsZWRcbiIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzFfUkdCOgorCQl7CisJCQkvLyBUT0RPOiBFVEMxUyBhbGxvd3MgQkMxIGZyb20gYWxwaGEgY2hhbm5lbC4gVGhhdCBkb2Vzbid0IHNlZW0gYWN0dWFsbHkgdXNlZnVsLCB0aG91Z2guCisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQkMxLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHNsaWNlX29mZnNldCwgc2xpY2VfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNCQzEsCisJCQkJYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCB0cnVlLCBoYXNfYWxwaGEsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLCBjaGFubmVsMCwgY2hhbm5lbDEpOworCQkJaWYgKCFzdGF0dXMpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBCQzEgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkMzX1JHQkE6CisJCXsKKwkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzMsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgc2xpY2Vfb2Zmc2V0LCBzbGljZV9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y0JDMywKKwkJCQlieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBoYXNfYWxwaGEsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLCBjaGFubmVsMCwgY2hhbm5lbDEpOworCQkJaWYgKCFzdGF0dXMpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBCQzMgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM0X1I6CisJCXsKKwkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwKKwkJCS8vCW51bGxwdHIsIDAsCisJCQkvLwkoKGhhc19hbHBoYSkgJiYgKHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzKSkgPyAzIDogMCk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgc2xpY2Vfb2Zmc2V0LCBzbGljZV9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y0JDNCwKKwkJCQlieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBoYXNfYWxwaGEsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLAorCQkJCSgoaGFzX2FscGhhKSAmJiAodHJhbnNjb2RlX2FscGhhX2RhdGFfdG9fb3BhcXVlX2Zvcm1hdHMpKSA/IDMgOiAwKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkM0IGZhaWxlZFxuIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkJDNV9SRzoKKwkJeworCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDNSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLAorCQkJLy8JbnVsbHB0ciwgMCwKKwkJCS8vCTAsIDMpOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHNsaWNlX29mZnNldCwgc2xpY2VfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNCQzUsCisJCQkJYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaGFzX2FscGhhLCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG91dHB1dF9yb3dzX2luX3BpeGVscywKKwkJCQkwLCAzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkM1IGZhaWxlZFxuIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkJDN19SR0JBOgorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkJDN19BTFQ6CisJCXsKKwkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzcsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgc2xpY2Vfb2Zmc2V0LCBzbGljZV9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y0JDNywKKwkJCQlieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBoYXNfYWxwaGEsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkM3IGZhaWxlZFxuIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMV80X1JHQjoKKwkJeworCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y1BWUlRDMV80X1JHQiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKKwkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyBzbGljZV9vZmZzZXQsIHNsaWNlX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjUFZSVEMxXzRfUkdCLAorCQkJCWJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGhhc19hbHBoYSwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOworCQkJaWYgKCFzdGF0dXMpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBQVlJUQzEgUkdCIDRicHAgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUFZSVEMxXzRfUkdCQToKKwkJeworCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y1BWUlRDMV80X1JHQkEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgc2xpY2Vfb2Zmc2V0LCBzbGljZV9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y1BWUlRDMV80X1JHQkEsCisJCQkJYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaGFzX2FscGhhLCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIFBWUlRDMSBSR0JBIDRicHAgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQVNUQ180eDRfUkdCQToKKwkJeworCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0FTVENfNHg0LCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHNsaWNlX29mZnNldCwgc2xpY2VfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNBU1RDXzR4NCwKKwkJCQlieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBoYXNfYWxwaGEsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQVNUQyA0eDQgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQVRDX1JHQjoKKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZBVENfUkdCQToKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiBVQVNUQy0+QVRDIGN1cnJlbnRseSB1bnN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZGWFQxX1JHQjoKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiBVQVNUQy0+RlhUMSBjdXJyZW50bHkgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUFZSVEMyXzRfUkdCOgorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IFVBU1RDLT5QVlJUQzIgY3VycmVudGx5IHVuc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMl80X1JHQkE6CisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogVUFTVEMtPlBWUlRDMiBjdXJyZW50bHkgdW5zdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRVRDMl9FQUNfUjExOgorCQl7CisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMl9FQUNfUjExLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsCisJCQkvLwludWxscHRyLCAwLAorCQkJLy8JKChoYXNfYWxwaGEpICYmICh0cmFuc2NvZGVfYWxwaGFfZGF0YV90b19vcGFxdWVfZm9ybWF0cykpID8gMyA6IDApOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHNsaWNlX29mZnNldCwgc2xpY2VfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19SMTEsCisJCQkJYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaGFzX2FscGhhLCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG91dHB1dF9yb3dzX2luX3BpeGVscywKKwkJCQkoKGhhc19hbHBoYSkgJiYgKHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzKSkgPyAzIDogMCk7CisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIEVBQyBSMTEgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRVRDMl9FQUNfUkcxMToKKwkJeworCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfRUFDX1JHMTEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwKKwkJCS8vCW51bGxwdHIsIDAsCisJCQkvLwkwLCAzKTsKKwkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyBzbGljZV9vZmZzZXQsIHNsaWNlX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjRVRDMl9FQUNfUkcxMSwKKwkJCQlieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBoYXNfYWxwaGEsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLAorCQkJCTAsIDMpOworCQkJaWYgKCFzdGF0dXMpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXJ0cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIEVBQyBSRzExIGZhaWxlZFxuIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlJHQkEzMjoKKwkJeworCQkJLy9zdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y1JHQkEzMiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKKwkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwT3V0cHV0X2Jsb2NrcywgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIHBDb21wcmVzc2VkX2RhdGEgKyBzbGljZV9vZmZzZXQsIHNsaWNlX2xlbmd0aCwgYmxvY2tfZm9ybWF0OjpjUkdCQTMyLAorCQkJCWJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGhhc19hbHBoYSwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOworCQkJaWYgKCFzdGF0dXMpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0JBMzIgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUkdCNTY1OgorCQl7CisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUkdCNTY1LCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOworCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBPdXRwdXRfYmxvY2tzLCBudW1fYmxvY2tzX3gsIG51bV9ibG9ja3NfeSwgcENvbXByZXNzZWRfZGF0YSArIHNsaWNlX29mZnNldCwgc2xpY2VfbGVuZ3RoLCBibG9ja19mb3JtYXQ6OmNSR0I1NjUsCisJCQkJYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBmYWxzZSwgaGFzX2FscGhhLCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2U6IHRyYW5zY29kZV9zbGljZSgpIHRvIFJHQjU2NSBmYWlsZWRcbiIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCR1I1NjU6CisJCXsKKwkJCS8vc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCR1I1NjUsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgc2xpY2Vfb2Zmc2V0LCBzbGljZV9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y0JHUjU2NSwKKwkJCQlieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGZhbHNlLCBoYXNfYWxwaGEsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKKwkJCWlmICghc3RhdHVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX3Vhc3RjX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZTogdHJhbnNjb2RlX3NsaWNlKCkgdG8gUkdCNTY1IGZhaWxlZFxuIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlJHQkE0NDQ0OgorCQl7CisJCQkvL3N0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUkdCQTQ0NDQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7CisJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocE91dHB1dF9ibG9ja3MsIG51bV9ibG9ja3NfeCwgbnVtX2Jsb2Nrc195LCBwQ29tcHJlc3NlZF9kYXRhICsgc2xpY2Vfb2Zmc2V0LCBzbGljZV9sZW5ndGgsIGJsb2NrX2Zvcm1hdDo6Y1JHQkE0NDQ0LAorCQkJCWJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZmFsc2UsIGhhc19hbHBoYSwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOworCQkJaWYgKCFzdGF0dXMpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0JBNDQ0NCBmYWlsZWRcbiIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJYXNzZXJ0KDApOworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfdWFzdGNfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlOiBJbnZhbGlkIGZvcm1hdFxuIik7CisJCQlicmVhazsKKwkJfQorCQl9CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAJCi0JYmFzaXN1X3RyYW5zY29kZXI6OmJhc2lzdV90cmFuc2NvZGVyKGNvbnN0IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKiBwR2xvYmFsX3NlbF9jb2RlYm9vaykgOgotCQltX2xvd2xldmVsX2V0YzFzX2RlY29kZXIocEdsb2JhbF9zZWxfY29kZWJvb2spLAorCWJhc2lzdV90cmFuc2NvZGVyOjpiYXNpc3VfdHJhbnNjb2RlcigpIDoKIAkJbV9yZWFkeV90b190cmFuc2NvZGUoZmFsc2UpCiAJewogCX0KQEAgLTE0MDUzLDYgKzE5NTU0LDIxIEBACiAJCWltYWdlX2luZm8ubV90b3RhbF9ibG9ja3MgPSBpbWFnZV9pbmZvLm1fbnVtX2Jsb2Nrc194ICogaW1hZ2VfaW5mby5tX251bV9ibG9ja3NfeTsKIAkJaW1hZ2VfaW5mby5tX2ZpcnN0X3NsaWNlX2luZGV4ID0gc2xpY2VfaW5kZXg7CiAKKwkJaW1hZ2VfaW5mby5tX3JnYl9maWxlX29mcyA9IHNsaWNlX2Rlc2MubV9maWxlX29mczsKKwkJaW1hZ2VfaW5mby5tX3JnYl9maWxlX2xlbiA9IHNsaWNlX2Rlc2MubV9maWxlX3NpemU7CisJCWltYWdlX2luZm8ubV9hbHBoYV9maWxlX29mcyA9IDA7CisJCWltYWdlX2luZm8ubV9hbHBoYV9maWxlX2xlbiA9IDA7CisKKwkJaWYgKHBIZWFkZXItPm1fdGV4X2Zvcm1hdCA9PSAoaW50KWJhc2lzX3RleF9mb3JtYXQ6OmNFVEMxUykKKwkJeworCQkJaWYgKHBIZWFkZXItPm1fZmxhZ3MgJiBjQkFTSVNIZWFkZXJGbGFnSGFzQWxwaGFTbGljZXMpCisJCQl7CisJCQkJYXNzZXJ0KChzbGljZV9pbmRleCArIDEpIDwgKGludClwSGVhZGVyLT5tX3RvdGFsX3NsaWNlcyk7CisJCQkJaW1hZ2VfaW5mby5tX2FscGhhX2ZpbGVfb2ZzID0gcFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4ICsgMV0ubV9maWxlX29mczsKKwkJCQlpbWFnZV9pbmZvLm1fYWxwaGFfZmlsZV9sZW4gPSBwU2xpY2VfZGVzY3Nbc2xpY2VfaW5kZXggKyAxXS5tX2ZpbGVfc2l6ZTsKKwkJCX0KKwkJfQorCiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMTQwNzIsMTEgKzE5NTg4LDE0IEBACiAJCWZpbGVfaW5mby5tX3RvdGFsX2hlYWRlcl9zaXplID0gc2l6ZW9mKGJhc2lzX2ZpbGVfaGVhZGVyKSArIHBIZWFkZXItPm1fdG90YWxfc2xpY2VzICogc2l6ZW9mKGJhc2lzX3NsaWNlX2Rlc2MpOwogCiAJCWZpbGVfaW5mby5tX3RvdGFsX3NlbGVjdG9ycyA9IHBIZWFkZXItPm1fdG90YWxfc2VsZWN0b3JzOworCQlmaWxlX2luZm8ubV9zZWxlY3Rvcl9jb2RlYm9va19vZnMgPSBwSGVhZGVyLT5tX3NlbGVjdG9yX2NiX2ZpbGVfb2ZzOwogCQlmaWxlX2luZm8ubV9zZWxlY3Rvcl9jb2RlYm9va19zaXplID0gcEhlYWRlci0+bV9zZWxlY3Rvcl9jYl9maWxlX3NpemU7CiAKIAkJZmlsZV9pbmZvLm1fdG90YWxfZW5kcG9pbnRzID0gcEhlYWRlci0+bV90b3RhbF9lbmRwb2ludHM7CisJCWZpbGVfaW5mby5tX2VuZHBvaW50X2NvZGVib29rX29mcyA9IHBIZWFkZXItPm1fZW5kcG9pbnRfY2JfZmlsZV9vZnM7CiAJCWZpbGVfaW5mby5tX2VuZHBvaW50X2NvZGVib29rX3NpemUgPSBwSGVhZGVyLT5tX2VuZHBvaW50X2NiX2ZpbGVfc2l6ZTsKIAorCQlmaWxlX2luZm8ubV90YWJsZXNfb2ZzID0gcEhlYWRlci0+bV90YWJsZXNfZmlsZV9vZnM7CiAJCWZpbGVfaW5mby5tX3RhYmxlc19zaXplID0gcEhlYWRlci0+bV90YWJsZXNfZmlsZV9zaXplOwogCiAJCWZpbGVfaW5mby5tX3RleF9mb3JtYXQgPSBzdGF0aWNfY2FzdDxiYXNpc190ZXhfZm9ybWF0PihzdGF0aWNfY2FzdDxpbnQ+KHBIZWFkZXItPm1fdGV4X2Zvcm1hdCkpOwpAQCAtMTQxNjEsNDYgKzE5NjgwLDg0IEBACiAKIAkJaWYgKHBIZWFkZXItPm1fdGV4X2Zvcm1hdCA9PSAoaW50KWJhc2lzX3RleF9mb3JtYXQ6OmNFVEMxUykKIAkJewotCQkJaWYgKG1fbG93bGV2ZWxfZXRjMXNfZGVjb2Rlci5tX2VuZHBvaW50cy5zaXplKCkpCisJCQlpZiAobV9sb3dsZXZlbF9ldGMxc19kZWNvZGVyLm1fbG9jYWxfZW5kcG9pbnRzLnNpemUoKSkKIAkJCXsKIAkJCQltX2xvd2xldmVsX2V0YzFzX2RlY29kZXIuY2xlYXIoKTsKIAkJCX0KIAotCQkJaWYgKCFwSGVhZGVyLT5tX2VuZHBvaW50X2NiX2ZpbGVfc2l6ZSB8fCAhcEhlYWRlci0+bV9zZWxlY3Rvcl9jYl9maWxlX3NpemUgfHwgIXBIZWFkZXItPm1fdGFibGVzX2ZpbGVfc2l6ZSkKKwkJCWlmIChwSGVhZGVyLT5tX2ZsYWdzICYgY0JBU0lTSGVhZGVyRmxhZ1VzZXNHbG9iYWxDb2RlYm9vaykKIAkJCXsKLQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjpzdGFydF90cmFuc2NvZGluZzogZmlsZSBpcyBjb3JydXB0ZWQgKDApXG4iKTsKKwkJCQlpZiAoIW1fbG93bGV2ZWxfZXRjMXNfZGVjb2Rlci5nZXRfZ2xvYmFsX2NvZGVib29rcygpKQorCQkJCXsKKwkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IEZpbGUgdXNlcyBnbG9iYWwgY29kZWJvb2tzLCBidXQgc2V0X2dsb2JhbF9jb2RlYm9va3MoKSBoYXMgbm90IGJlZW4gY2FsbGVkXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAoIW1fbG93bGV2ZWxfZXRjMXNfZGVjb2Rlci5nZXRfZ2xvYmFsX2NvZGVib29rcygpLT5nZXRfZW5kcG9pbnRzKCkuc2l6ZSgpKQorCQkJCXsKKwkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IEdsb2JhbCBjb2RlYm9va3MgbXVzdCBiZSB1bnBhY2tlZCBmaXJzdCBieSBjYWxsaW5nIHN0YXJ0X3RyYW5zY29kaW5nKClcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWlmICgobV9sb3dsZXZlbF9ldGMxc19kZWNvZGVyLmdldF9nbG9iYWxfY29kZWJvb2tzKCktPmdldF9lbmRwb2ludHMoKS5zaXplKCkgIT0gcEhlYWRlci0+bV90b3RhbF9lbmRwb2ludHMpIHx8CisJCQkJCSAobV9sb3dsZXZlbF9ldGMxc19kZWNvZGVyLmdldF9nbG9iYWxfY29kZWJvb2tzKCktPmdldF9zZWxlY3RvcnMoKS5zaXplKCkgIT0gcEhlYWRlci0+bV90b3RhbF9zZWxlY3RvcnMpKQorCQkJCXsKKwkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IEdsb2JhbCBjb2RlYm9vayBzaXplIG1pc21hdGNoICh3cm9uZyBjb2RlYm9va3MgZm9yIGZpbGUpLlxuIik7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJaWYgKCFwSGVhZGVyLT5tX3RhYmxlc19maWxlX3NpemUpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjpzdGFydF90cmFuc2NvZGluZzogZmlsZSBpcyBjb3JydXB0ZWQgKDIpXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAocEhlYWRlci0+bV90YWJsZXNfZmlsZV9vZnMgPiBkYXRhX3NpemUpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjpzdGFydF90cmFuc2NvZGluZzogZmlsZSBpcyBjb3JydXB0ZWQgb3IgcGFzc2VkIGluIGJ1ZmZlciB0b28gc21hbGwgKDQpXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAocEhlYWRlci0+bV90YWJsZXNfZmlsZV9zaXplID4gKGRhdGFfc2l6ZSAtIHBIZWFkZXItPm1fdGFibGVzX2ZpbGVfb2ZzKSkKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnN0YXJ0X3RyYW5zY29kaW5nOiBmaWxlIGlzIGNvcnJ1cHRlZCBvciBwYXNzZWQgaW4gYnVmZmVyIHRvbyBzbWFsbCAoNSlcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQogCQkJfQotCi0JCQlpZiAoKHBIZWFkZXItPm1fZW5kcG9pbnRfY2JfZmlsZV9vZnMgPiBkYXRhX3NpemUpIHx8IChwSGVhZGVyLT5tX3NlbGVjdG9yX2NiX2ZpbGVfb2ZzID4gZGF0YV9zaXplKSB8fCAocEhlYWRlci0+bV90YWJsZXNfZmlsZV9vZnMgPiBkYXRhX3NpemUpKQorCQkJZWxzZQogCQkJewotCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnN0YXJ0X3RyYW5zY29kaW5nOiBmaWxlIGlzIGNvcnJ1cHRlZCBvciBwYXNzZWQgaW4gYnVmZmVyIHRvbyBzbWFsbCAoMSlcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KKwkJCQlpZiAoIXBIZWFkZXItPm1fZW5kcG9pbnRfY2JfZmlsZV9zaXplIHx8ICFwSGVhZGVyLT5tX3NlbGVjdG9yX2NiX2ZpbGVfc2l6ZSB8fCAhcEhlYWRlci0+bV90YWJsZXNfZmlsZV9zaXplKQorCQkJCXsKKwkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IGZpbGUgaXMgY29ycnVwdGVkICgwKVxuIik7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQogCi0JCQlpZiAocEhlYWRlci0+bV9lbmRwb2ludF9jYl9maWxlX3NpemUgPiAoZGF0YV9zaXplIC0gcEhlYWRlci0+bV9lbmRwb2ludF9jYl9maWxlX29mcykpCi0JCQl7Ci0JCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IGZpbGUgaXMgY29ycnVwdGVkIG9yIHBhc3NlZCBpbiBidWZmZXIgdG9vIHNtYWxsICgyKVxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQorCQkJCWlmICgocEhlYWRlci0+bV9lbmRwb2ludF9jYl9maWxlX29mcyA+IGRhdGFfc2l6ZSkgfHwgKHBIZWFkZXItPm1fc2VsZWN0b3JfY2JfZmlsZV9vZnMgPiBkYXRhX3NpemUpIHx8IChwSGVhZGVyLT5tX3RhYmxlc19maWxlX29mcyA+IGRhdGFfc2l6ZSkpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjpzdGFydF90cmFuc2NvZGluZzogZmlsZSBpcyBjb3JydXB0ZWQgb3IgcGFzc2VkIGluIGJ1ZmZlciB0b28gc21hbGwgKDEpXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KIAotCQkJaWYgKHBIZWFkZXItPm1fc2VsZWN0b3JfY2JfZmlsZV9zaXplID4gKGRhdGFfc2l6ZSAtIHBIZWFkZXItPm1fc2VsZWN0b3JfY2JfZmlsZV9vZnMpKQotCQkJewotCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnN0YXJ0X3RyYW5zY29kaW5nOiBmaWxlIGlzIGNvcnJ1cHRlZCBvciBwYXNzZWQgaW4gYnVmZmVyIHRvbyBzbWFsbCAoMylcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KKwkJCQlpZiAocEhlYWRlci0+bV9lbmRwb2ludF9jYl9maWxlX3NpemUgPiAoZGF0YV9zaXplIC0gcEhlYWRlci0+bV9lbmRwb2ludF9jYl9maWxlX29mcykpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjpzdGFydF90cmFuc2NvZGluZzogZmlsZSBpcyBjb3JydXB0ZWQgb3IgcGFzc2VkIGluIGJ1ZmZlciB0b28gc21hbGwgKDIpXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KIAotCQkJaWYgKHBIZWFkZXItPm1fdGFibGVzX2ZpbGVfc2l6ZSA+IChkYXRhX3NpemUgLSBwSGVhZGVyLT5tX3RhYmxlc19maWxlX29mcykpCi0JCQl7Ci0JCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IGZpbGUgaXMgY29ycnVwdGVkIG9yIHBhc3NlZCBpbiBidWZmZXIgdG9vIHNtYWxsICgzKVxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQorCQkJCWlmIChwSGVhZGVyLT5tX3NlbGVjdG9yX2NiX2ZpbGVfc2l6ZSA+IChkYXRhX3NpemUgLSBwSGVhZGVyLT5tX3NlbGVjdG9yX2NiX2ZpbGVfb2ZzKSkKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnN0YXJ0X3RyYW5zY29kaW5nOiBmaWxlIGlzIGNvcnJ1cHRlZCBvciBwYXNzZWQgaW4gYnVmZmVyIHRvbyBzbWFsbCAoMylcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQogCi0JCQlpZiAoIW1fbG93bGV2ZWxfZXRjMXNfZGVjb2Rlci5kZWNvZGVfcGFsZXR0ZXMoCi0JCQkJcEhlYWRlci0+bV90b3RhbF9lbmRwb2ludHMsIHBEYXRhVTggKyBwSGVhZGVyLT5tX2VuZHBvaW50X2NiX2ZpbGVfb2ZzLCBwSGVhZGVyLT5tX2VuZHBvaW50X2NiX2ZpbGVfc2l6ZSwKLQkJCQlwSGVhZGVyLT5tX3RvdGFsX3NlbGVjdG9ycywgcERhdGFVOCArIHBIZWFkZXItPm1fc2VsZWN0b3JfY2JfZmlsZV9vZnMsIHBIZWFkZXItPm1fc2VsZWN0b3JfY2JfZmlsZV9zaXplKSkKLQkJCXsKLQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjpzdGFydF90cmFuc2NvZGluZzogZGVjb2RlX3BhbGV0dGVzIGZhaWxlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOworCQkJCWlmIChwSGVhZGVyLT5tX3RhYmxlc19maWxlX3NpemUgPiAoZGF0YV9zaXplIC0gcEhlYWRlci0+bV90YWJsZXNfZmlsZV9vZnMpKQorCQkJCXsKKwkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IGZpbGUgaXMgY29ycnVwdGVkIG9yIHBhc3NlZCBpbiBidWZmZXIgdG9vIHNtYWxsICgzKVxuIik7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCQlpZiAoIW1fbG93bGV2ZWxfZXRjMXNfZGVjb2Rlci5kZWNvZGVfcGFsZXR0ZXMoCisJCQkJCXBIZWFkZXItPm1fdG90YWxfZW5kcG9pbnRzLCBwRGF0YVU4ICsgcEhlYWRlci0+bV9lbmRwb2ludF9jYl9maWxlX29mcywgcEhlYWRlci0+bV9lbmRwb2ludF9jYl9maWxlX3NpemUsCisJCQkJCXBIZWFkZXItPm1fdG90YWxfc2VsZWN0b3JzLCBwRGF0YVU4ICsgcEhlYWRlci0+bV9zZWxlY3Rvcl9jYl9maWxlX29mcywgcEhlYWRlci0+bV9zZWxlY3Rvcl9jYl9maWxlX3NpemUpKQorCQkJCXsKKwkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IGRlY29kZV9wYWxldHRlcyBmYWlsZWRcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQogCQkJfQogCiAJCQlpZiAoIW1fbG93bGV2ZWxfZXRjMXNfZGVjb2Rlci5kZWNvZGVfdGFibGVzKHBEYXRhVTggKyBwSGVhZGVyLT5tX3RhYmxlc19maWxlX29mcywgcEhlYWRlci0+bV90YWJsZXNfZmlsZV9zaXplKSkKQEAgLTE0MjEyLDcgKzE5NzY5LDcgQEAKIAkJZWxzZQogCQl7CiAJCQkvLyBOb3RoaW5nIHNwZWNpYWwgdG8gZG8gZm9yIFVBU1RDLgotCQkJaWYgKG1fbG93bGV2ZWxfZXRjMXNfZGVjb2Rlci5tX2VuZHBvaW50cy5zaXplKCkpCisJCQlpZiAobV9sb3dsZXZlbF9ldGMxc19kZWNvZGVyLm1fbG9jYWxfZW5kcG9pbnRzLnNpemUoKSkKIAkJCXsKIAkJCQltX2xvd2xldmVsX2V0YzFzX2RlY29kZXIuY2xlYXIoKTsKIAkJCX0KQEAgLTE0NDA1LDkgKzE5OTYyLDkgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXN0YXRpYyB2b2lkIHdyaXRlX29wYXF1ZV9hbHBoYV9ibG9ja3MoCisJdm9pZCBiYXNpc3VfdHJhbnNjb2Rlcjo6d3JpdGVfb3BhcXVlX2FscGhhX2Jsb2NrcygKIAkJdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksCi0JCXZvaWQqIHBPdXRwdXRfYmxvY2tzLCB1aW50MzJfdCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdCBmbXQsCisJCXZvaWQqIHBPdXRwdXRfYmxvY2tzLCBibG9ja19mb3JtYXQgZm10LAogCQl1aW50MzJfdCBibG9ja19zdHJpZGVfaW5fYnl0ZXMsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscykKIAl7CiAJCS8vICdudW1fYmxvY2tzX3knLCAncE91dHB1dF9ibG9ja3MnICYgJ2Jsb2NrX3N0cmlkZV9pbl9ieXRlcycgdW51c2VkCkBAIC0xNDQxNSw3ICsxOTk3Miw2IEBACiAJCUJBU0lTVV9OT1RFX1VOVVNFRChudW1fYmxvY2tzX3kpOwogCQlCQVNJU1VfTk9URV9VTlVTRUQocE91dHB1dF9ibG9ja3MpOwogCQlCQVNJU1VfTk9URV9VTlVTRUQoYmxvY2tfc3RyaWRlX2luX2J5dGVzKTsKLQkJQkFTSVNVX05PVEVfVU5VU0VEKG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscyk7CiAKIAkJaWYgKCFvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpCiAJCQlvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSBudW1fYmxvY2tzX3g7CkBAIC0xNDQ3OCw3ICsyMDAzNCw3IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAotCQljb25zdCBib29sIHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzID0gKGRlY29kZV9mbGFncyAmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cykgIT0gMDsKKwkJLy9jb25zdCBib29sIHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzID0gKGRlY29kZV9mbGFncyAmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cykgIT0gMDsKIAogCQlpZiAoZGVjb2RlX2ZsYWdzICYgY0RlY29kZUZsYWdzUFZSVENEZWNvZGVUb05leHRQb3cyKQogCQl7CkBAIC0xNDU2Niw3MDggKzIwMTIyLDQwIEBACiAJCQogCQlpZiAocEhlYWRlci0+bV90ZXhfZm9ybWF0ID09IChpbnQpYmFzaXNfdGV4X2Zvcm1hdDo6Y1VBU1RDNHg0KQogCQl7Ci0JCQkvLyBVQVNUQzR4NAotCQkJc3dpdGNoIChmbXQpCi0JCQl7Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkVUQzFfUkdCOgotCQkJewotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMSBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRVRDMl9SR0JBOgotCQkJewotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMl9SR0JBLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBFVEMyIGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzFfUkdCOgotCQkJewotCQkJCS8vIFRPRE86IEVUQzFTIGFsbG93cyBCQzEgZnJvbSBhbHBoYSBjaGFubmVsLiBUaGF0IGRvZXNuJ3Qgc2VlbSBhY3R1YWxseSB1c2VmdWwsIHRob3VnaC4KLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkMxIGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzNfUkdCQToKLQkJCXsKLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDMywgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkMzIGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzRfUjoKLQkJCXsKLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDNCwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLAotCQkJCQludWxscHRyLCAwLAotCQkJCQkoKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykgJiYgKHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzKSkgPyAzIDogMCk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEJDNCBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM1X1JHOgotCQkJewotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQkM1LCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIAotCQkJCQludWxscHRyLCAwLCAKLQkJCQkJMCwgMyk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEJDNSBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM3X1JHQkE6Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkJDN19BTFQ6Ci0JCQl7Ci0JCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzcsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEJDNyBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUFZSVEMxXzRfUkdCOgotCQkJewotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUFZSVEMxXzRfUkdCLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBQVlJUQzEgUkdCIDRicHAgZmFpbGVkXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMV80X1JHQkE6Ci0JCQl7Ci0JCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNQVlJUQzFfNF9SR0JBLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBQVlJUQzEgUkdCQSA0YnBwIGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZBU1RDXzR4NF9SR0JBOgotCQkJewotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQVNUQ180eDQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEFTVEMgNHg0IGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZBVENfUkdCOgotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZBVENfUkdCQToKLQkJCXsKLQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IFVBU1RDLT5BVEMgY3VycmVudGx5IHVuc3VwcG9ydGVkXG4iKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkZYVDFfUkdCOgotCQkJewotCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogVUFTVEMtPkZYVDEgY3VycmVudGx5IHVuc3VwcG9ydGVkXG4iKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMl80X1JHQjoKLQkJCXsKLQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IFVBU1RDLT5QVlJUQzIgY3VycmVudGx5IHVuc3VwcG9ydGVkXG4iKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMl80X1JHQkE6Ci0JCQl7Ci0JCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBVQVNUQy0+UFZSVEMyIGN1cnJlbnRseSB1bnN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZFVEMyX0VBQ19SMTE6Ci0JCQl7Ci0JCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19SMTEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgCi0JCQkJCW51bGxwdHIsIDAsCi0JCQkJCSgoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKSAmJiAodHJhbnNjb2RlX2FscGhhX2RhdGFfdG9fb3BhcXVlX2Zvcm1hdHMpKSA/IDMgOiAwKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRUFDIFIxMSBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRVRDMl9FQUNfUkcxMToKLQkJCXsKLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfRUFDX1JHMTEsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgCi0JCQkJCW51bGxwdHIsIDAsIAotCQkJCQkwLCAzKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRUFDIFJHMTEgZmFpbGVkXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlJHQkEzMjoKLQkJCXsKLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y1JHQkEzMiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gUkdCQTMyIGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZSR0I1NjU6Ci0JCQl7Ci0JCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNSR0I1NjUsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIFJHQjU2NSBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkdSNTY1OgotCQkJewotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQkdSNTY1LCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0I1NjUgZmFpbGVkXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlJHQkE0NDQ0OgotCQkJewotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUkdCQTQ0NDQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIFJHQkE0NDQ0IGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdDoKLQkJCXsKLQkJCQlhc3NlcnQoMCk7Ci0JCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBJbnZhbGlkIGZtdFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9CisJCQljb25zdCBiYXNpc19zbGljZV9kZXNjKiBwU2xpY2VfZGVzYyA9ICZwU2xpY2VfZGVzY3Nbc2xpY2VfaW5kZXhdOworCisJCQkvLyBVc2UgdGhlIGNvbnRhaW5lciBpbmRlcGVuZGVudCBpbWFnZSB0cmFuc2NvZGUgbWV0aG9kLgorCQkJc3RhdHVzID0gbV9sb3dsZXZlbF91YXN0Y19kZWNvZGVyLnRyYW5zY29kZV9pbWFnZShmbXQsCisJCQkJcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJCQkoY29uc3QgdWludDhfdCopcERhdGEsIGRhdGFfc2l6ZSwgcFNsaWNlX2Rlc2MtPm1fbnVtX2Jsb2Nrc194LCBwU2xpY2VfZGVzYy0+bV9udW1fYmxvY2tzX3ksIHBTbGljZV9kZXNjLT5tX29yaWdfd2lkdGgsIHBTbGljZV9kZXNjLT5tX29yaWdfaGVpZ2h0LCBwU2xpY2VfZGVzYy0+bV9sZXZlbF9pbmRleCwKKwkJCQlwU2xpY2VfZGVzYy0+bV9maWxlX29mcywgcFNsaWNlX2Rlc2MtPm1fZmlsZV9zaXplLAorCQkJCWRlY29kZV9mbGFncywgYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzLCBwSGVhZGVyLT5tX3RleF90eXBlID09IGNCQVNJU1RleFR5cGVWaWRlb0ZyYW1lcywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CiAJCX0KIAkJZWxzZSAKIAkJewogCQkJLy8gRVRDMVMKKwkJCWNvbnN0IGJhc2lzX3NsaWNlX2Rlc2MqIHBTbGljZV9kZXNjID0gJnBTbGljZV9kZXNjc1tzbGljZV9pbmRleF07CisJCQljb25zdCBiYXNpc19zbGljZV9kZXNjKiBwQWxwaGFfc2xpY2VfZGVzYyA9IGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcyA/ICZwU2xpY2VfZGVzY3Nbc2xpY2VfaW5kZXggKyAxXSA6IG51bGxwdHI7CiAKLQkJCXN3aXRjaCAoZm10KQorCQkJYXNzZXJ0KChwU2xpY2VfZGVzYy0+bV9mbGFncyAmIGNTbGljZURlc2NGbGFnc0hhc0FscGhhKSA9PSAwKTsKKworCQkJaWYgKHBBbHBoYV9zbGljZV9kZXNjKQogCQkJewotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZFVEMxX1JHQjoKLQkJCXsKLQkJCQl1aW50MzJfdCBzbGljZV9pbmRleF90b19kZWNvZGUgPSBzbGljZV9pbmRleDsKLQkJCQkvLyBJZiB0aGUgY2FsbGVyIHdhbnRzIHVzIHRvIHRyYW5zY29kZSB0aGUgbWlwIGxldmVsJ3MgYWxwaGEgZGF0YSwgdGhlbiB1c2UgdGhlIG5leHQgc2xpY2UuCi0JCQkJaWYgKChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpICYmICh0cmFuc2NvZGVfYWxwaGFfZGF0YV90b19vcGFxdWVfZm9ybWF0cykpCi0JCQkJCXNsaWNlX2luZGV4X3RvX2RlY29kZSsrOwotCi0JCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4X3RvX2RlY29kZSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMSBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKKwkJCQkvLyBCYXNpYyBzYW5pdHkgY2hlY2tzCisJCQkJYXNzZXJ0KChwQWxwaGFfc2xpY2VfZGVzYy0+bV9mbGFncyAmIGNTbGljZURlc2NGbGFnc0hhc0FscGhhKSAhPSAwKTsKKwkJCQlhc3NlcnQocFNsaWNlX2Rlc2MtPm1fbnVtX2Jsb2Nrc194ID09IHBBbHBoYV9zbGljZV9kZXNjLT5tX251bV9ibG9ja3NfeCk7CisJCQkJYXNzZXJ0KHBTbGljZV9kZXNjLT5tX251bV9ibG9ja3NfeSA9PSBwQWxwaGFfc2xpY2VfZGVzYy0+bV9udW1fYmxvY2tzX3kpOworCQkJCWFzc2VydChwU2xpY2VfZGVzYy0+bV9sZXZlbF9pbmRleCA9PSBwQWxwaGFfc2xpY2VfZGVzYy0+bV9sZXZlbF9pbmRleCk7CiAJCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkJDMV9SR0I6Ci0JCQl7Ci0jaWYgIUJBU0lTRF9TVVBQT1JUX0RYVDEKLSAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogRFhUMSB1bnN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0JCQkJdWludDMyX3Qgc2xpY2VfaW5kZXhfdG9fZGVjb2RlID0gc2xpY2VfaW5kZXg7Ci0JCQkJLy8gSWYgdGhlIGNhbGxlciB3YW50cyB1cyB0byB0cmFuc2NvZGUgdGhlIG1pcCBsZXZlbCdzIGFscGhhIGRhdGEsIHRoZW4gdXNlIHRoZSBuZXh0IHNsaWNlLgotCQkJCWlmICgoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKSAmJiAodHJhbnNjb2RlX2FscGhhX2RhdGFfdG9fb3BhcXVlX2Zvcm1hdHMpKQotCQkJCQlzbGljZV9pbmRleF90b19kZWNvZGUrKzsKIAotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleF90b19kZWNvZGUsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkMxIGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzRfUjoKLQkJCXsKLSNpZiAhQkFTSVNEX1NVUFBPUlRfRFhUNUEKLSAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogRFhUNUEgdW5zdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCQkJCXVpbnQzMl90IHNsaWNlX2luZGV4X3RvX2RlY29kZSA9IHNsaWNlX2luZGV4OwotCQkJCS8vIElmIHRoZSBjYWxsZXIgd2FudHMgdXMgdG8gdHJhbnNjb2RlIHRoZSBtaXAgbGV2ZWwncyBhbHBoYSBkYXRhLCB0aGVuIHVzZSB0aGUgbmV4dCBzbGljZS4KLQkJCQlpZiAoKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykgJiYgKHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzKSkKLQkJCQkJc2xpY2VfaW5kZXhfdG9fZGVjb2RlKys7CisJCQkvLyBVc2UgdGhlIGNvbnRhaW5lciBpbmRlcGVuZGVudCBpbWFnZSB0cmFuc2NvZGUgbWV0aG9kLgorCQkJc3RhdHVzID0gbV9sb3dsZXZlbF9ldGMxc19kZWNvZGVyLnRyYW5zY29kZV9pbWFnZShmbXQsCisJCQkJcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKKwkJCQkoY29uc3QgdWludDhfdCAqKXBEYXRhLCBkYXRhX3NpemUsIHBTbGljZV9kZXNjLT5tX251bV9ibG9ja3NfeCwgcFNsaWNlX2Rlc2MtPm1fbnVtX2Jsb2Nrc195LCBwU2xpY2VfZGVzYy0+bV9vcmlnX3dpZHRoLCBwU2xpY2VfZGVzYy0+bV9vcmlnX2hlaWdodCwgcFNsaWNlX2Rlc2MtPm1fbGV2ZWxfaW5kZXgsCisJCQkJcFNsaWNlX2Rlc2MtPm1fZmlsZV9vZnMsIHBTbGljZV9kZXNjLT5tX2ZpbGVfc2l6ZSwKKwkJCQkocEFscGhhX3NsaWNlX2Rlc2MgIT0gbnVsbHB0cikgPyAodWludDMyX3QpcEFscGhhX3NsaWNlX2Rlc2MtPm1fZmlsZV9vZnMgOiAwVSwgKHBBbHBoYV9zbGljZV9kZXNjICE9IG51bGxwdHIpID8gKHVpbnQzMl90KXBBbHBoYV9zbGljZV9kZXNjLT5tX2ZpbGVfc2l6ZSA6IDBVLAorCQkJCWRlY29kZV9mbGFncywgYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzLCBwSGVhZGVyLT5tX3RleF90eXBlID09IGNCQVNJU1RleFR5cGVWaWRlb0ZyYW1lcywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUsIG91dHB1dF9yb3dzX2luX3BpeGVscyk7CiAKLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXhfdG9fZGVjb2RlLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEJDNCBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGUFZSVEMxXzRfUkdCOgotCQkJewotI2lmICFCQVNJU0RfU1VQUE9SVF9QVlJUQzEKLSAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogUFZSVEMxIHVuc3VwcG9ydGVkXG4iKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQkJCQl1aW50MzJfdCBzbGljZV9pbmRleF90b19kZWNvZGUgPSBzbGljZV9pbmRleDsKLQkJCQkvLyBJZiB0aGUgY2FsbGVyIHdhbnRzIHVzIHRvIHRyYW5zY29kZSB0aGUgbWlwIGxldmVsJ3MgYWxwaGEgZGF0YSwgdGhlbiB1c2UgdGhlIG5leHQgc2xpY2UuCi0JCQkJaWYgKChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpICYmICh0cmFuc2NvZGVfYWxwaGFfZGF0YV90b19vcGFxdWVfZm9ybWF0cykpCi0JCQkJCXNsaWNlX2luZGV4X3RvX2RlY29kZSsrOwotCi0JCQkJLy8gb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzIGlzIGFjdHVhbGx5IGlnbm9yZWQgYmVjYXVzZSB3ZSdyZSB0cmFuc2NvZGluZyB0byBQVlJUQzEuIChQcmludCBhIGRldiB3YXJuaW5nIGlmIGl0J3MgIT0gMD8pCi0JCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4X3RvX2RlY29kZSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUFZSVEMxXzRfUkdCLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBQVlJUQzEgNCBSR0IgZmFpbGVkXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMV80X1JHQkE6Ci0JCQl7Ci0jaWYgIUJBU0lTRF9TVVBQT1JUX1BWUlRDMQotICAgICAgICAgICAgQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBQVlJUQzEgdW5zdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCQkJCWFzc2VydChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpOwotCi0JCQkJLy8gVGVtcCBidWZmZXIgdG8gaG9sZCBhbHBoYSBibG9jayBlbmRwb2ludC9zZWxlY3RvciBpbmRpY2VzCi0JCQkJc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRlbXBfYmxvY2tfaW5kaWNlcyh0b3RhbF9zbGljZV9ibG9ja3MpOwotCi0JCQkJLy8gRmlyc3QgdHJhbnNjb2RlIGFscGhhIGRhdGEgdG8gdGVtcCBidWZmZXIKLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCAmdGVtcF9ibG9ja19pbmRpY2VzWzBdLCB0b3RhbF9zbGljZV9ibG9ja3MsIGJsb2NrX2Zvcm1hdDo6Y0luZGljZXMsIHNpemVvZih1aW50MzJfdCksIGRlY29kZV9mbGFncywgcFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XS5tX251bV9ibG9ja3NfeCwgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gUFZSVEMxIDQgUkdCQSBmYWlsZWQgKDApXG4iKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzIGlzIGFjdHVhbGx5IGlnbm9yZWQgYmVjYXVzZSB3ZSdyZSB0cmFuc2NvZGluZyB0byBQVlJUQzEuIChQcmludCBhIGRldiB3YXJuaW5nIGlmIGl0J3MgIT0gMD8pCi0JCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUFZSVEMxXzRfUkdCQSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCAmdGVtcF9ibG9ja19pbmRpY2VzWzBdKTsKLQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXsKLQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gUFZSVEMxIDQgUkdCQSBmYWlsZWQgKDEpXG4iKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzdfUkdCQToKLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM3X0FMVDoKLQkJCXsKLSNpZiAhQkFTSVNEX1NVUFBPUlRfQkM3X01PREU1Ci0gICAgICAgICAgICBCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IEJDNyB1bnN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotI2Vsc2UKLQkJCQlhc3NlcnQoYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsID09IDE2KTsKLQkJCQkvLyBXZSB1c2VkIHRvIHN1cHBvcnQgdHJhbnNjb2RpbmcganVzdCBhbHBoYSB0byBCQzcgLSBidXQgaXMgdGhhdCB1c2VmdWwgYXQgYWxsPwotCi0JCQkJLy8gRmlyc3QgdHJhbnNjb2RlIHRoZSBjb2xvciBzbGljZS4gVGhlIGNCQzdfTTVfQ09MT1IgdHJhbnNjb2RlciB3aWxsIG91dHB1dCBvcGFxdWUgbW9kZSA1IGJsb2Nrcy4KLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDN19NNV9DT0xPUiwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCi0JCQkJaWYgKChzdGF0dXMpICYmIChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpKQotCQkJCXsKLQkJCQkJLy8gTm93IHRyYW5zY29kZSB0aGUgYWxwaGEgc2xpY2UuIFRoZSBjQkM3X001X0FMUEhBIHRyYW5zY29kZXIgd2lsbCBub3cgY2hhbmdlIHRoZSBvcGFxdWUgbW9kZSA1IGJsb2NrcyB0byBibG9ja3Mgd2l0aCBhbHBoYS4KLQkJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4ICsgMSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQkM3X001X0FMUEhBLCAxNiwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXN0YXR1cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkM3IGZhaWxlZCAoMClcbiIpOwotICAgICAgICAgICAgfQotCi0JCQkJYnJlYWs7Ci0jZW5kaWYKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGRVRDMl9SR0JBOgotCQkJewotI2lmICFCQVNJU0RfU1VQUE9SVF9FVEMyX0VBQ19BOAotICAgICAgICAgICAgQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBFVEMyIEVBQyBBOCB1bnN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0JCQkJYXNzZXJ0KGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCA9PSAxNik7Ci0KLQkJCQlpZiAoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKQotCQkJCXsKLQkJCQkJLy8gRmlyc3QgZGVjb2RlIHRoZSBhbHBoYSBkYXRhIAotCQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19BOCwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQl3cml0ZV9vcGFxdWVfYWxwaGFfYmxvY2tzKHBTbGljZV9kZXNjc1tzbGljZV9pbmRleF0ubV9udW1fYmxvY2tzX3gsIHBTbGljZV9kZXNjc1tzbGljZV9pbmRleF0ubV9udW1fYmxvY2tzX3ksIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfRUFDX0E4LCAxNiwgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzKTsKLQkJCQkJc3RhdHVzID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoc3RhdHVzKQotCQkJCXsKLQkJCQkJLy8gTm93IGRlY29kZSB0aGUgY29sb3IgZGF0YQotCQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsICh1aW50OF90KilwT3V0cHV0X2Jsb2NrcyArIDgsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMSwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJewotCQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBFVEMyIFJHQiBmYWlsZWRcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMiBBIGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZCQzNfUkdCQToKLQkJCXsKLSNpZiAhQkFTSVNEX1NVUFBPUlRfRFhUMQotICAgICAgICAgICAgQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBEWFQxIHVuc3VwcG9ydGVkXG4iKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSNpZiAhQkFTSVNEX1NVUFBPUlRfRFhUNUEKLSAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogRFhUNUEgdW5zdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCQkJCWFzc2VydChieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwgPT0gMTYpOwotCi0JCQkJLy8gRmlyc3QgZGVjb2RlIHRoZSBhbHBoYSBkYXRhIAotCQkJCWlmIChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpCi0JCQkJewotCQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJd3JpdGVfb3BhcXVlX2FscGhhX2Jsb2NrcyhwU2xpY2VfZGVzY3Nbc2xpY2VfaW5kZXhdLm1fbnVtX2Jsb2Nrc194LCBwU2xpY2VfZGVzY3Nbc2xpY2VfaW5kZXhdLm1fbnVtX2Jsb2Nrc195LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpOwotCQkJCQlzdGF0dXMgPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChzdGF0dXMpCi0JCQkJewotCQkJCQkvLyBOb3cgZGVjb2RlIHRoZSBjb2xvciBkYXRhLiBGb3JiaWQgMyBjb2xvciBibG9ja3MsIHdoaWNoIGFyZW4ndCBhbGxvd2VkIGluIEJDMy4KLQkJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCAodWludDhfdCopcE91dHB1dF9ibG9ja3MgKyA4LCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDMSwgMTYsIGRlY29kZV9mbGFncyB8IGNEZWNvZGVGbGFnc0JDMUZvcmJpZFRocmVlQ29sb3JCbG9ja3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXsKLQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkMzIFJHQiBmYWlsZWRcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkMzIEEgZmFpbGVkXG4iKTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM1X1JHOgotCQkJewotI2lmICFCQVNJU0RfU1VQUE9SVF9EWFQ1QQotICAgICAgICAgICAgQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBEWFQ1QSB1bnN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0JCQkJYXNzZXJ0KGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCA9PSAxNik7Ci0KLQkJCQkvLyBEZWNvZGUgdGhlIFIgZGF0YSAoYWN0dWFsbHkgdGhlIGdyZWVuIGNoYW5uZWwgb2YgdGhlIGNvbG9yIGRhdGEgc2xpY2UgaW4gdGhlIGJhc2lzIGZpbGUpCi0JCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoc3RhdHVzKQotCQkJCXsKLQkJCQkJaWYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykKLQkJCQkJewotCQkJCQkJLy8gRGVjb2RlIHRoZSBHIGRhdGEgKGFjdHVhbGx5IHRoZSBncmVlbiBjaGFubmVsIG9mIHRoZSBhbHBoYSBkYXRhIHNsaWNlIGluIHRoZSBiYXNpcyBmaWxlKQotCQkJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4ICsgMSwgKHVpbnQ4X3QqKXBPdXRwdXRfYmxvY2tzICsgOCwgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQkJCWlmICghc3RhdHVzKQotCQkJCQkJewotCQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gQkM1IDEgZmFpbGVkXG4iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXdyaXRlX29wYXF1ZV9hbHBoYV9ibG9ja3MocFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XS5tX251bV9ibG9ja3NfeCwgcFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XS5tX251bV9ibG9ja3NfeSwgKHVpbnQ4X3QqKXBPdXRwdXRfYmxvY2tzICsgOCwgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNCQzQsIDE2LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpOwotCQkJCQkJc3RhdHVzID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEJDNSBjaGFubmVsIDAgZmFpbGVkXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkFTVENfNHg0X1JHQkE6Ci0JCQl7Ci0jaWYgIUJBU0lTRF9TVVBQT1JUX0FTVEMKLSAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogQVNUQyB1bnN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0JCQkJYXNzZXJ0KGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCA9PSAxNik7Ci0KLQkJCQlpZiAoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKQotCQkJCXsKLQkJCQkJLy8gRmlyc3QgZGVjb2RlIHRoZSBhbHBoYSBkYXRhIHRvIHRoZSBvdXRwdXQgKHdlJ3JlIHVzaW5nIHRoZSBvdXRwdXQgdGV4dHVyZSBhcyBhIHRlbXAgYnVmZmVyIGhlcmUpLgotCQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCAodWludDhfdCopcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjSW5kaWNlcywgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCQlpZiAoc3RhdHVzKQotCQkJCQl7Ci0JCQkJCQkvLyBOb3cgZGVjb2RlIHRoZSBjb2xvciBkYXRhIGFuZCB0cmFuc2NvZGUgdG8gQVNUQy4gVGhlIHRyYW5zY29kZXIgZnVuY3Rpb24gd2lsbCByZWFkIHRoZSBhbHBoYSBzZWxlY3RvciBkYXRhIGZyb20gdGhlIG91dHB1dCB0ZXh0dXJlIGFzIGl0IGNvbnZlcnRzIGFuZAotCQkJCQkJLy8gdHJhbnNjb2RlIGJvdGggdGhlIGFscGhhIGFuZCBjb2xvciBkYXRhIGF0IHRoZSBzYW1lIHRpbWUgdG8gQVNUQy4KLQkJCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQVNUQ180eDQsIDE2LCBkZWNvZGVfZmxhZ3MgfCBjRGVjb2RlRmxhZ3NPdXRwdXRIYXNBbHBoYUluZGljZXMsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQVNUQ180eDQsIDE2LCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQotICAgICAgICAgICAgaWYgKCFzdGF0dXMpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEFTVEMgZmFpbGVkICgwKVxuIik7Ci0gICAgICAgICAgICB9Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQVRDX1JHQjoKLQkJCXsKLSNpZiAhQkFTSVNEX1NVUFBPUlRfQVRDCi0gICAgICAgICAgICBCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IEFUQyB1bnN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0JCQkJdWludDMyX3Qgc2xpY2VfaW5kZXhfdG9fZGVjb2RlID0gc2xpY2VfaW5kZXg7Ci0JCQkJLy8gSWYgdGhlIGNhbGxlciB3YW50cyB1cyB0byB0cmFuc2NvZGUgdGhlIG1pcCBsZXZlbCdzIGFscGhhIGRhdGEsIHRoZW4gdXNlIHRoZSBuZXh0IHNsaWNlLgotCQkJCWlmICgoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKSAmJiAodHJhbnNjb2RlX2FscGhhX2RhdGFfdG9fb3BhcXVlX2Zvcm1hdHMpKQotCQkJCQlzbGljZV9pbmRleF90b19kZWNvZGUrKzsKLQotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleF90b19kZWNvZGUsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0FUQ19SR0IsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEFUQ19SR0IgZmFpbGVkXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkFUQ19SR0JBOgotCQkJewotI2lmICFCQVNJU0RfU1VQUE9SVF9BVEMKLSAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogQVRDIHVuc3VwcG9ydGVkXG4iKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSNpZiAhQkFTSVNEX1NVUFBPUlRfRFhUNUEKLSAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogRFhUNUEgdW5zdXBwb3J0ZWRcbiIpOwotICAgCQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0JCQkJYXNzZXJ0KGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCA9PSAxNik7Ci0KLQkJCQkvLyBGaXJzdCBkZWNvZGUgdGhlIGFscGhhIGRhdGEgCi0JCQkJaWYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykKLQkJCQl7Ci0JCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCArIDEsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDNCwgMTYsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQl3cml0ZV9vcGFxdWVfYWxwaGFfYmxvY2tzKHBTbGljZV9kZXNjc1tzbGljZV9pbmRleF0ubV9udW1fYmxvY2tzX3gsIHBTbGljZV9kZXNjc1tzbGljZV9pbmRleF0ubV9udW1fYmxvY2tzX3ksIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0JDNCwgMTYsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyk7Ci0JCQkJCXN0YXR1cyA9IHRydWU7Ci0JCQkJfQotCi0JCQkJaWYgKHN0YXR1cykKLQkJCQl7Ci0JCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgKHVpbnQ4X3QqKXBPdXRwdXRfYmxvY2tzICsgOCwgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNBVENfUkdCLCAxNiwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJCWlmICghc3RhdHVzKQotCQkJCQl7Ci0JCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEFUQyBSR0IgZmFpbGVkXG4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEFUQyBBIGZhaWxlZFxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZQVlJUQzJfNF9SR0I6Ci0JCQl7Ci0jaWYgIUJBU0lTRF9TVVBQT1JUX1BWUlRDMgotICAgICAgICAgICAgQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBQVlJUQzIgdW5zdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCQkJCXVpbnQzMl90IHNsaWNlX2luZGV4X3RvX2RlY29kZSA9IHNsaWNlX2luZGV4OwotCQkJCS8vIElmIHRoZSBjYWxsZXIgd2FudHMgdXMgdG8gdHJhbnNjb2RlIHRoZSBtaXAgbGV2ZWwncyBhbHBoYSBkYXRhLCB0aGVuIHVzZSB0aGUgbmV4dCBzbGljZS4KLQkJCQlpZiAoKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykgJiYgKHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzKSkKLQkJCQkJc2xpY2VfaW5kZXhfdG9fZGVjb2RlKys7Ci0KLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXhfdG9fZGVjb2RlLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNQVlJUQzJfNF9SR0IsIGJ5dGVzX3Blcl9ibG9ja19vcl9waXhlbCwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIGNQVlJUQzJfNF9SR0IgZmFpbGVkXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlBWUlRDMl80X1JHQkE6Ci0JCQl7Ci0jaWYgIUJBU0lTRF9TVVBQT1JUX1BWUlRDMgotICAgICAgICAgICAgQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBQVlJUQzIgdW5zdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCQkJCWlmIChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpCi0JCQkJewotCQkJCQkvLyBGaXJzdCBkZWNvZGUgdGhlIGFscGhhIGRhdGEgdG8gdGhlIG91dHB1dCAod2UncmUgdXNpbmcgdGhlIG91dHB1dCB0ZXh0dXJlIGFzIGEgdGVtcCBidWZmZXIgaGVyZSkuCi0JCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCArIDEsICh1aW50OF90KilwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNJbmRpY2VzLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJewotCQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBmYWlsZWRcbiIpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLy8gTm93IGRlY29kZSB0aGUgY29sb3IgZGF0YSBhbmQgdHJhbnNjb2RlIHRvIFBWUlRDMiBSR0JBLiAKLQkJCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUFZSVEMyXzRfUkdCQSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MgfCBjRGVjb2RlRmxhZ3NPdXRwdXRIYXNBbHBoYUluZGljZXMsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjUFZSVEMyXzRfUkdCLCBieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwsIGRlY29kZV9mbGFncywgb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBwU3RhdGUpOwotCi0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIGNQVlJUQzJfNF9SR0JBIGZhaWxlZFxuIik7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlJHQkEzMjoKLQkJCXsKLQkJCQkvLyBSYXcgMzJicHAgcGl4ZWxzLCBkZWNvZGVkIGluIHRoZSB1c3VhbCByYXN0ZXIgb3JkZXIgKE5PVCBibG9jayBvcmRlcikgaW50byBhbiBpbWFnZSBpbiBtZW1vcnkuCi0KLQkJCQkvLyBGaXJzdCBkZWNvZGUgdGhlIGFscGhhIGRhdGEgCi0JCQkJaWYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykKLQkJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4ICsgMSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjQTMyLCBzaXplb2YodWludDMyX3QpLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBudWxscHRyLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOwotCQkJCWVsc2UKLQkJCQkJc3RhdHVzID0gdHJ1ZTsKLQotCQkJCWlmIChzdGF0dXMpCi0JCQkJewotCQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXgsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcyA/IGJsb2NrX2Zvcm1hdDo6Y1JHQjMyIDogYmxvY2tfZm9ybWF0OjpjUkdCQTMyLCBzaXplb2YodWludDMyX3QpLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBudWxscHRyLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOwotCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJewotCQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0JBMzIgUkdCIGZhaWxlZFxuIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0JBMzIgQSBmYWlsZWRcbiIpOwotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZSR0I1NjU6Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkJHUjU2NToKLQkJCXsKLQkJCQkvLyBSYXcgMTZicHAgcGl4ZWxzLCBkZWNvZGVkIGluIHRoZSB1c3VhbCByYXN0ZXIgb3JkZXIgKE5PVCBibG9jayBvcmRlcikgaW50byBhbiBpbWFnZSBpbiBtZW1vcnkuCi0KLQkJCQl1aW50MzJfdCBzbGljZV9pbmRleF90b19kZWNvZGUgPSBzbGljZV9pbmRleDsKLQkJCQkvLyBJZiB0aGUgY2FsbGVyIHdhbnRzIHVzIHRvIHRyYW5zY29kZSB0aGUgbWlwIGxldmVsJ3MgYWxwaGEgZGF0YSwgdGhlbiB1c2UgdGhlIG5leHQgc2xpY2UuCi0JCQkJaWYgKChiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMpICYmICh0cmFuc2NvZGVfYWxwaGFfZGF0YV90b19vcGFxdWVfZm9ybWF0cykpCi0JCQkJCXNsaWNlX2luZGV4X3RvX2RlY29kZSsrOwotCi0JCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4X3RvX2RlY29kZSwgcE91dHB1dF9ibG9ja3MsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgKGZtdCA9PSB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0OjpjVEZSR0I1NjUpID8gYmxvY2tfZm9ybWF0OjpjUkdCNTY1IDogYmxvY2tfZm9ybWF0OjpjQkdSNTY1LCBzaXplb2YodWludDE2X3QpLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlLCBudWxscHRyLCBvdXRwdXRfcm93c19pbl9waXhlbHMpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0I1NjUgUkdCIGZhaWxlZFxuIik7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURlJHQkE0NDQ0OgotCQkJewotCQkJCS8vIFJhdyAxNmJwcCBwaXhlbHMsIGRlY29kZWQgaW4gdGhlIHVzdWFsIHJhc3RlciBvcmRlciAoTk9UIGJsb2NrIG9yZGVyKSBpbnRvIGFuIGltYWdlIGluIG1lbW9yeS4KLQotCQkJCS8vIEZpcnN0IGRlY29kZSB0aGUgYWxwaGEgZGF0YSAKLQkJCQlpZiAoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKQotCQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXggKyAxLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNSR0JBNDQ0NF9BTFBIQSwgc2l6ZW9mKHVpbnQxNl90KSwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKLQkJCQllbHNlCi0JCQkJCXN0YXR1cyA9IHRydWU7Ci0KLQkJCQlpZiAoc3RhdHVzKQotCQkJCXsKLQkJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBiYXNpc19maWxlX2hhc19hbHBoYV9zbGljZXMgPyBibG9ja19mb3JtYXQ6OmNSR0JBNDQ0NF9DT0xPUiA6IGJsb2NrX2Zvcm1hdDo6Y1JHQkE0NDQ0X0NPTE9SX09QQVFVRSwgc2l6ZW9mKHVpbnQxNl90KSwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSwgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKTsKLQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXsKLQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gUkdCQTQ0NDQgUkdCIGZhaWxlZFxuIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiB0cmFuc2NvZGVfc2xpY2UoKSB0byBSR0JBNDQ0NCBBIGZhaWxlZFxuIik7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkZYVDFfUkdCOgotCQkJewotI2lmICFCQVNJU0RfU1VQUE9SVF9GWFQxCi0gICAgICAgICAgICBCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IEZYVDEgdW5zdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCQkJCXVpbnQzMl90IHNsaWNlX2luZGV4X3RvX2RlY29kZSA9IHNsaWNlX2luZGV4OwotCQkJCS8vIElmIHRoZSBjYWxsZXIgd2FudHMgdXMgdG8gdHJhbnNjb2RlIHRoZSBtaXAgbGV2ZWwncyBhbHBoYSBkYXRhLCB0aGVuIHVzZSB0aGUgbmV4dCBzbGljZS4KLQkJCQlpZiAoKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykgJiYgKHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzKSkKLQkJCQkJc2xpY2VfaW5kZXhfdG9fZGVjb2RlKys7Ci0KLQkJCQlzdGF0dXMgPSB0cmFuc2NvZGVfc2xpY2UocERhdGEsIGRhdGFfc2l6ZSwgc2xpY2VfaW5kZXhfdG9fZGVjb2RlLCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNGWFQxX1JHQiwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRlhUMV9SR0IgZmFpbGVkXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkVUQzJfRUFDX1IxMToKLQkJCXsKLSNpZiAhQkFTSVNEX1NVUFBPUlRfRVRDMl9FQUNfUkcxMQotICAgICAgICAgICAgQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsOiBFQUNfUkcxMSB1bnN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0JCQkJdWludDMyX3Qgc2xpY2VfaW5kZXhfdG9fZGVjb2RlID0gc2xpY2VfaW5kZXg7Ci0JCQkJLy8gSWYgdGhlIGNhbGxlciB3YW50cyB1cyB0byB0cmFuc2NvZGUgdGhlIG1pcCBsZXZlbCdzIGFscGhhIGRhdGEsIHRoZW4gdXNlIHRoZSBuZXh0IHNsaWNlLgotCQkJCWlmICgoYmFzaXNfZmlsZV9oYXNfYWxwaGFfc2xpY2VzKSAmJiAodHJhbnNjb2RlX2FscGhhX2RhdGFfdG9fb3BhcXVlX2Zvcm1hdHMpKQotCQkJCQlzbGljZV9pbmRleF90b19kZWNvZGUrKzsKLQotCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleF90b19kZWNvZGUsIHBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfRUFDX1IxMSwgYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsLCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMl9FQUNfUjExIGZhaWxlZFxuIik7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkVUQzJfRUFDX1JHMTE6Ci0JCQl7Ci0jaWYgIUJBU0lTRF9TVVBQT1JUX0VUQzJfRUFDX1JHMTEKLSAgICAgICAgICAgIEJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogRUFDX1JHMTEgdW5zdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCQkJCWFzc2VydChieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwgPT0gMTYpOwotCi0JCQkJaWYgKGJhc2lzX2ZpbGVfaGFzX2FscGhhX3NsaWNlcykKLQkJCQl7Ci0JCQkJCS8vIEZpcnN0IGRlY29kZSB0aGUgYWxwaGEgZGF0YSB0byBHCi0JCQkJCXN0YXR1cyA9IHRyYW5zY29kZV9zbGljZShwRGF0YSwgZGF0YV9zaXplLCBzbGljZV9pbmRleCArIDEsICh1aW50OF90KilwT3V0cHV0X2Jsb2NrcyArIDgsIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywgYmxvY2tfZm9ybWF0OjpjRVRDMl9FQUNfUjExLCAxNiwgZGVjb2RlX2ZsYWdzLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsIHBTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXdyaXRlX29wYXF1ZV9hbHBoYV9ibG9ja3MocFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XS5tX251bV9ibG9ja3NfeCwgcFNsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XS5tX251bV9ibG9ja3NfeSwgKHVpbnQ4X3QqKXBPdXRwdXRfYmxvY2tzICsgOCwgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19SMTEsIDE2LCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpOwotCQkJCQlzdGF0dXMgPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChzdGF0dXMpCi0JCQkJewotCQkJCQkvLyBOb3cgZGVjb2RlIHRoZSBjb2xvciBkYXRhIHRvIFIKLQkJCQkJc3RhdHVzID0gdHJhbnNjb2RlX3NsaWNlKHBEYXRhLCBkYXRhX3NpemUsIHNsaWNlX2luZGV4LCBwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLCBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19SMTEsIDE2LCBkZWNvZGVfZmxhZ3MsIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgcFN0YXRlKTsKLQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXsKLQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV9sZXZlbDogdHJhbnNjb2RlX3NsaWNlKCkgdG8gRVRDMl9FQUNfUjExIFIgZmFpbGVkXG4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IHRyYW5zY29kZV9zbGljZSgpIHRvIEVUQzJfRUFDX1IxMSBHIGZhaWxlZFxuIik7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0OgotCQkJewotCQkJCWFzc2VydCgwKTsKLQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IEludmFsaWQgZm10XG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KIAkJfSAvLyBpZiAocEhlYWRlci0+bV90ZXhfZm9ybWF0ID09IChpbnQpYmFzaXNfdGV4X2Zvcm1hdDo6Y1VBU1RDNHg0KQogICAgICAgCiAgICAgICBpZiAoIXN0YXR1cykKQEAgLTE1MzU0LDYgKzIwMjQyLDM2IEBACiAJCXJldHVybiAiIjsKIAl9CiAKKwljb25zdCBjaGFyKiBiYXNpc19nZXRfYmxvY2tfZm9ybWF0X25hbWUoYmxvY2tfZm9ybWF0IGZtdCkKKwl7CisJCXN3aXRjaCAoZm10KQorCQl7CisJCWNhc2UgYmxvY2tfZm9ybWF0OjpjRVRDMTogcmV0dXJuICJFVEMxIjsKKwkJY2FzZSBibG9ja19mb3JtYXQ6OmNCQzE6IHJldHVybiAiQkMxIjsKKwkJY2FzZSBibG9ja19mb3JtYXQ6OmNQVlJUQzFfNF9SR0I6IHJldHVybiAiUFZSVEMxXzRfUkdCIjsKKwkJY2FzZSBibG9ja19mb3JtYXQ6OmNQVlJUQzFfNF9SR0JBOiByZXR1cm4gIlBWUlRDMV80X1JHQkEiOworCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0JDNzogcmV0dXJuICJCQzciOworCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0VUQzJfUkdCQTogcmV0dXJuICJFVEMyX1JHQkEiOworCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0JDMzogcmV0dXJuICJCQzMiOworCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfNHg0OiByZXR1cm4gIkFTVENfNHg0IjsKKwkJY2FzZSBibG9ja19mb3JtYXQ6OmNBVENfUkdCOiByZXR1cm4gIkFUQ19SR0IiOworCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y1JHQkEzMjogcmV0dXJuICJSR0JBMzIiOworCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y1JHQjU2NTogcmV0dXJuICJSR0I1NjUiOworCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0JHUjU2NTogcmV0dXJuICJCR1I1NjUiOworCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y1JHQkE0NDQ0OiByZXR1cm4gIlJHQkE0NDQ0IjsKKwkJY2FzZSBibG9ja19mb3JtYXQ6OmNGWFQxX1JHQjogcmV0dXJuICJGWFQxX1JHQiI7CisJCWNhc2UgYmxvY2tfZm9ybWF0OjpjUFZSVEMyXzRfUkdCOiByZXR1cm4gIlBWUlRDMl80X1JHQiI7CisJCWNhc2UgYmxvY2tfZm9ybWF0OjpjUFZSVEMyXzRfUkdCQTogcmV0dXJuICJQVlJUQzJfNF9SR0JBIjsKKwkJY2FzZSBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19SMTE6IHJldHVybiAiRVRDMl9FQUNfUjExIjsKKwkJY2FzZSBibG9ja19mb3JtYXQ6OmNFVEMyX0VBQ19SRzExOiByZXR1cm4gIkVUQzJfRUFDX1JHMTEiOworCQlkZWZhdWx0OgorCQkJYXNzZXJ0KDApOworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc19nZXRfYmFzaXN1X3RleHR1cmVfZm9ybWF0OiBJbnZhbGlkIGZtdFxuIik7CisJCWJyZWFrOworCQl9CisJCXJldHVybiAiIjsKKwl9CisKIAljb25zdCBjaGFyKiBiYXNpc19nZXRfdGV4dHVyZV90eXBlX25hbWUoYmFzaXNfdGV4dHVyZV90eXBlIHRleF90eXBlKQogCXsKIAkJc3dpdGNoICh0ZXhfdHlwZSkKQEAgLTE2MzE3LDcgKzIxMjM1LDcgQEAKIAkJCXsKIAkJCQl1aW50OF90IHZhbHNbNV0gPSB7IDAsIDAsIDAsIDAsIDAgfTsKIAotCQkJCWNvbnN0IGludCBsaW1pdCA9IHN0ZDo6bWluKGdyb3VwX3NpemUsIG51bV92YWxzIC0gZ3JvdXBfaW5kZXggKiBncm91cF9zaXplKTsKKwkJCQljb25zdCBpbnQgbGltaXQgPSBiYXNpc3U6Om1pbmltdW0oZ3JvdXBfc2l6ZSwgbnVtX3ZhbHMgLSBncm91cF9pbmRleCAqIGdyb3VwX3NpemUpOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykKIAkJCQkJdmFsc1tpXSA9IHBTcmNfdmFsc1tncm91cF9pbmRleCAqIGdyb3VwX3NpemUgKyBpXTsKIApAQCAtMTY1MTksNyArMjE0MzcsNyBAQAogCQlpZiAoIWNvZGVzaXplKQogCQkJcmV0dXJuIDA7CiAKLQkJaWYgKChJU19CSUdfRU5ESUFOKSB8fCAoIVVTRV9VTkFMSUdORURfV09SRF9SRUFEUykgfHwgKGJpdF9vZmZzZXQgPj0gMTEyKSkKKwkJaWYgKChCQVNJU0RfSVNfQklHX0VORElBTikgfHwgKCFCQVNJU0RfVVNFX1VOQUxJR05FRF9XT1JEX1JFQURTKSB8fCAoYml0X29mZnNldCA+PSAxMTIpKQogCQl7CiAJCQljb25zdCB1aW50OF90KiBwQnl0ZXMgPSAmcEJ1ZltiaXRfb2Zmc2V0ID4+IDNVXTsKIApAQCAtMTY1NzMsNyArMjE0OTEsNyBAQAogCQkJcmV0dXJuIDA7CiAJCWFzc2VydChiaXRfb2Zmc2V0IDwgMTEyKTsKIAotCQlpZiAoKElTX0JJR19FTkRJQU4pIHx8ICghVVNFX1VOQUxJR05FRF9XT1JEX1JFQURTKSkKKwkJaWYgKChCQVNJU0RfSVNfQklHX0VORElBTikgfHwgKCFCQVNJU0RfVVNFX1VOQUxJR05FRF9XT1JEX1JFQURTKSkKIAkJewogCQkJY29uc3QgdWludDhfdCogcEJ5dGVzID0gJnBCdWZbYml0X29mZnNldCA+PiAzVV07CiAKQEAgLTE2OTAzLDExICsyMTgyMSwxNiBAQAogCQkJdWludDY0X3QgYml0czsKIAkJCQogCQkJLy8gUmVhZCB0aGUgd2VpZ2h0IGJpdHMKLQkJCWlmICgoSVNfQklHX0VORElBTikgfHwgKCFVU0VfVU5BTElHTkVEX1dPUkRfUkVBRFMpKQotCQkJCWJpdHMgPSByZWFkX2JpdHM2NChibGsubV9ieXRlcywgYml0X29mcywgc3RkOjptaW48aW50Pig2NCwgMTI4IC0gKGludCliaXRfb2ZzKSk7CisJCQlpZiAoKEJBU0lTRF9JU19CSUdfRU5ESUFOKSB8fCAoIUJBU0lTRF9VU0VfVU5BTElHTkVEX1dPUkRfUkVBRFMpKQorCQkJCWJpdHMgPSByZWFkX2JpdHM2NChibGsubV9ieXRlcywgYml0X29mcywgYmFzaXN1OjptaW5pbXVtPGludD4oNjQsIDEyOCAtIChpbnQpYml0X29mcykpOwogCQkJZWxzZQogCQkJeworI2lmZGVmIF9fRU1TQ1JJUFRFTl9fCisJCQkJYml0cyA9IGJsay5tX2R3b3Jkc1syXTsKKwkJCQliaXRzIHw9ICgoKHVpbnQ2NF90KWJsay5tX2R3b3Jkc1szXSkgPDwgMzJVKTsKKyNlbHNlCiAJCQkJYml0cyA9IGJsay5tX3F3b3Jkc1sxXTsKKyNlbmRpZgogCQkJCQogCQkJCWlmIChiaXRfb2ZzID49IDY0VSkKIAkJCQkJYml0cyA+Pj0gKGJpdF9vZnMgLSA2NFUpOwpAQCAtMTcwNjgsNyArMjE5OTEsNyBAQAogCQljb2xvcjMyIGVuZHBvaW50c1szXVsyXTsKIAogCQljb25zdCB1aW50MzJfdCB0b3RhbF9zdWJzZXRzID0gZ191YXN0Y19tb2RlX3N1YnNldHNbbW9kZV07Ci0JCWNvbnN0IHVpbnQzMl90IHRvdGFsX2NvbXBzID0gc3RkOjptaW48dWludDMyX3Q+KDRVLCBnX3Vhc3RjX21vZGVfY29tcHNbbW9kZV0pOworCQljb25zdCB1aW50MzJfdCB0b3RhbF9jb21wcyA9IGJhc2lzdTo6bWluaW11bTx1aW50MzJfdD4oNFUsIGdfdWFzdGNfbW9kZV9jb21wc1ttb2RlXSk7CiAJCWNvbnN0IHVpbnQzMl90IGVuZHBvaW50X3JhbmdlID0gZ191YXN0Y19tb2RlX2VuZHBvaW50X3Jhbmdlc1ttb2RlXTsKIAkJY29uc3QgdWludDMyX3QgdG90YWxfcGxhbmVzID0gZ191YXN0Y19tb2RlX3BsYW5lc1ttb2RlXTsKIAkJY29uc3QgdWludDMyX3Qgd2VpZ2h0X2JpdHMgPSBnX3Vhc3RjX21vZGVfd2VpZ2h0X2JpdHNbbW9kZV07CkBAIC0xODI2NCw3ICsyMzE4Nyw3IEBACiAJCQkJCQl1aW50MzJfdCBzZWxzWzRdID0geyAwLDAsMCwwIH07CiAKIAkJCQkJCWNvbnN0IHVpbnQzMl90IE4gPSA0OwotCQkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN0ZDo6bWluPHVpbnQzMl90PihOLCAoMjU2IC0gYykpOyBpKyspCisJCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmFzaXN1OjptaW5pbXVtPHVpbnQzMl90PihOLCAoMjU2IC0gYykpOyBpKyspCiAJCQkJCQl7CiAJCQkJCQkJdWludDMyX3QgYmVzdF9zZWxfZSA9IFVJTlQzMl9NQVg7CiAJCQkJCQkJdWludDMyX3QgYmVzdF9zZWwgPSAwOwpAQCAtMTgzNDQsNyArMjMyNjcsNyBAQAogCQkJCQkJdWludDMyX3Qgc2Vsc1s0XSA9IHsgMCwwLDAsMCB9OwogCiAJCQkJCQljb25zdCB1aW50MzJfdCBOID0gMTsKLQkJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdGQ6Om1pbjx1aW50MzJfdD4oTiwgKDI1NiAtIGMpKTsgaSsrKQorCQkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJhc2lzdTo6bWluaW11bTx1aW50MzJfdD4oTiwgKDI1NiAtIGMpKTsgaSsrKQogCQkJCQkJewogCQkJCQkJCXVpbnQzMl90IGJlc3Rfc2VsX2UgPSBVSU5UMzJfTUFYOwogCQkJCQkJCXVpbnQzMl90IGJlc3Rfc2VsID0gMDsKQEAgLTE4NDQ4LDggKzIzMzcxLDggQEAKIAkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQogCQkJCXsKIAkJCQkJY29uc3QgdWludDMyX3QgdiA9IGJsb2NrX3lbeV1beF07Ci0JCQkJCWxvd1swXSA9IHN0ZDo6bWluKGxvd1swXSwgdik7Ci0JCQkJCWhpZ2hbMF0gPSBzdGQ6Om1heChoaWdoWzBdLCB2KTsKKwkJCQkJbG93WzBdID0gYmFzaXN1OjptaW5pbXVtKGxvd1swXSwgdik7CisJCQkJCWhpZ2hbMF0gPSBiYXNpc3U6Om1heGltdW0oaGlnaFswXSwgdik7CiAJCQkJfQogCQkJfQogCQkJZm9yICh1aW50MzJfdCB5ID0gMjsgeSA8IDQ7IHkrKykKQEAgLTE4NDU3LDggKzIzMzgwLDggQEAKIAkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQogCQkJCXsKIAkJCQkJY29uc3QgdWludDMyX3QgdiA9IGJsb2NrX3lbeV1beF07Ci0JCQkJCWxvd1sxXSA9IHN0ZDo6bWluKGxvd1sxXSwgdik7Ci0JCQkJCWhpZ2hbMV0gPSBzdGQ6Om1heChoaWdoWzFdLCB2KTsKKwkJCQkJbG93WzFdID0gYmFzaXN1OjptaW5pbXVtKGxvd1sxXSwgdik7CisJCQkJCWhpZ2hbMV0gPSBiYXNpc3U6Om1heGltdW0oaGlnaFsxXSwgdik7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xODQ2OSw4ICsyMzM5Miw4IEBACiAJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDI7IHgrKykKIAkJCQl7CiAJCQkJCWNvbnN0IHVpbnQzMl90IHYgPSBibG9ja195W3ldW3hdOwotCQkJCQlsb3dbMF0gPSBzdGQ6Om1pbihsb3dbMF0sIHYpOwotCQkJCQloaWdoWzBdID0gc3RkOjptYXgoaGlnaFswXSwgdik7CisJCQkJCWxvd1swXSA9IGJhc2lzdTo6bWluaW11bShsb3dbMF0sIHYpOworCQkJCQloaWdoWzBdID0gYmFzaXN1OjptYXhpbXVtKGhpZ2hbMF0sIHYpOwogCQkJCX0KIAkJCX0KIAkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCkBAIC0xODQ3OCw4ICsyMzQwMSw4IEBACiAJCQkJZm9yICh1aW50MzJfdCB4ID0gMjsgeCA8IDQ7IHgrKykKIAkJCQl7CiAJCQkJCWNvbnN0IHVpbnQzMl90IHYgPSBibG9ja195W3ldW3hdOwotCQkJCQlsb3dbMV0gPSBzdGQ6Om1pbihsb3dbMV0sIHYpOwotCQkJCQloaWdoWzFdID0gc3RkOjptYXgoaGlnaFsxXSwgdik7CisJCQkJCWxvd1sxXSA9IGJhc2lzdTo6bWluaW11bShsb3dbMV0sIHYpOworCQkJCQloaWdoWzFdID0gYmFzaXN1OjptYXhpbXVtKGhpZ2hbMV0sIHYpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTg3MzksMTAgKzIzNjYyLDEwIEBACiAJCQkJaWYgKChpbnRlbl90YWJsZV9tYXNrICYgKDEgPDwgaW50ZW4pKSA9PSAwKQogCQkJCQljb250aW51ZTsKIAotCQkJCWNvbnN0IGludCB0MCA9IHN0ZDo6bWF4KGxvd19saW1pdCwgZ19ldGMxX2ludGVuX3RhYmxlc1tpbnRlbl1bMF0pOwotCQkJCWNvbnN0IGludCB0MSA9IHN0ZDo6bWF4KGxvd19saW1pdCwgZ19ldGMxX2ludGVuX3RhYmxlc1tpbnRlbl1bMV0pOwotCQkJCWNvbnN0IGludCB0MiA9IHN0ZDo6bWluKGhpZ2hfbGltaXQsIGdfZXRjMV9pbnRlbl90YWJsZXNbaW50ZW5dWzJdKTsKLQkJCQljb25zdCBpbnQgdDMgPSBzdGQ6Om1pbihoaWdoX2xpbWl0LCBnX2V0YzFfaW50ZW5fdGFibGVzW2ludGVuXVszXSk7CisJCQkJY29uc3QgaW50IHQwID0gYmFzaXN1OjptYXhpbXVtKGxvd19saW1pdCwgZ19ldGMxX2ludGVuX3RhYmxlc1tpbnRlbl1bMF0pOworCQkJCWNvbnN0IGludCB0MSA9IGJhc2lzdTo6bWF4aW11bShsb3dfbGltaXQsIGdfZXRjMV9pbnRlbl90YWJsZXNbaW50ZW5dWzFdKTsKKwkJCQljb25zdCBpbnQgdDIgPSBiYXNpc3U6Om1pbmltdW0oaGlnaF9saW1pdCwgZ19ldGMxX2ludGVuX3RhYmxlc1tpbnRlbl1bMl0pOworCQkJCWNvbnN0IGludCB0MyA9IGJhc2lzdTo6bWluaW11bShoaWdoX2xpbWl0LCBnX2V0YzFfaW50ZW5fdGFibGVzW2ludGVuXVszXSk7CiAJCQkJYXNzZXJ0KCh0MCA8PSB0MSkgJiYgKHQxIDw9IHQyKSAmJiAodDIgPD0gdDMpKTsKIAogCQkJCWNvbnN0IGludCB0dls0XSA9IHsgdDIsIHQzLCB0MSwgdDAgfTsKQEAgLTE4OTYwLDggKzIzODgzLDggQEAKIAkJdWludDMyX3QgbWluX2EgPSAyNTUsIG1heF9hID0gMDsKIAkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspCiAJCXsKLQkJCW1pbl9hID0gc3RkOjptaW48dWludDMyX3Q+KG1pbl9hLCBwU3JjX3BpeGVsc1tpXS5hKTsKLQkJCW1heF9hID0gc3RkOjptYXg8dWludDMyX3Q+KG1heF9hLCBwU3JjX3BpeGVsc1tpXS5hKTsKKwkJCW1pbl9hID0gYmFzaXN1OjptaW5pbXVtPHVpbnQzMl90PihtaW5fYSwgcFNyY19waXhlbHNbaV0uYSk7CisJCQltYXhfYSA9IGJhc2lzdTo6bWF4aW11bTx1aW50MzJfdD4obWF4X2EsIHBTcmNfcGl4ZWxzW2ldLmEpOwogCQl9CiAKIAkJaWYgKG1pbl9hID09IG1heF9hKQpAQCAtMTkwNTksMjQgKzIzOTgyLDI0IEBACiAJCX0KIAogCQl7Ci0JCQl1aW50MzJfdCB2MCA9IHBQaXhlbHNbNCAqIHN0cmlkZV07IG1pbjBfdiA9IHN0ZDo6bWluKG1pbjBfdiwgdjApOyBtYXgwX3YgPSBzdGQ6Om1heChtYXgwX3YsIHYwKTsKLQkJCXVpbnQzMl90IHYxID0gcFBpeGVsc1s1ICogc3RyaWRlXTsgbWluMV92ID0gc3RkOjptaW4obWluMV92LCB2MSk7IG1heDFfdiA9IHN0ZDo6bWF4KG1heDFfdiwgdjEpOwotCQkJdWludDMyX3QgdjIgPSBwUGl4ZWxzWzYgKiBzdHJpZGVdOyBtaW4yX3YgPSBzdGQ6Om1pbihtaW4yX3YsIHYyKTsgbWF4Ml92ID0gc3RkOjptYXgobWF4Ml92LCB2Mik7Ci0JCQl1aW50MzJfdCB2MyA9IHBQaXhlbHNbNyAqIHN0cmlkZV07IG1pbjNfdiA9IHN0ZDo6bWluKG1pbjNfdiwgdjMpOyBtYXgzX3YgPSBzdGQ6Om1heChtYXgzX3YsIHYzKTsKKwkJCXVpbnQzMl90IHYwID0gcFBpeGVsc1s0ICogc3RyaWRlXTsgbWluMF92ID0gYmFzaXN1OjptaW5pbXVtKG1pbjBfdiwgdjApOyBtYXgwX3YgPSBiYXNpc3U6Om1heGltdW0obWF4MF92LCB2MCk7CisJCQl1aW50MzJfdCB2MSA9IHBQaXhlbHNbNSAqIHN0cmlkZV07IG1pbjFfdiA9IGJhc2lzdTo6bWluaW11bShtaW4xX3YsIHYxKTsgbWF4MV92ID0gYmFzaXN1OjptYXhpbXVtKG1heDFfdiwgdjEpOworCQkJdWludDMyX3QgdjIgPSBwUGl4ZWxzWzYgKiBzdHJpZGVdOyBtaW4yX3YgPSBiYXNpc3U6Om1pbmltdW0obWluMl92LCB2Mik7IG1heDJfdiA9IGJhc2lzdTo6bWF4aW11bShtYXgyX3YsIHYyKTsKKwkJCXVpbnQzMl90IHYzID0gcFBpeGVsc1s3ICogc3RyaWRlXTsgbWluM192ID0gYmFzaXN1OjptaW5pbXVtKG1pbjNfdiwgdjMpOyBtYXgzX3YgPSBiYXNpc3U6Om1heGltdW0obWF4M192LCB2Myk7CiAJCX0KIAogCQl7Ci0JCQl1aW50MzJfdCB2MCA9IHBQaXhlbHNbOCAqIHN0cmlkZV07IG1pbjBfdiA9IHN0ZDo6bWluKG1pbjBfdiwgdjApOyBtYXgwX3YgPSBzdGQ6Om1heChtYXgwX3YsIHYwKTsKLQkJCXVpbnQzMl90IHYxID0gcFBpeGVsc1s5ICogc3RyaWRlXTsgbWluMV92ID0gc3RkOjptaW4obWluMV92LCB2MSk7IG1heDFfdiA9IHN0ZDo6bWF4KG1heDFfdiwgdjEpOwotCQkJdWludDMyX3QgdjIgPSBwUGl4ZWxzWzEwICogc3RyaWRlXTsgbWluMl92ID0gc3RkOjptaW4obWluMl92LCB2Mik7IG1heDJfdiA9IHN0ZDo6bWF4KG1heDJfdiwgdjIpOwotCQkJdWludDMyX3QgdjMgPSBwUGl4ZWxzWzExICogc3RyaWRlXTsgbWluM192ID0gc3RkOjptaW4obWluM192LCB2Myk7IG1heDNfdiA9IHN0ZDo6bWF4KG1heDNfdiwgdjMpOworCQkJdWludDMyX3QgdjAgPSBwUGl4ZWxzWzggKiBzdHJpZGVdOyBtaW4wX3YgPSBiYXNpc3U6Om1pbmltdW0obWluMF92LCB2MCk7IG1heDBfdiA9IGJhc2lzdTo6bWF4aW11bShtYXgwX3YsIHYwKTsKKwkJCXVpbnQzMl90IHYxID0gcFBpeGVsc1s5ICogc3RyaWRlXTsgbWluMV92ID0gYmFzaXN1OjptaW5pbXVtKG1pbjFfdiwgdjEpOyBtYXgxX3YgPSBiYXNpc3U6Om1heGltdW0obWF4MV92LCB2MSk7CisJCQl1aW50MzJfdCB2MiA9IHBQaXhlbHNbMTAgKiBzdHJpZGVdOyBtaW4yX3YgPSBiYXNpc3U6Om1pbmltdW0obWluMl92LCB2Mik7IG1heDJfdiA9IGJhc2lzdTo6bWF4aW11bShtYXgyX3YsIHYyKTsKKwkJCXVpbnQzMl90IHYzID0gcFBpeGVsc1sxMSAqIHN0cmlkZV07IG1pbjNfdiA9IGJhc2lzdTo6bWluaW11bShtaW4zX3YsIHYzKTsgbWF4M192ID0gYmFzaXN1OjptYXhpbXVtKG1heDNfdiwgdjMpOwogCQl9CiAKIAkJewotCQkJdWludDMyX3QgdjAgPSBwUGl4ZWxzWzEyICogc3RyaWRlXTsgbWluMF92ID0gc3RkOjptaW4obWluMF92LCB2MCk7IG1heDBfdiA9IHN0ZDo6bWF4KG1heDBfdiwgdjApOwotCQkJdWludDMyX3QgdjEgPSBwUGl4ZWxzWzEzICogc3RyaWRlXTsgbWluMV92ID0gc3RkOjptaW4obWluMV92LCB2MSk7IG1heDFfdiA9IHN0ZDo6bWF4KG1heDFfdiwgdjEpOwotCQkJdWludDMyX3QgdjIgPSBwUGl4ZWxzWzE0ICogc3RyaWRlXTsgbWluMl92ID0gc3RkOjptaW4obWluMl92LCB2Mik7IG1heDJfdiA9IHN0ZDo6bWF4KG1heDJfdiwgdjIpOwotCQkJdWludDMyX3QgdjMgPSBwUGl4ZWxzWzE1ICogc3RyaWRlXTsgbWluM192ID0gc3RkOjptaW4obWluM192LCB2Myk7IG1heDNfdiA9IHN0ZDo6bWF4KG1heDNfdiwgdjMpOworCQkJdWludDMyX3QgdjAgPSBwUGl4ZWxzWzEyICogc3RyaWRlXTsgbWluMF92ID0gYmFzaXN1OjptaW5pbXVtKG1pbjBfdiwgdjApOyBtYXgwX3YgPSBiYXNpc3U6Om1heGltdW0obWF4MF92LCB2MCk7CisJCQl1aW50MzJfdCB2MSA9IHBQaXhlbHNbMTMgKiBzdHJpZGVdOyBtaW4xX3YgPSBiYXNpc3U6Om1pbmltdW0obWluMV92LCB2MSk7IG1heDFfdiA9IGJhc2lzdTo6bWF4aW11bShtYXgxX3YsIHYxKTsKKwkJCXVpbnQzMl90IHYyID0gcFBpeGVsc1sxNCAqIHN0cmlkZV07IG1pbjJfdiA9IGJhc2lzdTo6bWluaW11bShtaW4yX3YsIHYyKTsgbWF4Ml92ID0gYmFzaXN1OjptYXhpbXVtKG1heDJfdiwgdjIpOworCQkJdWludDMyX3QgdjMgPSBwUGl4ZWxzWzE1ICogc3RyaWRlXTsgbWluM192ID0gYmFzaXN1OjptaW5pbXVtKG1pbjNfdiwgdjMpOyBtYXgzX3YgPSBiYXNpc3U6Om1heGltdW0obWF4M192LCB2Myk7CiAJCX0KIAogCQljb25zdCB1aW50MzJfdCBtaW5fdiA9IGJhc2lzdTo6bWluaW11bShtaW4wX3YsIG1pbjFfdiwgbWluMl92LCBtaW4zX3YpOwpAQCAtMTk0MDEsMTIgKzI0MzI0LDE0IEBACiAJCQlmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgMTY7IGkrKykKIAkJCXsKIAkJCQljb25zdCBpbnQgciA9IHBTcmNfcGl4ZWxzW2ldLnIsIGcgPSBwU3JjX3BpeGVsc1tpXS5nLCBiID0gcFNyY19waXhlbHNbaV0uYjsKLQkJCQltYXhfciA9IHN0ZDo6bWF4KG1heF9yLCByKTsgbWF4X2cgPSBzdGQ6Om1heChtYXhfZywgZyk7IG1heF9iID0gc3RkOjptYXgobWF4X2IsIGIpOwotCQkJCW1pbl9yID0gc3RkOjptaW4obWluX3IsIHIpOyBtaW5fZyA9IHN0ZDo6bWluKG1pbl9nLCBnKTsgbWluX2IgPSBzdGQ6Om1pbihtaW5fYiwgYik7CisJCQkJbWF4X3IgPSBiYXNpc3U6Om1heGltdW0obWF4X3IsIHIpOyBtYXhfZyA9IGJhc2lzdTo6bWF4aW11bShtYXhfZywgZyk7IG1heF9iID0gYmFzaXN1OjptYXhpbXVtKG1heF9iLCBiKTsKKwkJCQltaW5fciA9IGJhc2lzdTo6bWluaW11bShtaW5fciwgcik7IG1pbl9nID0gYmFzaXN1OjptaW5pbXVtKG1pbl9nLCBnKTsgbWluX2IgPSBiYXNpc3U6Om1pbmltdW0obWluX2IsIGIpOwogCQkJCXRvdGFsX3IgKz0gcjsgdG90YWxfZyArPSBnOyB0b3RhbF9iICs9IGI7CiAJCQl9CiAKLQkJCWF2Z19yID0gKHRvdGFsX3IgKyA4KSA+PiA0LCBhdmdfZyA9ICh0b3RhbF9nICsgOCkgPj4gNCwgYXZnX2IgPSAodG90YWxfYiArIDgpID4+IDQ7CisJCQlhdmdfciA9ICh0b3RhbF9yICsgOCkgPj4gNDsKKwkJCWF2Z19nID0gKHRvdGFsX2cgKyA4KSA+PiA0OworCQkJYXZnX2IgPSAodG90YWxfYiArIDgpID4+IDQ7CiAKIAkJCWludCBpY292WzZdID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CiAJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKQEAgLTE5NTAyLDcgKzI0NDI3LDkgQEAKIAkJCQkJCXRvdGFsX2IgKz0gcFNyY19waXhlbHNbaV0uYjsKIAkJCQkJfQogCi0JCQkJCWF2Z19yID0gKHRvdGFsX3IgKyA4KSA+PiA0LCBhdmdfZyA9ICh0b3RhbF9nICsgOCkgPj4gNCwgYXZnX2IgPSAodG90YWxfYiArIDgpID4+IDQ7CisJCQkJCWF2Z19yID0gKHRvdGFsX3IgKyA4KSA+PiA0OworCQkJCQlhdmdfZyA9ICh0b3RhbF9nICsgOCkgPj4gNDsKKwkJCQkJYXZnX2IgPSAodG90YWxfYiArIDgpID4+IDQ7CiAJCQkJfQogCiAJCQkJLy8gQWxsIHNlbGVjdG9ycyBlcXVhbCAtIHRyZWF0IGl0IGFzIGEgc29saWQgYmxvY2sgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSBlcXVhbCBvciBiZXR0ZXIuCkBAIC0xOTYyOSw4ICsyNDU1Niw4IEBACiAJCQl7CiAJCQkJY29uc3QgaW50IHIgPSBwU3JjX3BpeGVsc1tpXS5yLCBnID0gcFNyY19waXhlbHNbaV0uZywgYiA9IHBTcmNfcGl4ZWxzW2ldLmI7CiAJCQkJZ3JheXNjYWxlX2ZsYWcgJj0gKChyID09IGcpICYmIChyID09IGIpKTsKLQkJCQltYXhfciA9IHN0ZDo6bWF4KG1heF9yLCByKTsgbWF4X2cgPSBzdGQ6Om1heChtYXhfZywgZyk7IG1heF9iID0gc3RkOjptYXgobWF4X2IsIGIpOwotCQkJCW1pbl9yID0gc3RkOjptaW4obWluX3IsIHIpOyBtaW5fZyA9IHN0ZDo6bWluKG1pbl9nLCBnKTsgbWluX2IgPSBzdGQ6Om1pbihtaW5fYiwgYik7CisJCQkJbWF4X3IgPSBiYXNpc3U6Om1heGltdW0obWF4X3IsIHIpOyBtYXhfZyA9IGJhc2lzdTo6bWF4aW11bShtYXhfZywgZyk7IG1heF9iID0gYmFzaXN1OjptYXhpbXVtKG1heF9iLCBiKTsKKwkJCQltaW5fciA9IGJhc2lzdTo6bWluaW11bShtaW5fciwgcik7IG1pbl9nID0gYmFzaXN1OjptaW5pbXVtKG1pbl9nLCBnKTsgbWluX2IgPSBiYXNpc3U6Om1pbmltdW0obWluX2IsIGIpOwogCQkJCXRvdGFsX3IgKz0gcjsgdG90YWxfZyArPSBnOyB0b3RhbF9iICs9IGI7CiAJCQl9CiAJCQkJCQkKQEAgLTE5NjUzLDcgKzI0NTgwLDkgQEAKIAkJCX0KIAkJCWVsc2UKIAkJCXsKLQkJCQlhdmdfciA9ICh0b3RhbF9yICsgOCkgPj4gNCwgYXZnX2cgPSAodG90YWxfZyArIDgpID4+IDQsIGF2Z19iID0gKHRvdGFsX2IgKyA4KSA+PiA0OworCQkJCWF2Z19yID0gKHRvdGFsX3IgKyA4KSA+PiA0OworCQkJCWF2Z19nID0gKHRvdGFsX2cgKyA4KSA+PiA0OworCQkJCWF2Z19iID0gKHRvdGFsX2IgKyA4KSA+PiA0OwogCiAJCQkJLy8gRmluZCB0aGUgc2hvcnRlc3QgdmVjdG9yIGZyb20gYSBBQUJCIGNvcm5lciB0byB0aGUgYmxvY2sncyBhdmVyYWdlIGNvbG9yLgogCQkJCS8vIFRoaXMgaXMgdG8gaGVscCBhdm9pZCBvdXRsaWVycy4KQEAgLTE5NjY1LDI1ICsyNDU5NCwyNSBAQAogCiAJCQkJdWludDMyX3QgbWluX2QwID0gKGRpc3RbMF1bMF0gKyBkaXN0WzFdWzBdICsgZGlzdFsyXVswXSk7CiAJCQkJdWludDMyX3QgZDQgPSAoZGlzdFswXVswXSArIGRpc3RbMV1bMF0gKyBkaXN0WzJdWzFdKSB8IDQ7Ci0JCQkJbWluX2QwID0gc3RkOjptaW4obWluX2QwLCBkNCk7CisJCQkJbWluX2QwID0gYmFzaXN1OjptaW5pbXVtKG1pbl9kMCwgZDQpOwogCiAJCQkJdWludDMyX3QgbWluX2QxID0gKGRpc3RbMF1bMV0gKyBkaXN0WzFdWzBdICsgZGlzdFsyXVswXSkgfCAxOwogCQkJCXVpbnQzMl90IGQ1ID0gKGRpc3RbMF1bMV0gKyBkaXN0WzFdWzBdICsgZGlzdFsyXVsxXSkgfCA1OwotCQkJCW1pbl9kMSA9IHN0ZDo6bWluKG1pbl9kMSwgZDUpOworCQkJCW1pbl9kMSA9IGJhc2lzdTo6bWluaW11bShtaW5fZDEsIGQ1KTsKIAogCQkJCXVpbnQzMl90IGQyID0gKGRpc3RbMF1bMF0gKyBkaXN0WzFdWzFdICsgZGlzdFsyXVswXSkgfCAyOwotCQkJCW1pbl9kMCA9IHN0ZDo6bWluKG1pbl9kMCwgZDIpOworCQkJCW1pbl9kMCA9IGJhc2lzdTo6bWluaW11bShtaW5fZDAsIGQyKTsKIAogCQkJCXVpbnQzMl90IGQzID0gKGRpc3RbMF1bMV0gKyBkaXN0WzFdWzFdICsgZGlzdFsyXVswXSkgfCAzOwotCQkJCW1pbl9kMSA9IHN0ZDo6bWluKG1pbl9kMSwgZDMpOworCQkJCW1pbl9kMSA9IGJhc2lzdTo6bWluaW11bShtaW5fZDEsIGQzKTsKIAogCQkJCXVpbnQzMl90IGQ2ID0gKGRpc3RbMF1bMF0gKyBkaXN0WzFdWzFdICsgZGlzdFsyXVsxXSkgfCA2OwotCQkJCW1pbl9kMCA9IHN0ZDo6bWluKG1pbl9kMCwgZDYpOworCQkJCW1pbl9kMCA9IGJhc2lzdTo6bWluaW11bShtaW5fZDAsIGQ2KTsKIAogCQkJCXVpbnQzMl90IGQ3ID0gKGRpc3RbMF1bMV0gKyBkaXN0WzFdWzFdICsgZGlzdFsyXVsxXSkgfCA3OwotCQkJCW1pbl9kMSA9IHN0ZDo6bWluKG1pbl9kMSwgZDcpOworCQkJCW1pbl9kMSA9IGJhc2lzdTo6bWluaW11bShtaW5fZDEsIGQ3KTsKIAotCQkJCXVpbnQzMl90IG1pbl9kID0gc3RkOjptaW4obWluX2QwLCBtaW5fZDEpOworCQkJCXVpbnQzMl90IG1pbl9kID0gYmFzaXN1OjptaW5pbXVtKG1pbl9kMCwgbWluX2QxKTsKIAkJCQl1aW50MzJfdCBiZXN0X2kgPSBtaW5fZCAmIDc7CiAKIAkJCQlpbnQgZGVsdGFfciA9IChiZXN0X2kgJiAxKSA/IChtYXhfciAtIGF2Z19yKSA6IChhdmdfciAtIG1pbl9yKTsKQEAgLTE5NzYzLDIwICsyNDY5MiwyOSBAQAogCQkJCQkJfQogCQkJCQl9CiAKLQkJCQkJbG93X2MgPSBsb3dfZG90MCAmIDE1LCBoaWdoX2MgPSB+aGlnaF9kb3QwICYgMTU7CisJCQkJCWxvd19jID0gbG93X2RvdDAgJiAxNTsKKwkJCQkJaGlnaF9jID0gfmhpZ2hfZG90MCAmIDE1OwogCQkJCQl1aW50MzJfdCByID0gKGhpZ2hfZG90MCAmIH4xNSkgLSAobG93X2RvdDAgJiB+MTUpOwogCiAJCQkJCXVpbnQzMl90IHRyID0gKGhpZ2hfZG90MSAmIH4xNSkgLSAobG93X2RvdDEgJiB+MTUpOwotCQkJCQlpZiAodHIgPiByKQotCQkJCQkJbG93X2MgPSBsb3dfZG90MSAmIDE1LCBoaWdoX2MgPSB+aGlnaF9kb3QxICYgMTUsIHIgPSB0cjsKKwkJCQkJaWYgKHRyID4gcikgeworCQkJCQkJbG93X2MgPSBsb3dfZG90MSAmIDE1OworCQkJCQkJaGlnaF9jID0gfmhpZ2hfZG90MSAmIDE1OworCQkJCQkJciA9IHRyOworCQkJCQl9CiAKIAkJCQkJdHIgPSAoaGlnaF9kb3QyICYgfjE1KSAtIChsb3dfZG90MiAmIH4xNSk7Ci0JCQkJCWlmICh0ciA+IHIpCi0JCQkJCQlsb3dfYyA9IGxvd19kb3QyICYgMTUsIGhpZ2hfYyA9IH5oaWdoX2RvdDIgJiAxNSwgciA9IHRyOworCQkJCQlpZiAodHIgPiByKSB7CisJCQkJCQlsb3dfYyA9IGxvd19kb3QyICYgMTU7CisJCQkJCQloaWdoX2MgPSB+aGlnaF9kb3QyICYgMTU7CisJCQkJCQlyID0gdHI7CisJCQkJCX0KIAogCQkJCQl0ciA9IChoaWdoX2RvdDMgJiB+MTUpIC0gKGxvd19kb3QzICYgfjE1KTsKLQkJCQkJaWYgKHRyID4gcikKLQkJCQkJCWxvd19jID0gbG93X2RvdDMgJiAxNSwgaGlnaF9jID0gfmhpZ2hfZG90MyAmIDE1OworCQkJCQlpZiAodHIgPiByKSB7CisJCQkJCQlsb3dfYyA9IGxvd19kb3QzICYgMTU7CisJCQkJCQloaWdoX2MgPSB+aGlnaF9kb3QzICYgMTU7CisJCQkJCX0KIAkJCQl9CiAKIAkJCQlsciA9IHRvXzUocFNyY19waXhlbHNbbG93X2NdLnIpOwpAQCAtMTk4MTAsNyArMjQ3NDgsOSBAQAogCQkJCQkJdG90YWxfYiArPSBwU3JjX3BpeGVsc1tpXS5iOwogCQkJCQl9CiAKLQkJCQkJYXZnX3IgPSAodG90YWxfciArIDgpID4+IDQsIGF2Z19nID0gKHRvdGFsX2cgKyA4KSA+PiA0LCBhdmdfYiA9ICh0b3RhbF9iICsgOCkgPj4gNDsKKwkJCQkJYXZnX3IgPSAodG90YWxfciArIDgpID4+IDQ7CisJCQkJCWF2Z19nID0gKHRvdGFsX2cgKyA4KSA+PiA0OworCQkJCQlhdmdfYiA9ICh0b3RhbF9iICsgOCkgPj4gNDsKIAkJCQl9CiAKIAkJCQkvLyBBbGwgc2VsZWN0b3JzIGVxdWFsIC0gdHJlYXQgaXQgYXMgYSBzb2xpZCBibG9jayB3aGljaCBzaG91bGQgYWx3YXlzIGJlIGVxdWFsIG9yIGJldHRlci4KQEAgLTIwMjU3LDEwICsyNTE5NywxMCBAQAogCQkJCQljb25zdCBpbnQgdjIgPSBjbGFtcDI1NShtdWxbMl0gKiBnX2VhY19tb2RpZmllcl90YWJsZVtUMl1bc10gKyBiYXNlWzJdKTsKIAkJCQkJY29uc3QgaW50IHYzID0gY2xhbXAyNTUobXVsWzNdICogZ19lYWNfbW9kaWZpZXJfdGFibGVbVDNdW3NdICsgYmFzZVszXSk7CiAKLQkJCQkJbDAgPSBzdGQ6Om1pbihsMCwgKGJhc2lzdTo6aWFicyh2MCAtIGEpIDw8IDMpIHwgcyk7Ci0JCQkJCWwxID0gc3RkOjptaW4obDEsIChiYXNpc3U6OmlhYnModjEgLSBhKSA8PCAzKSB8IHMpOwotCQkJCQlsMiA9IHN0ZDo6bWluKGwyLCAoYmFzaXN1OjppYWJzKHYyIC0gYSkgPDwgMykgfCBzKTsKLQkJCQkJbDMgPSBzdGQ6Om1pbihsMywgKGJhc2lzdTo6aWFicyh2MyAtIGEpIDw8IDMpIHwgcyk7CisJCQkJCWwwID0gYmFzaXN1OjptaW5pbXVtKGwwLCAoYmFzaXN1OjppYWJzKHYwIC0gYSkgPDwgMykgfCBzKTsKKwkJCQkJbDEgPSBiYXNpc3U6Om1pbmltdW0obDEsIChiYXNpc3U6OmlhYnModjEgLSBhKSA8PCAzKSB8IHMpOworCQkJCQlsMiA9IGJhc2lzdTo6bWluaW11bShsMiwgKGJhc2lzdTo6aWFicyh2MiAtIGEpIDw8IDMpIHwgcyk7CisJCQkJCWwzID0gYmFzaXN1OjptaW5pbXVtKGwzLCAoYmFzaXN1OjppYWJzKHYzIC0gYSkgPDwgMykgfCBzKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlIGlmIChtdWxfb3IgPT0gMSkKQEAgLTIwMjc0LDEwICsyNTIxNCwxMCBAQAogCQkJCQljb25zdCBpbnQgdjIgPSBnX2VhY19tb2RpZmllcl90YWJsZVtUMl1bc10gKyBhMjsKIAkJCQkJY29uc3QgaW50IHYzID0gZ19lYWNfbW9kaWZpZXJfdGFibGVbVDNdW3NdICsgYTM7CiAKLQkJCQkJbDAgPSBzdGQ6Om1pbihsMCwgKGJhc2lzdTo6aWFicyh2MCkgPDwgMykgfCBzKTsKLQkJCQkJbDEgPSBzdGQ6Om1pbihsMSwgKGJhc2lzdTo6aWFicyh2MSkgPDwgMykgfCBzKTsKLQkJCQkJbDIgPSBzdGQ6Om1pbihsMiwgKGJhc2lzdTo6aWFicyh2MikgPDwgMykgfCBzKTsKLQkJCQkJbDMgPSBzdGQ6Om1pbihsMywgKGJhc2lzdTo6aWFicyh2MykgPDwgMykgfCBzKTsKKwkJCQkJbDAgPSBiYXNpc3U6Om1pbmltdW0obDAsIChiYXNpc3U6OmlhYnModjApIDw8IDMpIHwgcyk7CisJCQkJCWwxID0gYmFzaXN1OjptaW5pbXVtKGwxLCAoYmFzaXN1OjppYWJzKHYxKSA8PCAzKSB8IHMpOworCQkJCQlsMiA9IGJhc2lzdTo6bWluaW11bShsMiwgKGJhc2lzdTo6aWFicyh2MikgPDwgMykgfCBzKTsKKwkJCQkJbDMgPSBiYXNpc3U6Om1pbmltdW0obDMsIChiYXNpc3U6OmlhYnModjMpIDw8IDMpIHwgcyk7CiAJCQkJfQogCQkJfQogCQkJZWxzZQpAQCAtMjAyOTEsMTAgKzI1MjMxLDEwIEBACiAJCQkJCWNvbnN0IGludCB2MiA9IG11bFsyXSAqIGdfZWFjX21vZGlmaWVyX3RhYmxlW1QyXVtzXSArIGEyOwogCQkJCQljb25zdCBpbnQgdjMgPSBtdWxbM10gKiBnX2VhY19tb2RpZmllcl90YWJsZVtUM11bc10gKyBhMzsKIAotCQkJCQlsMCA9IHN0ZDo6bWluKGwwLCAoYmFzaXN1OjppYWJzKHYwKSA8PCAzKSB8IHMpOwotCQkJCQlsMSA9IHN0ZDo6bWluKGwxLCAoYmFzaXN1OjppYWJzKHYxKSA8PCAzKSB8IHMpOwotCQkJCQlsMiA9IHN0ZDo6bWluKGwyLCAoYmFzaXN1OjppYWJzKHYyKSA8PCAzKSB8IHMpOwotCQkJCQlsMyA9IHN0ZDo6bWluKGwzLCAoYmFzaXN1OjppYWJzKHYzKSA8PCAzKSB8IHMpOworCQkJCQlsMCA9IGJhc2lzdTo6bWluaW11bShsMCwgKGJhc2lzdTo6aWFicyh2MCkgPDwgMykgfCBzKTsKKwkJCQkJbDEgPSBiYXNpc3U6Om1pbmltdW0obDEsIChiYXNpc3U6OmlhYnModjEpIDw8IDMpIHwgcyk7CisJCQkJCWwyID0gYmFzaXN1OjptaW5pbXVtKGwyLCAoYmFzaXN1OjppYWJzKHYyKSA8PCAzKSB8IHMpOworCQkJCQlsMyA9IGJhc2lzdTo6bWluaW11bShsMywgKGJhc2lzdTo6aWFicyh2MykgPDwgMykgfCBzKTsKIAkJCQl9CiAJCQl9CiAKQEAgLTIwNDEzLDEzICsyNTM1MywxMyBAQAogCQkJCWVsc2UKIAkJCQl7CiAJCQkJCXVpbnQzMl90IGwgPSBiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVswXSArIGIpIC0gYSkgPDwgMzsKLQkJCQkJbCA9IHN0ZDo6bWluKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVsxXSArIGIpIC0gYSkgPDwgMykgfCAxKTsKLQkJCQkJbCA9IHN0ZDo6bWluKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVsyXSArIGIpIC0gYSkgPDwgMykgfCAyKTsKLQkJCQkJbCA9IHN0ZDo6bWluKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVszXSArIGIpIC0gYSkgPDwgMykgfCAzKTsKLQkJCQkJbCA9IHN0ZDo6bWluKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVs0XSArIGIpIC0gYSkgPDwgMykgfCA0KTsKLQkJCQkJbCA9IHN0ZDo6bWluKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVs1XSArIGIpIC0gYSkgPDwgMykgfCA1KTsKLQkJCQkJbCA9IHN0ZDo6bWluKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVs2XSArIGIpIC0gYSkgPDwgMykgfCA2KTsKLQkJCQkJbCA9IHN0ZDo6bWluKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVs3XSArIGIpIC0gYSkgPDwgMykgfCA3KTsKKwkJCQkJbCA9IGJhc2lzdTo6bWluaW11bShsLCAoYmFzaXN1OjppYWJzKGNsYW1wMjU1KG0gKiBwVGFibGVbMV0gKyBiKSAtIGEpIDw8IDMpIHwgMSk7CisJCQkJCWwgPSBiYXNpc3U6Om1pbmltdW0obCwgKGJhc2lzdTo6aWFicyhjbGFtcDI1NShtICogcFRhYmxlWzJdICsgYikgLSBhKSA8PCAzKSB8IDIpOworCQkJCQlsID0gYmFzaXN1OjptaW5pbXVtKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVszXSArIGIpIC0gYSkgPDwgMykgfCAzKTsKKwkJCQkJbCA9IGJhc2lzdTo6bWluaW11bShsLCAoYmFzaXN1OjppYWJzKGNsYW1wMjU1KG0gKiBwVGFibGVbNF0gKyBiKSAtIGEpIDw8IDMpIHwgNCk7CisJCQkJCWwgPSBiYXNpc3U6Om1pbmltdW0obCwgKGJhc2lzdTo6aWFicyhjbGFtcDI1NShtICogcFRhYmxlWzVdICsgYikgLSBhKSA8PCAzKSB8IDUpOworCQkJCQlsID0gYmFzaXN1OjptaW5pbXVtKGwsIChiYXNpc3U6OmlhYnMoY2xhbXAyNTUobSAqIHBUYWJsZVs2XSArIGIpIC0gYSkgPDwgMykgfCA2KTsKKwkJCQkJbCA9IGJhc2lzdTo6bWluaW11bShsLCAoYmFzaXN1OjppYWJzKGNsYW1wMjU1KG0gKiBwVGFibGVbN10gKyBiKSAtIGEpIDw8IDMpIHwgNyk7CiAKIAkJCQkJc2Vsc1t0YWJsZV1baV0gPSBsICYgNzsKIAkJCQkJdG90YWxfZXJyW3RhYmxlXSArPSBiYXNpc3U6OnNxdWFyZTx1aW50MzJfdD4obCA+PiAzKTsKQEAgLTIwODQ4LDcgKzI1Nzg4LDcgQEAKIAkJaWYgKCFiYXNpc3U6OmlzX3BvdzIod2lkdGgpIHx8ICFiYXNpc3U6OmlzX3BvdzIoaGVpZ2h0KSkKIAkJCXJldHVybiBmYWxzZTsKIAotCQlzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gdGVtcF9lbmRwb2ludHMobnVtX2Jsb2Nrc194ICogbnVtX2Jsb2Nrc195KTsKKwkJYmFzaXN1Ojp2ZWN0b3I8dWludDMyX3Q+IHRlbXBfZW5kcG9pbnRzKG51bV9ibG9ja3NfeCAqIG51bV9ibG9ja3NfeSk7CiAKIAkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IG51bV9ibG9ja3NfeTsgeSsrKQogCQl7CkBAIC0yMDg2Niw4ICsyNTgwNiw4IEBACiAJCQkJCXVpbnQzMl90IGxvd19hID0gMjU1LCBoaWdoX2EgPSAwOwogCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJCQkJewotCQkJCQkJbG93X2EgPSBzdGQ6Om1pbjx1aW50MzJfdD4obG93X2EsIGJsb2NrX3BpeGVsc1tpXS5hKTsKLQkJCQkJCWhpZ2hfYSA9IHN0ZDo6bWF4PHVpbnQzMl90PihoaWdoX2EsIGJsb2NrX3BpeGVsc1tpXS5hKTsKKwkJCQkJCWxvd19hID0gYmFzaXN1OjptaW5pbXVtPHVpbnQzMl90Pihsb3dfYSwgYmxvY2tfcGl4ZWxzW2ldLmEpOworCQkJCQkJaGlnaF9hID0gYmFzaXN1OjptYXhpbXVtPHVpbnQzMl90PihoaWdoX2EsIGJsb2NrX3BpeGVsc1tpXS5hKTsKIAkJCQkJfQogCQkJCQlsb3dfY29sb3Iuc2V0KGxvd19hLCBsb3dfYSwgbG93X2EsIDI1NSk7CiAJCQkJCWhpZ2hfY29sb3Iuc2V0KGhpZ2hfYSwgaGlnaF9hLCBoaWdoX2EsIDI1NSk7CkBAIC0yMDkwNyw3ICsyNTg0Nyw3IEBACiAJCWlmICghYmFzaXN1Ojppc19wb3cyKHdpZHRoKSB8fCAhYmFzaXN1Ojppc19wb3cyKGhlaWdodCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAKLQkJc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRlbXBfZW5kcG9pbnRzKG51bV9ibG9ja3NfeCAqIG51bV9ibG9ja3NfeSk7CisJCWJhc2lzdTo6dmVjdG9yPHVpbnQzMl90PiB0ZW1wX2VuZHBvaW50cyhudW1fYmxvY2tzX3ggKiBudW1fYmxvY2tzX3kpOwogCiAJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCBudW1fYmxvY2tzX3k7IHkrKykKIAkJewpAQCAtMjEwMzMsMTIgKzI1OTczLDg5MSBAQAogCiAjZW5kaWYgLy8gI2lmIEJBU0lTRF9TVVBQT1JUX1VBU1RDCiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vIEtUWDIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworI2lmIEJBU0lTRF9TVVBQT1JUX0tUWDIKKwljb25zdCB1aW50OF90IGdfa3R4Ml9maWxlX2lkZW50aWZpZXJbMTJdID0geyAweEFCLCAweDRCLCAweDU0LCAweDU4LCAweDIwLCAweDMyLCAweDMwLCAweEJCLCAweDBELCAweDBBLCAweDFBLCAweDBBIH07CisKKwlrdHgyX3RyYW5zY29kZXI6Omt0eDJfdHJhbnNjb2RlcigpIDoKKwkJbV9ldGMxc190cmFuc2NvZGVyKCkKKwl7CisJCWNsZWFyKCk7CisJfQorCisJdm9pZCBrdHgyX3RyYW5zY29kZXI6OmNsZWFyKCkKKwl7CisJCW1fcERhdGEgPSBudWxscHRyOworCQltX2RhdGFfc2l6ZSA9IDA7CisKKwkJbWVtc2V0KCZtX2hlYWRlciwgMCwgc2l6ZW9mKG1faGVhZGVyKSk7CisJCW1fbGV2ZWxzLmNsZWFyKCk7CisJCW1fZGZkLmNsZWFyKCk7CisJCW1fa2V5X3ZhbHVlcy5jbGVhcigpOworCQltZW1zZXQoJm1fZXRjMXNfaGVhZGVyLCAwLCBzaXplb2YobV9ldGMxc19oZWFkZXIpKTsKKwkJbV9ldGMxc19pbWFnZV9kZXNjcy5jbGVhcigpOworCQkJCQorCQltX2Zvcm1hdCA9IGJhc2lzdDo6YmFzaXNfdGV4X2Zvcm1hdDo6Y0VUQzFTOworCisJCW1fZGZkX2NvbG9yX21vZGVsID0gMDsKKwkJbV9kZmRfY29sb3JfcHJpbXMgPSBLVFgyX0RGX1BSSU1BUklFU19VTlNQRUNJRklFRDsKKwkJbV9kZmRfdHJhbnNmZXJfZnVuYyA9IDA7CisJCW1fZGZkX2ZsYWdzID0gMDsKKwkJbV9kZmRfc2FtcGxlcyA9IDA7CisJCW1fZGZkX2NoYW4wID0gS1RYMl9ERl9DSEFOTkVMX1VBU1RDX1JHQjsKKwkJbV9kZmRfY2hhbjEgPSBLVFgyX0RGX0NIQU5ORUxfVUFTVENfUkdCOworCisJCW1fZXRjMXNfdHJhbnNjb2Rlci5jbGVhcigpOworCQkJCQorCQltX2RlZl90cmFuc2NvZGVyX3N0YXRlLmNsZWFyKCk7CisJCQorCQltX2hhc19hbHBoYSA9IGZhbHNlOworCQltX2lzX3ZpZGVvID0gZmFsc2U7CisJfQorCisJYm9vbCBrdHgyX3RyYW5zY29kZXI6OmluaXQoY29uc3Qgdm9pZCogcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSkKKwl7CisJCWNsZWFyKCk7CisKKwkJaWYgKCFwRGF0YSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmluaXQ6IHBEYXRhIGlzIG51bGxwdHJcbiIpOworCQkJYXNzZXJ0KDApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKGRhdGFfc2l6ZSA8PSBzaXplb2Yoa3R4Ml9oZWFkZXIpKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogRmlsZSBpcyBpbXBvc3NpYmx5IHRvbyBzbWFsbCB0byBiZSBhIHZhbGlkIEtUWDIgZmlsZVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobWVtY21wKHBEYXRhLCBnX2t0eDJfZmlsZV9pZGVudGlmaWVyLCBzaXplb2YoZ19rdHgyX2ZpbGVfaWRlbnRpZmllcikpICE9IDApCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBLVFgyIGZpbGUgaWRlbnRpZmllciBpcyBub3QgcHJlc2VudFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQltX3BEYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwRGF0YSk7CisJCW1fZGF0YV9zaXplID0gZGF0YV9zaXplOworCisJCW1lbWNweSgmbV9oZWFkZXIsIHBEYXRhLCBzaXplb2YobV9oZWFkZXIpKTsKKworCQkvLyBXZSBvbmx5IHN1cHBvcnQgVUFTVEMgYW5kIEVUQzFTCisJCWlmIChtX2hlYWRlci5tX3ZrX2Zvcm1hdCAhPSBLVFgyX1ZLX0ZPUk1BVF9VTkRFRklORUQpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBLVFgyIGZpbGUgbXVzdCBiZSBpbiBFVEMxUyBvciBVQVNUQyBmb3JtYXRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gMy4zOiAiV2hlbiBmb3JtYXQgaXMgVktfRk9STUFUX1VOREVGSU5FRCwgdHlwZVNpemUgbXVzdCBlcXVhbCAxLiIKKwkJaWYgKG1faGVhZGVyLm1fdHlwZV9zaXplICE9IDEpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBJbnZhbGlkIHR5cGVfc2l6ZVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBXZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0IDJEIHRleHR1cmVzIChwbGFpbiwgY3ViZW1hcHBlZCwgb3IgdGV4dHVyZSBhcnJheSksIHdoaWNoIGlzIGJ5IGZhciB0aGUgbW9zdCBjb21tb24gdXNlIGNhc2UuCisJCS8vIFRoZSBCYXNpc1UgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0IDFEIG9yIDNEIHRleHR1cmVzIGF0IGFsbC4KKwkJaWYgKChtX2hlYWRlci5tX3BpeGVsX3dpZHRoIDwgMSkgfHwgKG1faGVhZGVyLm1fcGl4ZWxfaGVpZ2h0IDwgMSkgfHwgKG1faGVhZGVyLm1fcGl4ZWxfZGVwdGggPiAwKSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmluaXQ6IE9ubHkgMkQgb3IgY3ViZW1hcCB0ZXh0dXJlcyBhcmUgc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIEZhY2UgY291bnQgbXVzdCBiZSAxIG9yIDYKKwkJaWYgKChtX2hlYWRlci5tX2ZhY2VfY291bnQgIT0gMSkgJiYgKG1faGVhZGVyLm1fZmFjZV9jb3VudCAhPSA2KSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmluaXQ6IEludmFsaWQgZmFjZSBjb3VudCwgZmlsZSBpcyBjb3JydXB0ZWQgb3IgaW52YWxpZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobV9oZWFkZXIubV9mYWNlX2NvdW50ID4gMSkKKwkJeworCQkJLy8gMy40OiBNYWtlIHN1cmUgY3ViZW1hcHMgYXJlIHNxdWFyZS4KKwkJCWlmIChtX2hlYWRlci5tX3BpeGVsX3dpZHRoICE9IG1faGVhZGVyLm1fcGl4ZWxfaGVpZ2h0KQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBDdWJlbWFwIGlzIG5vdCBzcXVhcmVcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gMy43IGxldmVsQ291bnQ6ICJsZXZlbENvdW50PTAgaXMgYWxsb3dlZCwgZXhjZXB0IGZvciBibG9jay1jb21wcmVzc2VkIGZvcm1hdHMiCisJCWlmIChtX2hlYWRlci5tX2xldmVsX2NvdW50IDwgMSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmluaXQ6IEludmFsaWQgbGV2ZWwgY291bnRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gU2FuaXR5IGNoZWNrIHRoZSBsZXZlbCBjb3VudC4KKwkJaWYgKG1faGVhZGVyLm1fbGV2ZWxfY291bnQgPiBLVFgyX01BWF9TVVBQT1JURURfTEVWRUxfQ09VTlQpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBUb28gbWFueSBsZXZlbHMgb3IgZmlsZSBpcyBjb3JydXB0ZWQgb3IgaW52YWxpZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobV9oZWFkZXIubV9zdXBlcmNvbXByZXNzaW9uX3NjaGVtZSA+IEtUWDJfU1NfWlNUQU5EQVJEKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogSW52YWxpZC91bnN1cHBvcnRlZCBzdXBlcmNvbXByZXNzaW9uIG9yIGZpbGUgaXMgY29ycnVwdGVkIG9yIGludmFsaWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKG1faGVhZGVyLm1fc3VwZXJjb21wcmVzc2lvbl9zY2hlbWUgPT0gS1RYMl9TU19CQVNJU0xaKQorCQl7CisJCQlpZiAobV9oZWFkZXIubV9zZ2RfYnl0ZV9sZW5ndGggPD0gc2l6ZW9mKGt0eDJfZXRjMXNfZ2xvYmFsX2RhdGFfaGVhZGVyKSkKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogU3VwZXJjb21wcmVzc2lvbiBnbG9iYWwgZGF0YSBpcyB0b28gc21hbGxcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJaWYgKG1faGVhZGVyLm1fc2dkX2J5dGVfb2Zmc2V0IDwgc2l6ZW9mKGt0eDJfaGVhZGVyKSkKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogU3VwZXJjb21wcmVzc2lvbiBnbG9iYWwgZGF0YSBvZmZzZXQgaXMgdG9vIGxvd1xuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpZiAobV9oZWFkZXIubV9zZ2RfYnl0ZV9vZmZzZXQgKyBtX2hlYWRlci5tX3NnZF9ieXRlX2xlbmd0aCA+IG1fZGF0YV9zaXplKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBTdXBlcmNvbXByZXNzaW9uIGdsb2JhbCBkYXRhIG9mZnNldCBhbmQvb3IgbGVuZ3RoIGlzIHRvbyBoaWdoXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlpZiAoIW1fbGV2ZWxzLnRyeV9yZXNpemUobV9oZWFkZXIubV9sZXZlbF9jb3VudCkpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBPdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWNvbnN0IHVpbnQzMl90IGxldmVsX2luZGV4X3NpemVfaW5fYnl0ZXMgPSBiYXNpc3U6Om1heGltdW0oMVUsICh1aW50MzJfdCltX2hlYWRlci5tX2xldmVsX2NvdW50KSAqIHNpemVvZihrdHgyX2xldmVsX2luZGV4KTsKKworCQlpZiAoKHNpemVvZihrdHgyX2hlYWRlcikgKyBsZXZlbF9pbmRleF9zaXplX2luX2J5dGVzKSA+IG1fZGF0YV9zaXplKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogRmlsZSBpcyB0b28gc21hbGwgKGNhbid0IHJlYWQgbGV2ZWwgaW5kZXggYXJyYXkpXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCW1lbWNweSgmbV9sZXZlbHNbMF0sIG1fcERhdGEgKyBzaXplb2Yoa3R4Ml9oZWFkZXIpLCBsZXZlbF9pbmRleF9zaXplX2luX2J5dGVzKTsKKwkJCisJCS8vIFNhbml0eSBjaGVjayB0aGUgbGV2ZWwgb2Zmc2V0cyBhbmQgYnl0ZSBzaXplcworCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9sZXZlbHMuc2l6ZSgpOyBpKyspCisJCXsKKwkJCWlmIChtX2xldmVsc1tpXS5tX2J5dGVfb2Zmc2V0IDwgc2l6ZW9mKGt0eDJfaGVhZGVyKSkKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogSW52YWxpZCBsZXZlbCBvZmZzZXQgKHRvbyBsb3cpXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWlmICghbV9sZXZlbHNbaV0ubV9ieXRlX2xlbmd0aCkKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogSW52YWxpZCBsZXZlbCBieXRlIGxlbmd0aFxuIik7CisJCQl9CisKKwkJCWlmICgobV9sZXZlbHNbaV0ubV9ieXRlX29mZnNldCArIG1fbGV2ZWxzW2ldLm1fYnl0ZV9sZW5ndGgpID4gbV9kYXRhX3NpemUpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmluaXQ6IEludmFsaWQgbGV2ZWwgb2Zmc2V0IGFuZC9vciBsZW5ndGhcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQorCQkJY29uc3QgdWludDY0X3QgTUFYX1NBTkVfTEVWRUxfVU5DT01QX1NJWkUgPSAyMDQ4VUxMICogMTAyNFVMTCAqIDEwMjRVTEw7CisJCQkKKwkJCWlmIChtX2xldmVsc1tpXS5tX3VuY29tcHJlc3NlZF9ieXRlX2xlbmd0aCA+PSBNQVhfU0FORV9MRVZFTF9VTkNPTVBfU0laRSkKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogSW52YWxpZCBsZXZlbCBvZmZzZXQgKHRvbyBsYXJnZSlcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJaWYgKG1faGVhZGVyLm1fc3VwZXJjb21wcmVzc2lvbl9zY2hlbWUgPT0gS1RYMl9TU19CQVNJU0xaKQorCQkJeworCQkJCWlmIChtX2xldmVsc1tpXS5tX3VuY29tcHJlc3NlZF9ieXRlX2xlbmd0aCkKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBJbnZhbGlkIHVuY29tcHJlc3NlZCBsZW5ndGggKDApXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG1faGVhZGVyLm1fc3VwZXJjb21wcmVzc2lvbl9zY2hlbWUgPj0gS1RYMl9TU19aU1RBTkRBUkQpCisJCQl7CisJCQkJaWYgKCFtX2xldmVsc1tpXS5tX3VuY29tcHJlc3NlZF9ieXRlX2xlbmd0aCkKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBJbnZhbGlkIHVuY29tcHJlc3NlZCBsZW5ndGggKDEpXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWNvbnN0IHVpbnQzMl90IERGRF9NSU5JTVVNX1NJWkUgPSA0NCwgREZEX01BWElNVU1fU0laRSA9IDYwOworCQlpZiAoKG1faGVhZGVyLm1fZGZkX2J5dGVfbGVuZ3RoICE9IERGRF9NSU5JTVVNX1NJWkUpICYmIChtX2hlYWRlci5tX2RmZF9ieXRlX2xlbmd0aCAhPSBERkRfTUFYSU1VTV9TSVpFKSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmluaXQ6IFVuc3VwcG9ydGVkIERGRCBzaXplXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICgoKG1faGVhZGVyLm1fZGZkX2J5dGVfb2Zmc2V0ICsgbV9oZWFkZXIubV9kZmRfYnl0ZV9sZW5ndGgpID4gbV9kYXRhX3NpemUpIHx8IChtX2hlYWRlci5tX2RmZF9ieXRlX29mZnNldCA8IHNpemVvZihrdHgyX2hlYWRlcikpKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogSW52YWxpZCBERkQgb2Zmc2V0IGFuZC9vciBsZW5ndGhcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQkJCisJCWNvbnN0IHVpbnQ4X3QqIHBERkQgPSBtX3BEYXRhICsgbV9oZWFkZXIubV9kZmRfYnl0ZV9vZmZzZXQ7CisKKwkJaWYgKCFtX2RmZC50cnlfcmVzaXplKG1faGVhZGVyLm1fZGZkX2J5dGVfbGVuZ3RoKSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmluaXQ6IE91dCBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJbWVtY3B5KG1fZGZkLmRhdGEoKSwgcERGRCwgbV9oZWFkZXIubV9kZmRfYnl0ZV9sZW5ndGgpOworCQkKKwkJLy8gVGhpcyBpcyBhbGwgaGFyZCBjb2RlZCBmb3Igb25seSBFVEMxUyBhbmQgVUFTVEMuCisJCXVpbnQzMl90IGRmZF90b3RhbF9zaXplID0gYmFzaXN1OjpyZWFkX2xlX2R3b3JkKHBERkQpOworCQkKKwkJLy8gMy4xMC4zOiBTYW5pdHkgY2hlY2sKKwkJaWYgKGRmZF90b3RhbF9zaXplICE9IG1faGVhZGVyLm1fZGZkX2J5dGVfbGVuZ3RoKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6aW5pdDogREZEIHNpemUgdmFsaWRhdGlvbiBmYWlsZWQgKDEpXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkJCQorCQkvLyAzLjEwLjM6IE1vcmUgc2FuaXR5IGNoZWNraW5nCisJCWlmIChtX2hlYWRlci5tX2t2ZF9ieXRlX2xlbmd0aCkKKwkJeworCQkJaWYgKGRmZF90b3RhbF9zaXplICE9IG1faGVhZGVyLm1fa3ZkX2J5dGVfb2Zmc2V0IC0gbV9oZWFkZXIubV9kZmRfYnl0ZV9vZmZzZXQpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmluaXQ6IERGRCBzaXplIHZhbGlkYXRpb24gZmFpbGVkICgyKVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJY29uc3QgdWludDMyX3QgZGZkX2JpdHMgPSBiYXNpc3U6OnJlYWRfbGVfZHdvcmQocERGRCArIDMgKiBzaXplb2YodWludDMyX3QpKTsKKwkJY29uc3QgdWludDMyX3Qgc2FtcGxlX2NoYW5uZWwwID0gYmFzaXN1OjpyZWFkX2xlX2R3b3JkKHBERkQgKyA3ICogc2l6ZW9mKHVpbnQzMl90KSk7CisJCSAKKwkJbV9kZmRfY29sb3JfbW9kZWwgPSBkZmRfYml0cyAmIDI1NTsKKwkJbV9kZmRfY29sb3JfcHJpbXMgPSAoa3R4Ml9kZl9jb2xvcl9wcmltYXJpZXMpKChkZmRfYml0cyA+PiA4KSAmIDI1NSk7CisJCW1fZGZkX3RyYW5zZmVyX2Z1bmMgPSAoZGZkX2JpdHMgPj4gMTYpICYgMjU1OworCQltX2RmZF9mbGFncyA9IChkZmRfYml0cyA+PiAyNCkgJiAyNTU7CisKKwkJLy8gU2VlIDMuMTAuMS5SZXN0cmljdGlvbnMKKwkJaWYgKChtX2RmZF90cmFuc2Zlcl9mdW5jICE9IEtUWDJfS0hSX0RGX1RSQU5TRkVSX0xJTkVBUikgJiYgKG1fZGZkX3RyYW5zZmVyX2Z1bmMgIT0gS1RYMl9LSFJfREZfVFJBTlNGRVJfU1JHQikpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBJbnZhbGlkIERGRCB0cmFuc2ZlciBmdW5jdGlvblxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobV9kZmRfY29sb3JfbW9kZWwgPT0gS1RYMl9LREZfREZfTU9ERUxfRVRDMVMpCisJCXsKKwkJCW1fZm9ybWF0ID0gYmFzaXN0OjpiYXNpc190ZXhfZm9ybWF0OjpjRVRDMVM7CisJCQkKKwkJCS8vIDMuMTAuMjogIldoZXRoZXIgdGhlIGltYWdlIGhhcyAxIG9yIDIgc2xpY2VzIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIERGRJJzIHNhbXBsZSBjb3VudC4iCisJCQkvLyBJZiBtX2hhc19hbHBoYSBpcyB0cnVlIGl0IG1heSBiZSAyLWNoYW5uZWwgUlJSRyBvciA0LWNoYW5uZWwgUkdCQSwgYnV0IHdlIGxldCB0aGUgY2FsbGVyIGRlYWwgd2l0aCB0aGF0LgorCQkJbV9oYXNfYWxwaGEgPSAobV9oZWFkZXIubV9kZmRfYnl0ZV9sZW5ndGggPT0gNjApOworCQkJCisJCQltX2RmZF9zYW1wbGVzID0gbV9oYXNfYWxwaGEgPyAyIDogMTsKKwkJCW1fZGZkX2NoYW4wID0gKGt0eDJfZGZfY2hhbm5lbF9pZCkoKHNhbXBsZV9jaGFubmVsMCA+PiAyNCkgJiAxNSk7CisKKwkJCWlmIChtX2hhc19hbHBoYSkKKwkJCXsKKwkJCQljb25zdCB1aW50MzJfdCBzYW1wbGVfY2hhbm5lbDEgPSBiYXNpc3U6OnJlYWRfbGVfZHdvcmQocERGRCArIDExICogc2l6ZW9mKHVpbnQzMl90KSk7CisJCQkJbV9kZmRfY2hhbjEgPSAoa3R4Ml9kZl9jaGFubmVsX2lkKSgoc2FtcGxlX2NoYW5uZWwxID4+IDI0KSAmIDE1KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChtX2RmZF9jb2xvcl9tb2RlbCA9PSBLVFgyX0tERl9ERl9NT0RFTF9VQVNUQykKKwkJeworCQkJbV9mb3JtYXQgPSBiYXNpc3Q6OmJhc2lzX3RleF9mb3JtYXQ6OmNVQVNUQzR4NDsKKworCQkJbV9kZmRfc2FtcGxlcyA9IDE7CisJCQltX2RmZF9jaGFuMCA9IChrdHgyX2RmX2NoYW5uZWxfaWQpKChzYW1wbGVfY2hhbm5lbDAgPj4gMjQpICYgMTUpOworCQkJCisJCQkvLyBXZSdyZSBhc3N1bWluZyAiREFUQSIgbWVhbnMgUkdCQSBzbyBpdCBoYXMgYWxwaGEuCisJCQltX2hhc19hbHBoYSA9IChtX2RmZF9jaGFuMCA9PSBLVFgyX0RGX0NIQU5ORUxfVUFTVENfUkdCQSkgfHwgKG1fZGZkX2NoYW4wID09IEtUWDJfREZfQ0hBTk5FTF9VQVNUQ19SUlJHKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFVuc3VwcG9ydGVkIERGRCBjb2xvciBtb2RlbC4KKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiBVbnN1cHBvcnRlZCBERkQgY29sb3IgbW9kZWxcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQkJCisJCWlmICghcmVhZF9rZXlfdmFsdWVzKCkpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjppbml0OiByZWFkX2tleV92YWx1ZXMoKSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gQ2hlY2sgZm9yIGEgS1RYYW5pbURhdGEga2V5CisJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX2tleV92YWx1ZXMuc2l6ZSgpOyBpKyspCisJCXsKKwkJCWlmIChzdHJjbXAocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obV9rZXlfdmFsdWVzW2ldLm1fa2V5LmRhdGEoKSksICJLVFhhbmltRGF0YSIpID09IDApCisJCQl7CisJCQkJbV9pc192aWRlbyA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl1aW50MzJfdCBrdHgyX3RyYW5zY29kZXI6OmdldF9ldGMxc19pbWFnZV9kZXNjc19pbWFnZV9mbGFncyh1aW50MzJfdCBsZXZlbF9pbmRleCwgdWludDMyX3QgbGF5ZXJfaW5kZXgsIHVpbnQzMl90IGZhY2VfaW5kZXgpIGNvbnN0CisJeworCQljb25zdCB1aW50MzJfdCBldGMxc19pbWFnZV9pbmRleCA9CisJCQkobGV2ZWxfaW5kZXggKiBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KG1faGVhZGVyLm1fbGF5ZXJfY291bnQsIDEpICogbV9oZWFkZXIubV9mYWNlX2NvdW50KSArCisJCQlsYXllcl9pbmRleCAqIG1faGVhZGVyLm1fZmFjZV9jb3VudCArCisJCQlmYWNlX2luZGV4OworCisJCWlmIChldGMxc19pbWFnZV9pbmRleCA+PSBnZXRfZXRjMXNfaW1hZ2VfZGVzY3MoKS5zaXplKCkpCisJCXsKKwkJCWFzc2VydCgwKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIGdldF9ldGMxc19pbWFnZV9kZXNjcygpW2V0YzFzX2ltYWdlX2luZGV4XS5tX2ltYWdlX2ZsYWdzOworCX0KKworCWNvbnN0IGJhc2lzdTo6dWludDhfdmVjKiBrdHgyX3RyYW5zY29kZXI6OmZpbmRfa2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfbmFtZSkgY29uc3QKKwl7CisJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX2tleV92YWx1ZXMuc2l6ZSgpOyBpKyspCisJCQlpZiAoc3RyY21wKChjb25zdCBjaGFyICopbV9rZXlfdmFsdWVzW2ldLm1fa2V5LmRhdGEoKSwga2V5X25hbWUuY19zdHIoKSkgPT0gMCkKKwkJCQlyZXR1cm4gJm1fa2V5X3ZhbHVlc1tpXS5tX3ZhbHVlOworCisJCXJldHVybiBudWxscHRyOworCX0KKwkKKwlib29sIGt0eDJfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2RpbmcoKQorCXsKKwkJaWYgKCFtX3BEYXRhKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IE11c3QgY2FsbCBpbml0KCkgZmlyc3RcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKG1faGVhZGVyLm1fc3VwZXJjb21wcmVzc2lvbl9zY2hlbWUgPT0gS1RYMl9TU19CQVNJU0xaKSAKKwkJeworCQkJLy8gQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSBkZWNvbXByZXNzZWQgdGhlIEVUQzFTIGdsb2JhbCBkYXRhLiBJZiBzbyBkb24ndCB1bnBhY2sgaXQgYWdhaW4uCisJCQlpZiAoIW1fZXRjMXNfdHJhbnNjb2Rlci5nZXRfZW5kcG9pbnRzKCkuZW1wdHkoKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJaWYgKCFkZWNvbXByZXNzX2V0YzFzX2dsb2JhbF9kYXRhKCkpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OnN0YXJ0X3RyYW5zY29kaW5nOiBkZWNvbXByZXNzX2V0YzFzX2dsb2JhbF9kYXRhKCkgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQkKKwkJCWlmICghbV9pc192aWRlbykKKwkJCXsKKwkJCQkvLyBTZWUgaWYgdGhlcmUgYXJlIGFueSBQLWZyYW1lcy4gSWYgc28gaXQgbXVzdCBiZSBhIHZpZGVvLCBldmVuIGlmIHRoZXJlIHdhc24ndCBhIEtUWGFuaW1EYXRhIGtleS4KKwkJCQkvLyBWaWRlbyBjYW5ub3QgYmUgYSBjdWJlbWFwLCBhbmQgaXQgbXVzdCBiZSBhIHRleHR1cmUgYXJyYXkuCisJCQkJaWYgKChtX2hlYWRlci5tX2ZhY2VfY291bnQgPT0gMSkgJiYgKG1faGVhZGVyLm1fbGF5ZXJfY291bnQgPiAxKSkKKwkJCQl7CisJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX2V0YzFzX2ltYWdlX2Rlc2NzLnNpemUoKTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAobV9ldGMxc19pbWFnZV9kZXNjc1tpXS5tX2ltYWdlX2ZsYWdzICYgS1RYMl9JTUFHRV9JU19QX0ZSQU1FKQorCQkJCQkJeworCQkJCQkJCW1faXNfdmlkZW8gPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgaWYgKG1faGVhZGVyLm1fc3VwZXJjb21wcmVzc2lvbl9zY2hlbWUgPT0gS1RYMl9TU19aU1RBTkRBUkQpCisJCXsKKyNpZiAhQkFTSVNEX1NVUFBPUlRfS1RYMl9aU1RECisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6c3RhcnRfdHJhbnNjb2Rpbmc6IEZpbGUgdXNlcyB6c3RkIHN1cGVyY29tcHJlc3Npb24sIGJ1dCB6c3RkIHN1cHBvcnQgd2FzIG5vdCBlbmFibGVkIGF0IGNvbXBpbGF0aW9uIHRpbWUgKEJBU0lTRF9TVVBQT1JUX0tUWDJfWlNURCA9PSAwKVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisjZW5kaWYKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCWJvb2wga3R4Ml90cmFuc2NvZGVyOjpnZXRfaW1hZ2VfbGV2ZWxfaW5mbyhrdHgyX2ltYWdlX2xldmVsX2luZm8mIGxldmVsX2luZm8sIHVpbnQzMl90IGxldmVsX2luZGV4LCB1aW50MzJfdCBsYXllcl9pbmRleCwgdWludDMyX3QgZmFjZV9pbmRleCkgY29uc3QKKwl7CisJCWlmIChsZXZlbF9pbmRleCA+PSBtX2xldmVscy5zaXplKCkpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpnZXRfaW1hZ2VfbGV2ZWxfaW5mbzogbGV2ZWxfaW5kZXggPj0gbV9sZXZlbHMuc2l6ZSgpXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmIChtX2hlYWRlci5tX2ZhY2VfY291bnQgPiAxKQorCQl7CisJCQlpZiAoZmFjZV9pbmRleCA+PSA2KQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpnZXRfaW1hZ2VfbGV2ZWxfaW5mbzogZmFjZV9pbmRleCA+PSA2XG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoZmFjZV9pbmRleCAhPSAwKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6Z2V0X2ltYWdlX2xldmVsX2luZm86IGZhY2VfaW5kZXggIT0gMFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobGF5ZXJfaW5kZXggPj0gYmFzaXN1OjptYXhpbXVtPHVpbnQzMl90PihtX2hlYWRlci5tX2xheWVyX2NvdW50LCAxKSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmdldF9pbWFnZV9sZXZlbF9pbmZvOiBsYXllcl9pbmRleCA+PSBtYXhpbXVtPHVpbnQzMl90PihtX2hlYWRlci5tX2xheWVyX2NvdW50LCAxKVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCQkKKwkJY29uc3QgdWludDMyX3QgbGV2ZWxfd2lkdGggPSBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KG1faGVhZGVyLm1fcGl4ZWxfd2lkdGggPj4gbGV2ZWxfaW5kZXgsIDEpOworCQljb25zdCB1aW50MzJfdCBsZXZlbF9oZWlnaHQgPSBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KG1faGVhZGVyLm1fcGl4ZWxfaGVpZ2h0ID4+IGxldmVsX2luZGV4LCAxKTsKKwkJY29uc3QgdWludDMyX3QgbnVtX2Jsb2Nrc194ID0gKGxldmVsX3dpZHRoICsgMykgPj4gMjsKKwkJY29uc3QgdWludDMyX3QgbnVtX2Jsb2Nrc195ID0gKGxldmVsX2hlaWdodCArIDMpID4+IDI7CisKKwkJbGV2ZWxfaW5mby5tX2ZhY2VfaW5kZXggPSBmYWNlX2luZGV4OworCQlsZXZlbF9pbmZvLm1fbGF5ZXJfaW5kZXggPSBsYXllcl9pbmRleDsKKwkJbGV2ZWxfaW5mby5tX2xldmVsX2luZGV4ID0gbGV2ZWxfaW5kZXg7CisJCWxldmVsX2luZm8ubV9vcmlnX3dpZHRoID0gbGV2ZWxfd2lkdGg7CisJCWxldmVsX2luZm8ubV9vcmlnX2hlaWdodCA9IGxldmVsX2hlaWdodDsKKwkJbGV2ZWxfaW5mby5tX3dpZHRoID0gbnVtX2Jsb2Nrc194ICogNDsKKwkJbGV2ZWxfaW5mby5tX2hlaWdodCA9IG51bV9ibG9ja3NfeSAqIDQ7CisJCWxldmVsX2luZm8ubV9udW1fYmxvY2tzX3ggPSBudW1fYmxvY2tzX3g7CisJCWxldmVsX2luZm8ubV9udW1fYmxvY2tzX3kgPSBudW1fYmxvY2tzX3k7CisJCWxldmVsX2luZm8ubV90b3RhbF9ibG9ja3MgPSBudW1fYmxvY2tzX3ggKiBudW1fYmxvY2tzX3k7CisJCWxldmVsX2luZm8ubV9hbHBoYV9mbGFnID0gbV9oYXNfYWxwaGE7CisJCWxldmVsX2luZm8ubV9pZnJhbWVfZmxhZyA9IGZhbHNlOworCQlpZiAobV9ldGMxc19pbWFnZV9kZXNjcy5zaXplKCkpCisJCXsKKwkJCWNvbnN0IHVpbnQzMl90IGV0YzFzX2ltYWdlX2luZGV4ID0KKwkJCQkobGV2ZWxfaW5kZXggKiBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KG1faGVhZGVyLm1fbGF5ZXJfY291bnQsIDEpICogbV9oZWFkZXIubV9mYWNlX2NvdW50KSArCisJCQkJbGF5ZXJfaW5kZXggKiBtX2hlYWRlci5tX2ZhY2VfY291bnQgKworCQkJCWZhY2VfaW5kZXg7CisKKwkJCWxldmVsX2luZm8ubV9pZnJhbWVfZmxhZyA9IChtX2V0YzFzX2ltYWdlX2Rlc2NzW2V0YzFzX2ltYWdlX2luZGV4XS5tX2ltYWdlX2ZsYWdzICYgS1RYMl9JTUFHRV9JU19QX0ZSQU1FKSA9PSAwOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCQkKKwlib29sIGt0eDJfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlX2xldmVsKAorCQl1aW50MzJfdCBsZXZlbF9pbmRleCwgdWludDMyX3QgbGF5ZXJfaW5kZXgsIHVpbnQzMl90IGZhY2VfaW5kZXgsIAorCQl2b2lkKiBwT3V0cHV0X2Jsb2NrcywgdWludDMyX3Qgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLAorCQliYXNpc3Q6OnRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgZm10LAorCQl1aW50MzJfdCBkZWNvZGVfZmxhZ3MsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLCBpbnQgY2hhbm5lbDAsIGludCBjaGFubmVsMSwKKwkJa3R4Ml90cmFuc2NvZGVyX3N0YXRlKiBwU3RhdGUpCisJeworCQlpZiAoIW1fcERhdGEpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfMkQ6IE11c3QgY2FsbCBpbml0KCkgZmlyc3RcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFwU3RhdGUpCisJCQlwU3RhdGUgPSAmbV9kZWZfdHJhbnNjb2Rlcl9zdGF0ZTsKKwkJCQkJCQkJCQkKKwkJaWYgKGxldmVsX2luZGV4ID49IG1fbGV2ZWxzLnNpemUoKSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV8yRDogbGV2ZWxfaW5kZXggPj0gbV9sZXZlbHMuc2l6ZSgpXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmIChtX2hlYWRlci5tX2ZhY2VfY291bnQgPiAxKQorCQl7CisJCQlpZiAoZmFjZV9pbmRleCA+PSA2KQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfMkQ6IGZhY2VfaW5kZXggPj0gNlxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGZhY2VfaW5kZXggIT0gMCkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV8yRDogZmFjZV9pbmRleCAhPSAwXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmIChsYXllcl9pbmRleCA+PSBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KG1faGVhZGVyLm1fbGF5ZXJfY291bnQsIDEpKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlXzJEOiBsYXllcl9pbmRleCA+PSBtYXhpbXVtPHVpbnQzMl90PihtX2hlYWRlci5tX2xheWVyX2NvdW50LCAxKVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQljb25zdCB1aW50OF90KiBwQ29tcF9sZXZlbF9kYXRhID0gbV9wRGF0YSArIG1fbGV2ZWxzW2xldmVsX2luZGV4XS5tX2J5dGVfb2Zmc2V0OworCQl1aW50NjRfdCBjb21wX2xldmVsX2RhdGFfc2l6ZSA9IG1fbGV2ZWxzW2xldmVsX2luZGV4XS5tX2J5dGVfbGVuZ3RoOworCQkKKwkJY29uc3QgdWludDhfdCogcFVuY29tcF9sZXZlbF9kYXRhID0gcENvbXBfbGV2ZWxfZGF0YTsKKwkJdWludDY0X3QgdW5jb21wX2xldmVsX2RhdGFfc2l6ZSA9IGNvbXBfbGV2ZWxfZGF0YV9zaXplOworCisJCWlmICh1bmNvbXBfbGV2ZWxfZGF0YV9zaXplID4gVUlOVDMyX01BWCkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV8yRDogdW5jb21wX2xldmVsX2RhdGFfc2l6ZSA+IFVJTlQzMl9NQVhcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQkJCisJCWlmIChtX2hlYWRlci5tX3N1cGVyY29tcHJlc3Npb25fc2NoZW1lID09IEtUWDJfU1NfWlNUQU5EQVJEKQorCQl7CisJCQkvLyBDaGVjayBpZiB3ZSd2ZSBhbHJlYWR5IGRlY29tcHJlc3NlZCB0aGlzIGxldmVsJ3Mgc3VwZXJjb21wcmVzc2VkIGRhdGEuCisJCQlpZiAoKGludClsZXZlbF9pbmRleCAhPSBwU3RhdGUtPm1fdW5jb21wX2RhdGFfbGV2ZWxfaW5kZXgpCisJCQl7CisJCQkJLy8gVW5jb21wcmVzcyB0aGUgZW50aXJlIGxldmVsJ3Mgc3VwZXJjb21wcmVzc2VkIGRhdGEuCisJCQkJaWYgKCFkZWNvbXByZXNzX2xldmVsX2RhdGEobGV2ZWxfaW5kZXgsIHBTdGF0ZS0+bV9sZXZlbF91bmNvbXBfZGF0YSkpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlXzJEOiBkZWNvbXByZXNzX2xldmVsX2RhdGEoKSBmYWlsZWRcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXBTdGF0ZS0+bV91bmNvbXBfZGF0YV9sZXZlbF9pbmRleCA9IGxldmVsX2luZGV4OworCQkJfQorCisJCQlwVW5jb21wX2xldmVsX2RhdGEgPSBwU3RhdGUtPm1fbGV2ZWxfdW5jb21wX2RhdGEuZGF0YSgpOworCQkJdW5jb21wX2xldmVsX2RhdGFfc2l6ZSA9IHBTdGF0ZS0+bV9sZXZlbF91bmNvbXBfZGF0YS5zaXplKCk7CisJCX0KKwkJCQkKKwkJY29uc3QgdWludDMyX3QgbGV2ZWxfd2lkdGggPSBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KG1faGVhZGVyLm1fcGl4ZWxfd2lkdGggPj4gbGV2ZWxfaW5kZXgsIDEpOworCQljb25zdCB1aW50MzJfdCBsZXZlbF9oZWlnaHQgPSBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KG1faGVhZGVyLm1fcGl4ZWxfaGVpZ2h0ID4+IGxldmVsX2luZGV4LCAxKTsKKwkJY29uc3QgdWludDMyX3QgbnVtX2Jsb2Nrc194ID0gKGxldmVsX3dpZHRoICsgMykgPj4gMjsKKwkJY29uc3QgdWludDMyX3QgbnVtX2Jsb2Nrc195ID0gKGxldmVsX2hlaWdodCArIDMpID4+IDI7CisJCQorCQlpZiAobV9mb3JtYXQgPT0gYmFzaXN0OjpiYXNpc190ZXhfZm9ybWF0OjpjRVRDMVMpCisJCXsKKwkJCS8vIEVuc3VyZSBzdGFydF90cmFuc2NvZGluZygpIHdhcyBjYWxsZWQuCisJCQlpZiAobV9ldGMxc190cmFuc2NvZGVyLmdldF9lbmRwb2ludHMoKS5lbXB0eSgpKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfMkQ6IG11c3QgY2FsbCBzdGFydF90cmFuc2NvZGluZygpIGZpcnN0XG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWNvbnN0IHVpbnQzMl90IGV0YzFzX2ltYWdlX2luZGV4ID0KKwkJCQkobGV2ZWxfaW5kZXggKiBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KG1faGVhZGVyLm1fbGF5ZXJfY291bnQsIDEpICogbV9oZWFkZXIubV9mYWNlX2NvdW50KSArCisJCQkJbGF5ZXJfaW5kZXggKiBtX2hlYWRlci5tX2ZhY2VfY291bnQgKworCQkJCWZhY2VfaW5kZXg7CisJCQorCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZiAoZXRjMXNfaW1hZ2VfaW5kZXggPj0gbV9ldGMxc19pbWFnZV9kZXNjcy5zaXplKCkpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV8yRDogZXRjMXNfaW1hZ2VfaW5kZXggPj0gbV9ldGMxc19pbWFnZV9kZXNjcy5zaXplKClcbiIpOworCQkJCWFzc2VydCgwKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWlmIChzdGF0aWNfY2FzdDx1aW50MzJfdD4obV9kYXRhX3NpemUpICE9IG1fZGF0YV9zaXplKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfMkQ6IEZpbGUgaXMgdG9vIGxhcmdlXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWNvbnN0IGt0eDJfZXRjMXNfaW1hZ2VfZGVzYyYgaW1hZ2VfZGVzYyA9IG1fZXRjMXNfaW1hZ2VfZGVzY3NbZXRjMXNfaW1hZ2VfaW5kZXhdOworCisJCQlpZiAoIW1fZXRjMXNfdHJhbnNjb2Rlci50cmFuc2NvZGVfaW1hZ2UoZm10LAorCQkJCXBPdXRwdXRfYmxvY2tzLCBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMsIG1fcERhdGEsIHN0YXRpY19jYXN0PHVpbnQzMl90PihtX2RhdGFfc2l6ZSksCisJCQkJbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIGxldmVsX3dpZHRoLCBsZXZlbF9oZWlnaHQsCisJCQkJbGV2ZWxfaW5kZXgsCisJCQkJbV9sZXZlbHNbbGV2ZWxfaW5kZXhdLm1fYnl0ZV9vZmZzZXQgKyBpbWFnZV9kZXNjLm1fcmdiX3NsaWNlX2J5dGVfb2Zmc2V0LCBpbWFnZV9kZXNjLm1fcmdiX3NsaWNlX2J5dGVfbGVuZ3RoLAorCQkJCWltYWdlX2Rlc2MubV9hbHBoYV9zbGljZV9ieXRlX2xlbmd0aCA/IChtX2xldmVsc1tsZXZlbF9pbmRleF0ubV9ieXRlX29mZnNldCArIGltYWdlX2Rlc2MubV9hbHBoYV9zbGljZV9ieXRlX29mZnNldCkgOiAwLCBpbWFnZV9kZXNjLm1fYWxwaGFfc2xpY2VfYnl0ZV9sZW5ndGgsCisJCQkJZGVjb2RlX2ZsYWdzLCBtX2hhc19hbHBoYSwKKwkJCQltX2lzX3ZpZGVvLCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsICZwU3RhdGUtPm1fdHJhbnNjb2Rlcl9zdGF0ZSwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzKSkKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6dHJhbnNjb2RlX2ltYWdlXzJEOiBFVEMxUyB0cmFuc2NvZGVfaW1hZ2UoKSBmYWlsZWQsIHRoaXMgaXMgZWl0aGVyIGEgYnVnIG9yIHRoZSBmaWxlIGlzIGNvcnJ1cHRlZC9pbnZhbGlkXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAobV9mb3JtYXQgPT0gYmFzaXN0OjpiYXNpc190ZXhfZm9ybWF0OjpjVUFTVEM0eDQpCisJCXsKKwkJCS8vIENvbXB1dGUgbGVuZ3RoIGFuZCBvZmZzZXQgdG8gdW5jb21wcmVzc2VkIDJEIFVBU1RDIHRleHR1cmUgZGF0YSwgZ2l2ZW4gdGhlIGZhY2UvbGF5ZXIgaW5kaWNlcy4KKwkJCWFzc2VydCh1bmNvbXBfbGV2ZWxfZGF0YV9zaXplID09IG1fbGV2ZWxzW2xldmVsX2luZGV4XS5tX3VuY29tcHJlc3NlZF9ieXRlX2xlbmd0aCk7CisJCQljb25zdCB1aW50MzJfdCB0b3RhbF8yRF9pbWFnZV9zaXplID0gbnVtX2Jsb2Nrc194ICogbnVtX2Jsb2Nrc195ICogS1RYMl9VQVNUQ19CTE9DS19TSVpFOworCQkJCQkJCisJCQljb25zdCB1aW50MzJfdCB1bmNvbXBfb2ZzID0gKGxheWVyX2luZGV4ICogbV9oZWFkZXIubV9mYWNlX2NvdW50ICsgZmFjZV9pbmRleCkgKiB0b3RhbF8yRF9pbWFnZV9zaXplOworCisJCQkvLyBTYW5pdHkgY2hlY2tzCisJCQlpZiAodW5jb21wX29mcyA+PSB1bmNvbXBfbGV2ZWxfZGF0YV9zaXplKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfMkQ6IHVuY29tcF9vZnMgPj0gdG90YWxfMkRfaW1hZ2Vfc2l6ZVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpZiAoKHVuY29tcF9sZXZlbF9kYXRhX3NpemUgLSB1bmNvbXBfb2ZzKSA8IHRvdGFsXzJEX2ltYWdlX3NpemUpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OnRyYW5zY29kZV9pbWFnZV8yRDogKHVuY29tcF9sZXZlbF9kYXRhX3NpemUgLSB1bmNvbXBfb2ZzKSA8IHRvdGFsXzJEX2ltYWdlX3NpemVcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJaWYgKCFtX3Vhc3RjX3RyYW5zY29kZXIudHJhbnNjb2RlX2ltYWdlKGZtdCwKKwkJCQlwT3V0cHV0X2Jsb2Nrcywgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLAorCQkJCShjb25zdCB1aW50OF90KilwVW5jb21wX2xldmVsX2RhdGEgKyB1bmNvbXBfb2ZzLCAodWludDMyX3QpdG90YWxfMkRfaW1hZ2Vfc2l6ZSwgbnVtX2Jsb2Nrc194LCBudW1fYmxvY2tzX3ksIGxldmVsX3dpZHRoLCBsZXZlbF9oZWlnaHQsIGxldmVsX2luZGV4LAorCQkJCTAsICh1aW50MzJfdCl0b3RhbF8yRF9pbWFnZV9zaXplLAorCQkJCWRlY29kZV9mbGFncywgbV9oYXNfYWxwaGEsIG1faXNfdmlkZW8sIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgbnVsbHB0ciwgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLCBjaGFubmVsMCwgY2hhbm5lbDEpKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfMkQ6IFVBU1RDIHRyYW5zY29kZV9pbWFnZSgpIGZhaWxlZCwgdGhpcyBpcyBlaXRoZXIgYSBidWcgb3IgdGhlIGZpbGUgaXMgY29ycnVwdGVkL2ludmFsaWRcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFNob3VsZG4ndCBnZXQgaGVyZS4KKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfMkQ6IEludGVybmFsIGVycm9yXG4iKTsKKwkJCWFzc2VydCgwKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKwkJCisJYm9vbCBrdHgyX3RyYW5zY29kZXI6OmRlY29tcHJlc3NfbGV2ZWxfZGF0YSh1aW50MzJfdCBsZXZlbF9pbmRleCwgYmFzaXN1Ojp1aW50OF92ZWMmIHVuY29tcF9kYXRhKQorCXsKKwkJY29uc3QgdWludDhfdCogcENvbXBfZGF0YSA9IG1fbGV2ZWxzW2xldmVsX2luZGV4XS5tX2J5dGVfb2Zmc2V0ICsgbV9wRGF0YTsKKwkJY29uc3QgdWludDY0X3QgY29tcF9zaXplID0gbV9sZXZlbHNbbGV2ZWxfaW5kZXhdLm1fYnl0ZV9sZW5ndGg7CisJCQorCQljb25zdCB1aW50NjRfdCB1bmNvbXBfc2l6ZSA9IG1fbGV2ZWxzW2xldmVsX2luZGV4XS5tX3VuY29tcHJlc3NlZF9ieXRlX2xlbmd0aDsKKworCQlpZiAoKChzaXplX3QpY29tcF9zaXplKSAhPSBjb21wX3NpemUpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpkZWNvbXByZXNzX2xldmVsX2RhdGE6IENvbXByZXNzZWQgZGF0YSB0b28gbGFyZ2VcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICgoKHNpemVfdCl1bmNvbXBfc2l6ZSkgIT0gdW5jb21wX3NpemUpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpkZWNvbXByZXNzX2xldmVsX2RhdGE6IFVuY29tcHJlc3NlZCBkYXRhIHRvbyBsYXJnZVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIXVuY29tcF9kYXRhLnRyeV9yZXNpemUoKHNpemVfdCl1bmNvbXBfc2l6ZSkpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpkZWNvbXByZXNzX2xldmVsX2RhdGE6IE91dCBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlpZiAobV9oZWFkZXIubV9zdXBlcmNvbXByZXNzaW9uX3NjaGVtZSA9PSBLVFgyX1NTX1pTVEFOREFSRCkKKwkJeworI2lmIEJBU0lTRF9TVVBQT1JUX0tUWDJfWlNURAorCQkJc2l6ZV90IGFjdHVhbFVuY29tcFNpemUgPSBaU1REX2RlY29tcHJlc3ModW5jb21wX2RhdGEuZGF0YSgpLCAoc2l6ZV90KXVuY29tcF9zaXplLCBwQ29tcF9kYXRhLCAoc2l6ZV90KWNvbXBfc2l6ZSk7CisJCQlpZiAoWlNURF9pc0Vycm9yKGFjdHVhbFVuY29tcFNpemUpKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpkZWNvbXByZXNzX2xldmVsX2RhdGE6IFpzdGQgZGVjb21wcmVzc2lvbiBmYWlsZWQsIGZpbGUgaXMgaW52YWxpZCBvciBjb3JydXB0ZWRcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChhY3R1YWxVbmNvbXBTaXplICE9IHVuY29tcF9zaXplKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpkZWNvbXByZXNzX2xldmVsX2RhdGE6IFpzdGQgZGVjb21wcmVzc2lvbiByZXR1cm5lZCB0b28gZmV3IGJ5dGVzLCBmaWxlIGlzIGludmFsaWQgb3IgY29ycnVwdGVkXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisjZWxzZQorCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmRlY29tcHJlc3NfbGV2ZWxfZGF0YTogRmlsZSB1c2VzIFpzdGQgc3VwZXJjb21wcmVzc2lvbiwgYnV0IFpzdGQgc3VwcG9ydCB3YXMgbm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lIChCQVNJU0RfU1VQUE9SVF9LVFgyX1pTVEQgaXMgMClcbiIpOworCQkJcmV0dXJuIGZhbHNlOworI2VuZGlmCisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCQorCWJvb2wga3R4Ml90cmFuc2NvZGVyOjpkZWNvbXByZXNzX2V0YzFzX2dsb2JhbF9kYXRhKCkKKwl7CisJCS8vIE5vdGU6IHdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgM0QgdGV4dHVyZXMgaW4gaGVyZSB5ZXQKKwkJLy91aW50MzJfdCBsYXllcl9waXhlbF9kZXB0aCA9IGJhc2lzdTo6bWF4aW11bTx1aW50MzJfdD4obV9oZWFkZXIubV9waXhlbF9kZXB0aCwgMSk7CisJCS8vZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IG1faGVhZGVyLm1fbGV2ZWxfY291bnQ7IGkrKykKKwkJLy8JbGF5ZXJfcGl4ZWxfZGVwdGggKz0gYmFzaXN1OjptYXhpbXVtPHVpbnQzMl90PihtX2hlYWRlci5tX3BpeGVsX2RlcHRoID4+IGksIDEpOworCisJCWNvbnN0IHVpbnQzMl90IGltYWdlX2NvdW50ID0gYmFzaXN1OjptYXhpbXVtPHVpbnQzMl90PihtX2hlYWRlci5tX2xheWVyX2NvdW50LCAxKSAqIG1faGVhZGVyLm1fZmFjZV9jb3VudCAqIG1faGVhZGVyLm1fbGV2ZWxfY291bnQ7CisJCWFzc2VydChpbWFnZV9jb3VudCk7CisKKwkJY29uc3QgdWludDhfdCogcFNyYyA9IG1fcERhdGEgKyBtX2hlYWRlci5tX3NnZF9ieXRlX29mZnNldDsKKworCQltZW1jcHkoJm1fZXRjMXNfaGVhZGVyLCBwU3JjLCBzaXplb2Yoa3R4Ml9ldGMxc19nbG9iYWxfZGF0YV9oZWFkZXIpKTsKKwkJcFNyYyArPSBzaXplb2Yoa3R4Ml9ldGMxc19nbG9iYWxfZGF0YV9oZWFkZXIpOworCisJCWlmICgoIW1fZXRjMXNfaGVhZGVyLm1fZW5kcG9pbnRzX2J5dGVfbGVuZ3RoKSB8fCAoIW1fZXRjMXNfaGVhZGVyLm1fc2VsZWN0b3JzX2J5dGVfbGVuZ3RoKSB8fCAoIW1fZXRjMXNfaGVhZGVyLm1fdGFibGVzX2J5dGVfbGVuZ3RoKSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmRlY29tcHJlc3NfZXRjMXNfZ2xvYmFsX2RhdGE6IEludmFsaWQgRVRDMVMgZ2xvYmFsIGRhdGFcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCghbV9ldGMxc19oZWFkZXIubV9lbmRwb2ludF9jb3VudCkgfHwgKCFtX2V0YzFzX2hlYWRlci5tX3NlbGVjdG9yX2NvdW50KSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmRlY29tcHJlc3NfZXRjMXNfZ2xvYmFsX2RhdGE6IGVuZHBvaW50IGFuZC9vciBzZWxlY3RvciBjb3VudCBpcyAwLCBmaWxlIGlzIGludmFsaWQgb3IgY29ycnVwdGVkXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIFNhbml0eSBjaGVjayB0aGUgRVRDMVMgaGVhZGVyLgorCQlpZiAoKHNpemVvZihrdHgyX2V0YzFzX2dsb2JhbF9kYXRhX2hlYWRlcikgKworCQkJc2l6ZW9mKGt0eDJfZXRjMXNfaW1hZ2VfZGVzYykgKiBpbWFnZV9jb3VudCArCisJCQltX2V0YzFzX2hlYWRlci5tX2VuZHBvaW50c19ieXRlX2xlbmd0aCArCisJCQltX2V0YzFzX2hlYWRlci5tX3NlbGVjdG9yc19ieXRlX2xlbmd0aCArCisJCQltX2V0YzFzX2hlYWRlci5tX3RhYmxlc19ieXRlX2xlbmd0aCArCisJCQltX2V0YzFzX2hlYWRlci5tX2V4dGVuZGVkX2J5dGVfbGVuZ3RoKSA+IG1faGVhZGVyLm1fc2dkX2J5dGVfbGVuZ3RoKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6ZGVjb21wcmVzc19ldGMxc19nbG9iYWxfZGF0YTogU0dEIGJ5dGUgbGVuZ3RoIGlzIHRvbyBzbWFsbCwgZmlsZSBpcyBpbnZhbGlkIG9yIGNvcnJ1cHRlZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCQkKKwkJaWYgKCFtX2V0YzFzX2ltYWdlX2Rlc2NzLnRyeV9yZXNpemUoaW1hZ2VfY291bnQpKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6ZGVjb21wcmVzc19ldGMxc19nbG9iYWxfZGF0YTogT3V0IG9mIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCW1lbWNweShtX2V0YzFzX2ltYWdlX2Rlc2NzLmRhdGEoKSwgcFNyYywgc2l6ZW9mKGt0eDJfZXRjMXNfaW1hZ2VfZGVzYykgKiBpbWFnZV9jb3VudCk7CisJCXBTcmMgKz0gc2l6ZW9mKGt0eDJfZXRjMXNfaW1hZ2VfZGVzYykgKiBpbWFnZV9jb3VudDsKKworCQkvLyBTYW5pdHkgY2hlY2sgdGhlIEVUQzFTIGltYWdlIGRlc2NzCisJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbWFnZV9jb3VudDsgaSsrKQorCQl7CisJCQkvLyBtX2V0YzFzX3RyYW5zY29kZXIudHJhbnNjb2RlX2ltYWdlKCkgd2lsbCB2YWxpZGF0ZSB0aGUgc2xpY2Ugb2Zmc2V0cy9sZW5ndGhzIGJlZm9yZSB0cmFuc2NvZGluZy4KKworCQkJaWYgKCFtX2V0YzFzX2ltYWdlX2Rlc2NzW2ldLm1fcmdiX3NsaWNlX2J5dGVfbGVuZ3RoKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpkZWNvbXByZXNzX2V0YzFzX2dsb2JhbF9kYXRhOiBFVEMxUyBpbWFnZSBkZXNjcyBzYW5pdHkgY2hlY2sgZmFpbGVkICgxKVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpZiAobV9oYXNfYWxwaGEpCisJCQl7CisJCQkJaWYgKCFtX2V0YzFzX2ltYWdlX2Rlc2NzW2ldLm1fYWxwaGFfc2xpY2VfYnl0ZV9sZW5ndGgpCisJCQkJeworCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6ZGVjb21wcmVzc19ldGMxc19nbG9iYWxfZGF0YTogRVRDMVMgaW1hZ2UgZGVzY3Mgc2FuaXR5IGNoZWNrIGZhaWxlZCAoMilcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisKKwkJY29uc3QgdWludDhfdCogcEVuZHBvaW50X2RhdGEgPSBwU3JjOworCQljb25zdCB1aW50OF90KiBwU2VsZWN0b3JfZGF0YSA9IHBTcmMgKyBtX2V0YzFzX2hlYWRlci5tX2VuZHBvaW50c19ieXRlX2xlbmd0aDsKKwkJY29uc3QgdWludDhfdCogcFRhYmxlc19kYXRhID0gcFNyYyArIG1fZXRjMXNfaGVhZGVyLm1fZW5kcG9pbnRzX2J5dGVfbGVuZ3RoICsgbV9ldGMxc19oZWFkZXIubV9zZWxlY3RvcnNfYnl0ZV9sZW5ndGg7CisKKwkJaWYgKCFtX2V0YzFzX3RyYW5zY29kZXIuZGVjb2RlX3RhYmxlcyhwVGFibGVzX2RhdGEsIG1fZXRjMXNfaGVhZGVyLm1fdGFibGVzX2J5dGVfbGVuZ3RoKSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OmRlY29tcHJlc3NfZXRjMXNfZ2xvYmFsX2RhdGE6IGRlY29kZV90YWJsZXMoKSBmYWlsZWQsIGZpbGUgaXMgaW52YWxpZCBvciBjb3JydXB0ZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQkJCisJCWlmICghbV9ldGMxc190cmFuc2NvZGVyLmRlY29kZV9wYWxldHRlcygKKwkJCW1fZXRjMXNfaGVhZGVyLm1fZW5kcG9pbnRfY291bnQsCXBFbmRwb2ludF9kYXRhLCBtX2V0YzFzX2hlYWRlci5tX2VuZHBvaW50c19ieXRlX2xlbmd0aCwKKwkJCW1fZXRjMXNfaGVhZGVyLm1fc2VsZWN0b3JfY291bnQsCXBTZWxlY3Rvcl9kYXRhLCBtX2V0YzFzX2hlYWRlci5tX3NlbGVjdG9yc19ieXRlX2xlbmd0aCkpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpkZWNvbXByZXNzX2V0YzFzX2dsb2JhbF9kYXRhOiBkZWNvZGVfcGFsZXR0ZXMoKSBmYWlsZWQsIGZpbGUgaXMgbGlrZWx5IGNvcnJ1cHRlZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCisJYm9vbCBrdHgyX3RyYW5zY29kZXI6OnJlYWRfa2V5X3ZhbHVlcygpCisJeworCQlpZiAoIW1faGVhZGVyLm1fa3ZkX2J5dGVfbGVuZ3RoKQorCQl7CisJCQlpZiAobV9oZWFkZXIubV9rdmRfYnl0ZV9vZmZzZXQpCisJCQl7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OnJlYWRfa2V5X3ZhbHVlczogSW52YWxpZCBLVkQgYnl0ZSBvZmZzZXQgKGl0IHNob3VsZCBiZSB6ZXJvIHdoZW4gdGhlIGxlbmd0aCBpcyB6ZXJvKVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmIChtX2hlYWRlci5tX2t2ZF9ieXRlX29mZnNldCA8IHNpemVvZihrdHgyX2hlYWRlcikpCisJCXsKKwkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpyZWFkX2tleV92YWx1ZXM6IEludmFsaWQgS1ZEIGJ5dGUgb2Zmc2V0XG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICgobV9oZWFkZXIubV9rdmRfYnl0ZV9vZmZzZXQgKyBtX2hlYWRlci5tX2t2ZF9ieXRlX2xlbmd0aCkgPiBtX2RhdGFfc2l6ZSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJrdHgyX3RyYW5zY29kZXI6OnJlYWRfa2V5X3ZhbHVlczogSW52YWxpZCBLVkQgYnl0ZSBvZmZzZXQgYW5kL29yIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQljb25zdCB1aW50OF90KiBwU3JjID0gbV9wRGF0YSArIG1faGVhZGVyLm1fa3ZkX2J5dGVfb2Zmc2V0OworCQl1aW50MzJfdCBzcmNfbGVmdCA9IG1faGVhZGVyLm1fa3ZkX2J5dGVfbGVuZ3RoOworCisJCWlmICghbV9rZXlfdmFsdWVzLnRyeV9yZXNlcnZlKDgpKQorCQl7CisJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6cmVhZF9rZXlfdmFsdWVzOiBPdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXdoaWxlIChzcmNfbGVmdCA+IHNpemVvZih1aW50MzJfdCkpCisJCXsKKwkJCXVpbnQzMl90IGwgPSBiYXNpc3U6OnJlYWRfbGVfZHdvcmQocFNyYyk7CisJCQkKKwkJCXBTcmMgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCXNyY19sZWZ0IC09IHNpemVvZih1aW50MzJfdCk7CisKKwkJCWlmIChsIDwgMikKKwkJCXsKKwkJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6cmVhZF9rZXlfdmFsdWVzOiBGYWlsZWQgcmVhZGluZyBrZXkgdmFsdWUgZmllbGRzICgwKVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpZiAoc3JjX2xlZnQgPCBsKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpyZWFkX2tleV92YWx1ZXM6IEZhaWxlZCByZWFkaW5nIGtleSB2YWx1ZSBmaWVsZHMgKDEpXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWlmICghbV9rZXlfdmFsdWVzLnRyeV9yZXNpemUobV9rZXlfdmFsdWVzLnNpemUoKSArIDEpKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpyZWFkX2tleV92YWx1ZXM6IE91dCBvZiBtZW1vcnlcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQorCQkJYmFzaXN1Ojp1aW50OF92ZWMmIGtleV9kYXRhID0gbV9rZXlfdmFsdWVzLmJhY2soKS5tX2tleTsKKwkJCWJhc2lzdTo6dWludDhfdmVjJiB2YWx1ZV9kYXRhID0gbV9rZXlfdmFsdWVzLmJhY2soKS5tX3ZhbHVlOworCisJCQlkbworCQkJeworCQkJCWlmICghbCkKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpyZWFkX2tleV92YWx1ZXM6IEZhaWxlZCByZWFkaW5nIGtleSB2YWx1ZSBmaWVsZHMgKDIpXG4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJCWlmICgha2V5X2RhdGEudHJ5X3B1c2hfYmFjaygqcFNyYysrKSkKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpyZWFkX2tleV92YWx1ZXM6IE91dCBvZiBtZW1vcnlcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQkJc3JjX2xlZnQtLTsKKwkJCQlsLS07CisKKwkJCX0gd2hpbGUgKGtleV9kYXRhLmJhY2soKSk7CisJCQkJCQkKKwkJCWlmICghdmFsdWVfZGF0YS50cnlfcmVzaXplKGwpKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpyZWFkX2tleV92YWx1ZXM6IE91dCBvZiBtZW1vcnlcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJaWYgKGwpCisJCQl7CisJCQkJbWVtY3B5KHZhbHVlX2RhdGEuZGF0YSgpLCBwU3JjLCBsKTsKKwkJCQlwU3JjICs9IGw7CisJCQkJc3JjX2xlZnQgLT0gbDsKKwkJCX0KKworCQkJdWludDMyX3Qgb2ZzID0gKHVpbnQzMl90KShwU3JjIC0gbV9wRGF0YSkgJiAzOworCQkJdWludDMyX3QgYWxpZ25tZW50X2J5dGVzID0gKDQgLSBvZnMpICYgMzsKKworCQkJaWYgKHNyY19sZWZ0IDwgYWxpZ25tZW50X2J5dGVzKQorCQkJeworCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigia3R4Ml90cmFuc2NvZGVyOjpyZWFkX2tleV92YWx1ZXM6IEZhaWxlZCByZWFkaW5nIGtleSB2YWx1ZSBmaWVsZHMgKDMpXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXBTcmMgKz0gYWxpZ25tZW50X2J5dGVzOworCQkJc3JjX2xlZnQgLT0gYWxpZ25tZW50X2J5dGVzOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCQkKKyNlbmRpZiAvLyBCQVNJU0RfU1VQUE9SVF9LVFgyCisKKwlib29sIGJhc2lzdV90cmFuc2NvZGVyX3N1cHBvcnRzX2t0eDIoKQorCXsKKyNpZiBCQVNJU0RfU1VQUE9SVF9LVFgyCisJCXJldHVybiB0cnVlOworI2Vsc2UKKwkJcmV0dXJuIGZhbHNlOworI2VuZGlmCisJfQorCisJYm9vbCBiYXNpc3VfdHJhbnNjb2Rlcl9zdXBwb3J0c19rdHgyX3pzdGQoKQorCXsKKyNpZiBCQVNJU0RfU1VQUE9SVF9LVFgyX1pTVEQKKwkJcmV0dXJuIHRydWU7CisjZWxzZQorCQlyZXR1cm4gZmFsc2U7CisjZW5kaWYKKwl9CisKIH0gLy8gbmFtZXNwYWNlIGJhc2lzdAotCi0KLQotCi0KIC8qKioqIGVuZGVkIGlubGluaW5nIGJhc2lzdV90cmFuc2NvZGVyLmNwcCAqKioqLwogCiAvKioKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcHJldmlld2Vycy9saWIvYmFzaXN1X3RyYW5zY29kZXIuaCBiL2NvbnRyaWIvcHJldmlld2Vycy9saWIvYmFzaXN1X3RyYW5zY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkODkzYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3ByZXZpZXdlcnMvbGliL2Jhc2lzdV90cmFuc2NvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzA1ICswLDAgQEAKLS8vIGJhc2lzdV90cmFuc2NvZGVyLmgKLS8vIENvcHlyaWdodCAoQykgMjAxOS0yMDIwIEJpbm9taWFsIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIEltcG9ydGFudDogSWYgY29tcGlsaW5nIHdpdGggZ2NjLCBiZSBzdXJlIHN0cmljdCBhbGlhc2luZyBpcyBkaXNhYmxlZDogLWZuby1zdHJpY3QtYWxpYXNpbmcKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotI3ByYWdtYSBvbmNlCi0KLS8vIFNldCBCQVNJU1VfRk9SQ0VfREVWRUxfTUVTU0FHRVMgdG8gMSB0byBlbmFibGUgZGVidWcgcHJpbnRmKCkncyB3aGVuZXZlciBhbiBlcnJvciBvY2N1cnMsIGZvciBlYXNpZXIgZGVidWdnaW5nIGR1cmluZyBkZXZlbG9wbWVudC4KLSNpZm5kZWYgQkFTSVNVX0ZPUkNFX0RFVkVMX01FU1NBR0VTCi0jZGVmaW5lIEJBU0lTVV9GT1JDRV9ERVZFTF9NRVNTQUdFUyAwCi0jZW5kaWYKLQotLyoqKiogc3RhcnQgaW5saW5pbmcgYmFzaXN1X3RyYW5zY29kZXJfaW50ZXJuYWwuaCAqKioqLwotLy8gYmFzaXN1X3RyYW5zY29kZXJfaW50ZXJuYWwuaCAtIFVuaXZlcnNhbCB0ZXh0dXJlIGZvcm1hdCB0cmFuc2NvZGVyIGxpYnJhcnkuCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBCaW5vbWlhbCBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gSW1wb3J0YW50OiBJZiBjb21waWxpbmcgd2l0aCBnY2MsIGJlIHN1cmUgc3RyaWN0IGFsaWFzaW5nIGlzIGRpc2FibGVkOiAtZm5vLXN0cmljdC1hbGlhc2luZwotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZmRlZiBfTVNDX1ZFUgotI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MTI3KSAvLyAgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAotI2VuZGlmCi0KLSNkZWZpbmUgQkFTSVNEX0xJQl9WRVJTSU9OIDExMgotI2RlZmluZSBCQVNJU0RfVkVSU0lPTl9TVFJJTkcgIjAxLjEyIgotCi0jaWZkZWYgX0RFQlVHCi0jZGVmaW5lIEJBU0lTRF9CVUlMRF9ERUJVRwotI2Vsc2UKLSNkZWZpbmUgQkFTSVNEX0JVSUxEX1JFTEVBU0UKLSNlbmRpZgotCi0vKioqKiBzdGFydCBpbmxpbmluZyBiYXNpc3UuaCAqKioqLwotLy8gYmFzaXN1LmgKLS8vIENvcHlyaWdodCAoQykgMjAxOS0yMDIwIEJpbm9taWFsIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIEltcG9ydGFudDogSWYgY29tcGlsaW5nIHdpdGggZ2NjLCBiZSBzdXJlIHN0cmljdCBhbGlhc2luZyBpcyBkaXNhYmxlZDogLWZuby1zdHJpY3QtYWxpYXNpbmcKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZkZWYgX01TQ19WRVIKLQotCSNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQyMDEpCi0JI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDEyNykgLy8gd2FybmluZyBDNDEyNzogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAotCSNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ1MzApIC8vIEMrKyBleGNlcHRpb24gaGFuZGxlciB1c2VkLCBidXQgdW53aW5kIHNlbWFudGljcyBhcmUgbm90IGVuYWJsZWQuCi0KLQkjaWZuZGVmIEJBU0lTVV9OT19JVEVSQVRPUl9ERUJVR19MRVZFTAotCQkvLyNkZWZpbmUgX0hBU19JVEVSQVRPUl9ERUJVR0dJTkcgMAotCi0JCSNpZiBkZWZpbmVkKF9ERUJVRykgfHwgZGVmaW5lZChERUJVRykKLQkJCS8vIFRoaXMgaXMgbWFkbmVzcywgYnV0IHdlIG5lZWQgdG8gZGlzYWJsZSBpdGVyYXRvciBkZWJ1Z2dpbmcgaW4gZGVidWcgYnVpbGRzIG9yIHRoZSBlbmNvZGVyIGlzIHVuc2FibGUgYmVjYXVzZSBNU1ZDJ3MgaXRlcmF0b3IgZGVidWdnaW5nIGltcGxlbWVudGF0aW9uIGlzIHRvdGFsbHkgYnJva2VuLgotCQkJI2lmbmRlZiBfSVRFUkFUT1JfREVCVUdfTEVWRUwKLQkJCSNkZWZpbmUgX0lURVJBVE9SX0RFQlVHX0xFVkVMIDEKLQkJCSNlbmRpZgotCQkJI2lmbmRlZiBfU0VDVVJFX1NDTAotCQkJI2RlZmluZSBfU0VDVVJFX1NDTCAxCi0JCQkjZW5kaWYKLQkJI2Vsc2UgLy8gZGVmaW5lZChfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCi0JCQkjaWZuZGVmIF9TRUNVUkVfU0NMCi0JCQkjZGVmaW5lIF9TRUNVUkVfU0NMIDAKLQkJCSNlbmRpZgotCQkJI2lmbmRlZiBfSVRFUkFUT1JfREVCVUdfTEVWRUwKLQkJCSNkZWZpbmUgX0lURVJBVE9SX0RFQlVHX0xFVkVMIDAKLQkJCSNlbmRpZgotCQkjZW5kaWYgLy8gZGVmaW5lZChfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCi0KLQkJI2lmbmRlZiBOT01JTk1BWAotCQkJI2RlZmluZSBOT01JTk1BWAotCQkjZW5kaWYKLQotCSNlbmRpZiAvLyBCQVNJU1VfTk9fSVRFUkFUT1JfREVCVUdfTEVWRUwKLQotI2VuZGlmIC8vIF9NU0NfVkVSCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cmFuZG9tPgotCi0jaWZkZWYgbWF4Ci0jdW5kZWYgbWF4Ci0jZW5kaWYKLQotI2lmZGVmIG1pbgotI3VuZGVmIG1pbgotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgc3RyY2FzZWNtcCBfc3RyaWNtcAotI2VuZGlmCi0KLS8vIFNldCB0byBvbmUgdG8gZW5hYmxlIGRlYnVnIHByaW50ZigpJ3Mgd2hlbiBhbnkgZXJyb3JzIG9jY3VyLCBmb3IgZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgV2ViR0wgZGV2ZWxvcG1lbnQuCi0jaWZuZGVmIEJBU0lTVV9GT1JDRV9ERVZFTF9NRVNTQUdFUwotI2RlZmluZSBCQVNJU1VfRk9SQ0VfREVWRUxfTUVTU0FHRVMgMAotI2VuZGlmCi0KLSNkZWZpbmUgQkFTSVNVX05PVEVfVU5VU0VEKHgpICh2b2lkKSh4KQotI2RlZmluZSBCQVNJU1VfQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKHhbMF0pKQotI2RlZmluZSBCQVNJU1VfTk9fRVFVQUxTX09SX0NPUFlfQ09OU1RSVUNUKHgpIHgoY29uc3QgeCAmKSA9IGRlbGV0ZTsgeCYgb3BlcmF0b3I9IChjb25zdCB4ICYpID0gZGVsZXRlOwotI2RlZmluZSBCQVNJU1VfQVNTVU1FKHgpIHN0YXRpY19hc3NlcnQoeCwgI3gpOwotI2RlZmluZSBCQVNJU1VfT0ZGU0VUT0YocywgbSkgKHVpbnQzMl90KShpbnRwdHJfdCkoJigocyAqKSgwKSktPm0pCi0jZGVmaW5lIEJBU0lTVV9TVFJJTkdJWkUoeCkgI3gKLSNkZWZpbmUgQkFTSVNVX1NUUklOR0laRTIoeCkgQkFTSVNVX1NUUklOR0laRSh4KQotCi0jaWYgQkFTSVNVX0ZPUkNFX0RFVkVMX01FU1NBR0VTCi0JI2RlZmluZSBCQVNJU1VfREVWRUxfRVJST1IoLi4uKSBkbyB7IGJhc2lzdTo6ZGVidWdfcHJpbnRmKF9fVkFfQVJHU19fKTsgfSB3aGlsZSgwKQotI2Vsc2UKLQkjZGVmaW5lIEJBU0lTVV9ERVZFTF9FUlJPUiguLi4pCi0jZW5kaWYKLQotbmFtZXNwYWNlIGJhc2lzdQotewotCS8vIFR5cGVzL3V0aWxpdGllcwotCi0jaWZkZWYgX1dJTjMyCi0JY29uc3QgY2hhciBCQVNJU1VfUEFUSF9TRVBFUkFUT1JfQ0hBUiA9ICdcXCc7Ci0jZWxzZQotCWNvbnN0IGNoYXIgQkFTSVNVX1BBVEhfU0VQRVJBVE9SX0NIQVIgPSAnLyc7Ci0jZW5kaWYKLQotCXR5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDhfdD4gdWludDhfdmVjOwotCXR5cGVkZWYgc3RkOjp2ZWN0b3I8aW50MTZfdD4gaW50MTZfdmVjOwotCXR5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHVpbnQxNl92ZWM7Ci0JdHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gdWludF92ZWM7Ci0JdHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gdWludDY0X3ZlYzsKLQl0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD4gaW50X3ZlYzsKLQl0eXBlZGVmIHN0ZDo6dmVjdG9yPGJvb2w+IGJvb2xfdmVjOwotCi0Jdm9pZCBlbmFibGVfZGVidWdfcHJpbnRmKGJvb2wgZW5hYmxlZCk7Ci0Jdm9pZCBkZWJ1Z19wcmludGYoY29uc3QgY2hhciAqcEZtdCwgLi4uKTsKLQkJCi0JdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSB2b2lkIGNsZWFyX29iaihUJiBvYmopIHsgbWVtc2V0KCZvYmosIDAsIHNpemVvZihvYmopKTsgfQotCi0JdGVtcGxhdGUgPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4gaW5saW5lIFQwIGxlcnAoVDAgYSwgVDAgYiwgVDEgYykgeyByZXR1cm4gYSArIChiIC0gYSkgKiBjOyB9Ci0KLQl0ZW1wbGF0ZSA8dHlwZW5hbWUgUz4gaW5saW5lIFMgbWF4aW11bShTIGEsIFMgYikgeyByZXR1cm4gKGEgPiBiKSA/IGEgOiBiOyB9Ci0JdGVtcGxhdGUgPHR5cGVuYW1lIFM+IGlubGluZSBTIG1heGltdW0oUyBhLCBTIGIsIFMgYykgeyByZXR1cm4gbWF4aW11bShtYXhpbXVtKGEsIGIpLCBjKTsgfQotCXRlbXBsYXRlIDx0eXBlbmFtZSBTPiBpbmxpbmUgUyBtYXhpbXVtKFMgYSwgUyBiLCBTIGMsIFMgZCkgeyByZXR1cm4gbWF4aW11bShtYXhpbXVtKG1heGltdW0oYSwgYiksIGMpLCBkKTsgfQotCQotCXRlbXBsYXRlIDx0eXBlbmFtZSBTPiBpbmxpbmUgUyBtaW5pbXVtKFMgYSwgUyBiKSB7CXJldHVybiAoYSA8IGIpID8gYSA6IGI7IH0KLQl0ZW1wbGF0ZSA8dHlwZW5hbWUgUz4gaW5saW5lIFMgbWluaW11bShTIGEsIFMgYiwgUyBjKSB7CXJldHVybiBtaW5pbXVtKG1pbmltdW0oYSwgYiksIGMpOyB9Ci0JdGVtcGxhdGUgPHR5cGVuYW1lIFM+IGlubGluZSBTIG1pbmltdW0oUyBhLCBTIGIsIFMgYywgUyBkKSB7IHJldHVybiBtaW5pbXVtKG1pbmltdW0obWluaW11bShhLCBiKSwgYyksIGQpOyB9Ci0KLQlpbmxpbmUgZmxvYXQgY2xhbXBmKGZsb2F0IHZhbHVlLCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsgaWYgKHZhbHVlIDwgbG93KSB2YWx1ZSA9IGxvdzsgZWxzZSBpZiAodmFsdWUgPiBoaWdoKSB2YWx1ZSA9IGhpZ2g7CXJldHVybiB2YWx1ZTsgfQotCWlubGluZSBmbG9hdCBzYXR1cmF0ZShmbG9hdCB2YWx1ZSkgeyByZXR1cm4gY2xhbXBmKHZhbHVlLCAwLCAxLjBmKTsgfQotCWlubGluZSB1aW50OF90IG1pbmltdW11Yih1aW50OF90IGEsIHVpbnQ4X3QgYikgeyByZXR1cm4gKGEgPCBiKSA/IGEgOiBiOyB9Ci0JaW5saW5lIHVpbnQzMl90IG1pbmltdW11KHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsgcmV0dXJuIChhIDwgYikgPyBhIDogYjsgfQotCWlubGluZSBpbnQzMl90IG1pbmltdW1pKGludDMyX3QgYSwgaW50MzJfdCBiKSB7IHJldHVybiAoYSA8IGIpID8gYSA6IGI7IH0KLQlpbmxpbmUgZmxvYXQgbWluaW11bWYoZmxvYXQgYSwgZmxvYXQgYikgeyByZXR1cm4gKGEgPCBiKSA/IGEgOiBiOyB9Ci0JaW5saW5lIHVpbnQ4X3QgbWF4aW11bXViKHVpbnQ4X3QgYSwgdWludDhfdCBiKSB7IHJldHVybiAoYSA+IGIpID8gYSA6IGI7IH0KLQlpbmxpbmUgdWludDMyX3QgbWF4aW11bXUodWludDMyX3QgYSwgdWludDMyX3QgYikgeyByZXR1cm4gKGEgPiBiKSA/IGEgOiBiOyB9Ci0JaW5saW5lIGludDMyX3QgbWF4aW11bWkoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsgcmV0dXJuIChhID4gYikgPyBhIDogYjsgfQotCWlubGluZSBmbG9hdCBtYXhpbXVtZihmbG9hdCBhLCBmbG9hdCBiKSB7IHJldHVybiAoYSA+IGIpID8gYSA6IGI7IH0KLQlpbmxpbmUgaW50IHNxdWFyZWkoaW50IGkpIHsgcmV0dXJuIGkgKiBpOyB9Ci0JaW5saW5lIGZsb2F0IHNxdWFyZWYoZmxvYXQgaSkgeyByZXR1cm4gaSAqIGk7IH0KLQl0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBzcXVhcmUoVCBhKSB7IHJldHVybiBhICogYTsgfQotCi0JdGVtcGxhdGUgPHR5cGVuYW1lIFM+IGlubGluZSBTIGNsYW1wKFMgdmFsdWUsIFMgbG93LCBTIGhpZ2gpIHsgcmV0dXJuICh2YWx1ZSA8IGxvdykgPyBsb3cgOiAoKHZhbHVlID4gaGlnaCkgPyBoaWdoIDogdmFsdWUpOyB9Ci0KLQlpbmxpbmUgdWludDMyX3QgaWFicyhpbnQzMl90IGkpIHsgcmV0dXJuIChpIDwgMCkgPyBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLWkpIDogc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGkpOwl9Ci0JaW5saW5lIHVpbnQ2NF90IGlhYnM2NChpbnQ2NF90IGkpIHsJcmV0dXJuIChpIDwgMCkgPyBzdGF0aWNfY2FzdDx1aW50NjRfdD4oLWkpIDogc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGkpOyB9Ci0KLQl0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCBjbGVhcl92ZWN0b3IoVCAmdmVjKSB7IHZlYy5lcmFzZSh2ZWMuYmVnaW4oKSwgdmVjLmVuZCgpKTsgfQkJCi0JdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgKmVubGFyZ2VfdmVjdG9yKFQgJnZlYywgc2l6ZV90IG4pIHsgc2l6ZV90IGNzID0gdmVjLnNpemUoKTsgdmVjLnJlc2l6ZShjcyArIG4pOyByZXR1cm4gJnZlY1tjc107IH0KLQotCWlubGluZSBib29sIGlzX3BvdzIodWludDMyX3QgeCkgeyByZXR1cm4geCAmJiAoKHggJiAoeCAtIDFVKSkgPT0gMFUpOyB9Ci0JaW5saW5lIGJvb2wgaXNfcG93Mih1aW50NjRfdCB4KSB7IHJldHVybiB4ICYmICgoeCAmICh4IC0gMVUpKSA9PSAwVSk7IH0KLQotCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBUIG9wZW5fcmFuZ2VfY2hlY2soVCB2LCBUIG1pbnYsIFQgbWF4dikgeyBhc3NlcnQodiA+PSBtaW52ICYmIHYgPCBtYXh2KTsgQkFTSVNVX05PVEVfVU5VU0VEKG1pbnYpOyBCQVNJU1VfTk9URV9VTlVTRUQobWF4dik7IHJldHVybiB2OyB9Ci0JdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgb3Blbl9yYW5nZV9jaGVjayhUIHYsIFQgbWF4dikgeyBhc3NlcnQodiA8IG1heHYpOyBCQVNJU1VfTk9URV9VTlVTRUQobWF4dik7IHJldHVybiB2OyB9Ci0KLQlpbmxpbmUgdWludDMyX3QgdG90YWxfYml0cyh1aW50MzJfdCB2KSB7IHVpbnQzMl90IGwgPSAwOyBmb3IgKCA7IHYgPiAwVTsgKytsKSB2ID4+PSAxOyByZXR1cm4gbDsgfQotCi0JdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgc2F0dXJhdGUoVCB2YWwpIHsgcmV0dXJuIGNsYW1wKHZhbCwgMC4wZiwgMS4wZik7IH0KLQotCXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFI+IGlubGluZSB2b2lkIGFwcGVuZF92ZWN0b3IoVCAmdmVjLCBjb25zdCBSICpwT2Jqcywgc2l6ZV90IG4pIAotCXsgCi0JCWlmIChuKQotCQl7Ci0JCQljb25zdCBzaXplX3QgY3VyX3MgPSB2ZWMuc2l6ZSgpOwotCQkJdmVjLnJlc2l6ZShjdXJfcyArIG4pOwotCQkJbWVtY3B5KCZ2ZWNbY3VyX3NdLCBwT2Jqcywgc2l6ZW9mKFIpICogbik7Ci0JCX0KLQl9Ci0KLQl0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCBhcHBlbmRfdmVjdG9yKFQgJnZlYywgY29uc3QgVCAmb3RoZXJfdmVjKQotCXsKLQkJaWYgKG90aGVyX3ZlYy5zaXplKCkpCi0JCQlhcHBlbmRfdmVjdG9yKHZlYywgJm90aGVyX3ZlY1swXSwgb3RoZXJfdmVjLnNpemUoKSk7Ci0JfQotCi0JdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgdmVjdG9yX2Vuc3VyZV9lbGVtZW50X2lzX3ZhbGlkKFQgJnZlYywgc2l6ZV90IGlkeCkKLQl7Ci0JCWlmIChpZHggPj0gdmVjLnNpemUoKSkKLQkJCXZlYy5yZXNpemUoaWR4ICsgMSk7Ci0JfQotCi0JdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgdmVjdG9yX3NvcnQoVCAmdmVjKQotCXsKLQkJaWYgKHZlYy5zaXplKCkpCi0JCQlzdGQ6OnNvcnQodmVjLmJlZ2luKCksIHZlYy5lbmQoKSk7Ci0JfQotCi0JdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gaW5saW5lIGJvb2wgdW5vcmRlcmVkX3NldF9jb250YWlucyhUJiBzZXQsIGNvbnN0IFUmb2JqKQotCXsKLQkJcmV0dXJuIHNldC5maW5kKG9iaikgIT0gc2V0LmVuZCgpOwotCX0KLQotCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCB2ZWN0b3JfZmluZChjb25zdCBUICZ2ZWMsIGNvbnN0IHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgJm9iaikKLQl7Ci0JCWFzc2VydCh2ZWMuc2l6ZSgpIDw9IElOVF9NQVgpOwotCQlmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlYy5zaXplKCk7IGkrKykKLQkJCWlmICh2ZWNbaV0gPT0gb2JqKQotCQkJCXJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB2ZWN0b3Jfc2V0X2FsbChUICZ2ZWMsIGNvbnN0IHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgJm9iaikKLQl7Ci0JCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjLnNpemUoKTsgaSsrKQotCQkJdmVjW2ldID0gb2JqOwotCX0KLQkJCi0JaW5saW5lIHVpbnQ2NF90IHJlYWRfYmU2NChjb25zdCB2b2lkICpwKQotCXsKLQkJdWludDY0X3QgdmFsID0gMDsKLQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7IGkrKykKLQkJCXZhbCB8PSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocClbNyAtIGldKSA8PCAoaSAqIDgpKTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQlpbmxpbmUgdm9pZCB3cml0ZV9iZTY0KHZvaWQgKnAsIHVpbnQ2NF90IHgpCi0JewotCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgODsgaSsrKQotCQkJc3RhdGljX2Nhc3Q8dWludDhfdCAqPihwKVs3IC0gaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih4ID4+IChpICogOCkpOwotCX0KLQotCXN0YXRpYyBpbmxpbmUgdWludDE2X3QgYnl0ZXN3YXAxNih1aW50MTZfdCB4KSB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oKHggPDwgOCkgfCAoeCA+PiA4KSk7IH0KLQlzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJ5dGVzd2FwMzIodWludDMyX3QgeCkgeyByZXR1cm4gKCh4IDw8IDI0KSB8ICgoeCA8PCA4KSAmIDB4MDBGRjAwMDApIHwgKCh4ID4+IDgpICYgMHgwMDAwRkYwMCkgfCAoeCA+PiAyNCkpOyB9Ci0KLQlpbmxpbmUgdWludDMyX3QgZmxvb3JfbG9nMmkodWludDMyX3QgdikKLQl7Ci0JCXVpbnQzMl90IGIgPSAwOwotCQlmb3IgKDsgdiA+IDFVOyArK2IpCi0JCQl2ID4+PSAxOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlpbmxpbmUgdWludDMyX3QgY2VpbF9sb2cyaSh1aW50MzJfdCB2KQotCXsKLQkJdWludDMyX3QgYiA9IGZsb29yX2xvZzJpKHYpOwotCQlpZiAoKGIgIT0gMzIpICYmICh2ID4gKDFVIDw8IGIpKSkKLQkJCSsrYjsKLQkJcmV0dXJuIGI7Ci0JfQotCi0JaW5saW5lIGludCBwb3Ntb2QoaW50IHgsIGludCB5KQotCXsKLQkJaWYgKHggPj0gMCkKLQkJCXJldHVybiAoeCA8IHkpID8geCA6ICh4ICUgeSk7Ci0JCWludCBtID0gKC14KSAlIHk7Ci0JCXJldHVybiAobSAhPSAwKSA/ICh5IC0gbSkgOiBtOwotCX0KLQotCWlubGluZSBib29sIGRvX2V4Y2xfcmFuZ2VzX292ZXJsYXAoaW50IGxhLCBpbnQgaGEsIGludCBsYiwgaW50IGhiKQotCXsKLQkJYXNzZXJ0KGxhIDwgaGEgJiYgbGIgPCBoYik7Ci0JCWlmICgoaGEgPD0gbGIpIHx8IChsYSA+PSBoYikpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQkKLQkvLyBBbHdheXMgbGl0dGxlIGVuZGlhbiAyLTQgYnl0ZSB1bnNpZ25lZCBpbnQKLQl0ZW1wbGF0ZTx1aW50MzJfdCBOdW1CeXRlcz4KLQlzdHJ1Y3QgcGFja2VkX3VpbnQKLQl7Ci0JCXVpbnQ4X3QgbV9ieXRlc1tOdW1CeXRlc107Ci0KLQkJaW5saW5lIHBhY2tlZF91aW50KCkgeyBzdGF0aWNfYXNzZXJ0KE51bUJ5dGVzIDw9IDQsICJOdW1CeXRlcyA8PSA0Iik7IH0KLQkJaW5saW5lIHBhY2tlZF91aW50KHVpbnQzMl90IHYpIHsgKnRoaXMgPSB2OyB9Ci0JCWlubGluZSBwYWNrZWRfdWludChjb25zdCBwYWNrZWRfdWludCYgb3RoZXIpIHsgKnRoaXMgPSBvdGhlcjsgfQotCi0JCWlubGluZSBwYWNrZWRfdWludCYgb3BlcmF0b3I9ICh1aW50MzJfdCB2KSB7IGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBOdW1CeXRlczsgaSsrKSBtX2J5dGVzW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odiA+PiAoaSAqIDgpKTsgcmV0dXJuICp0aGlzOyB9Ci0JCWlubGluZSBwYWNrZWRfdWludCYgb3BlcmF0b3I9IChjb25zdCBwYWNrZWRfdWludCYgcmhzKSB7IG1lbWNweShtX2J5dGVzLCByaHMubV9ieXRlcywgc2l6ZW9mKG1fYnl0ZXMpKTsgcmV0dXJuICp0aGlzOyB9Ci0KLQkJaW5saW5lIG9wZXJhdG9yIHVpbnQzMl90KCkgY29uc3QKLQkJewotCQkJc3dpdGNoIChOdW1CeXRlcykKLQkJCXsKLQkJCQljYXNlIDE6ICByZXR1cm4gIG1fYnl0ZXNbMF07Ci0JCQkJY2FzZSAyOiAgcmV0dXJuIChtX2J5dGVzWzFdIDw8IDhVKSB8IG1fYnl0ZXNbMF07Ci0JCQkJY2FzZSAzOiAgcmV0dXJuIChtX2J5dGVzWzJdIDw8IDE2VSkgfCAobV9ieXRlc1sxXSA8PCA4VSkgfCAobV9ieXRlc1swXSk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIChtX2J5dGVzWzNdIDw8IDI0VSkgfCAobV9ieXRlc1syXSA8PCAxNlUpIHwgKG1fYnl0ZXNbMV0gPDwgOFUpIHwgKG1fYnl0ZXNbMF0pOwotCQkJfQotCQl9Ci0JfTsKLQotCWVudW0gZVplcm8geyBjWmVybyB9OwotCWVudW0gZU5vQ2xhbXAgeyBjTm9DbGFtcCB9OwotCQotCS8vIFJpY2UvSHVmZm1hbiBlbnRyb3B5IGNvZGluZwotCQkKLQkvLyBUaGlzIGlzIGJhc2ljYWxseSBEZWZsYXRlLXN0eWxlIGNhbm9uaWNhbCBIdWZmbWFuLCBleGNlcHQgd2UgYWxsb3cgZm9yIGEgbG90IG1vcmUgc3ltYm9scy4KLQllbnVtCi0JewotCQljSHVmZm1hbk1heFN1cHBvcnRlZENvZGVTaXplID0gMTYsIGNIdWZmbWFuTWF4U3VwcG9ydGVkSW50ZXJuYWxDb2RlU2l6ZSA9IDMxLCAKLQkJY0h1ZmZtYW5GYXN0TG9va3VwQml0cyA9IDEwLCBjSHVmZm1hbkZhc3RMb29rdXBTaXplID0gMSA8PCBjSHVmZm1hbkZhc3RMb29rdXBCaXRzLAotCQljSHVmZm1hbk1heFN5bXNMb2cyID0gMTQsIGNIdWZmbWFuTWF4U3ltcyA9IDEgPDwgY0h1ZmZtYW5NYXhTeW1zTG9nMiwKLQotCQkvLyBTbWFsbCB6ZXJvIHJ1bnMKLQkJY0h1ZmZtYW5TbWFsbFplcm9SdW5TaXplTWluID0gMywgY0h1ZmZtYW5TbWFsbFplcm9SdW5TaXplTWF4ID0gMTAsIGNIdWZmbWFuU21hbGxaZXJvUnVuRXh0cmFCaXRzID0gMywKLQotCQkvLyBCaWcgemVybyBydW4KLQkJY0h1ZmZtYW5CaWdaZXJvUnVuU2l6ZU1pbiA9IDExLCBjSHVmZm1hbkJpZ1plcm9SdW5TaXplTWF4ID0gMTM4LCBjSHVmZm1hbkJpZ1plcm9SdW5FeHRyYUJpdHMgPSA3LAotCi0JCS8vIFNtYWxsIG5vbi16ZXJvIHJ1bgotCQljSHVmZm1hblNtYWxsUmVwZWF0U2l6ZU1pbiA9IDMsIGNIdWZmbWFuU21hbGxSZXBlYXRTaXplTWF4ID0gNiwgY0h1ZmZtYW5TbWFsbFJlcGVhdEV4dHJhQml0cyA9IDIsCi0KLQkJLy8gQmlnIG5vbi16ZXJvIHJ1bgotCQljSHVmZm1hbkJpZ1JlcGVhdFNpemVNaW4gPSA3LCBjSHVmZm1hbkJpZ1JlcGVhdFNpemVNYXggPSAxMzQsIGNIdWZmbWFuQmlnUmVwZWF0RXh0cmFCaXRzID0gNywKLQotCQljSHVmZm1hblRvdGFsQ29kZWxlbmd0aENvZGVzID0gMjEsIGNIdWZmbWFuU21hbGxaZXJvUnVuQ29kZSA9IDE3LCBjSHVmZm1hbkJpZ1plcm9SdW5Db2RlID0gMTgsIGNIdWZmbWFuU21hbGxSZXBlYXRDb2RlID0gMTksIGNIdWZmbWFuQmlnUmVwZWF0Q29kZSA9IDIwCi0JfTsKLQotCXN0YXRpYyBjb25zdCB1aW50OF90IGdfaHVmZm1hbl9zb3J0ZWRfY29kZWxlbmd0aF9jb2Rlc1tdID0geyBjSHVmZm1hblNtYWxsWmVyb1J1bkNvZGUsIGNIdWZmbWFuQmlnWmVyb1J1bkNvZGUsCWNIdWZmbWFuU21hbGxSZXBlYXRDb2RlLCBjSHVmZm1hbkJpZ1JlcGVhdENvZGUsIDAsIDgsIDcsIDksIDYsIDB4QSwgNSwgMHhCLCA0LCAweEMsIDMsIDB4RCwgMiwgMHhFLCAxLCAweEYsIDB4MTAgfTsKLQljb25zdCB1aW50MzJfdCBjSHVmZm1hblRvdGFsU29ydGVkQ29kZWxlbmd0aENvZGVzID0gc2l6ZW9mKGdfaHVmZm1hbl9zb3J0ZWRfY29kZWxlbmd0aF9jb2RlcykgLyBzaXplb2YoZ19odWZmbWFuX3NvcnRlZF9jb2RlbGVuZ3RoX2NvZGVzWzBdKTsKLQotCS8vIEdQVSB0ZXh0dXJlIGZvcm1hdHMKLQotCWVudW0gY2xhc3MgdGV4dHVyZV9mb3JtYXQKLQl7Ci0JCWNJbnZhbGlkVGV4dHVyZUZvcm1hdCA9IC0xLAotCQkKLQkJLy8gQmxvY2stYmFzZWQgZm9ybWF0cwotCQljRVRDMSwJCQkvLyBFVEMxCi0JCWNFVEMxUywJCQkvLyBFVEMxIChzdWJzZXQ6IGRpZmYgY29sb3JzIG9ubHksIG5vIHN1YmJsb2NrcykKLQkJY0VUQzJfUkdCLAkJLy8gRVRDMiBjb2xvciBibG9jayAoYmFzaXN1IGRvZXNuJ3Qgc3VwcG9ydCBFVEMyIHBsYW5hci9UL0ggbW9kZXMgLSBqdXN0IGJhc2ljIEVUQzEpCi0JCWNFVEMyX1JHQkEsCQkvLyBFVEMyIEVBQyBhbHBoYSBibG9jayBmb2xsb3dlZCBieSBFVEMyIGNvbG9yIGJsb2NrCi0JCWNFVEMyX0FMUEhBLAkvLyBFVEMyIEVBQyBhbHBoYSBibG9jayAKLQkJY0JDMSwJCQkJLy8gRFhUMQotCQljQkMzLAkJCQkvLyBEWFQ1IChCQzQvRFhUNUEgYmxvY2sgZm9sbG93ZWQgYnkgYSBCQzEvRFhUMSBibG9jaykKLQkJY0JDNCwJCQkJLy8gRFhUNUEKLQkJY0JDNSwJCQkJLy8gM0RDL0RYTiAodHdvIEJDNC9EWFQ1QSBibG9ja3MpCi0JCWNCQzcsCi0JCWNBU1RDNHg0LAkJLy8gTERSIG9ubHkKLQkJY1BWUlRDMV80X1JHQiwKLQkJY1BWUlRDMV80X1JHQkEsCi0JCWNBVENfUkdCLAotCQljQVRDX1JHQkFfSU5URVJQT0xBVEVEX0FMUEhBLAotCQljRlhUMV9SR0IsCi0JCWNQVlJUQzJfNF9SR0JBLAotCQljRVRDMl9SMTFfRUFDLAotCQljRVRDMl9SRzExX0VBQywKLQkJY1VBU1RDNHg0LAkJCi0JCQotCQkvLyBVbmNvbXByZXNzZWQvcmF3IHBpeGVscwotCQljUkdCQTMyLAotCQljUkdCNTY1LAotCQljQkdSNTY1LAotCQljUkdCQTQ0NDQsCi0JCWNBQkdSNDQ0NAotCX07Ci0KLQlpbmxpbmUgdWludDMyX3QgZ2V0X2J5dGVzX3Blcl9ibG9jayh0ZXh0dXJlX2Zvcm1hdCBmbXQpCi0JewotCQlzd2l0Y2ggKGZtdCkKLQkJewotCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjRVRDMToKLQkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y0VUQzFTOgotCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjRVRDMl9SR0I6Ci0JCWNhc2UgdGV4dHVyZV9mb3JtYXQ6OmNFVEMyX0FMUEhBOgotCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjQkMxOgotCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjQkM0OgotCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjUFZSVEMxXzRfUkdCOgotCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjUFZSVEMxXzRfUkdCQToKLQkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y0FUQ19SR0I6Ci0JCWNhc2UgdGV4dHVyZV9mb3JtYXQ6OmNQVlJUQzJfNF9SR0JBOgotCQljYXNlIHRleHR1cmVfZm9ybWF0OjpjRVRDMl9SMTFfRUFDOgotCQkJcmV0dXJuIDg7Ci0JCWNhc2UgdGV4dHVyZV9mb3JtYXQ6OmNSR0JBMzI6Ci0JCQlyZXR1cm4gc2l6ZW9mKHVpbnQzMl90KSAqIDE2OwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIDE2OwotCX0KLQotCWlubGluZSB1aW50MzJfdCBnZXRfcXdvcmRzX3Blcl9ibG9jayh0ZXh0dXJlX2Zvcm1hdCBmbXQpCi0JewotCQlyZXR1cm4gZ2V0X2J5dGVzX3Blcl9ibG9jayhmbXQpID4+IDM7Ci0JfQotCi0JaW5saW5lIHVpbnQzMl90IGdldF9ibG9ja193aWR0aCh0ZXh0dXJlX2Zvcm1hdCBmbXQpCi0JewotCQlCQVNJU1VfTk9URV9VTlVTRUQoZm10KTsKLQkJc3dpdGNoIChmbXQpCi0JCXsKLQkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y0ZYVDFfUkdCOgotCQkJcmV0dXJuIDg7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gNDsKLQl9Ci0KLQlpbmxpbmUgdWludDMyX3QgZ2V0X2Jsb2NrX2hlaWdodCh0ZXh0dXJlX2Zvcm1hdCBmbXQpCi0JewotCQlCQVNJU1VfTk9URV9VTlVTRUQoZm10KTsKLQkJcmV0dXJuIDQ7Ci0JfQotCQkJCQkJCQotfSAvLyBuYW1lc3BhY2UgYmFzaXN1Ci0KLS8qKioqIGVuZGVkIGlubGluaW5nIGJhc2lzdS5oICoqKiovCi0KLSNkZWZpbmUgQkFTSVNEX3puZXcgKHogPSAzNjk2OSAqICh6ICYgNjU1MzUpICsgKHogPj4gMTYpKQotCi1uYW1lc3BhY2UgYmFzaXN1Ci17Ci0JZXh0ZXJuIGJvb2wgZ19kZWJ1Z19wcmludGY7Ci19Ci0KLW5hbWVzcGFjZSBiYXNpc3QKLXsKLQkvLyBMb3ctbGV2ZWwgZm9ybWF0cyBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgdGhlIHRyYW5zY29kZXIgKG90aGVyIHN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdHMgYXJlIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSBsb3ctbGV2ZWwgYmxvY2sgZm9ybWF0cykuCi0JLy8gWW91IHByb2JhYmx5IGRvbid0IGNhcmUgYWJvdXQgdGhlc2UgZW51bSdzIHVubGVzcyB5b3UgYXJlIGdvaW5nIHByZXR0eSBsb3ctbGV2ZWwgYW5kIGNhbGxpbmcgdGhlIHRyYW5zY29kZXIgdG8gZGVjb2RlIGluZGl2aWR1YWwgc2xpY2VzLgotCWVudW0gY2xhc3MgYmxvY2tfZm9ybWF0Ci0JewotCQljRVRDMSwJCQkJCQkJCS8vIEVUQzFTIFJHQiAKLQkJY0VUQzJfUkdCQSwJCQkJCQkJLy8gZnVsbCBFVEMyIEVBQyBSR0JBOCBibG9jawotCQljQkMxLAkJCQkJCQkJCS8vIERYVDEgUkdCIAotCQljQkMzLAkJCQkJCQkJCS8vIEJDNCBibG9jayBmb2xsb3dlZCBieSBhIGZvdXIgY29sb3IgQkMxIGJsb2NrCi0JCWNCQzQsCQkJCQkJCQkJLy8gRFhUNUEgKGFscGhhIGJsb2NrIG9ubHkpCi0JCWNCQzUsCQkJCQkJCQkJLy8gdHdvIEJDNCBibG9ja3MKLQkJY1BWUlRDMV80X1JHQiwJCQkJCQkvLyBvcGFxdWUtb25seSBQVlJUQzEgNGJwcAotCQljUFZSVEMxXzRfUkdCQSwJCQkJCS8vIFBWUlRDMSA0YnBwIFJHQkEKLQkJY0JDNywJCQkJCQkJCQkvLyBGdWxsIEJDNyBibG9jaywgYW55IG1vZGUKLQkJY0JDN19NNV9DT0xPUiwJCQkJCQkvLyBSR0IgQkM3IG1vZGUgNSBjb2xvciAod3JpdGVzIGFuIG9wYXF1ZSBtb2RlIDUgYmxvY2spCi0JCWNCQzdfTTVfQUxQSEEsCQkJCQkJLy8gYWxwaGEgcG9ydGlvbiBvZiBCQzcgbW9kZSA1IChjQkM3X001X0NPTE9SIG91dHB1dCBkYXRhIG11c3QgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBidWZmZXIgZmlyc3QgdG8gc2V0IHRoZSBtb2RlL3JvdCBmaWVsZHMgZXRjLikKLQkJY0VUQzJfRUFDX0E4LAkJCQkJCS8vIGFscGhhIGJsb2NrIG9mIEVUQzIgRUFDIChmaXJzdCA4IGJ5dGVzIG9mIHRoZSAxNi1iaXQgRVRDMiBFQUMgUkdCQSBmb3JtYXQpCi0JCWNBU1RDXzR4NCwJCQkJCQkJLy8gQVNUQyA0eDQgKGVpdGhlciBjb2xvci1vbmx5IG9yIGNvbG9yK2FscGhhKS4gTm90ZSB0aGF0IHRoZSB0cmFuc2NvZGVyIGFsd2F5cyBjdXJyZW50bHkgYXNzdW1lcyBzUkdCIGlzIG5vdCBlbmFibGVkIHdoZW4gb3V0cHV0dGluZyBBU1RDIAotCQkJCQkJCQkJCQkJLy8gZGF0YS4gSWYgeW91IHVzZSBhIHNSR0IgQVNUQyBmb3JtYXQgeW91J2xsIGdldCB+MSBMU0Igb2YgYWRkaXRpb25hbCBlcnJvciwgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW50IHdheSBBU1RDIGRlY29kZXJzIHNjYWxlIDgtYml0IGVuZHBvaW50cyB0byAxNi1iaXRzIGR1cmluZyB1bnBhY2tpbmcuCi0JCQotCQljQVRDX1JHQiwKLQkJY0FUQ19SR0JBX0lOVEVSUE9MQVRFRF9BTFBIQSwKLQkJY0ZYVDFfUkdCLAkJCQkJCQkvLyBPcGFxdWUtb25seSwgaGFzIG9kZGJhbGwgOHg0IHBpeGVsIGJsb2NrIHNpemUKLQotCQljUFZSVEMyXzRfUkdCLAotCQljUFZSVEMyXzRfUkdCQSwKLQotCQljRVRDMl9FQUNfUjExLAotCQljRVRDMl9FQUNfUkcxMSwKLQkJCQkJCQkJCQkJCQotCQljSW5kaWNlcywJCQkJCQkJLy8gVXNlZCBpbnRlcm5hbGx5OiBXcml0ZSAxNi1iaXQgZW5kcG9pbnQgYW5kIHNlbGVjdG9yIGluZGljZXMgZGlyZWN0bHkgdG8gb3V0cHV0IChvdXRwdXQgYmxvY2sgbXVzdCBiZSBhdCBsZWFzdCAzMi1iaXRzKQotCi0JCWNSR0IzMiwJCQkJCQkJCS8vIFdyaXRlcyBSR0IgY29tcG9uZW50cyB0byAzMmJwcCBvdXRwdXQgcGl4ZWxzCi0JCWNSR0JBMzIsCQkJCQkJCQkvLyBXcml0ZXMgUkdCMjU1IGNvbXBvbmVudHMgdG8gMzJicHAgb3V0cHV0IHBpeGVscwotCQljQTMyLAkJCQkJCQkJCS8vIFdyaXRlcyBhbHBoYSBjb21wb25lbnQgdG8gMzJicHAgb3V0cHV0IHBpeGVscwotCQkJCQotCQljUkdCNTY1LAotCQljQkdSNTY1LAotCQkKLQkJY1JHQkE0NDQ0X0NPTE9SLAotCQljUkdCQTQ0NDRfQUxQSEEsCi0JCWNSR0JBNDQ0NF9DT0xPUl9PUEFRVUUsCi0JCWNSR0JBNDQ0NCwKLQkJCQkJCQotCQljVG90YWxCbG9ja0Zvcm1hdHMKLQl9OwotCi0JY29uc3QgaW50IENPTE9SNV9QQUwwX1BSRVZfSEkgPSA5LCBDT0xPUjVfUEFMMF9ERUxUQV9MTyA9IC05LCBDT0xPUjVfUEFMMF9ERUxUQV9ISSA9IDMxOwotCWNvbnN0IGludCBDT0xPUjVfUEFMMV9QUkVWX0hJID0gMjEsIENPTE9SNV9QQUwxX0RFTFRBX0xPID0gLTIxLCBDT0xPUjVfUEFMMV9ERUxUQV9ISSA9IDIxOwotCWNvbnN0IGludCBDT0xPUjVfUEFMMl9QUkVWX0hJID0gMzEsIENPTE9SNV9QQUwyX0RFTFRBX0xPID0gLTMxLCBDT0xPUjVfUEFMMl9ERUxUQV9ISSA9IDk7Ci0JY29uc3QgaW50IENPTE9SNV9QQUxfTUlOX0RFTFRBX0JfUlVOTEVOID0gMywgQ09MT1I1X1BBTF9ERUxUQV81X1JVTkxFTl9WTENfQklUUyA9IDM7Ci0KLQljb25zdCB1aW50MzJfdCBFTkRQT0lOVF9QUkVEX1RPVEFMX1NZTUJPTFMgPSAoNCAqIDQgKiA0ICogNCkgKyAxOwotCWNvbnN0IHVpbnQzMl90IEVORFBPSU5UX1BSRURfUkVQRUFUX0xBU1RfU1lNQk9MID0gRU5EUE9JTlRfUFJFRF9UT1RBTF9TWU1CT0xTIC0gMTsKLQljb25zdCB1aW50MzJfdCBFTkRQT0lOVF9QUkVEX01JTl9SRVBFQVRfQ09VTlQgPSAzOwotCWNvbnN0IHVpbnQzMl90IEVORFBPSU5UX1BSRURfQ09VTlRfVkxDX0JJVFMgPSA0OwotCi0JY29uc3QgdWludDMyX3QgTlVNX0VORFBPSU5UX1BSRURTID0gMzsvLyBCQVNJU1VfQVJSQVlfU0laRShnX2VuZHBvaW50X3ByZWRzKTsKLQljb25zdCB1aW50MzJfdCBDUl9FTkRQT0lOVF9QUkVEX0lOREVYID0gTlVNX0VORFBPSU5UX1BSRURTIC0gMTsKLQljb25zdCB1aW50MzJfdCBOT19FTkRQT0lOVF9QUkVEX0lOREVYID0gMzsvL05VTV9FTkRQT0lOVF9QUkVEUzsKLQljb25zdCB1aW50MzJfdCBNQVhfU0VMRUNUT1JfSElTVE9SWV9CVUZfU0laRSA9IDY0OwotCWNvbnN0IHVpbnQzMl90IFNFTEVDVE9SX0hJU1RPUllfQlVGX1JMRV9DT1VOVF9USFJFU0ggPSAzOwotCWNvbnN0IHVpbnQzMl90IFNFTEVDVE9SX0hJU1RPUllfQlVGX1JMRV9DT1VOVF9CSVRTID0gNjsKLQljb25zdCB1aW50MzJfdCBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9STEVfQ09VTlRfVE9UQUwgPSAoMSA8PCBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9STEVfQ09VTlRfQklUUyk7Ci0JCQotCXVpbnQxNl90IGNyYzE2KGNvbnN0IHZvaWQgKnIsIHNpemVfdCBzaXplLCB1aW50MTZfdCBjcmMpOwotCQkKLQljbGFzcyBodWZmbWFuX2RlY29kaW5nX3RhYmxlCi0JewotCQlmcmllbmQgY2xhc3MgYml0d2lzZV9kZWNvZGVyOwotCi0JcHVibGljOgotCQlodWZmbWFuX2RlY29kaW5nX3RhYmxlKCkKLQkJewotCQl9Ci0KLQkJdm9pZCBjbGVhcigpCi0JCXsKLQkJCWJhc2lzdTo6Y2xlYXJfdmVjdG9yKG1fY29kZV9zaXplcyk7Ci0JCQliYXNpc3U6OmNsZWFyX3ZlY3RvcihtX2xvb2t1cCk7Ci0JCQliYXNpc3U6OmNsZWFyX3ZlY3RvcihtX3RyZWUpOwotCQl9Ci0KLQkJYm9vbCBpbml0KHVpbnQzMl90IHRvdGFsX3N5bXMsIGNvbnN0IHVpbnQ4X3QgKnBDb2RlX3NpemVzKQotCQl7Ci0JCQlpZiAoIXRvdGFsX3N5bXMpCi0JCQl7Ci0JCQkJY2xlYXIoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJbV9jb2RlX3NpemVzLnJlc2l6ZSh0b3RhbF9zeW1zKTsKLQkJCW1lbWNweSgmbV9jb2RlX3NpemVzWzBdLCBwQ29kZV9zaXplcywgdG90YWxfc3ltcyk7Ci0KLQkJCW1fbG9va3VwLnJlc2l6ZSgwKTsKLQkJCW1fbG9va3VwLnJlc2l6ZShiYXNpc3U6OmNIdWZmbWFuRmFzdExvb2t1cFNpemUpOwotCi0JCQltX3RyZWUucmVzaXplKDApOwotCQkJbV90cmVlLnJlc2l6ZSh0b3RhbF9zeW1zICogMik7Ci0KLQkJCXVpbnQzMl90IHN5bXNfdXNpbmdfY29kZXNpemVbYmFzaXN1OjpjSHVmZm1hbk1heFN1cHBvcnRlZEludGVybmFsQ29kZVNpemUgKyAxXTsKLQkJCWJhc2lzdTo6Y2xlYXJfb2JqKHN5bXNfdXNpbmdfY29kZXNpemUpOwotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHRvdGFsX3N5bXM7IGkrKykKLQkJCXsKLQkJCQlpZiAocENvZGVfc2l6ZXNbaV0gPiBiYXNpc3U6OmNIdWZmbWFuTWF4U3VwcG9ydGVkSW50ZXJuYWxDb2RlU2l6ZSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCXN5bXNfdXNpbmdfY29kZXNpemVbcENvZGVfc2l6ZXNbaV1dKys7Ci0JCQl9Ci0KLQkJCXVpbnQzMl90IG5leHRfY29kZVtiYXNpc3U6OmNIdWZmbWFuTWF4U3VwcG9ydGVkSW50ZXJuYWxDb2RlU2l6ZSArIDFdOwotCQkJbmV4dF9jb2RlWzBdID0gbmV4dF9jb2RlWzFdID0gMDsKLQotCQkJdWludDMyX3QgdXNlZF9zeW1zID0gMCwgdG90YWwgPSAwOwotCQkJZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IGJhc2lzdTo6Y0h1ZmZtYW5NYXhTdXBwb3J0ZWRJbnRlcm5hbENvZGVTaXplOyBpKyspCi0JCQl7Ci0JCQkJdXNlZF9zeW1zICs9IHN5bXNfdXNpbmdfY29kZXNpemVbaV07Ci0JCQkJbmV4dF9jb2RlW2kgKyAxXSA9ICh0b3RhbCA9ICgodG90YWwgKyBzeW1zX3VzaW5nX2NvZGVzaXplW2ldKSA8PCAxKSk7Ci0JCQl9Ci0KLQkJCWlmICgoKDFVIDw8IGJhc2lzdTo6Y0h1ZmZtYW5NYXhTdXBwb3J0ZWRJbnRlcm5hbENvZGVTaXplKSAhPSB0b3RhbCkgJiYgKHVzZWRfc3ltcyA+IDFVKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWZvciAoaW50IHRyZWVfbmV4dCA9IC0xLCBzeW1faW5kZXggPSAwOyBzeW1faW5kZXggPCAoaW50KXRvdGFsX3N5bXM7ICsrc3ltX2luZGV4KQotCQkJewotCQkJCXVpbnQzMl90IHJldl9jb2RlID0gMCwgbCwgY3VyX2NvZGUsIGNvZGVfc2l6ZSA9IHBDb2RlX3NpemVzW3N5bV9pbmRleF07Ci0JCQkJaWYgKCFjb2RlX3NpemUpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJY3VyX2NvZGUgPSBuZXh0X2NvZGVbY29kZV9zaXplXSsrOwotCi0JCQkJZm9yIChsID0gY29kZV9zaXplOyBsID4gMDsgbC0tLCBjdXJfY29kZSA+Pj0gMSkKLQkJCQkJcmV2X2NvZGUgPSAocmV2X2NvZGUgPDwgMSkgfCAoY3VyX2NvZGUgJiAxKTsKLQotCQkJCWlmIChjb2RlX3NpemUgPD0gYmFzaXN1OjpjSHVmZm1hbkZhc3RMb29rdXBCaXRzKQotCQkJCXsKLQkJCQkJdWludDMyX3QgayA9IChjb2RlX3NpemUgPDwgMTYpIHwgc3ltX2luZGV4OwotCQkJCQl3aGlsZSAocmV2X2NvZGUgPCBiYXNpc3U6OmNIdWZmbWFuRmFzdExvb2t1cFNpemUpCi0JCQkJCXsKLQkJCQkJCWlmIChtX2xvb2t1cFtyZXZfY29kZV0gIT0gMCkKLQkJCQkJCXsKLQkJCQkJCQkvLyBTdXBwbGllZCBjb2Rlc2l6ZXMgY2FuJ3QgY3JlYXRlIGEgdmFsaWQgcHJlZml4IGNvZGUuCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCi0JCQkJCQltX2xvb2t1cFtyZXZfY29kZV0gPSBrOwotCQkJCQkJcmV2X2NvZGUgKz0gKDEgPDwgY29kZV9zaXplKTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpbnQgdHJlZV9jdXI7Ci0JCQkJaWYgKDAgPT0gKHRyZWVfY3VyID0gbV9sb29rdXBbcmV2X2NvZGUgJiAoYmFzaXN1OjpjSHVmZm1hbkZhc3RMb29rdXBTaXplIC0gMSldKSkKLQkJCQl7Ci0JCQkJCWNvbnN0IHVpbnQzMl90IGlkeCA9IHJldl9jb2RlICYgKGJhc2lzdTo6Y0h1ZmZtYW5GYXN0TG9va3VwU2l6ZSAtIDEpOwotCQkJCQlpZiAobV9sb29rdXBbaWR4XSAhPSAwKQotCQkJCQl7Ci0JCQkJCQkvLyBTdXBwbGllZCBjb2Rlc2l6ZXMgY2FuJ3QgY3JlYXRlIGEgdmFsaWQgcHJlZml4IGNvZGUuCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQltX2xvb2t1cFtpZHhdID0gdHJlZV9uZXh0OwotCQkJCQl0cmVlX2N1ciA9IHRyZWVfbmV4dDsKLQkJCQkJdHJlZV9uZXh0IC09IDI7Ci0JCQkJfQotCi0JCQkJaWYgKHRyZWVfY3VyID49IDApCi0JCQkJewotCQkJCQkvLyBTdXBwbGllZCBjb2Rlc2l6ZXMgY2FuJ3QgY3JlYXRlIGEgdmFsaWQgcHJlZml4IGNvZGUuCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlyZXZfY29kZSA+Pj0gKGJhc2lzdTo6Y0h1ZmZtYW5GYXN0TG9va3VwQml0cyAtIDEpOwotCi0JCQkJZm9yIChpbnQgaiA9IGNvZGVfc2l6ZTsgaiA+IChiYXNpc3U6OmNIdWZmbWFuRmFzdExvb2t1cEJpdHMgKyAxKTsgai0tKQotCQkJCXsKLQkJCQkJdHJlZV9jdXIgLT0gKChyZXZfY29kZSA+Pj0gMSkgJiAxKTsKLQotCQkJCQljb25zdCBpbnQgaWR4ID0gLXRyZWVfY3VyIC0gMTsKLQkJCQkJaWYgKGlkeCA8IDApCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWVsc2UgaWYgKGlkeCA+PSAoaW50KW1fdHJlZS5zaXplKCkpCi0JCQkJCQltX3RyZWUucmVzaXplKGlkeCArIDEpOwotCQkJCQkJCQkJCQotCQkJCQlpZiAoIW1fdHJlZVtpZHhdKQotCQkJCQl7Ci0JCQkJCQltX3RyZWVbaWR4XSA9IChpbnQxNl90KXRyZWVfbmV4dDsKLQkJCQkJCXRyZWVfY3VyID0gdHJlZV9uZXh0OwotCQkJCQkJdHJlZV9uZXh0IC09IDI7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQl0cmVlX2N1ciA9IG1fdHJlZVtpZHhdOwotCQkJCQkJaWYgKHRyZWVfY3VyID49IDApCi0JCQkJCQl7Ci0JCQkJCQkJLy8gU3VwcGxpZWQgY29kZXNpemVzIGNhbid0IGNyZWF0ZSBhIHZhbGlkIHByZWZpeCBjb2RlLgotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXRyZWVfY3VyIC09ICgocmV2X2NvZGUgPj49IDEpICYgMSk7Ci0KLQkJCQljb25zdCBpbnQgaWR4ID0gLXRyZWVfY3VyIC0gMTsKLQkJCQlpZiAoaWR4IDwgMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UgaWYgKGlkeCA+PSAoaW50KW1fdHJlZS5zaXplKCkpCi0JCQkJCW1fdHJlZS5yZXNpemUoaWR4ICsgMSk7Ci0KLQkJCQlpZiAobV90cmVlW2lkeF0gIT0gMCkKLQkJCQl7Ci0JCQkJCS8vIFN1cHBsaWVkIGNvZGVzaXplcyBjYW4ndCBjcmVhdGUgYSB2YWxpZCBwcmVmaXggY29kZS4KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCW1fdHJlZVtpZHhdID0gKGludDE2X3Qpc3ltX2luZGV4OwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWNvbnN0IGJhc2lzdTo6dWludDhfdmVjICZnZXRfY29kZV9zaXplcygpIGNvbnN0IHsgcmV0dXJuIG1fY29kZV9zaXplczsgfQotCi0JCWJvb2wgaXNfdmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2NvZGVfc2l6ZXMuc2l6ZSgpID4gMDsgfQotCi0JcHJpdmF0ZToKLQkJYmFzaXN1Ojp1aW50OF92ZWMgbV9jb2RlX3NpemVzOwotCQliYXNpc3U6OmludF92ZWMgbV9sb29rdXA7Ci0JCWJhc2lzdTo6aW50MTZfdmVjIG1fdHJlZTsKLQl9OwotCi0JY2xhc3MgYml0d2lzZV9kZWNvZGVyCi0JewotCXB1YmxpYzoKLQkJYml0d2lzZV9kZWNvZGVyKCkgOgotCQkJbV9idWZfc2l6ZSgwKSwKLQkJCW1fcEJ1ZihudWxscHRyKSwKLQkJCW1fcEJ1Zl9zdGFydChudWxscHRyKSwKLQkJCW1fcEJ1Zl9lbmQobnVsbHB0ciksCi0JCQltX2JpdF9idWYoMCksCi0JCQltX2JpdF9idWZfc2l6ZSgwKQotCQl7Ci0JCX0KLQotCQl2b2lkIGNsZWFyKCkKLQkJewotCQkJbV9idWZfc2l6ZSA9IDA7Ci0JCQltX3BCdWYgPSBudWxscHRyOwotCQkJbV9wQnVmX3N0YXJ0ID0gbnVsbHB0cjsKLQkJCW1fcEJ1Zl9lbmQgPSBudWxscHRyOwotCQkJbV9iaXRfYnVmID0gMDsKLQkJCW1fYml0X2J1Zl9zaXplID0gMDsKLQkJfQotCi0JCWJvb2wgaW5pdChjb25zdCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBidWZfc2l6ZSkKLQkJewotCQkJaWYgKCghcEJ1ZikgJiYgKGJ1Zl9zaXplKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCW1fYnVmX3NpemUgPSBidWZfc2l6ZTsKLQkJCW1fcEJ1ZiA9IHBCdWY7Ci0JCQltX3BCdWZfc3RhcnQgPSBwQnVmOwotCQkJbV9wQnVmX2VuZCA9IHBCdWYgKyBidWZfc2l6ZTsKLQkJCW1fYml0X2J1ZiA9IDA7Ci0JCQltX2JpdF9idWZfc2l6ZSA9IDA7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXZvaWQgc3RvcCgpCi0JCXsKLQkJfQotCi0JCWlubGluZSB1aW50MzJfdCBwZWVrX2JpdHModWludDMyX3QgbnVtX2JpdHMpCi0JCXsKLQkJCWlmICghbnVtX2JpdHMpCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCWFzc2VydChudW1fYml0cyA8PSAyNSk7Ci0KLQkJCXdoaWxlIChtX2JpdF9idWZfc2l6ZSA8IG51bV9iaXRzKQotCQkJewotCQkJCXVpbnQzMl90IGMgPSAwOwotCQkJCWlmIChtX3BCdWYgPCBtX3BCdWZfZW5kKQotCQkJCQljID0gKm1fcEJ1ZisrOwotCi0JCQkJbV9iaXRfYnVmIHw9IChjIDw8IG1fYml0X2J1Zl9zaXplKTsKLQkJCQltX2JpdF9idWZfc2l6ZSArPSA4OwotCQkJCWFzc2VydChtX2JpdF9idWZfc2l6ZSA8PSAzMik7Ci0JCQl9Ci0KLQkJCXJldHVybiBtX2JpdF9idWYgJiAoKDEgPDwgbnVtX2JpdHMpIC0gMSk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZV9iaXRzKHVpbnQzMl90IG51bV9iaXRzKQotCQl7Ci0JCQlhc3NlcnQobV9iaXRfYnVmX3NpemUgPj0gbnVtX2JpdHMpOwotCi0JCQltX2JpdF9idWYgPj49IG51bV9iaXRzOwotCQkJbV9iaXRfYnVmX3NpemUgLT0gbnVtX2JpdHM7Ci0JCX0KLQotCQl1aW50MzJfdCBnZXRfYml0cyh1aW50MzJfdCBudW1fYml0cykKLQkJewotCQkJaWYgKG51bV9iaXRzID4gMjUpCi0JCQl7Ci0JCQkJYXNzZXJ0KG51bV9iaXRzIDw9IDMyKTsKLQotCQkJCWNvbnN0IHVpbnQzMl90IGJpdHMwID0gcGVla19iaXRzKDI1KTsKLQkJCQltX2JpdF9idWYgPj49IDI1OwotCQkJCW1fYml0X2J1Zl9zaXplIC09IDI1OwotCQkJCW51bV9iaXRzIC09IDI1OwotCi0JCQkJY29uc3QgdWludDMyX3QgYml0cyA9IHBlZWtfYml0cyhudW1fYml0cyk7Ci0JCQkJbV9iaXRfYnVmID4+PSBudW1fYml0czsKLQkJCQltX2JpdF9idWZfc2l6ZSAtPSBudW1fYml0czsKLQotCQkJCXJldHVybiBiaXRzMCB8IChiaXRzIDw8IDI1KTsKLQkJCX0KLQotCQkJY29uc3QgdWludDMyX3QgYml0cyA9IHBlZWtfYml0cyhudW1fYml0cyk7Ci0KLQkJCW1fYml0X2J1ZiA+Pj0gbnVtX2JpdHM7Ci0JCQltX2JpdF9idWZfc2l6ZSAtPSBudW1fYml0czsKLQotCQkJcmV0dXJuIGJpdHM7Ci0JCX0KLQotCQl1aW50MzJfdCBkZWNvZGVfdHJ1bmNhdGVkX2JpbmFyeSh1aW50MzJfdCBuKQotCQl7Ci0JCQlhc3NlcnQobiA+PSAyKTsKLQotCQkJY29uc3QgdWludDMyX3QgayA9IGJhc2lzdTo6Zmxvb3JfbG9nMmkobik7Ci0JCQljb25zdCB1aW50MzJfdCB1ID0gKDEgPDwgKGsgKyAxKSkgLSBuOwotCi0JCQl1aW50MzJfdCByZXN1bHQgPSBnZXRfYml0cyhrKTsKLQotCQkJaWYgKHJlc3VsdCA+PSB1KQotCQkJCXJlc3VsdCA9ICgocmVzdWx0IDw8IDEpIHwgZ2V0X2JpdHMoMSkpIC0gdTsKLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXVpbnQzMl90IGRlY29kZV9yaWNlKHVpbnQzMl90IG0pCi0JCXsKLQkJCWFzc2VydChtKTsKLQotCQkJdWludDMyX3QgcSA9IDA7Ci0JCQlmb3IgKDs7KQotCQkJewotCQkJCXVpbnQzMl90IGsgPSBwZWVrX2JpdHMoMTYpOwotCQkJCQotCQkJCXVpbnQzMl90IGwgPSAwOwotCQkJCXdoaWxlIChrICYgMSkKLQkJCQl7Ci0JCQkJCWwrKzsKLQkJCQkJayA+Pj0gMTsKLQkJCQl9Ci0JCQkJCi0JCQkJcSArPSBsOwotCi0JCQkJcmVtb3ZlX2JpdHMobCk7Ci0KLQkJCQlpZiAobCA8IDE2KQotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJcmV0dXJuIChxIDw8IG0pICsgKGdldF9iaXRzKG0gKyAxKSA+PiAxKTsKLQkJfQotCi0JCWlubGluZSB1aW50MzJfdCBkZWNvZGVfdmxjKHVpbnQzMl90IGNodW5rX2JpdHMpCi0JCXsKLQkJCWFzc2VydChjaHVua19iaXRzKTsKLQotCQkJY29uc3QgdWludDMyX3QgY2h1bmtfc2l6ZSA9IDEgPDwgY2h1bmtfYml0czsKLQkJCWNvbnN0IHVpbnQzMl90IGNodW5rX21hc2sgPSBjaHVua19zaXplIC0gMTsKLQkJCQkJCi0JCQl1aW50MzJfdCB2ID0gMDsKLQkJCXVpbnQzMl90IG9mcyA9IDA7Ci0KLQkJCWZvciAoIDsgOyApCi0JCQl7Ci0JCQkJdWludDMyX3QgcyA9IGdldF9iaXRzKGNodW5rX2JpdHMgKyAxKTsKLQkJCQl2IHw9ICgocyAmIGNodW5rX21hc2spIDw8IG9mcyk7Ci0JCQkJb2ZzICs9IGNodW5rX2JpdHM7Ci0KLQkJCQlpZiAoKHMgJiBjaHVua19zaXplKSA9PSAwKQotCQkJCQlicmVhazsKLQkJCQkKLQkJCQlpZiAob2ZzID49IDMyKQotCQkJCXsKLQkJCQkJYXNzZXJ0KDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiB2OwotCQl9Ci0KLQkJaW5saW5lIHVpbnQzMl90IGRlY29kZV9odWZmbWFuKGNvbnN0IGh1ZmZtYW5fZGVjb2RpbmdfdGFibGUgJmN0KQotCQl7Ci0JCQlhc3NlcnQoY3QubV9jb2RlX3NpemVzLnNpemUoKSk7Ci0JCQkJCQkKLQkJCXdoaWxlIChtX2JpdF9idWZfc2l6ZSA8IDE2KQotCQkJewotCQkJCXVpbnQzMl90IGMgPSAwOwotCQkJCWlmIChtX3BCdWYgPCBtX3BCdWZfZW5kKQotCQkJCQljID0gKm1fcEJ1ZisrOwotCi0JCQkJbV9iaXRfYnVmIHw9IChjIDw8IG1fYml0X2J1Zl9zaXplKTsKLQkJCQltX2JpdF9idWZfc2l6ZSArPSA4OwotCQkJCWFzc2VydChtX2JpdF9idWZfc2l6ZSA8PSAzMik7Ci0JCQl9Ci0JCQkJCQkKLQkJCWludCBjb2RlX2xlbjsKLQotCQkJaW50IHN5bTsKLQkJCWlmICgoc3ltID0gY3QubV9sb29rdXBbbV9iaXRfYnVmICYgKGJhc2lzdTo6Y0h1ZmZtYW5GYXN0TG9va3VwU2l6ZSAtIDEpXSkgPj0gMCkKLQkJCXsKLQkJCQljb2RlX2xlbiA9IHN5bSA+PiAxNjsKLQkJCQlzeW0gJj0gMHhGRkZGOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWNvZGVfbGVuID0gYmFzaXN1OjpjSHVmZm1hbkZhc3RMb29rdXBCaXRzOwotCQkJCWRvCi0JCQkJewotCQkJCQlzeW0gPSBjdC5tX3RyZWVbfnN5bSArICgobV9iaXRfYnVmID4+IGNvZGVfbGVuKyspICYgMSldOyAvLyB+c3ltID0gLXN5bSAtIDEKLQkJCQl9IHdoaWxlIChzeW0gPCAwKTsKLQkJCX0KLQotCQkJbV9iaXRfYnVmID4+PSBjb2RlX2xlbjsKLQkJCW1fYml0X2J1Zl9zaXplIC09IGNvZGVfbGVuOwotCi0JCQlyZXR1cm4gc3ltOwotCQl9Ci0KLQkJYm9vbCByZWFkX2h1ZmZtYW5fdGFibGUoaHVmZm1hbl9kZWNvZGluZ190YWJsZSAmY3QpCi0JCXsKLQkJCWN0LmNsZWFyKCk7Ci0KLQkJCWNvbnN0IHVpbnQzMl90IHRvdGFsX3VzZWRfc3ltcyA9IGdldF9iaXRzKGJhc2lzdTo6Y0h1ZmZtYW5NYXhTeW1zTG9nMik7Ci0KLQkJCWlmICghdG90YWxfdXNlZF9zeW1zKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKHRvdGFsX3VzZWRfc3ltcyA+IGJhc2lzdTo6Y0h1ZmZtYW5NYXhTeW1zKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJdWludDhfdCBjb2RlX2xlbmd0aF9jb2RlX3NpemVzW2Jhc2lzdTo6Y0h1ZmZtYW5Ub3RhbENvZGVsZW5ndGhDb2Rlc107Ci0JCQliYXNpc3U6OmNsZWFyX29iaihjb2RlX2xlbmd0aF9jb2RlX3NpemVzKTsKLQotCQkJY29uc3QgdWludDMyX3QgbnVtX2NvZGVsZW5ndGhfY29kZXMgPSBnZXRfYml0cyg1KTsKLQkJCWlmICgobnVtX2NvZGVsZW5ndGhfY29kZXMgPCAxKSB8fCAobnVtX2NvZGVsZW5ndGhfY29kZXMgPiBiYXNpc3U6OmNIdWZmbWFuVG90YWxDb2RlbGVuZ3RoQ29kZXMpKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9jb2RlbGVuZ3RoX2NvZGVzOyBpKyspCi0JCQkJY29kZV9sZW5ndGhfY29kZV9zaXplc1tiYXNpc3U6OmdfaHVmZm1hbl9zb3J0ZWRfY29kZWxlbmd0aF9jb2Rlc1tpXV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihnZXRfYml0cygzKSk7Ci0KLQkJCWh1ZmZtYW5fZGVjb2RpbmdfdGFibGUgY29kZV9sZW5ndGhfdGFibGU7Ci0JCQlpZiAoIWNvZGVfbGVuZ3RoX3RhYmxlLmluaXQoYmFzaXN1OjpjSHVmZm1hblRvdGFsQ29kZWxlbmd0aENvZGVzLCBjb2RlX2xlbmd0aF9jb2RlX3NpemVzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWlmICghY29kZV9sZW5ndGhfdGFibGUuaXNfdmFsaWQoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWJhc2lzdTo6dWludDhfdmVjIGNvZGVfc2l6ZXModG90YWxfdXNlZF9zeW1zKTsKLQotCQkJdWludDMyX3QgY3VyID0gMDsKLQkJCXdoaWxlIChjdXIgPCB0b3RhbF91c2VkX3N5bXMpCi0JCQl7Ci0JCQkJaW50IGMgPSBkZWNvZGVfaHVmZm1hbihjb2RlX2xlbmd0aF90YWJsZSk7Ci0KLQkJCQlpZiAoYyA8PSAxNikKLQkJCQkJY29kZV9zaXplc1tjdXIrK10gPSBzdGF0aWNfY2FzdDx1aW50OF90PihjKTsKLQkJCQllbHNlIGlmIChjID09IGJhc2lzdTo6Y0h1ZmZtYW5TbWFsbFplcm9SdW5Db2RlKQotCQkJCQljdXIgKz0gZ2V0X2JpdHMoYmFzaXN1OjpjSHVmZm1hblNtYWxsWmVyb1J1bkV4dHJhQml0cykgKyBiYXNpc3U6OmNIdWZmbWFuU21hbGxaZXJvUnVuU2l6ZU1pbjsKLQkJCQllbHNlIGlmIChjID09IGJhc2lzdTo6Y0h1ZmZtYW5CaWdaZXJvUnVuQ29kZSkKLQkJCQkJY3VyICs9IGdldF9iaXRzKGJhc2lzdTo6Y0h1ZmZtYW5CaWdaZXJvUnVuRXh0cmFCaXRzKSArIGJhc2lzdTo6Y0h1ZmZtYW5CaWdaZXJvUnVuU2l6ZU1pbjsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAoIWN1cikKLQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQl1aW50MzJfdCBsOwotCQkJCQlpZiAoYyA9PSBiYXNpc3U6OmNIdWZmbWFuU21hbGxSZXBlYXRDb2RlKQotCQkJCQkJbCA9IGdldF9iaXRzKGJhc2lzdTo6Y0h1ZmZtYW5TbWFsbFJlcGVhdEV4dHJhQml0cykgKyBiYXNpc3U6OmNIdWZmbWFuU21hbGxSZXBlYXRTaXplTWluOwotCQkJCQllbHNlCi0JCQkJCQlsID0gZ2V0X2JpdHMoYmFzaXN1OjpjSHVmZm1hbkJpZ1JlcGVhdEV4dHJhQml0cykgKyBiYXNpc3U6OmNIdWZmbWFuQmlnUmVwZWF0U2l6ZU1pbjsKLQotCQkJCQljb25zdCB1aW50OF90IHByZXYgPSBjb2RlX3NpemVzW2N1ciAtIDFdOwotCQkJCQlpZiAocHJldiA9PSAwKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlkbwotCQkJCQl7Ci0JCQkJCQlpZiAoY3VyID49IHRvdGFsX3VzZWRfc3ltcykKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQljb2RlX3NpemVzW2N1cisrXSA9IHByZXY7Ci0JCQkJCX0gd2hpbGUgKC0tbCA+IDApOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGN1ciAhPSB0b3RhbF91c2VkX3N5bXMpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlyZXR1cm4gY3QuaW5pdCh0b3RhbF91c2VkX3N5bXMsICZjb2RlX3NpemVzWzBdKTsKLQkJfQotCi0JcHJpdmF0ZToKLQkJdWludDMyX3QgbV9idWZfc2l6ZTsKLQkJY29uc3QgdWludDhfdCAqbV9wQnVmOwotCQljb25zdCB1aW50OF90ICptX3BCdWZfc3RhcnQ7Ci0JCWNvbnN0IHVpbnQ4X3QgKm1fcEJ1Zl9lbmQ7Ci0KLQkJdWludDMyX3QgbV9iaXRfYnVmOwotCQl1aW50MzJfdCBtX2JpdF9idWZfc2l6ZTsKLQl9OwotCi0JaW5saW5lIHVpbnQzMl90IGJhc2lzZF9yYW5kKHVpbnQzMl90IHNlZWQpCi0JewotCQlpZiAoIXNlZWQpCi0JCQlzZWVkKys7Ci0JCXVpbnQzMl90IHogPSBzZWVkOwotCQlCQVNJU0Rfem5ldzsKLQkJcmV0dXJuIHo7Ci0JfQotCi0JLy8gUmV0dXJucyByYW5kb20gbnVtYmVyIGluIFswLGxpbWl0KS4gTWF4IGxpbWl0IGlzIDB4RkZGRi4KLQlpbmxpbmUgdWludDMyX3QgYmFzaXNkX3VyYW5kKHVpbnQzMl90JiBzZWVkLCB1aW50MzJfdCBsaW1pdCkKLQl7Ci0JCXNlZWQgPSBiYXNpc2RfcmFuZChzZWVkKTsKLQkJcmV0dXJuICgoKHNlZWQgXiAoc2VlZCA+PiAxNikpICYgMHhGRkZGKSAqIGxpbWl0KSA+PiAxNjsKLQl9Ci0KLQljbGFzcyBhcHByb3hfbW92ZV90b19mcm9udAotCXsKLQlwdWJsaWM6Ci0JCWFwcHJveF9tb3ZlX3RvX2Zyb250KHVpbnQzMl90IG4pCi0JCXsKLQkJCWluaXQobik7Ci0JCX0KLQotCQl2b2lkIGluaXQodWludDMyX3QgbikKLQkJewotCQkJbV92YWx1ZXMucmVzaXplKG4pOwotCQkJbV9yb3ZlciA9IG4gLyAyOwotCQl9Ci0KLQkJY29uc3QgYmFzaXN1OjppbnRfdmVjJiBnZXRfdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KLQkJYmFzaXN1OjppbnRfdmVjJiBnZXRfdmFsdWVzKCkgeyByZXR1cm4gbV92YWx1ZXM7IH0KLQotCQl1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gKHVpbnQzMl90KW1fdmFsdWVzLnNpemUoKTsgfQotCi0JCWNvbnN0IGludCYgb3BlcmF0b3JbXSAodWludDMyX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQotCQlpbnQgb3BlcmF0b3JbXSAodWludDMyX3QgaW5kZXgpIHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQotCi0JCXZvaWQgYWRkKGludCBuZXdfdmFsdWUpCi0JCXsKLQkJCW1fdmFsdWVzW21fcm92ZXIrK10gPSBuZXdfdmFsdWU7Ci0JCQlpZiAobV9yb3ZlciA9PSBtX3ZhbHVlcy5zaXplKCkpCi0JCQkJbV9yb3ZlciA9ICh1aW50MzJfdCltX3ZhbHVlcy5zaXplKCkgLyAyOwotCQl9Ci0KLQkJdm9pZCB1c2UodWludDMyX3QgaW5kZXgpCi0JCXsKLQkJCWlmIChpbmRleCkKLQkJCXsKLQkJCQkvL3N0ZDo6c3dhcChtX3ZhbHVlc1tpbmRleCAvIDJdLCBtX3ZhbHVlc1tpbmRleF0pOwotCQkJCWludCB4ID0gbV92YWx1ZXNbaW5kZXggLyAyXTsKLQkJCQlpbnQgeSA9IG1fdmFsdWVzW2luZGV4XTsKLQkJCQltX3ZhbHVlc1tpbmRleCAvIDJdID0geTsKLQkJCQltX3ZhbHVlc1tpbmRleF0gPSB4OwotCQkJfQotCQl9Ci0KLQkJLy8gcmV0dXJucyAtMSBpZiBub3QgZm91bmQKLQkJaW50IGZpbmQoaW50IHZhbHVlKSBjb25zdAotCQl7Ci0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV92YWx1ZXMuc2l6ZSgpOyBpKyspCi0JCQkJaWYgKG1fdmFsdWVzW2ldID09IHZhbHVlKQotCQkJCQlyZXR1cm4gaTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXZvaWQgcmVzZXQoKQotCQl7Ci0JCQljb25zdCB1aW50MzJfdCBuID0gKHVpbnQzMl90KW1fdmFsdWVzLnNpemUoKTsKLQotCQkJbV92YWx1ZXMuY2xlYXIoKTsKLQotCQkJaW5pdChuKTsKLQkJfQotCi0JcHJpdmF0ZToKLQkJYmFzaXN1OjppbnRfdmVjIG1fdmFsdWVzOwotCQl1aW50MzJfdCBtX3JvdmVyOwotCX07Ci0KLQlzdHJ1Y3QgZGVjb2Rlcl9ldGNfYmxvY2s7Ci0JCi0JaW5saW5lIHVpbnQ4X3QgY2xhbXAyNTUoaW50MzJfdCBpKQotCXsKLQkJcmV0dXJuICh1aW50OF90KSgoaSAmIDB4RkZGRkZGMDBVKSA/ICh+KGkgPj4gMzEpKSA6IGkpOwotCX0KLQotCWVudW0gZU5vQ2xhbXAKLQl7Ci0JCWNOb0NsYW1wID0gMAotCX07Ci0KLQlzdHJ1Y3QgY29sb3IzMgotCXsKLQkJdW5pb24KLQkJewotCQkJc3RydWN0Ci0JCQl7Ci0JCQkJdWludDhfdCByOwotCQkJCXVpbnQ4X3QgZzsKLQkJCQl1aW50OF90IGI7Ci0JCQkJdWludDhfdCBhOwotCQkJfTsKLQotCQkJdWludDhfdCBjWzRdOwotCQkJCi0JCQl1aW50MzJfdCBtOwotCQl9OwotCi0JCWNvbG9yMzIoKSB7IH0KLQotCQljb2xvcjMyKHVpbnQzMl90IHZyLCB1aW50MzJfdCB2ZywgdWludDMyX3QgdmIsIHVpbnQzMl90IHZhKSB7IHNldCh2ciwgdmcsIHZiLCB2YSk7IH0KLQkJY29sb3IzMihlTm9DbGFtcCB1bnVzZWQsIHVpbnQzMl90IHZyLCB1aW50MzJfdCB2ZywgdWludDMyX3QgdmIsIHVpbnQzMl90IHZhKSB7ICh2b2lkKXVudXNlZDsgc2V0X25vY2xhbXBfcmdiYSh2ciwgdmcsIHZiLCB2YSk7IH0KLQotCQl2b2lkIHNldCh1aW50MzJfdCB2ciwgdWludDMyX3QgdmcsIHVpbnQzMl90IHZiLCB1aW50MzJfdCB2YSkgeyBjWzBdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odnIpOyBjWzFdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmcpOyBjWzJdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmIpOyBjWzNdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmEpOyB9Ci0KLQkJdm9pZCBzZXRfbm9jbGFtcF9yZ2IodWludDMyX3QgdnIsIHVpbnQzMl90IHZnLCB1aW50MzJfdCB2YikgeyBjWzBdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odnIpOyBjWzFdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmcpOyBjWzJdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmIpOyB9Ci0JCXZvaWQgc2V0X25vY2xhbXBfcmdiYSh1aW50MzJfdCB2ciwgdWludDMyX3QgdmcsIHVpbnQzMl90IHZiLCB1aW50MzJfdCB2YSkgeyBzZXQodnIsIHZnLCB2YiwgdmEpOyB9Ci0KLQkJdm9pZCBzZXRfY2xhbXBlZChpbnQgdnIsIGludCB2ZywgaW50IHZiLCBpbnQgdmEpIHsgY1swXSA9IGNsYW1wMjU1KHZyKTsgY1sxXSA9IGNsYW1wMjU1KHZnKTsJY1syXSA9IGNsYW1wMjU1KHZiKTsgY1szXSA9IGNsYW1wMjU1KHZhKTsgfQotCi0JCXVpbnQ4X3Qgb3BlcmF0b3JbXSAodWludDMyX3QgaWR4KSBjb25zdCB7IGFzc2VydChpZHggPCA0KTsgcmV0dXJuIGNbaWR4XTsgfQotCQl1aW50OF90ICZvcGVyYXRvcltdICh1aW50MzJfdCBpZHgpIHsgYXNzZXJ0KGlkeCA8IDQpOyByZXR1cm4gY1tpZHhdOyB9Ci0KLQkJYm9vbCBvcGVyYXRvcj09IChjb25zdCBjb2xvcjMyJnJocykgY29uc3QgeyByZXR1cm4gbSA9PSByaHMubTsgfQotCi0JCXN0YXRpYyBjb2xvcjMyIGNvbXBfbWluKGNvbnN0IGNvbG9yMzImIGEsIGNvbnN0IGNvbG9yMzImIGIpIHsgcmV0dXJuIGNvbG9yMzIoY05vQ2xhbXAsIHN0ZDo6bWluKGFbMF0sIGJbMF0pLCBzdGQ6Om1pbihhWzFdLCBiWzFdKSwgc3RkOjptaW4oYVsyXSwgYlsyXSksIHN0ZDo6bWluKGFbM10sIGJbM10pKTsgfQotCQlzdGF0aWMgY29sb3IzMiBjb21wX21heChjb25zdCBjb2xvcjMyJiBhLCBjb25zdCBjb2xvcjMyJiBiKSB7IHJldHVybiBjb2xvcjMyKGNOb0NsYW1wLCBzdGQ6Om1heChhWzBdLCBiWzBdKSwgc3RkOjptYXgoYVsxXSwgYlsxXSksIHN0ZDo6bWF4KGFbMl0sIGJbMl0pLCBzdGQ6Om1heChhWzNdLCBiWzNdKSk7IH0KLQl9OwotCi0Jc3RydWN0IGVuZHBvaW50Ci0JewotCQljb2xvcjMyIG1fY29sb3I1OwotCQl1aW50OF90IG1faW50ZW41OwotCX07Ci0KLQlzdHJ1Y3Qgc2VsZWN0b3IKLQl7Ci0JCS8vIFBsYWluIHNlbGVjdG9ycyAoMi1iaXRzIHBlciB2YWx1ZSkKLQkJdWludDhfdCBtX3NlbGVjdG9yc1s0XTsKLQotCQkvLyBFVEMxIHNlbGVjdG9ycwotCQl1aW50OF90IG1fYnl0ZXNbNF07Ci0KLQkJdWludDhfdCBtX2xvX3NlbGVjdG9yLCBtX2hpX3NlbGVjdG9yOwotCQl1aW50OF90IG1fbnVtX3VuaXF1ZV9zZWxlY3RvcnM7Ci0KLQkJdm9pZCBpbml0X2ZsYWdzKCkKLQkJewotCQkJdWludDMyX3QgaGlzdFs0XSA9IHsgMCwgMCwgMCwgMCB9OwotCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCXsKLQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCXsKLQkJCQkJdWludDMyX3QgcyA9IGdldF9zZWxlY3Rvcih4LCB5KTsKLQkJCQkJaGlzdFtzXSsrOwotCQkJCX0KLQkJCX0KLQotCQkJbV9sb19zZWxlY3RvciA9IDM7Ci0JCQltX2hpX3NlbGVjdG9yID0gMDsKLQkJCW1fbnVtX3VuaXF1ZV9zZWxlY3RvcnMgPSAwOwotCi0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgaSsrKQotCQkJewotCQkJCWlmIChoaXN0W2ldKQotCQkJCXsKLQkJCQkJbV9udW1fdW5pcXVlX3NlbGVjdG9ycysrOwotCQkJCQlpZiAoaSA8IG1fbG9fc2VsZWN0b3IpIG1fbG9fc2VsZWN0b3IgPSBzdGF0aWNfY2FzdDx1aW50OF90PihpKTsKLQkJCQkJaWYgKGkgPiBtX2hpX3NlbGVjdG9yKSBtX2hpX3NlbGVjdG9yID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gUmV0dXJuZWQgc2VsZWN0b3IgdmFsdWUgcmFuZ2VzIGZyb20gMC0zIGFuZCBpcyBhIGRpcmVjdCBpbmRleCBpbnRvIGdfZXRjMV9pbnRlbl90YWJsZXMuCi0JCWlubGluZSB1aW50MzJfdCBnZXRfc2VsZWN0b3IodWludDMyX3QgeCwgdWludDMyX3QgeSkgY29uc3QKLQkJewotCQkJYXNzZXJ0KCh4IDwgNCkgJiYgKHkgPCA0KSk7Ci0JCQlyZXR1cm4gKG1fc2VsZWN0b3JzW3ldID4+ICh4ICogMikpICYgMzsKLQkJfQotCi0JCXZvaWQgc2V0X3NlbGVjdG9yKHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHZhbCkKLQkJewotCQkJc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc19zZWxlY3Rvcl9pbmRleF90b19ldGMxWzRdID0geyAzLCAyLCAwLCAxIH07Ci0KLQkJCWFzc2VydCgoeCB8IHkgfCB2YWwpIDwgNCk7Ci0KLQkJCW1fc2VsZWN0b3JzW3ldICY9IH4oMyA8PCAoeCAqIDIpKTsKLQkJCW1fc2VsZWN0b3JzW3ldIHw9ICh2YWwgPDwgKHggKiAyKSk7Ci0KLQkJCWNvbnN0IHVpbnQzMl90IGV0YzFfYml0X2luZGV4ID0geCAqIDQgKyB5OwotCi0JCQl1aW50OF90ICpwID0gJm1fYnl0ZXNbMyAtIChldGMxX2JpdF9pbmRleCA+PiAzKV07Ci0KLQkJCWNvbnN0IHVpbnQzMl90IGJ5dGVfYml0X29mcyA9IGV0YzFfYml0X2luZGV4ICYgNzsKLQkJCWNvbnN0IHVpbnQzMl90IG1hc2sgPSAxIDw8IGJ5dGVfYml0X29mczsKLQotCQkJY29uc3QgdWludDMyX3QgZXRjMV92YWwgPSBzX3NlbGVjdG9yX2luZGV4X3RvX2V0YzFbdmFsXTsKLQotCQkJY29uc3QgdWludDMyX3QgbHNiID0gZXRjMV92YWwgJiAxOwotCQkJY29uc3QgdWludDMyX3QgbXNiID0gZXRjMV92YWwgPj4gMTsKLQotCQkJcFswXSAmPSB+bWFzazsKLQkJCXBbMF0gfD0gKGxzYiA8PCBieXRlX2JpdF9vZnMpOwotCi0JCQlwWy0yXSAmPSB+bWFzazsKLQkJCXBbLTJdIHw9IChtc2IgPDwgYnl0ZV9iaXRfb2ZzKTsKLQkJfQotCX07Ci0KLQlib29sIGJhc2lzX2Jsb2NrX2Zvcm1hdF9pc191bmNvbXByZXNzZWQoYmxvY2tfZm9ybWF0IHRleF90eXBlKTsKLQkKLX0gLy8gbmFtZXNwYWNlIGJhc2lzdAotCi0KLQotLyoqKiogZW5kZWQgaW5saW5pbmcgYmFzaXN1X3RyYW5zY29kZXJfaW50ZXJuYWwuaCAqKioqLwotLyoqKiogc3RhcnQgaW5saW5pbmcgYmFzaXN1X3RyYW5zY29kZXJfdWFzdGMuaCAqKioqLwotLy8gYmFzaXN1X3RyYW5zY29kZXJfdWFzdGMuaAotLyoqKiogc2tpcHBpbmcgZmlsZTogYmFzaXN1X3RyYW5zY29kZXJfaW50ZXJuYWwuaCAqKioqLwotCi1uYW1lc3BhY2UgYmFzaXN0Ci17Ci0Jc3RydWN0IGNvbG9yX3F1YWRfdTgKLQl7IAotCQl1aW50OF90IG1fY1s0XTsgCi0JfTsKLQotCWNvbnN0IHVpbnQzMl90IFRPVEFMX1VBU1RDX01PREVTID0gMTk7Ci0JY29uc3QgdWludDMyX3QgVUFTVENfTU9ERV9JTkRFWF9TT0xJRF9DT0xPUiA9IDg7Ci0KLQljb25zdCB1aW50MzJfdCBUT1RBTF9BU1RDX0JDN19DT01NT05fUEFSVElUSU9OUzIgPSAzMDsKLQljb25zdCB1aW50MzJfdCBUT1RBTF9BU1RDX0JDN19DT01NT05fUEFSVElUSU9OUzMgPSAxMTsKLQljb25zdCB1aW50MzJfdCBUT1RBTF9CQzdfM19BU1RDMl9DT01NT05fUEFSVElUSU9OUyA9IDE5OwotCi0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX3dlaWdodF9iaXRzW1RPVEFMX1VBU1RDX01PREVTXTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX3Vhc3RjX21vZGVfd2VpZ2h0X3Jhbmdlc1tUT1RBTF9VQVNUQ19NT0RFU107Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX2VuZHBvaW50X3Jhbmdlc1tUT1RBTF9VQVNUQ19NT0RFU107Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX3N1YnNldHNbVE9UQUxfVUFTVENfTU9ERVNdOwotCWV4dGVybiBjb25zdCB1aW50OF90IGdfdWFzdGNfbW9kZV9wbGFuZXNbVE9UQUxfVUFTVENfTU9ERVNdOwotCWV4dGVybiBjb25zdCB1aW50OF90IGdfdWFzdGNfbW9kZV9jb21wc1tUT1RBTF9VQVNUQ19NT0RFU107Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX2hhc19ldGMxX2JpYXNbVE9UQUxfVUFTVENfTU9ERVNdOwotCWV4dGVybiBjb25zdCB1aW50OF90IGdfdWFzdGNfbW9kZV9oYXNfYmMxX2hpbnQwW1RPVEFMX1VBU1RDX01PREVTXTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX3Vhc3RjX21vZGVfaGFzX2JjMV9oaW50MVtUT1RBTF9VQVNUQ19NT0RFU107Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX2hhc19hbHBoYVtUT1RBTF9VQVNUQ19NT0RFU107Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ191YXN0Y19tb2RlX2lzX2xhW1RPVEFMX1VBU1RDX01PREVTXTsKLQotCXN0cnVjdCBhc3RjX2JjN19jb21tb25fcGFydGl0aW9uMl9kZXNjCi0JewotCQl1aW50OF90IG1fYmM3OwotCQl1aW50MTZfdCBtX2FzdGM7Ci0JCWJvb2wgbV9pbnZlcnQ7Ci0JfTsKLQotCWV4dGVybiBjb25zdCBhc3RjX2JjN19jb21tb25fcGFydGl0aW9uMl9kZXNjIGdfYXN0Y19iYzdfY29tbW9uX3BhcnRpdGlvbnMyW1RPVEFMX0FTVENfQkM3X0NPTU1PTl9QQVJUSVRJT05TMl07Ci0KLQlzdHJ1Y3QgYmM3M19hc3RjMl9jb21tb25fcGFydGl0aW9uX2Rlc2MKLQl7Ci0JCXVpbnQ4X3QgbV9iYzczOwotCQl1aW50MTZfdCBtX2FzdGMyOwotCQl1aW50OF90IGs7CQkvLyAwLTUgLSBob3cgdG8gbW9kaWZ5IHRoZSBCQzcgMy1zdWJzZXQgcGF0dGVybiB0byBtYXRjaCB0aGUgQVNUQyBwYXR0ZXJuIChMU0I9aW52ZXJ0KQotCX07Ci0KLQlleHRlcm4gY29uc3QgYmM3M19hc3RjMl9jb21tb25fcGFydGl0aW9uX2Rlc2MgZ19iYzdfM19hc3RjMl9jb21tb25fcGFydGl0aW9uc1tUT1RBTF9CQzdfM19BU1RDMl9DT01NT05fUEFSVElUSU9OU107Ci0KLQlzdHJ1Y3QgYXN0Y19iYzdfY29tbW9uX3BhcnRpdGlvbjNfZGVzYwotCXsKLQkJdWludDhfdCBtX2JjNzsKLQkJdWludDE2X3QgbV9hc3RjOwotCQl1aW50OF90IG1fYXN0Y190b19iYzdfcGVybTsgLy8gY29udmVydHMgQVNUQyB0byBCQzcgcGFydGl0aW9uIHVzaW5nIGdfYXN0Y19iYzdfcGFydGl0aW9uX2luZGV4X3Blcm1fdGFibGVzW11bXQotCX07Ci0KLQlleHRlcm4gY29uc3QgYXN0Y19iYzdfY29tbW9uX3BhcnRpdGlvbjNfZGVzYyBnX2FzdGNfYmM3X2NvbW1vbl9wYXJ0aXRpb25zM1tUT1RBTF9BU1RDX0JDN19DT01NT05fUEFSVElUSU9OUzNdOwotCi0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19hc3RjX2JjN19wYXR0ZXJuczJbVE9UQUxfQVNUQ19CQzdfQ09NTU9OX1BBUlRJVElPTlMyXVsxNl07Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19hc3RjX2JjN19wYXR0ZXJuczNbVE9UQUxfQVNUQ19CQzdfQ09NTU9OX1BBUlRJVElPTlMzXVsxNl07Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzdfM19hc3RjMl9wYXR0ZXJuczJbVE9UQUxfQkM3XzNfQVNUQzJfQ09NTU9OX1BBUlRJVElPTlNdWzE2XTsKLQotCWV4dGVybiBjb25zdCB1aW50OF90IGdfYXN0Y19iYzdfcGF0dGVybjJfYW5jaG9yc1tUT1RBTF9BU1RDX0JDN19DT01NT05fUEFSVElUSU9OUzJdWzNdOwotCWV4dGVybiBjb25zdCB1aW50OF90IGdfYXN0Y19iYzdfcGF0dGVybjNfYW5jaG9yc1tUT1RBTF9BU1RDX0JDN19DT01NT05fUEFSVElUSU9OUzNdWzNdOwotCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3XzNfYXN0YzJfcGF0dGVybnMyX2FuY2hvcnNbVE9UQUxfQkM3XzNfQVNUQzJfQ09NTU9OX1BBUlRJVElPTlNdWzNdOwotCi0JZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGdfdWFzdGNfbW9kZV9odWZmX2NvZGVzW1RPVEFMX1VBU1RDX01PREVTICsgMV1bMl07Ci0KLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2FzdGNfdG9fYmM3X3BhcnRpdGlvbl9pbmRleF9wZXJtX3RhYmxlc1s2XVszXTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN190b19hc3RjX3BhcnRpdGlvbl9pbmRleF9wZXJtX3RhYmxlc1s2XVszXTsgLy8gaW52ZXJzZSBvZiBnX2FzdGNfdG9fYmM3X3BhcnRpdGlvbl9pbmRleF9wZXJtX3RhYmxlcwotCi0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QqIHNfdWFzdGNfdG9fYmMxX3dlaWdodHNbNl07Ci0KLQl1aW50MzJfdCBiYzdfY29udmVydF9wYXJ0aXRpb25faW5kZXhfM190b18yKHVpbnQzMl90IHAsIHVpbnQzMl90IGspOwotCi0JaW5saW5lIHVpbnQzMl90IGFzdGNfaW50ZXJwb2xhdGUodWludDMyX3QgbCwgdWludDMyX3QgaCwgdWludDMyX3QgdywgYm9vbCBzcmdiKQotCXsKLQkJaWYgKHNyZ2IpCi0JCXsKLQkJCWwgPSAobCA8PCA4KSB8IDB4ODA7Ci0JCQloID0gKGggPDwgOCkgfCAweDgwOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbCA9IChsIDw8IDgpIHwgbDsKLQkJCWggPSAoaCA8PCA4KSB8IGg7Ci0JCX0KLQotCQl1aW50MzJfdCBrID0gKGwgKiAoNjQgLSB3KSArIGggKiB3ICsgMzIpID4+IDY7Ci0KLQkJcmV0dXJuIGsgPj4gODsKLQl9Ci0KLQlzdHJ1Y3QgYXN0Y19ibG9ja19kZXNjCi0JewotCQlpbnQgbV93ZWlnaHRfcmFuZ2U7CS8vIHdlaWdodCBCSVNFIHJhbmdlCi0KLQkJaW50IG1fc3Vic2V0czsJCQkvLyBudW1iZXIgb2YgQVNUQyBwYXJ0aXRpb25zCi0JCWludCBtX3BhcnRpdGlvbl9zZWVkOwkvLyBwYXJ0aXRpb24gcGF0dGVybiBzZWVkCi0JCWludCBtX2NlbTsJCQkJLy8gY29sb3IgZW5kcG9pbnQgbW9kZSB1c2VkIGJ5IGFsbCBzdWJzZXRzCi0KLQkJaW50IG1fY2NzOwkJCQkvLyBjb2xvciBjb21wb25lbnQgc2VsZWN0b3IgKGR1YWwgcGxhbmUgb25seSkKLQkJYm9vbCBtX2R1YWxfcGxhbmU7CS8vIHRydWUgaWYgZHVhbCBwbGFuZQotCi0JCS8vIFdlaWdodCBhbmQgZW5kcG9pbnQgQklTRSB2YWx1ZXMuIAotCQkvLyBOb3RlIHRoZXNlIHZhbHVlcyBhcmUgTk9UIGxpbmVhciwgdGhleSBtdXN0IGJlIEJJU0UgZW5jb2RlZC4gU2VlIFRhYmxlIDk3IGFuZCBUYWJsZSAxMDcuCi0JCXVpbnQ4X3QgbV9lbmRwb2ludHNbMThdOwkvLyBlbmRwb2ludCB2YWx1ZXMsIGluIFJSIEdHIEJCIGV0Yy4gb3JkZXIgCi0JCXVpbnQ4X3QgbV93ZWlnaHRzWzY0XTsJCS8vIHdlaWdodCBpbmRleCB2YWx1ZXMsIHJhc3RlciBvcmRlciwgaW4gUDAgUDEsIFAwIFAxLCBldGMuIG9yIFAwLCBQMCwgUDAsIFAwLCBldGMuIG9yZGVyCi0JfTsKLQotCWNvbnN0IHVpbnQzMl90IEJDN0VOQ19UT1RBTF9BU1RDX1JBTkdFUyA9IDIxOwotCi0JLy8gU2VlIHRhYmxlcyA4MSwgOTMsIDE4LjEzLkVuZHBvaW50IFVucXVhbnRpemF0aW9uCi0JY29uc3QgdWludDMyX3QgVE9UQUxfQVNUQ19SQU5HRVMgPSAyMTsKLQlleHRlcm4gY29uc3QgaW50IGdfYXN0Y19iaXNlX3JhbmdlX3RhYmxlW1RPVEFMX0FTVENfUkFOR0VTXVszXTsKLQotCXN0cnVjdCBhc3RjX3F1YW50X2JpbgotCXsKLQkJdWludDhfdCBtX3VucXVhbnQ7IC8vIHVucXVhbnRpemVkIHZhbHVlCi0JCXVpbnQ4X3QgbV9pbmRleDsgLy8gc29ydGVkIGluZGV4Ci0JfTsKLQotCWV4dGVybiBhc3RjX3F1YW50X2JpbiBnX2FzdGNfdW5xdWFudFtCQzdFTkNfVE9UQUxfQVNUQ19SQU5HRVNdWzI1Nl07IC8vIFtBU1RDIGVuY29kZWQgZW5kcG9pbnQgaW5kZXhdCi0KLQlpbnQgYXN0Y19nZXRfbGV2ZWxzKGludCByYW5nZSk7Ci0JYm9vbCBhc3RjX2lzX3ZhbGlkX2VuZHBvaW50X3JhbmdlKHVpbnQzMl90IHJhbmdlKTsKLQl1aW50MzJfdCB1bnF1YW50X2FzdGNfZW5kcG9pbnQodWludDMyX3QgcGFja2VkX2JpdHMsIHVpbnQzMl90IHBhY2tlZF90cml0cywgdWludDMyX3QgcGFja2VkX3F1aW50cywgdWludDMyX3QgcmFuZ2UpOwotCXVpbnQzMl90IHVucXVhbnRfYXN0Y19lbmRwb2ludF92YWwodWludDMyX3QgcGFja2VkX3ZhbCwgdWludDMyX3QgcmFuZ2UpOwotCi0JY29uc3QgdWludDhfdCogZ2V0X2FuY2hvcl9pbmRpY2VzKHVpbnQzMl90IHN1YnNldHMsIHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IGNvbW1vbl9wYXR0ZXJuLCBjb25zdCB1aW50OF90KiYgcFBhcnRpdGlvbl9wYXR0ZXJuKTsKLQotCS8vIEJDNwotCWNvbnN0IHVpbnQzMl90IEJDN0VOQ19CTE9DS19TSVpFID0gMTY7Ci0KLQlzdHJ1Y3QgYmM3X2Jsb2NrCi0JewotCQl1aW50NjRfdCBtX3F3b3Jkc1syXTsKLQl9OwotCi0Jc3RydWN0IGJjN19vcHRpbWl6YXRpb25fcmVzdWx0cwotCXsKLQkJdWludDMyX3QgbV9tb2RlOwotCQl1aW50MzJfdCBtX3BhcnRpdGlvbjsKLQkJdWludDhfdCBtX3NlbGVjdG9yc1sxNl07Ci0JCXVpbnQ4X3QgbV9hbHBoYV9zZWxlY3RvcnNbMTZdOwotCQljb2xvcl9xdWFkX3U4IG1fbG93WzNdOwotCQljb2xvcl9xdWFkX3U4IG1faGlnaFszXTsKLQkJdWludDMyX3QgbV9wYml0c1szXVsyXTsKLQkJdWludDMyX3QgbV9pbmRleF9zZWxlY3RvcjsKLQkJdWludDMyX3QgbV9yb3RhdGlvbjsKLQl9OwotCi0JZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGdfYmM3X3dlaWdodHMxWzJdOwotCWV4dGVybiBjb25zdCB1aW50MzJfdCBnX2JjN193ZWlnaHRzMls0XTsKLQlleHRlcm4gY29uc3QgdWludDMyX3QgZ19iYzdfd2VpZ2h0czNbOF07Ci0JZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGdfYmM3X3dlaWdodHM0WzE2XTsKLQlleHRlcm4gY29uc3QgdWludDMyX3QgZ19hc3RjX3dlaWdodHM0WzE2XTsKLQlleHRlcm4gY29uc3QgdWludDMyX3QgZ19hc3RjX3dlaWdodHM1WzMyXTsKLQlleHRlcm4gY29uc3QgdWludDMyX3QgZ19hc3RjX3dlaWdodHNfM2xldmVsc1szXTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19wYXJ0aXRpb24xWzE2XTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19wYXJ0aXRpb24yWzY0ICogMTZdOwotCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X3BhcnRpdGlvbjNbNjQgKiAxNl07Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzdfdGFibGVfYW5jaG9yX2luZGV4X3NlY29uZF9zdWJzZXRbNjRdOwotCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM3X3RhYmxlX2FuY2hvcl9pbmRleF90aGlyZF9zdWJzZXRfMVs2NF07Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzdfdGFibGVfYW5jaG9yX2luZGV4X3RoaXJkX3N1YnNldF8yWzY0XTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19udW1fc3Vic2V0c1s4XTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19wYXJ0aXRpb25fYml0c1s4XTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19jb2xvcl9pbmRleF9iaXRjb3VudFs4XTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19tb2RlX2hhc19wX2JpdHNbOF07Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzdfbW9kZV9oYXNfc2hhcmVkX3BfYml0c1s4XTsKLQlleHRlcm4gY29uc3QgdWludDhfdCBnX2JjN19jb2xvcl9wcmVjaXNpb25fdGFibGVbOF07Ci0JZXh0ZXJuIGNvbnN0IGludDhfdCBnX2JjN19hbHBoYV9wcmVjaXNpb25fdGFibGVbOF07Ci0JZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzdfYWxwaGFfaW5kZXhfYml0Y291bnRbOF07Ci0KLQlpbmxpbmUgYm9vbCBnZXRfYmM3X21vZGVfaGFzX3NlcGVyYXRlX2FscGhhX3NlbGVjdG9ycyhpbnQgbW9kZSkgeyByZXR1cm4gKG1vZGUgPT0gNCkgfHwgKG1vZGUgPT0gNSk7IH0KLQlpbmxpbmUgaW50IGdldF9iYzdfY29sb3JfaW5kZXhfc2l6ZShpbnQgbW9kZSwgaW50IGluZGV4X3NlbGVjdGlvbl9iaXQpIHsgcmV0dXJuIGdfYmM3X2NvbG9yX2luZGV4X2JpdGNvdW50W21vZGVdICsgaW5kZXhfc2VsZWN0aW9uX2JpdDsgfQotCWlubGluZSBpbnQgZ2V0X2JjN19hbHBoYV9pbmRleF9zaXplKGludCBtb2RlLCBpbnQgaW5kZXhfc2VsZWN0aW9uX2JpdCkgeyByZXR1cm4gZ19iYzdfYWxwaGFfaW5kZXhfYml0Y291bnRbbW9kZV0gLSBpbmRleF9zZWxlY3Rpb25fYml0OyB9Ci0KLQlzdHJ1Y3QgZW5kcG9pbnRfZXJyCi0JewotCQl1aW50MTZfdCBtX2Vycm9yOyB1aW50OF90IG1fbG87IHVpbnQ4X3QgbV9oaTsKLQl9OwotCi0JZXh0ZXJuIGVuZHBvaW50X2VyciBnX2JjN19tb2RlXzZfb3B0aW1hbF9lbmRwb2ludHNbMjU2XVsyXTsgLy8gW2NdW3BiaXRdCi0JY29uc3QgdWludDMyX3QgQkM3RU5DX01PREVfNl9PUFRJTUFMX0lOREVYID0gNTsKLQotCWV4dGVybiBlbmRwb2ludF9lcnIgZ19iYzdfbW9kZV81X29wdGltYWxfZW5kcG9pbnRzWzI1Nl07IC8vIFtjXQotCWNvbnN0IHVpbnQzMl90IEJDN0VOQ19NT0RFXzVfT1BUSU1BTF9JTkRFWCA9IDE7Ci0KLQkvLyBQYWNrcyBhIEJDNyBibG9jayBmcm9tIGEgaGlnaC1sZXZlbCBkZXNjcmlwdGlvbi4gSGFuZGxlcyBhbGwgQkM3IG1vZGVzLgotCXZvaWQgZW5jb2RlX2JjN19ibG9jayh2b2lkKiBwQmxvY2ssIGNvbnN0IGJjN19vcHRpbWl6YXRpb25fcmVzdWx0cyogcFJlc3VsdHMpOwotCi0JLy8gUGFja3MgYW4gQVNUQyBibG9jawotCS8vIENvbnN0cmFpbnRzOiBBbHdheXMgNHg0LCBhbGwgc3Vic2V0IENFTSdzIG11c3QgYmUgZXF1YWwsIG9ubHkgdGVzdGVkIHdpdGggTERSIENFTSdzLgotCWJvb2wgcGFja19hc3RjX2Jsb2NrKHVpbnQzMl90KiBwRHN0LCBjb25zdCBhc3RjX2Jsb2NrX2Rlc2MqIHBCbG9jaywgdWludDMyX3QgbW9kZSk7Ci0KLQl2b2lkIHBhY2tfYXN0Y19zb2xpZF9ibG9jayh2b2lkKiBwRHN0X2Jsb2NrLCBjb25zdCBjb2xvcjMyJiBjb2xvcik7Ci0KLSNpZmRlZiBfREVCVUcKLQlpbnQgYXN0Y19jb21wdXRlX3RleGVsX3BhcnRpdGlvbihpbnQgc2VlZCwgaW50IHgsIGludCB5LCBpbnQgeiwgaW50IHBhcnRpdGlvbmNvdW50LCBib29sIHNtYWxsX2Jsb2NrKTsKLSNlbmRpZgotCQkKLQlzdHJ1Y3QgdWFzdGNfYmxvY2sKLQl7Ci0JCXVuaW9uCi0JCXsKLQkJCXVpbnQ4X3QgbV9ieXRlc1sxNl07Ci0JCQl1aW50MzJfdCBtX2R3b3Jkc1s0XTsKLQkJCXVpbnQ2NF90IG1fcXdvcmRzWzJdOwotCQl9OwotCX07Ci0KLQlzdHJ1Y3QgdW5wYWNrZWRfdWFzdGNfYmxvY2sKLQl7Ci0JCWFzdGNfYmxvY2tfZGVzYyBtX2FzdGM7Ci0KLQkJdWludDMyX3QgbV9tb2RlOwotCQl1aW50MzJfdCBtX2NvbW1vbl9wYXR0ZXJuOwotCi0JCWNvbG9yMzIgbV9zb2xpZF9jb2xvcjsKLQotCQlib29sIG1fYmMxX2hpbnQwOwotCQlib29sIG1fYmMxX2hpbnQxOwotCi0JCWJvb2wgbV9ldGMxX2ZsaXA7Ci0JCWJvb2wgbV9ldGMxX2RpZmY7Ci0JCXVpbnQzMl90IG1fZXRjMV9pbnRlbjA7Ci0JCXVpbnQzMl90IG1fZXRjMV9pbnRlbjE7Ci0KLQkJdWludDMyX3QgbV9ldGMxX2JpYXM7Ci0KLQkJdWludDMyX3QgbV9ldGMyX2hpbnRzOwotCi0JCXVpbnQzMl90IG1fZXRjMV9zZWxlY3RvcjsKLQkJdWludDMyX3QgbV9ldGMxX3IsIG1fZXRjMV9nLCBtX2V0YzFfYjsKLQl9OwotCi0JY29sb3IzMiBhcHBseV9ldGMxX2JpYXMoY29uc3QgY29sb3IzMiAmYmxvY2tfY29sb3IsIHVpbnQzMl90IGJpYXMsIHVpbnQzMl90IGxpbWl0LCB1aW50MzJfdCBzdWJibG9jayk7Ci0JCi0Jc3RydWN0IGRlY29kZXJfZXRjX2Jsb2NrOwotCXN0cnVjdCBlYWNfYmxvY2s7Ci0JCQotCWJvb2wgdW5wYWNrX3Vhc3RjKHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IGNvbW1vbl9wYXR0ZXJuLCBjb25zdCBjb2xvcjMyJiBzb2xpZF9jb2xvciwgY29uc3QgYXN0Y19ibG9ja19kZXNjJiBhc3RjLCBjb2xvcjMyKiBwUGl4ZWxzLCBib29sIHNyZ2IpOwotCWJvb2wgdW5wYWNrX3Vhc3RjKGNvbnN0IHVucGFja2VkX3Vhc3RjX2Jsb2NrJiB1bnBhY2tlZF9ibGssIGNvbG9yMzIqIHBQaXhlbHMsIGJvb2wgc3JnYik7Ci0KLQlib29sIHVucGFja191YXN0Yyhjb25zdCB1YXN0Y19ibG9jayYgYmxrLCBjb2xvcjMyKiBwUGl4ZWxzLCBib29sIHNyZ2IpOwotCWJvb2wgdW5wYWNrX3Vhc3RjKGNvbnN0IHVhc3RjX2Jsb2NrJiBibGssIHVucGFja2VkX3Vhc3RjX2Jsb2NrJiB1bnBhY2tlZCwgYm9vbCB1bmRvX2JsdWVfY29udHJhY3QsIGJvb2wgcmVhZF9oaW50cyA9IHRydWUpOwotCi0JYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fYXN0Yyhjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCk7Ci0KLQlib29sIHRyYW5zY29kZV91YXN0Y190b19iYzcoY29uc3QgdW5wYWNrZWRfdWFzdGNfYmxvY2smIHVucGFja2VkX3NyY19ibGssIGJjN19vcHRpbWl6YXRpb25fcmVzdWx0cyYgZHN0X2Jsayk7Ci0JYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fYmM3KGNvbnN0IHVhc3RjX2Jsb2NrJiBzcmNfYmxrLCBiYzdfb3B0aW1pemF0aW9uX3Jlc3VsdHMmIGRzdF9ibGspOwotCWJvb2wgdHJhbnNjb2RlX3Vhc3RjX3RvX2JjNyhjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCk7Ci0KLQl2b2lkIHRyYW5zY29kZV91YXN0Y190b19ldGMxKHVucGFja2VkX3Vhc3RjX2Jsb2NrJiB1bnBhY2tlZF9zcmNfYmxrLCBjb2xvcjMyIGJsb2NrX3BpeGVsc1s0XVs0XSwgdm9pZCogcERzdCk7Ci0JYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fZXRjMShjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCk7Ci0JYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fZXRjMShjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCwgdWludDMyX3QgY2hhbm5lbCk7Ci0KLQl2b2lkIHRyYW5zY29kZV91YXN0Y190b19ldGMyX2VhY19hOCh1bnBhY2tlZF91YXN0Y19ibG9jayYgdW5wYWNrZWRfc3JjX2JsaywgY29sb3IzMiBibG9ja19waXhlbHNbNF1bNF0sIHZvaWQqIHBEc3QpOwotCWJvb2wgdHJhbnNjb2RlX3Vhc3RjX3RvX2V0YzJfcmdiYShjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCk7Ci0KLQkvLyBQYWNrcyAxNiBzY2FsYXIgdmFsdWVzIHRvIEJDNC4gU2FtZSBQU05SIGFzIHN0Yl9keHQncyBCQzQgZW5jb2RlciwgYXJvdW5kIDEzJSBmYXN0ZXIuCi0Jdm9pZCBlbmNvZGVfYmM0KHZvaWQqIHBEc3QsIGNvbnN0IHVpbnQ4X3QqIHBQaXhlbHMsIHVpbnQzMl90IHN0cmlkZSk7Ci0JCi0Jdm9pZCBlbmNvZGVfYmMxX3NvbGlkX2Jsb2NrKHZvaWQqIHBEc3QsIHVpbnQzMl90IGZyLCB1aW50MzJfdCBmZywgdWludDMyX3QgZmIpOwotCi0JZW51bQotCXsKLQkJY0VuY29kZUJDMUhpZ2hRdWFsaXR5ID0gMSwKLQkJY0VuY29kZUJDMUhpZ2hlclF1YWxpdHkgPSAyLAotCQljRW5jb2RlQkMxVXNlU2VsZWN0b3JzID0gNCwKLQl9OwotCXZvaWQgZW5jb2RlX2JjMSh2b2lkKiBwRHN0LCBjb25zdCB1aW50OF90KiBwUGl4ZWxzLCB1aW50MzJfdCBmbGFncyk7Ci0JCi0JLy8gQWx0ZXJuYXRlIFBDQS1mcmVlIGVuY29kZXIsIGFyb3VuZCAxNSUgZmFzdGVyLCBzYW1lIChvciBzbGlnaHRseSBoaWdoZXIpIGF2Zy4gUFNOUgotCXZvaWQgZW5jb2RlX2JjMV9hbHQodm9pZCogcERzdCwgY29uc3QgdWludDhfdCogcFBpeGVscywgdWludDMyX3QgZmxhZ3MpOwotCi0Jdm9pZCB0cmFuc2NvZGVfdWFzdGNfdG9fYmMxX2hpbnQwKGNvbnN0IHVucGFja2VkX3Vhc3RjX2Jsb2NrJiB1bnBhY2tlZF9zcmNfYmxrLCB2b2lkKiBwRHN0KTsKLQl2b2lkIHRyYW5zY29kZV91YXN0Y190b19iYzFfaGludDEoY29uc3QgdW5wYWNrZWRfdWFzdGNfYmxvY2smIHVucGFja2VkX3NyY19ibGssIGNvbnN0IGNvbG9yMzIgYmxvY2tfcGl4ZWxzWzRdWzRdLCB2b2lkKiBwRHN0LCBib29sIGhpZ2hfcXVhbGl0eSk7Ci0KLQlib29sIHRyYW5zY29kZV91YXN0Y190b19iYzEoY29uc3QgdWFzdGNfYmxvY2smIHNyY19ibGssIHZvaWQqIHBEc3QsIGJvb2wgaGlnaF9xdWFsaXR5KTsKLQlib29sIHRyYW5zY29kZV91YXN0Y190b19iYzMoY29uc3QgdWFzdGNfYmxvY2smIHNyY19ibGssIHZvaWQqIHBEc3QsIGJvb2wgaGlnaF9xdWFsaXR5KTsKLQlib29sIHRyYW5zY29kZV91YXN0Y190b19iYzQoY29uc3QgdWFzdGNfYmxvY2smIHNyY19ibGssIHZvaWQqIHBEc3QsIGJvb2wgaGlnaF9xdWFsaXR5LCB1aW50MzJfdCBjaGFuMCk7Ci0JYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fYmM1KGNvbnN0IHVhc3RjX2Jsb2NrJiBzcmNfYmxrLCB2b2lkKiBwRHN0LCBib29sIGhpZ2hfcXVhbGl0eSwgdWludDMyX3QgY2hhbjAsIHVpbnQzMl90IGNoYW4xKTsKLQotCWJvb2wgdHJhbnNjb2RlX3Vhc3RjX3RvX2V0YzJfZWFjX3IxMShjb25zdCB1YXN0Y19ibG9jayYgc3JjX2Jsaywgdm9pZCogcERzdCwgYm9vbCBoaWdoX3F1YWxpdHksIHVpbnQzMl90IGNoYW4wKTsKLQlib29sIHRyYW5zY29kZV91YXN0Y190b19ldGMyX2VhY19yZzExKGNvbnN0IHVhc3RjX2Jsb2NrJiBzcmNfYmxrLCB2b2lkKiBwRHN0LCBib29sIGhpZ2hfcXVhbGl0eSwgdWludDMyX3QgY2hhbjAsIHVpbnQzMl90IGNoYW4xKTsKLQotCWJvb2wgdHJhbnNjb2RlX3Vhc3RjX3RvX3B2cnRjMV80X3JnYihjb25zdCB1YXN0Y19ibG9jayogcFNyY19ibG9ja3MsIHZvaWQqIHBEc3RfYmxvY2tzLCB1aW50MzJfdCBudW1fYmxvY2tzX3gsIHVpbnQzMl90IG51bV9ibG9ja3NfeSwgYm9vbCBoaWdoX3F1YWxpdHksIGJvb2wgZnJvbV9hbHBoYSk7Ci0JYm9vbCB0cmFuc2NvZGVfdWFzdGNfdG9fcHZydGMxXzRfcmdiYShjb25zdCB1YXN0Y19ibG9jayogcFNyY19ibG9ja3MsIHZvaWQqIHBEc3RfYmxvY2tzLCB1aW50MzJfdCBudW1fYmxvY2tzX3gsIHVpbnQzMl90IG51bV9ibG9ja3NfeSwgYm9vbCBoaWdoX3F1YWxpdHkpOwotCQkKLQkvLyB1YXN0Y19pbml0KCkgTVVTVCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIHRoaXMgbW9kdWxlLgotCXZvaWQgdWFzdGNfaW5pdCgpOwotCi19IC8vIG5hbWVzcGFjZSBiYXNpc3QKLS8qKioqIGVuZGVkIGlubGluaW5nIGJhc2lzdV90cmFuc2NvZGVyX3Vhc3RjLmggKioqKi8KLS8qKioqIHN0YXJ0IGlubGluaW5nIGJhc2lzdV9nbG9iYWxfc2VsZWN0b3JfcGFsZXR0ZS5oICoqKiovCi0vLyBiYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGUuaAotLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgQmlub21pYWwgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vKioqKiBza2lwcGluZyBmaWxlOiBiYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oICoqKiovCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi1uYW1lc3BhY2UgYmFzaXN0Ci17Ci0JY2xhc3MgZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllcgotCXsKLQlwdWJsaWM6Ci0JCWVudW0geyBjVG90YWxCaXRzID0gMTUsIGNUb3RhbFZhbHVlcyA9IDEgPDwgY1RvdGFsQml0cyB9OwotCi0JCWV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIodWludDMyX3QgaW5kZXggPSAwKQotCQl7Ci0jaWZkZWYgX0RFQlVHCi0JCQlzdGF0aWMgYm9vbCBzX3Rlc3RlZDsKLQkJCWlmICghc190ZXN0ZWQpCi0JCQl7Ci0JCQkJc190ZXN0ZWQgPSB0cnVlOwotCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjVG90YWxWYWx1ZXM7IGkrKykKLQkJCQl7Ci0JCQkJCWV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgbShpKTsKLQkJCQkJZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllciBuID0gbTsKLQotCQkJCQlhc3NlcnQobi5nZXRfaW5kZXgoKSA9PSBpKTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYKLQotCQkJc2V0X2luZGV4KGluZGV4KTsKLQkJfQotCi0JCXZvaWQgc2V0X2luZGV4KHVpbnQzMl90IGluZGV4KQotCQl7Ci0JCQlhc3NlcnQoaW5kZXggPCBjVG90YWxWYWx1ZXMpOwotCQkJbV9yb3QgPSBpbmRleCAmIDM7Ci0JCQltX2ZsaXAgPSAoaW5kZXggPj4gMikgJiAxOwotCQkJbV9pbnYgPSAoaW5kZXggPj4gMykgJiAxOwotCQkJbV9jb250cmFzdCA9IChpbmRleCA+PiA0KSAmIDM7Ci0JCQltX3NoaWZ0ID0gKGluZGV4ID4+IDYpICYgMTsKLQkJCW1fbWVkaWFuID0gKGluZGV4ID4+IDcpICYgMTsKLQkJCW1fZGl2ID0gKGluZGV4ID4+IDgpICYgMTsKLQkJCW1fcmFuZCA9IChpbmRleCA+PiA5KSAmIDE7Ci0JCQltX2RpbGF0ZSA9IChpbmRleCA+PiAxMCkgJiAxOwotCQkJbV9zaGlmdF94ID0gKGluZGV4ID4+IDExKSAmIDE7Ci0JCQltX3NoaWZ0X3kgPSAoaW5kZXggPj4gMTIpICYgMTsKLQkJCW1fZXJvZGUgPSAoaW5kZXggPj4gMTMpICYgMTsKLQkJCW1faGlnaF9wYXNzID0gKGluZGV4ID4+IDE0KSAmIDE7Ci0JCX0KLQotCQl1aW50MzJfdCBnZXRfaW5kZXgoKSBjb25zdAotCQl7Ci0JCQlyZXR1cm4gbV9yb3QgfCAobV9mbGlwIDw8IDIpIHwgKG1faW52IDw8IDMpIHwgKG1fY29udHJhc3QgPDwgNCkgfCAobV9zaGlmdCA8PCA2KSB8IChtX21lZGlhbiA8PCA3KSB8IChtX2RpdiA8PCA4KSB8IChtX3JhbmQgPDwgOSkgfCAobV9kaWxhdGUgPDwgMTApIHwgKG1fc2hpZnRfeCA8PCAxMSkgfCAobV9zaGlmdF95IDw8IDEyKSB8IChtX2Vyb2RlIDw8IDEzKSB8IChtX2hpZ2hfcGFzcyA8PCAxNCk7Ci0JCX0KLQotCQl2b2lkIGNsZWFyKCkKLQkJewotCQkJYmFzaXN1OjpjbGVhcl9vYmooKnRoaXMpOwotCQl9Ci0KLQkJdWludDhfdCBtX2NvbnRyYXN0OwotCQlib29sIG1fcmFuZDsKLQkJYm9vbCBtX21lZGlhbjsKLQkJYm9vbCBtX2RpdjsKLQkJYm9vbCBtX3NoaWZ0OwotCQlib29sIG1faW52OwotCQlib29sIG1fZmxpcDsKLQkJYm9vbCBtX2RpbGF0ZTsKLQkJYm9vbCBtX3NoaWZ0X3g7Ci0JCWJvb2wgbV9zaGlmdF95OwotCQlib29sIG1fZXJvZGU7Ci0JCWJvb2wgbV9oaWdoX3Bhc3M7Ci0JCXVpbnQ4X3QgbV9yb3Q7Ci0JfTsKLQotCWVudW0gbW9kaWZpZXJfdHlwZXMKLQl7Ci0JCWNNb2RpZmllckNvbnRyYXN0LAotCQljTW9kaWZpZXJSYW5kLAotCQljTW9kaWZpZXJNZWRpYW4sCi0JCWNNb2RpZmllckRpdiwKLQkJY01vZGlmaWVyU2hpZnQsCi0JCWNNb2RpZmllckludiwKLQkJY01vZGlmaWVyRmxpcHBlZEFuZFJvdGF0ZWQsCi0JCWNNb2RpZmllckRpbGF0ZSwKLQkJY01vZGlmaWVyU2hpZnRYLAotCQljTW9kaWZpZXJTaGlmdFksCi0JCWNNb2RpZmllckVyb2RlLAotCQljTW9kaWZpZXJIaWdoUGFzcywKLQkJY1RvdGFsTW9kaWZpZXJzCi0JfTsKLQotI2RlZmluZSBFVEMxX0dMT0JBTF9TRUxFQ1RPUl9DT0RFQk9PS19NQVhfTU9EX0JJVFMgKGV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXI6OmNUb3RhbEJpdHMpCi0KLQlzdHJ1Y3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5Ci0JewotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkoKQotCQl7Ci0JCQljbGVhcigpOwotCQl9Ci0KLQkJdm9pZCBjbGVhcigpCi0JCXsKLQkJCWJhc2lzdTo6Y2xlYXJfb2JqKCp0aGlzKTsKLQkJfQotCi0JCXVpbnQ4X3Qgb3BlcmF0b3JbXSAodWludDMyX3QgaSkgY29uc3QgeyBhc3NlcnQoaSA8IDE2KTsgcmV0dXJuIG1fc2VsZWN0b3JzW2ldOyB9Ci0JCXVpbnQ4X3Qmb3BlcmF0b3JbXSAodWludDMyX3QgaSkgeyBhc3NlcnQoaSA8IDE2KTsgcmV0dXJuIG1fc2VsZWN0b3JzW2ldOyB9Ci0KLQkJdm9pZCBzZXRfdWludDMyKHVpbnQzMl90IHYpCi0JCXsKLQkJCWZvciAodWludDMyX3QgYnl0ZV9pbmRleCA9IDA7IGJ5dGVfaW5kZXggPCA0OyBieXRlX2luZGV4KyspCi0JCQl7Ci0JCQkJdWludDMyX3QgYiA9ICh2ID4+IChieXRlX2luZGV4ICogOCkpICYgMHhGRjsKLQotCQkJCW1fc2VsZWN0b3JzW2J5dGVfaW5kZXggKiA0ICsgMF0gPSBiICYgMzsKLQkJCQltX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDFdID0gKGIgPj4gMikgJiAzOwotCQkJCW1fc2VsZWN0b3JzW2J5dGVfaW5kZXggKiA0ICsgMl0gPSAoYiA+PiA0KSAmIDM7Ci0JCQkJbV9zZWxlY3RvcnNbYnl0ZV9pbmRleCAqIDQgKyAzXSA9IChiID4+IDYpICYgMzsKLQkJCX0KLQkJfQotCi0JCXVpbnQzMl90IGdldF91aW50MzIoKSBjb25zdAotCQl7Ci0JCQlyZXR1cm4gZ2V0X2J5dGUoMCkgfCAoZ2V0X2J5dGUoMSkgPDwgOCkgfCAoZ2V0X2J5dGUoMikgPDwgMTYpIHwgKGdldF9ieXRlKDMpIDw8IDI0KTsKLQkJfQotCi0JCXVpbnQzMl90IGdldF9ieXRlKHVpbnQzMl90IGJ5dGVfaW5kZXgpIGNvbnN0Ci0JCXsKLQkJCWFzc2VydChieXRlX2luZGV4IDwgNCk7Ci0KLQkJCXJldHVybiBtX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDBdIHwKLQkJCQkobV9zZWxlY3RvcnNbYnl0ZV9pbmRleCAqIDQgKyAxXSA8PCAyKSB8Ci0JCQkJKG1fc2VsZWN0b3JzW2J5dGVfaW5kZXggKiA0ICsgMl0gPDwgNCkgfAotCQkJCShtX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDNdIDw8IDYpOwotCQl9Ci0KLQkJdWludDhfdCBvcGVyYXRvcigpKHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIGNvbnN0IHsgYXNzZXJ0KCh4IDwgNCkgJiYgKHkgPCA0KSk7IHJldHVybiBtX3NlbGVjdG9yc1t4ICsgeSAqIDRdOyB9Ci0JCXVpbnQ4X3Qmb3BlcmF0b3IoKSh1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7IGFzc2VydCgoeCA8IDQpICYmICh5IDwgNCkpOyByZXR1cm4gbV9zZWxlY3RvcnNbeCArIHkgKiA0XTsgfQotCi0JCXVpbnQzMl90IGNhbGNfZGlzdGFuY2UoY29uc3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5ICZvdGhlcikgY29uc3QKLQkJewotCQkJdWludDMyX3QgZGlzdCA9IDA7Ci0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgODsgaSsrKQotCQkJewotCQkJCWludCBkZWx0YSA9IHN0YXRpY19jYXN0PGludD4obV9zZWxlY3RvcnNbaV0pIC0gc3RhdGljX2Nhc3Q8aW50PihvdGhlci5tX3NlbGVjdG9yc1tpXSk7Ci0JCQkJZGlzdCArPSBkZWx0YSAqIGRlbHRhOwotCQkJfQotCQkJcmV0dXJuIGRpc3Q7Ci0JCX0KLQotI2lmIDAKLQkJdWludDMyX3QgY2FsY19oYW1taW5nX2Rpc3QoY29uc3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5ICZvdGhlcikgY29uc3QKLQkJewotCQkJdWludDMyX3QgZGlzdCA9IDA7Ci0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgaSsrKQotCQkJCWRpc3QgKz0gZ19oYW1taW5nX2Rpc3RbZ2V0X2J5dGUoaSkgXiBvdGhlci5nZXRfYnl0ZShpKV07Ci0JCQlyZXR1cm4gZGlzdDsKLQkJfQotI2VuZGlmCi0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9pbnZlcnRlZCgpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByZXN1bHQ7Ci0KLQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkJCXJlc3VsdC5tX3NlbGVjdG9yc1tpXSA9IDMgLSBtX3NlbGVjdG9yc1tpXTsKLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfZGl2aWRlZCgpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByZXN1bHQ7Ci0KLQkJCWNvbnN0IHVpbnQ4X3QgZGl2X3NlbGVjdG9yWzRdID0geyAyLCAwLCAzLCAxIH07Ci0KLQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkJCXJlc3VsdC5tX3NlbGVjdG9yc1tpXSA9IGRpdl9zZWxlY3RvclttX3NlbGVjdG9yc1tpXV07Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X3NoaWZ0ZWQoaW50IGRlbHRhKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCQlyZXN1bHQubV9zZWxlY3RvcnNbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihiYXNpc3U6OmNsYW1wPGludD4obV9zZWxlY3RvcnNbaV0gKyBkZWx0YSwgMCwgMykpOwotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9yYW5kb21pemVkKCkgY29uc3QKLQkJewotCQkJdWludDMyX3Qgc2VlZCA9IGdldF91aW50MzIoKTsKLQotCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHJlc3VsdDsKLQotCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCXsKLQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCXsKLQkJCQkJaW50IHMgPSAoKnRoaXMpKHgsIHkpOwotCi0JCQkJCS8vIGJldHdlZW4gMCBhbmQgMTAKLQkJCQkJdWludDMyX3QgaSA9IGJhc2lzZF91cmFuZChzZWVkLCA2KSArIGJhc2lzZF91cmFuZChzZWVkLCA2KTsKLQkJCQkJaWYgKGkgPT0gMCkKLQkJCQkJCXMgLT0gMjsKLQkJCQkJZWxzZSBpZiAoaSA9PSAxMCkKLQkJCQkJCXMgKz0gMjsKLQkJCQkJZWxzZSBpZiAoaSA8IDMpCi0JCQkJCQlzIC09IDE7Ci0JCQkJCWVsc2UgaWYgKGkgPiA3KQotCQkJCQkJcyArPSAxOwotCi0JCQkJCXJlc3VsdCh4LCB5KSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJhc2lzdTo6Y2xhbXA8aW50PihzLCAwLCAzKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9jb250cmFzdChpbnQgdGFibGVfaW5kZXgpIGNvbnN0Ci0JCXsKLQkJCWFzc2VydCh0YWJsZV9pbmRleCA8IDQpOwotCi0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlzdGF0aWMgY29uc3QgdWludDhfdCBzX2NvbnRyYXN0X3RhYmxlc1s0XVs0XSA9Ci0JCQl7Ci0JCQkJeyAwLCAxLCAyLCAzIH0sIC8vIG5vdCB1c2VkCi0JCQkJeyAwLCAwLCAzLCAzIH0sCi0JCQkJeyAxLCAxLCAyLCAyIH0sCi0JCQkJeyAxLCAxLCAzLCAzIH0KLQkJCX07Ci0KLQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkJewotCQkJCXJlc3VsdFtpXSA9IHNfY29udHJhc3RfdGFibGVzW3RhYmxlX2luZGV4XVsoKnRoaXMpW2ldXTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfZGlsYXRlZCgpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByZXN1bHQ7Ci0KLQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQl7Ci0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQl7Ci0JCQkJCXVpbnQzMl90IG1heF9zZWxlY3RvciA9IDA7Ci0KLQkJCQkJZm9yIChpbnQgeWQgPSAtMTsgeWQgPD0gMTsgeWQrKykKLQkJCQkJewotCQkJCQkJaW50IGZ5ID0geSArIHlkOwotCQkJCQkJaWYgKChmeSA8IDApIHx8IChmeSA+IDMpKQotCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCQlmb3IgKGludCB4ZCA9IC0xOyB4ZCA8PSAxOyB4ZCsrKQotCQkJCQkJewotCQkJCQkJCWludCBmeCA9IHggKyB4ZDsKLQkJCQkJCQlpZiAoKGZ4IDwgMCkgfHwgKGZ4ID4gMykpCi0JCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCQkJbWF4X3NlbGVjdG9yID0gYmFzaXN1OjptYXhpbXVtPHVpbnQzMl90PihtYXhfc2VsZWN0b3IsICgqdGhpcykoZngsIGZ5KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXN1bHQoeCwgeSkgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtYXhfc2VsZWN0b3IpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfZXJvZGVkKCkgY29uc3QKLQkJewotCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHJlc3VsdDsKLQotCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCXsKLQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCXsKLQkJCQkJdWludDMyX3QgbWluX3NlbGVjdG9yID0gOTk7Ci0KLQkJCQkJZm9yIChpbnQgeWQgPSAtMTsgeWQgPD0gMTsgeWQrKykKLQkJCQkJewotCQkJCQkJaW50IGZ5ID0geSArIHlkOwotCQkJCQkJaWYgKChmeSA8IDApIHx8IChmeSA+IDMpKQotCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCQlmb3IgKGludCB4ZCA9IC0xOyB4ZCA8PSAxOyB4ZCsrKQotCQkJCQkJewotCQkJCQkJCWludCBmeCA9IHggKyB4ZDsKLQkJCQkJCQlpZiAoKGZ4IDwgMCkgfHwgKGZ4ID4gMykpCi0JCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCQkJbWluX3NlbGVjdG9yID0gYmFzaXN1OjptaW5pbXVtPHVpbnQzMl90PihtaW5fc2VsZWN0b3IsICgqdGhpcykoZngsIGZ5KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXN1bHQoeCwgeSkgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtaW5fc2VsZWN0b3IpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfc2hpZnRfeCgpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByZXN1bHQ7Ci0KLQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQl7Ci0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQl7Ci0JCQkJCWludCBzeCA9IHggLSAxOwotCQkJCQlpZiAoc3ggPCAwKQotCQkJCQkJc3ggPSAwOwotCi0JCQkJCXJlc3VsdCh4LCB5KSA9ICgqdGhpcykoc3gsIHkpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfc2hpZnRfeSgpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByZXN1bHQ7Ci0KLQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQl7Ci0JCQkJaW50IHN5ID0geSAtIDE7Ci0JCQkJaWYgKHN5IDwgMCkKLQkJCQkJc3kgPSAzOwotCi0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQkJcmVzdWx0KHgsIHkpID0gKCp0aGlzKSh4LCBzeSk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X21lZGlhbigpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByZXN1bHQ7Ci0KLQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQl7Ci0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQl7Ci0JCQkJCS8vIEFCQwotCQkJCQkvLyBEIEYKLQkJCQkJLy8gR0hJCi0KLQkJCQkJdWludDhfdCBzZWxlY3RvcnNbOF07Ci0JCQkJCXVpbnQzMl90IG4gPSAwOwotCi0JCQkJCWZvciAoaW50IHlkID0gLTE7IHlkIDw9IDE7IHlkKyspCi0JCQkJCXsKLQkJCQkJCWludCBmeSA9IHkgKyB5ZDsKLQkJCQkJCWlmICgoZnkgPCAwKSB8fCAoZnkgPiAzKSkKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJZm9yIChpbnQgeGQgPSAtMTsgeGQgPD0gMTsgeGQrKykKLQkJCQkJCXsKLQkJCQkJCQlpZiAoKHhkIHwgeWQpID09IDApCi0JCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCQkJaW50IGZ4ID0geCArIHhkOwotCQkJCQkJCWlmICgoZnggPCAwKSB8fCAoZnggPiAzKSkKLQkJCQkJCQkJY29udGludWU7Ci0KLQkJCQkJCQlzZWxlY3RvcnNbbisrXSA9ICgqdGhpcykoZngsIGZ5KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXN0ZDo6c29ydChzZWxlY3RvcnMsIHNlbGVjdG9ycyArIG4pOwotCi0JCQkJCXJlc3VsdCh4LCB5KSA9IHNlbGVjdG9yc1tuIC8gMl07Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9oaWdoX3Bhc3MoKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlzdGF0aWMgY29uc3QgaW50IGtlcm5lbFszXVszXSA9Ci0JCQl7Ci0JCQkJeyAwLCAgLTEsICAwIH0sCi0JCQkJeyAtMSwgIDgsIC0xIH0sCi0JCQkJeyAwLCAgLTEsICAwIH0KLQkJCX07Ci0KLQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQl7Ci0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQl7Ci0JCQkJCS8vIEFCQwotCQkJCQkvLyBEIEYKLQkJCQkJLy8gR0hJCi0KLQkJCQkJaW50IHN1bSA9IDA7Ci0KLQkJCQkJZm9yIChpbnQgeWQgPSAtMTsgeWQgPD0gMTsgeWQrKykKLQkJCQkJewotCQkJCQkJaW50IGZ5ID0geSArIHlkOwotCQkJCQkJZnkgPSBiYXNpc3U6OmNsYW1wPGludD4oZnksIDAsIDMpOwotCi0JCQkJCQlmb3IgKGludCB4ZCA9IC0xOyB4ZCA8PSAxOyB4ZCsrKQotCQkJCQkJewotCQkJCQkJCWludCBmeCA9IHggKyB4ZDsKLQkJCQkJCQlmeCA9IGJhc2lzdTo6Y2xhbXA8aW50PihmeCwgMCwgMyk7Ci0KLQkJCQkJCQlpbnQgayA9ICgqdGhpcykoZngsIGZ5KTsKLQkJCQkJCQlzdW0gKz0gayAqIGtlcm5lbFt5ZCArIDFdW3hkICsgMV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlzdW0gPSBzdW0gLyA0OwotCi0JCQkJCXJlc3VsdCh4LCB5KSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJhc2lzdTo6Y2xhbXA8aW50PihzdW0sIDAsIDMpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X2ZsaXBwZWRfYW5kX3JvdGF0ZWQoYm9vbCBmbGlwLCB1aW50MzJfdCByb3RhdGlvbl9pbmRleCkgY29uc3QKLQkJewotCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHRlbXA7Ci0KLQkJCWlmIChmbGlwKQotCQkJewotCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJCQl0ZW1wKHgsIHkpID0gKCp0aGlzKSh4LCAzIC0geSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdGVtcCA9ICp0aGlzOwotCQkJfQotCi0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlzd2l0Y2ggKHJvdGF0aW9uX2luZGV4KQotCQkJewotCQkJY2FzZSAwOgotCQkJCXJlc3VsdCA9IHRlbXA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQkJCXJlc3VsdCh4LCB5KSA9IHRlbXAoeSwgMyAtIHgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJCQlyZXN1bHQoeCwgeSkgPSB0ZW1wKDMgLSB4LCAzIC0geSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQkJCXJlc3VsdCh4LCB5KSA9IHRlbXAoMyAtIHksIHgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlhc3NlcnQoMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X21vZGlmaWVkKGNvbnN0IGV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgJm1vZGlmaWVyKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcigqdGhpcyk7Ci0KLQkJCWlmIChtb2RpZmllci5tX3NoaWZ0X3gpCi0JCQkJciA9IHIuZ2V0X3NoaWZ0X3goKTsKLQotCQkJaWYgKG1vZGlmaWVyLm1fc2hpZnRfeSkKLQkJCQlyID0gci5nZXRfc2hpZnRfeSgpOwotCi0JCQlyID0gci5nZXRfZmxpcHBlZF9hbmRfcm90YXRlZChtb2RpZmllci5tX2ZsaXAgIT0gMCwgbW9kaWZpZXIubV9yb3QpOwotCi0JCQlpZiAobW9kaWZpZXIubV9kaWxhdGUpCi0JCQkJciA9IHIuZ2V0X2RpbGF0ZWQoKTsKLQotCQkJaWYgKG1vZGlmaWVyLm1fZXJvZGUpCi0JCQkJciA9IHIuZ2V0X2Vyb2RlZCgpOwotCi0JCQlpZiAobW9kaWZpZXIubV9oaWdoX3Bhc3MpCi0JCQkJciA9IHIuZ2V0X2hpZ2hfcGFzcygpOwotCi0JCQlpZiAobW9kaWZpZXIubV9yYW5kKQotCQkJCXIgPSByLmdldF9yYW5kb21pemVkKCk7Ci0KLQkJCWlmIChtb2RpZmllci5tX2RpdikKLQkJCQlyID0gci5nZXRfZGl2aWRlZCgpOwotCi0JCQlpZiAobW9kaWZpZXIubV9zaGlmdCkKLQkJCQlyID0gci5nZXRfc2hpZnRlZCgxKTsKLQotCQkJaWYgKG1vZGlmaWVyLm1fY29udHJhc3QpCi0JCQkJciA9IHIuZ2V0X2NvbnRyYXN0KG1vZGlmaWVyLm1fY29udHJhc3QpOwotCi0JCQlpZiAobW9kaWZpZXIubV9pbnYpCi0JCQkJciA9IHIuZ2V0X2ludmVydGVkKCk7Ci0KLQkJCWlmIChtb2RpZmllci5tX21lZGlhbikKLQkJCQlyID0gci5nZXRfbWVkaWFuKCk7Ci0KLQkJCXJldHVybiByOwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGFwcGx5X21vZGlmaWVyKG1vZGlmaWVyX3R5cGVzIG1vZF90eXBlLCBjb25zdCBldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyICZtb2RpZmllcikgY29uc3QKLQkJewotCQkJc3dpdGNoIChtb2RfdHlwZSkKLQkJCXsKLQkJCWNhc2UgY01vZGlmaWVyQ29udHJhc3Q6Ci0JCQkJcmV0dXJuIGdldF9jb250cmFzdChtb2RpZmllci5tX2NvbnRyYXN0KTsKLQkJCWNhc2UgY01vZGlmaWVyUmFuZDoKLQkJCQlyZXR1cm4gZ2V0X3JhbmRvbWl6ZWQoKTsKLQkJCWNhc2UgY01vZGlmaWVyTWVkaWFuOgotCQkJCXJldHVybiBnZXRfbWVkaWFuKCk7Ci0JCQljYXNlIGNNb2RpZmllckRpdjoKLQkJCQlyZXR1cm4gZ2V0X2RpdmlkZWQoKTsKLQkJCWNhc2UgY01vZGlmaWVyU2hpZnQ6Ci0JCQkJcmV0dXJuIGdldF9zaGlmdGVkKDEpOwotCQkJY2FzZSBjTW9kaWZpZXJJbnY6Ci0JCQkJcmV0dXJuIGdldF9pbnZlcnRlZCgpOwotCQkJY2FzZSBjTW9kaWZpZXJGbGlwcGVkQW5kUm90YXRlZDoKLQkJCQlyZXR1cm4gZ2V0X2ZsaXBwZWRfYW5kX3JvdGF0ZWQobW9kaWZpZXIubV9mbGlwICE9IDAsIG1vZGlmaWVyLm1fcm90KTsKLQkJCWNhc2UgY01vZGlmaWVyRGlsYXRlOgotCQkJCXJldHVybiBnZXRfZGlsYXRlZCgpOwotCQkJY2FzZSBjTW9kaWZpZXJTaGlmdFg6Ci0JCQkJcmV0dXJuIGdldF9zaGlmdF94KCk7Ci0JCQljYXNlIGNNb2RpZmllclNoaWZ0WToKLQkJCQlyZXR1cm4gZ2V0X3NoaWZ0X3koKTsKLQkJCWNhc2UgY01vZGlmaWVyRXJvZGU6Ci0JCQkJcmV0dXJuIGdldF9lcm9kZWQoKTsKLQkJCWNhc2UgY01vZGlmaWVySGlnaFBhc3M6Ci0JCQkJcmV0dXJuIGdldF9oaWdoX3Bhc3MoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJYXNzZXJ0KDApOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlyZXR1cm4gKnRoaXM7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X21vZGlmaWVkKGNvbnN0IGV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgJm1vZGlmaWVyLCB1aW50MzJfdCBudW1fb3JkZXIsIGNvbnN0IG1vZGlmaWVyX3R5cGVzICpwT3JkZXIpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByKCp0aGlzKTsKLQotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9vcmRlcjsgaSsrKQotCQkJewotCQkJCXIgPSByLmFwcGx5X21vZGlmaWVyKHBPcmRlcltpXSwgbW9kaWZpZXIpOwotCQkJfQotCi0JCQlyZXR1cm4gcjsKLQkJfQotCi0JCWJvb2wgb3BlcmF0b3I8IChjb25zdCBldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgJm90aGVyKSBjb25zdAotCQl7Ci0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCXsKLQkJCQlpZiAobV9zZWxlY3RvcnNbaV0gPCBvdGhlci5tX3NlbGVjdG9yc1tpXSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZSBpZiAobV9zZWxlY3RvcnNbaV0gIT0gb3RoZXIubV9zZWxlY3RvcnNbaV0pCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJYm9vbCBvcGVyYXRvcj09IChjb25zdCBldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgJm90aGVyKSBjb25zdAotCQl7Ci0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCXsKLQkJCQlpZiAobV9zZWxlY3RvcnNbaV0gIT0gb3RoZXIubV9zZWxlY3RvcnNbaV0pCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCXByaXZhdGU6Ci0JCXVpbnQ4X3QgbV9zZWxlY3RvcnNbMTZdOwotCX07Ci0KLQl0eXBlZGVmIHN0ZDo6dmVjdG9yPGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeT4gZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5X3ZlYzsKLQotCWV4dGVybiBjb25zdCB1aW50MzJfdCBnX2dsb2JhbF9zZWxlY3Rvcl9jYltdOwotCWV4dGVybiBjb25zdCB1aW50MzJfdCBnX2dsb2JhbF9zZWxlY3Rvcl9jYl9zaXplOwotCi0jZGVmaW5lIEVUQzFfR0xPQkFMX1NFTEVDVE9SX0NPREVCT09LX01BWF9QQUxfQklUUyAoMTIpCi0KLQlzdHJ1Y3QgZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZW50cnlfaWQKLQl7Ci0JCXVpbnQzMl90IG1fcGFsZXR0ZV9pbmRleDsKLQkJZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllciBtX21vZGlmaWVyOwotCi0JCWV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rX2VudHJ5X2lkKHVpbnQzMl90IHBhbGV0dGVfaW5kZXgsIGNvbnN0IGV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgJm1vZGlmaWVyKSA6IG1fcGFsZXR0ZV9pbmRleChwYWxldHRlX2luZGV4KSwgbV9tb2RpZmllcihtb2RpZmllcikgeyB9Ci0KLQkJZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZW50cnlfaWQoKSB7IH0KLQotCQl2b2lkIHNldCh1aW50MzJfdCBwYWxldHRlX2luZGV4LCBjb25zdCBldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyICZtb2RpZmllcikgeyBtX3BhbGV0dGVfaW5kZXggPSBwYWxldHRlX2luZGV4OyBtX21vZGlmaWVyID0gbW9kaWZpZXI7IH0KLQl9OwotCi0JdHlwZWRlZiBzdGQ6OnZlY3RvcjxldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9va19lbnRyeV9pZD4gZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZW50cnlfaWRfdmVjOwotCi0JY2xhc3MgZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sKLQl7Ci0JcHVibGljOgotCQlldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vaygpIHsgfQotCQlldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayh1aW50MzJfdCBOLCBjb25zdCB1aW50MzJfdCAqcEVudHJpZXMpIHsgaW5pdChOLCBwRW50cmllcyk7IH0KLQotCQl2b2lkIGluaXQodWludDMyX3QgTiwgY29uc3QgdWludDMyX3QqIHBFbnRyaWVzKTsKLQotCQl2b2lkIHByaW50X2NvZGUoRklMRSAqcEZpbGUpOwotCi0JCXZvaWQgY2xlYXIoKQotCQl7Ci0JCQltX3BhbGV0dGUuY2xlYXIoKTsKLQkJfQotCi0JCXVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpbV9wYWxldHRlLnNpemUoKTsgfQotCi0JCWNvbnN0IGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeV92ZWMgJmdldF9wYWxldHRlKCkgY29uc3QKLQkJewotCQkJcmV0dXJuIG1fcGFsZXR0ZTsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfZW50cnkodWludDMyX3QgcGFsZXR0ZV9pbmRleCkgY29uc3QKLQkJewotCQkJcmV0dXJuIG1fcGFsZXR0ZVtwYWxldHRlX2luZGV4XTsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfZW50cnkodWludDMyX3QgcGFsZXR0ZV9pbmRleCwgY29uc3QgZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllciAmbW9kaWZpZXIpIGNvbnN0Ci0JCXsKLQkJCXJldHVybiBtX3BhbGV0dGVbcGFsZXR0ZV9pbmRleF0uZ2V0X21vZGlmaWVkKG1vZGlmaWVyKTsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfZW50cnkoY29uc3QgZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZW50cnlfaWQgJmlkKSBjb25zdAotCQl7Ci0JCQlyZXR1cm4gbV9wYWxldHRlW2lkLm1fcGFsZXR0ZV9pbmRleF0uZ2V0X21vZGlmaWVkKGlkLm1fbW9kaWZpZXIpOwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5X3ZlYyBtX3BhbGV0dGU7Ci0JfTsKLQotfSAvLyBuYW1lc3BhY2UgYmFzaXN0Ci0vKioqKiBlbmRlZCBpbmxpbmluZyBiYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGUuaCAqKioqLwotLyoqKiogc3RhcnQgaW5saW5pbmcgYmFzaXN1X2ZpbGVfaGVhZGVycy5oICoqKiovCi0vLyBiYXNpc19maWxlX2hlYWRlcnMuaAotLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgQmlub21pYWwgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vKioqKiBza2lwcGluZyBmaWxlOiBiYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oICoqKiovCi0KLW5hbWVzcGFjZSBiYXNpc3QKLXsKLQkvLyBTbGljZSBkZXNjIGhlYWRlciBmbGFncwotCWVudW0gYmFzaXNfc2xpY2VfZGVzY19mbGFncwotCXsKLQkJY1NsaWNlRGVzY0ZsYWdzSGFzQWxwaGEgPSAxLAotCQljU2xpY2VEZXNjRmxhZ3NGcmFtZUlzSUZyYW1lID0gMgkJCS8vIFZpZGVvIG9ubHk6IEZyYW1lIGRvZXNuJ3QgcmVmZXIgdG8gcHJldmlvdXMgZnJhbWUgKG5vIHVzYWdlIG9mIGNvbmRpdGlvbmFsIHJlcGxlbmlzaG1lbnQgcHJlZCBzeW1ib2xzKQotCX07Ci0KLSNwcmFnbWEgcGFjayhwdXNoKQotI3ByYWdtYSBwYWNrKDEpCi0Jc3RydWN0IGJhc2lzX3NsaWNlX2Rlc2MKLQl7Ci0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mz4gbV9pbWFnZV9pbmRleDsgIC8vIFRoZSBpbmRleCBvZiB0aGUgc291cmNlIGltYWdlIHByb3ZpZGVkIHRvIHRoZSBlbmNvZGVyICh3aWxsIGFsd2F5cyBhcHBlYXIgaW4gb3JkZXIgZnJvbSBmaXJzdCB0byBsYXN0LCBmaXJzdCBpbWFnZSBpbmRleCBpcyAwLCBubyBza2lwcGluZyBhbGxvd2VkKQotCQliYXNpc3U6OnBhY2tlZF91aW50PDE+IG1fbGV2ZWxfaW5kZXg7CS8vIFRoZSBtaXBtYXAgbGV2ZWwgaW5kZXggKG1pcG1hcHMgd2lsbCBhbHdheXMgYXBwZWFyIGZyb20gbGFyZ2VzdCB0byBzbWFsbGVzdCkKLQkJYmFzaXN1OjpwYWNrZWRfdWludDwxPiBtX2ZsYWdzOwkJCS8vIGVudW0gYmFzaXNfc2xpY2VfZGVzY19mbGFncwotCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gbV9vcmlnX3dpZHRoOwkvLyBUaGUgb3JpZ2luYWwgaW1hZ2Ugd2lkdGggKG1heSBub3QgYmUgYSBtdWx0aXBsZSBvZiA0IHBpeGVscykKLQkJYmFzaXN1OjpwYWNrZWRfdWludDwyPiBtX29yaWdfaGVpZ2h0OyAgLy8gVGhlIG9yaWdpbmFsIGltYWdlIGhlaWdodCAobWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIDQgcGl4ZWxzKQotCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gbV9udW1fYmxvY2tzX3g7CS8vIFRoZSBzbGljZSdzIGJsb2NrIFggZGltZW5zaW9ucy4gRWFjaCBibG9jayBpcyA0eDQgcGl4ZWxzLiBUaGUgc2xpY2UncyBwaXhlbCByZXNvbHV0aW9uIG1heSBvciBtYXkgbm90IGJlIGEgcG93ZXIgb2YgMi4KLQkJYmFzaXN1OjpwYWNrZWRfdWludDwyPiBtX251bV9ibG9ja3NfeTsJLy8gVGhlIHNsaWNlJ3MgYmxvY2sgWSBkaW1lbnNpb25zLiAKLQotCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fZmlsZV9vZnM7CQkvLyBPZmZzZXQgZnJvbSB0aGUgaGVhZGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgc2xpY2UncyBkYXRhCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9maWxlX3NpemU7CQkvLyBUaGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBzbGljZSBkYXRhIGluIGJ5dGVzCi0KLQkJYmFzaXN1OjpwYWNrZWRfdWludDwyPiBtX3NsaWNlX2RhdGFfY3JjMTY7IC8vIFRoZSBDUkMxNiBvZiB0aGUgY29tcHJlc3NlZCBzbGljZSBkYXRhLCBmb3IgZXh0cmEtcGFyYW5vaWQgdXNlIGNhc2VzCi0JfTsKLQotCS8vIEZpbGUgaGVhZGVyIGZpbGVzCi0JZW51bSBiYXNpc19oZWFkZXJfZmxhZ3MKLQl7Ci0JCWNCQVNJU0hlYWRlckZsYWdFVEMxUyA9IDEsCQkJCQkvLyBBbHdheXMgc2V0IGZvciBFVEMxUyBmaWxlcy4gTm90IHNldCBmb3IgVUFTVEMgZmlsZXMuCi0JCWNCQVNJU0hlYWRlckZsYWdZRmxpcHBlZCA9IDIsCQkJCS8vIFNldCBpZiB0aGUgdGV4dHVyZSBoYWQgdG8gYmUgWSBmbGlwcGVkIGJlZm9yZSBlbmNvZGluZwotCQljQkFTSVNIZWFkZXJGbGFnSGFzQWxwaGFTbGljZXMgPSA0CQkvLyBUcnVlIGlmIGFueSBzbGljZXMgY29udGFpbiBhbHBoYSAoZm9yIEVUQzFTLCBpZiB0aGUgb2RkIHNsaWNlcyBjb250YWluIGFscGhhIGRhdGEpCi0JfTsKLQotCS8vIFRoZSBpbWFnZSB0eXBlIGZpZWxkIGF0dGVtcHRzIHRvIGRlc2NyaWJlIGhvdyB0byBpbnRlcnByZXQgdGhlIGltYWdlIGRhdGEgaW4gYSBCYXNpcyBmaWxlLgotCS8vIFRoZSBlbmNvZGVyIGxpYnJhcnkgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcgc3BlY2lhbCBvciBkaWZmZXJlbnQgd2l0aCB0aGVzZSB0ZXh0dXJlIHR5cGVzLCB0aGlzIGlzIG1vc3RseSBoZXJlIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgdXNlci4gCi0JLy8gV2UgZG8gbWFrZSBzdXJlIHRoZSB2YXJpb3VzIGNvbnN0cmFpbnRzIGFyZSBmb2xsb3dlZCAoMkRBcnJheS9jdWJlbWFwL3ZpZGVvZnJhbWVzL3ZvbHVtZSBpbXBsaWVzIHRoYXQgZWFjaCBpbWFnZSBoYXMgdGhlIHNhbWUgcmVzb2x1dGlvbiBhbmQgIyBvZiBtaXBtYXAgbGV2ZWxzLCBldGMuLCBjdWJlbWFwIGltcGxpZXMgdGhhdCB0aGUgIyBvZiBpbWFnZSBzbGljZXMgaXMgYSBtdWx0aXBsZSBvZiA2KQotCWVudW0gYmFzaXNfdGV4dHVyZV90eXBlCi0JewotCQljQkFTSVNUZXhUeXBlMkQgPSAwLAkJCQkJLy8gQW4gYXJiaXRyYXJ5IGFycmF5IG9mIDJEIFJHQiBvciBSR0JBIGltYWdlcyB3aXRoIG9wdGlvbmFsIG1pcG1hcHMsIGFycmF5IHNpemUgPSAjIGltYWdlcywgZWFjaCBpbWFnZSBtYXkgaGF2ZSBhIGRpZmZlcmVudCByZXNvbHV0aW9uIGFuZCAjIG9mIG1pcG1hcCBsZXZlbHMKLQkJY0JBU0lTVGV4VHlwZTJEQXJyYXkgPSAxLAkJCS8vIEFuIGFycmF5IG9mIDJEIFJHQiBvciBSR0JBIGltYWdlcyB3aXRoIG9wdGlvbmFsIG1pcG1hcHMsIGFycmF5IHNpemUgPSAjIGltYWdlcywgZWFjaCBpbWFnZSBoYXMgdGhlIHNhbWUgcmVzb2x1dGlvbiBhbmQgbWlwbWFwIGxldmVscwotCQljQkFTSVNUZXhUeXBlQ3ViZW1hcEFycmF5ID0gMiwJLy8gYW4gYXJyYXkgb2YgY3ViZW1hcCBsZXZlbHMsIHRvdGFsICMgb2YgaW1hZ2VzIG11c3QgYmUgZGl2aXNhYmxlIGJ5IDYsIGluIFgrLCBYLSwgWSssIFktLCBaKywgWi0gb3JkZXIsIHdpdGggb3B0aW9uYWwgbWlwbWFwcwotCQljQkFTSVNUZXhUeXBlVmlkZW9GcmFtZXMgPSAzLAkJLy8gQW4gYXJyYXkgb2YgMkQgdmlkZW8gZnJhbWVzLCB3aXRoIG9wdGlvbmFsIG1pcG1hcHMsICMgZnJhbWVzID0gIyBpbWFnZXMsIGVhY2ggaW1hZ2UgaGFzIHRoZSBzYW1lIHJlc29sdXRpb24gYW5kICMgb2YgbWlwbWFwIGxldmVscwotCQljQkFTSVNUZXhUeXBlVm9sdW1lID0gNCwJCQkvLyBBIDNEIHRleHR1cmUgd2l0aCBvcHRpb25hbCBtaXBtYXBzLCBaIGRpbWVuc2lvbiA9ICMgaW1hZ2VzLCBlYWNoIGltYWdlIGhhcyB0aGUgc2FtZSByZXNvbHV0aW9uIGFuZCAjIG9mIG1pcG1hcCBsZXZlbHMKLQotCQljQkFTSVNUZXhUeXBlVG90YWwKLQl9OwotCi0JZW51bQotCXsKLQkJY0JBU0lTTWF4VVNQZXJGcmFtZSA9IDB4RkZGRkZGCi0JfTsKLQotCWVudW0gY2xhc3MgYmFzaXNfdGV4X2Zvcm1hdAotCXsKLQkJY0VUQzFTID0gMCwKLQkJY1VBU1RDNHg0ID0gMQotCX07Ci0KLQlzdHJ1Y3QgYmFzaXNfZmlsZV9oZWFkZXIKLQl7Ci0JCWVudW0KLQkJewotCQkJY0JBU0lTU2lnVmFsdWUgPSAoJ0InIDw8IDgpIHwgJ3MnLAotCQkJY0JBU0lTRmlyc3RWZXJzaW9uID0gMHgxMAotCQl9OwotCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX3NpZzsJCQkJLy8gMiBieXRlIGZpbGUgc2lnbmF0dXJlCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX3ZlcjsJCQkJLy8gQmFzZWxpbmUgZmlsZSB2ZXJzaW9uCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX2hlYWRlcl9zaXplOwkvLyBIZWFkZXIgc2l6ZSBpbiBieXRlcywgc2l6ZW9mKGJhc2lzX2ZpbGVfaGVhZGVyKQotCQliYXNpc3U6OnBhY2tlZF91aW50PDI+ICAgICAgbV9oZWFkZXJfY3JjMTY7CS8vIGNyYzE2IG9mIHRoZSByZW1haW5pbmcgaGVhZGVyIGRhdGEKLQotCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV9kYXRhX3NpemU7CQkvLyBUaGUgdG90YWwgc2l6ZSBvZiBhbGwgZGF0YSBhZnRlciB0aGUgaGVhZGVyCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX2RhdGFfY3JjMTY7CQkvLyBUaGUgQ1JDMTYgb2YgYWxsIGRhdGEgYWZ0ZXIgdGhlIGhlYWRlcgotCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mz4gICAgICBtX3RvdGFsX3NsaWNlczsJLy8gVGhlIHRvdGFsICMgb2YgY29tcHJlc3NlZCBzbGljZXMgKDEgc2xpY2UgcGVyIGltYWdlLCBvciAyIGZvciBhbHBoYSBiYXNpcyBmaWxlcykKLQotCQliYXNpc3U6OnBhY2tlZF91aW50PDM+ICAgICAgbV90b3RhbF9pbWFnZXM7CS8vIFRoZSB0b3RhbCAjIG9mIGltYWdlcwotCQkJCQotCQliYXNpc3U6OnBhY2tlZF91aW50PDE+ICAgICAgbV90ZXhfZm9ybWF0OwkJLy8gZW51bSBiYXNpc190ZXhfZm9ybWF0Ci0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX2ZsYWdzOwkJCS8vIGVudW0gYmFzaXN0OjpoZWFkZXJfZmxhZ3MKLQkJYmFzaXN1OjpwYWNrZWRfdWludDwxPiAgICAgIG1fdGV4X3R5cGU7CQkvLyBlbnVtIGJhc2lzdDo6YmFzaXNfdGV4dHVyZV90eXBlCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mz4gICAgICBtX3VzX3Blcl9mcmFtZTsJLy8gRnJhbWVyYXRlIG9mIHZpZGVvLCBpbiBtaWNyb3NlY29uZHMgcGVyIGZyYW1lCi0KLQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiAgICAgIG1fcmVzZXJ2ZWQ7CQkvLyBGb3IgZnV0dXJlIHVzZQotCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV91c2VyZGF0YTA7CQkvLyBGb3IgY2xpZW50IHVzZQotCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV91c2VyZGF0YTE7CQkvLyBGb3IgY2xpZW50IHVzZQotCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8Mj4gICAgICBtX3RvdGFsX2VuZHBvaW50czsJCQkvLyBUaGUgbnVtYmVyIG9mIGVuZHBvaW50cyBpbiB0aGUgZW5kcG9pbnQgY29kZWJvb2sgCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gICAgICBtX2VuZHBvaW50X2NiX2ZpbGVfb2ZzOwkvLyBUaGUgY29tcHJlc3NlZCBlbmRwb2ludCBjb2RlYm9vaydzIGZpbGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBoZWFkZXIKLQkJYmFzaXN1OjpwYWNrZWRfdWludDwzPiAgICAgIG1fZW5kcG9pbnRfY2JfZmlsZV9zaXplOwkvLyBUaGUgY29tcHJlc3NlZCBlbmRwb2ludCBjb2RlYm9vaydzIHNpemUgaW4gYnl0ZXMKLQotCQliYXNpc3U6OnBhY2tlZF91aW50PDI+ICAgICAgbV90b3RhbF9zZWxlY3RvcnM7CQkJLy8gVGhlIG51bWJlciBvZiBzZWxlY3RvcnMgaW4gdGhlIGVuZHBvaW50IGNvZGVib29rIAotCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV9zZWxlY3Rvcl9jYl9maWxlX29mczsJLy8gVGhlIGNvbXByZXNzZWQgc2VsZWN0b3JzIGNvZGVib29rJ3MgZmlsZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGhlYWRlcgotCQliYXNpc3U6OnBhY2tlZF91aW50PDM+ICAgICAgbV9zZWxlY3Rvcl9jYl9maWxlX3NpemU7CS8vIFRoZSBjb21wcmVzc2VkIHNlbGVjdG9yIGNvZGVib29rJ3Mgc2l6ZSBpbiBieXRlcwotCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gICAgICBtX3RhYmxlc19maWxlX29mczsJCQkvLyBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGNvbXByZXNzZWQgSHVmZm1hbiBjb2RlbGVuZ3RoIHRhYmxlcywgZm9yIGRlY29tcHJlc3Npbmcgc2xpY2VzCi0JCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gICAgICBtX3RhYmxlc19maWxlX3NpemU7CQkJLy8gVGhlIGZpbGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgY29tcHJlc3NlZCBodWZmbWFuIGNvZGVsZW5ndGggdGFibGVzCi0KLQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiAgICAgIG1fc2xpY2VfZGVzY19maWxlX29mczsJCS8vIFRoZSBmaWxlIG9mZnNldCB0byB0aGUgc2xpY2UgZGVzY3JpcHRpb24gYXJyYXksIHVzdWFsbHkgZm9sbG93cyB0aGUgaGVhZGVyCi0JCQotCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+ICAgICAgbV9leHRlbmRlZF9maWxlX29mczsJCS8vIFRoZSBmaWxlIG9mZnNldCBvZiB0aGUgImV4dGVuZGVkIiBoZWFkZXIgYW5kIGNvbXByZXNzZWQgZGF0YSwgZm9yIGZ1dHVyZSB1c2UKLQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiAgICAgIG1fZXh0ZW5kZWRfZmlsZV9zaXplOwkJLy8gVGhlIGZpbGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgImV4dGVuZGVkIiBoZWFkZXIgYW5kIGNvbXByZXNzZWQgZGF0YSwgZm9yIGZ1dHVyZSB1c2UKLQl9OwotI3ByYWdtYSBwYWNrIChwb3ApCi0KLX0gLy8gbmFtZXNwYWNlIGJhc2lzdAotLyoqKiogZW5kZWQgaW5saW5pbmcgYmFzaXN1X2ZpbGVfaGVhZGVycy5oICoqKiovCi0KLW5hbWVzcGFjZSBiYXNpc3QKLXsKLQkvLyBIaWdoLWxldmVsIGNvbXBvc2l0ZSB0ZXh0dXJlIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSB0cmFuc2NvZGVyLgotCS8vIEVhY2ggb2YgdGhlc2UgdGV4dHVyZSBmb3JtYXRzIGRpcmVjdGx5IGNvcnJlc3BvbmQgdG8gT3BlbkdML0QzRC9WdWxrYW4gZXRjLiB0ZXh0dXJlIGZvcm1hdHMuCi0JLy8gTm90ZXM6Ci0JLy8gLSBJZiB5b3Ugc3BlY2lmeSBhIHRleHR1cmUgZm9ybWF0IHRoYXQgc3VwcG9ydHMgYWxwaGEsIGJ1dCB0aGUgLmJhc2lzIGZpbGUgZG9lc24ndCBoYXZlIGFscGhhLCB0aGUgdHJhbnNjb2RlciB3aWxsIGF1dG9tYXRpY2FsbHkgb3V0cHV0IGEgCi0JLy8gZnVsbHkgb3BhcXVlICgyNTUpIGFscGhhIGNoYW5uZWwuCi0JLy8gLSBUaGUgUFZSVEMxIHRleHR1cmUgZm9ybWF0cyBvbmx5IHN1cHBvcnQgcG93ZXIgb2YgMiBkaW1lbnNpb24gLmJhc2lzIGZpbGVzLCBidXQgdGhpcyBtYXkgYmUgcmVsYXhlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLgotCS8vIC0gVGhlIFBWUlRDMSB0cmFuc2NvZGVycyBhcmUgcmVhbC10aW1lIGVuY29kZXJzLCBzbyBkb24ndCBleHBlY3QgdGhlIGhpZ2hlc3QgcXVhbGl0eS4gV2UgbWF5IGFkZCBhIHNsb3dlciBlbmNvZGVyIHdpdGggaW1wcm92ZWQgcXVhbGl0eS4KLQkvLyAtIFRoZXNlIGVudW1zIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggSmF2YXNjcmlwdCBjb2RlIHRoYXQgY2FsbHMgdGhlIHRyYW5zY29kZXIuCi0JZW51bSBjbGFzcyB0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0Ci0JewotCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKLQotCQkvLyBFVEMxLTIKLQkJY1RGRVRDMV9SR0IgPSAwLAkJCQkJCQkvLyBPcGFxdWUgb25seSwgcmV0dXJucyBSR0Igb3IgYWxwaGEgZGF0YSBpZiBjRGVjb2RlRmxhZ3NUcmFuc2NvZGVBbHBoYURhdGFUb09wYXF1ZUZvcm1hdHMgZmxhZyBpcyBzcGVjaWZpZWQKLQkJY1RGRVRDMl9SR0JBID0gMSwJCQkJCQkJLy8gT3BhcXVlK2FscGhhLCBFVEMyX0VBQ19BOCBibG9jayBmb2xsb3dlZCBieSBhIEVUQzEgYmxvY2ssIGFscGhhIGNoYW5uZWwgd2lsbCBiZSBvcGFxdWUgZm9yIG9wYXF1ZSAuYmFzaXMgZmlsZXMKLQotCQkvLyBCQzEtNSwgQkM3IChkZXNrdG9wLCBzb21lIG1vYmlsZSBkZXZpY2VzKQotCQljVEZCQzFfUkdCID0gMiwJCQkJCQkJLy8gT3BhcXVlIG9ubHksIG5vIHB1bmNodGhyb3VnaCBhbHBoYSBzdXBwb3J0IHlldCwgdHJhbnNjb2RlcyBhbHBoYSBzbGljZSBpZiBjRGVjb2RlRmxhZ3NUcmFuc2NvZGVBbHBoYURhdGFUb09wYXF1ZUZvcm1hdHMgZmxhZyBpcyBzcGVjaWZpZWQKLQkJY1RGQkMzX1JHQkEgPSAzLCAJCQkJCQkJLy8gT3BhcXVlK2FscGhhLCBCQzQgZm9sbG93ZWQgYnkgYSBCQzEgYmxvY2ssIGFscGhhIGNoYW5uZWwgd2lsbCBiZSBvcGFxdWUgZm9yIG9wYXF1ZSAuYmFzaXMgZmlsZXMKLQkJY1RGQkM0X1IgPSA0LAkJCQkJCQkJLy8gUmVkIG9ubHksIGFscGhhIHNsaWNlIGlzIHRyYW5zY29kZWQgdG8gb3V0cHV0IGlmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cyBmbGFnIGlzIHNwZWNpZmllZAotCQljVEZCQzVfUkcgPSA1LAkJCQkJCQkJLy8gWFk6IFR3byBCQzQgYmxvY2tzLCBYPVIgYW5kIFk9QWxwaGEsIC5iYXNpcyBmaWxlIHNob3VsZCBoYXZlIGFscGhhIGRhdGEgKGlmIG5vdCBZIHdpbGwgYmUgYWxsIDI1NSdzKQotCQljVEZCQzdfUkdCQSA9IDYsCQkJCQkJCS8vIFJHQiBvciBSR0JBLCBtb2RlIDUgZm9yIEVUQzFTLCBtb2RlcyAoMSwyLDMsNSw2LDcpIGZvciBVQVNUQwotCQkJCQotCQkvLyBQVlJUQzEgNGJwcCAobW9iaWxlLCBQb3dlclZSIGRldmljZXMpCi0JCWNURlBWUlRDMV80X1JHQiA9IDgsCQkJCQkJLy8gT3BhcXVlIG9ubHksIFJHQiBvciBhbHBoYSBpZiBjRGVjb2RlRmxhZ3NUcmFuc2NvZGVBbHBoYURhdGFUb09wYXF1ZUZvcm1hdHMgZmxhZyBpcyBzcGVjaWZpZWQsIG5lYXJseSBsb3dlc3QgcXVhbGl0eSBvZiBhbnkgdGV4dHVyZSBmb3JtYXQuCi0JCWNURlBWUlRDMV80X1JHQkEgPSA5LAkJCQkJLy8gT3BhcXVlK2FscGhhLCBtb3N0IHVzZWZ1bCBmb3Igc2ltcGxlIG9wYWNpdHkgbWFwcy4gSWYgLmJhc2lzIGZpbGUgZG9lc24ndCBoYXZlIGFscGhhIGNURlBWUlRDMV80X1JHQiB3aWxsIGJlIHVzZWQgaW5zdGVhZC4gTG93ZXN0IHF1YWxpdHkgb2YgYW55IHN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdC4KLQotCQkvLyBBU1RDIChtb2JpbGUsIEludGVsIGRldmljZXMsIGhvcGVmdWxseSBhbGwgZGVza3RvcCBHUFUncyBvbmUgZGF5KQotCQljVEZBU1RDXzR4NF9SR0JBID0gMTAsCQkJCQkvLyBPcGFxdWUrYWxwaGEsIEFTVEMgNHg0LCBhbHBoYSBjaGFubmVsIHdpbGwgYmUgb3BhcXVlIGZvciBvcGFxdWUgLmJhc2lzIGZpbGVzLiBUcmFuc2NvZGVyIHVzZXMgUkdCL1JHQkEvTC9MQSBtb2Rlcywgdm9pZCBleHRlbnQsIGFuZCB1cCB0byB0d28gKFswLDQ3XSBhbmQgWzAsMjU1XSkgZW5kcG9pbnQgcHJlY2lzaW9ucy4KLQotCQkvLyBBVEMgKG1vYmlsZSwgQWRyZW5vIGRldmljZXMsIHRoaXMgaXMgYSBuaWNoZSBmb3JtYXQpCi0JCWNURkFUQ19SR0IgPSAxMSwJCQkJCQkJLy8gT3BhcXVlLCBSR0Igb3IgYWxwaGEgaWYgY0RlY29kZUZsYWdzVHJhbnNjb2RlQWxwaGFEYXRhVG9PcGFxdWVGb3JtYXRzIGZsYWcgaXMgc3BlY2lmaWVkLiBBVEkgQVRDIChHTF9BVENfUkdCX0FNRCkKLQkJY1RGQVRDX1JHQkEgPSAxMiwJCQkJCQkJLy8gT3BhcXVlK2FscGhhLCBhbHBoYSBjaGFubmVsIHdpbGwgYmUgb3BhcXVlIGZvciBvcGFxdWUgLmJhc2lzIGZpbGVzLiBBVEkgQVRDIChHTF9BVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEFfQU1EKSAKLQotCQkvLyBGWFQxIChkZXNrdG9wLCBJbnRlbCBkZXZpY2VzLCB0aGlzIGlzIGEgc3VwZXIgb2JzY3VyZSBmb3JtYXQpCi0JCWNURkZYVDFfUkdCID0gMTcsCQkJCQkJCS8vIE9wYXF1ZSBvbmx5LCB1c2VzIGV4Y2x1c2l2ZWx5IENDX01JWEVEIGJsb2Nrcy4gTm90YWJsZSBmb3IgaGF2aW5nIGEgOHg0IGJsb2NrIHNpemUuIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxIGlzIHN1cHBvcnRlZCBvbiBJbnRlbCBpbnRlZ3JhdGVkIEdQVSdzIChzdWNoIGFzIEhEIDYzMCkuCi0JCQkJCQkJCQkJCQkJCS8vIFB1bmNoLXRocm91Z2ggYWxwaGEgaXMgcmVsYXRpdmVseSBlYXN5IHRvIHN1cHBvcnQsIGJ1dCBmdWxsIGFscGhhIGlzIGhhcmRlci4gVGhpcyBmb3JtYXQgaXMgb25seSBoZXJlIGZvciBjb21wbGV0ZW5lc3Mgc28gb3BhcXVlLW9ubHkgaXMgZmluZSBmb3Igbm93LgotCQkJCQkJCQkJCQkJCQkvLyBTZWUgdGhlIEJBU0lTVV9VU0VfT1JJR0lOQUxfM0RGWF9GWFQxX0VOQ09ESU5HIG1hY3JvIGluIGJhc2lzdV90cmFuc2NvZGVyX2ludGVybmFsLmguCi0KLQkJY1RGUFZSVEMyXzRfUkdCID0gMTgsCQkJCQkvLyBPcGFxdWUtb25seSwgYWxtb3N0IEJDMSBxdWFsaXR5LCBtdWNoIGZhc3RlciB0byB0cmFuc2NvZGUgYW5kIHN1cHBvcnRzIGFyYml0cmFyeSB0ZXh0dXJlIGRpbWVuc2lvbnMgKHVubGlrZSBQVlJUQzEgUkdCKS4KLQkJY1RGUFZSVEMyXzRfUkdCQSA9IDE5LAkJCQkJLy8gT3BhcXVlK2FscGhhLCBzbG93ZXIgdG8gZW5jb2RlIHRoYW4gY1RGUFZSVEMyXzRfUkdCLiBQcmVtdWx0aXBsaWVkIGFscGhhIGlzIGhpZ2hseSByZWNvbW1lbmRlZCwgb3RoZXJ3aXNlIHRoZSBjb2xvciBjaGFubmVsIGNhbiBsZWFrIGludG8gdGhlIGFscGhhIGNoYW5uZWwgb24gdHJhbnNwYXJlbnQgYmxvY2tzLgotCi0JCWNURkVUQzJfRUFDX1IxMSA9IDIwLAkJCQkJLy8gUiBvbmx5IChFVEMyIEVBQyBSMTEgdW5zaWduZWQpCi0JCWNURkVUQzJfRUFDX1JHMTEgPSAyMSwJCQkJCS8vIFJHIG9ubHkgKEVUQzIgRUFDIFJHMTEgdW5zaWduZWQpLCBSPW9wYXF1ZS5yLCBHPWFscGhhIC0gZm9yIHRhbmdlbnQgc3BhY2Ugbm9ybWFsIG1hcHMKLQkJCi0JCS8vIFVuY29tcHJlc3NlZCAocmF3IHBpeGVsKSBmb3JtYXRzCi0JCWNURlJHQkEzMiA9IDEzLAkJCQkJCQkvLyAzMmJwcCBSR0JBIGltYWdlIHN0b3JlZCBpbiByYXN0ZXIgKG5vdCBibG9jaykgb3JkZXIgaW4gbWVtb3J5LCBSIGlzIGZpcnN0IGJ5dGUsIEEgaXMgbGFzdCBieXRlLgotCQljVEZSR0I1NjUgPSAxNCwJCQkJCQkJLy8gMTY2cHAgUkdCIGltYWdlIHN0b3JlZCBpbiByYXN0ZXIgKG5vdCBibG9jaykgb3JkZXIgaW4gbWVtb3J5LCBSIGF0IGJpdCBwb3NpdGlvbiAxMQotCQljVEZCR1I1NjUgPSAxNSwJCQkJCQkJLy8gMTZicHAgUkdCIGltYWdlIHN0b3JlZCBpbiByYXN0ZXIgKG5vdCBibG9jaykgb3JkZXIgaW4gbWVtb3J5LCBSIGF0IGJpdCBwb3NpdGlvbiAwCi0JCWNURlJHQkE0NDQ0ID0gMTYsCQkJCQkJCS8vIDE2YnBwIFJHQkEgaW1hZ2Ugc3RvcmVkIGluIHJhc3RlciAobm90IGJsb2NrKSBvcmRlciBpbiBtZW1vcnksIFIgYXQgYml0IHBvc2l0aW9uIDEyLCBBIGF0IGJpdCBwb3NpdGlvbiAwCi0KLQkJY1RGVG90YWxUZXh0dXJlRm9ybWF0cyA9IDIyLAotCi0JCS8vIE9sZCBlbnVtcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNvZGUgY29tcGlsZWQgYWdhaW5zdCBwcmV2aW91cyB2ZXJzaW9ucwotCQljVEZFVEMxID0gY1RGRVRDMV9SR0IsCi0JCWNURkVUQzIgPSBjVEZFVEMyX1JHQkEsCi0JCWNURkJDMSA9IGNURkJDMV9SR0IsCi0JCWNURkJDMyA9IGNURkJDM19SR0JBLAotCQljVEZCQzQgPSBjVEZCQzRfUiwKLQkJY1RGQkM1ID0gY1RGQkM1X1JHLAotCQkKLQkJLy8gUHJldmlvdXNseSwgdGhlIGNhbGxlciBoYWQgc29tZSBjb250cm9sIG92ZXIgd2hpY2ggQkM3IG1vZGUgdGhlIHRyYW5zY29kZXIgb3V0cHV0LiBXZSd2ZSBzaW1wbGlmaWVkIHRoaXMgZHVlIHRvIFVBU1RDLCB3aGljaCBzdXBwb3J0cyBudW1lcm91cyBtb2Rlcy4KLQkJY1RGQkM3X002X1JHQiA9IGNURkJDN19SR0JBLAkJCS8vIE9wYXF1ZSBvbmx5LCBSR0Igb3IgYWxwaGEgaWYgY0RlY29kZUZsYWdzVHJhbnNjb2RlQWxwaGFEYXRhVG9PcGFxdWVGb3JtYXRzIGZsYWcgaXMgc3BlY2lmaWVkLiBIaWdoZXN0IHF1YWxpdHkgb2YgYWxsIHRoZSBub24tRVRDMSBmb3JtYXRzLgotCQljVEZCQzdfTTVfUkdCQSA9IGNURkJDN19SR0JBLAkJCS8vIE9wYXF1ZSthbHBoYSwgYWxwaGEgY2hhbm5lbCB3aWxsIGJlIG9wYXF1ZSBmb3Igb3BhcXVlIC5iYXNpcyBmaWxlcwotCQljVEZCQzdfTTZfT1BBUVVFX09OTFkgPSBjVEZCQzdfUkdCQSwKLQkJY1RGQkM3X001ID0gY1RGQkM3X1JHQkEsCi0JCWNURkJDN19BTFQgPSA3LAotCi0JCWNURkFTVENfNHg0ID0gY1RGQVNUQ180eDRfUkdCQSwKLQkJCi0JCWNURkFUQ19SR0JBX0lOVEVSUE9MQVRFRF9BTFBIQSA9IGNURkFUQ19SR0JBLAotCX07Ci0KLQkvLyBGb3IgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMsIHRoaXMgcmV0dXJucyB0aGUgIyBvZiBieXRlcyBwZXIgYmxvY2suIEZvciB1bmNvbXByZXNzZWQsIGl0IHJldHVybnMgdGhlICMgb2YgYnl0ZXMgcGVyIHBpeGVsLgotCS8vIE5PVEU6IFByZXZpb3VzbHksIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCBiYXNpc19nZXRfYnl0ZXNfcGVyX2Jsb2NrKCksIGFuZCBpdCBhbHdheXMgcmV0dXJuZWQgMTYqYnl0ZXNfcGVyX3BpeGVsIGZvciB1bmNvbXByZXNzZWQgZm9ybWF0cyB3aGljaCB3YXMgY29uZnVzaW5nLgotCXVpbnQzMl90IGJhc2lzX2dldF9ieXRlc19wZXJfYmxvY2tfb3JfcGl4ZWwodHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCBmbXQpOwotCi0JLy8gUmV0dXJucyBmb3JtYXQncyBuYW1lIGluIEFTQ0lJCi0JY29uc3QgY2hhciogYmFzaXNfZ2V0X2Zvcm1hdF9uYW1lKHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgZm10KTsKLQotCS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybWF0IHN1cHBvcnRzIGFuIGFscGhhIGNoYW5uZWwuCi0JYm9vbCBiYXNpc190cmFuc2NvZGVyX2Zvcm1hdF9oYXNfYWxwaGEodHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCBmbXQpOwotCi0JLy8gUmV0dXJucyB0aGUgYmFzaXN1Ojp0ZXh0dXJlX2Zvcm1hdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdC4KLQliYXNpc3U6OnRleHR1cmVfZm9ybWF0IGJhc2lzX2dldF9iYXNpc3VfdGV4dHVyZV9mb3JtYXQodHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCBmbXQpOwotCi0JLy8gUmV0dXJucyB0aGUgdGV4dHVyZSB0eXBlJ3MgbmFtZSBpbiBBU0NJSS4KLQljb25zdCBjaGFyKiBiYXNpc19nZXRfdGV4dHVyZV90eXBlX25hbWUoYmFzaXNfdGV4dHVyZV90eXBlIHRleF90eXBlKTsKLQkKLQkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zY29kZXIgdGV4dHVyZSB0eXBlIGlzIGFuIHVuY29tcHJlc3NlZCAocmF3IHBpeGVsKSBmb3JtYXQuCi0JYm9vbCBiYXNpc190cmFuc2NvZGVyX2Zvcm1hdF9pc191bmNvbXByZXNzZWQodHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCB0ZXhfdHlwZSk7Ci0KLQkvLyBSZXR1cm5zIHRoZSAjIG9mIGJ5dGVzIHBlciBwaXhlbCBmb3IgdW5jb21wcmVzc2VkIGZvcm1hdHMsIG9yIDAgZm9yIGJsb2NrIHRleHR1cmUgZm9ybWF0cy4KLQl1aW50MzJfdCBiYXNpc19nZXRfdW5jb21wcmVzc2VkX2J5dGVzX3Blcl9waXhlbCh0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IGZtdCk7Ci0JCi0JLy8gUmV0dXJucyB0aGUgYmxvY2sgd2lkdGggZm9yIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBmb3JtYXQsIHdoaWNoIGlzIGN1cnJlbnRseSBlaXRoZXIgNCBvciA4IGZvciBGWFQxLgotCXVpbnQzMl90IGJhc2lzX2dldF9ibG9ja193aWR0aCh0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IHRleF90eXBlKTsKLQkKLQkvLyBSZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgZm9yIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBmb3JtYXQsIHdoaWNoIGlzIGN1cnJlbnRseSBhbHdheXMgNC4KLQl1aW50MzJfdCBiYXNpc19nZXRfYmxvY2tfaGVpZ2h0KHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQgdGV4X3R5cGUpOwotCi0JLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHdhcyBlbmFibGVkIGF0IGNvbXBpbGUgdGltZS4KLQlib29sIGJhc2lzX2lzX2Zvcm1hdF9zdXBwb3J0ZWQodHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCB0ZXhfdHlwZSwgYmFzaXNfdGV4X2Zvcm1hdCBmbXQgPSBiYXNpc190ZXhfZm9ybWF0OjpjRVRDMVMpOwotCQkKLQljbGFzcyBiYXNpc3VfdHJhbnNjb2RlcjsKLQotCS8vIFRoaXMgc3RydWN0IGhvbGRzIGFsbCBzdGF0ZSB1c2VkIGR1cmluZyB0cmFuc2NvZGluZy4gRm9yIHZpZGVvLCBpdCBuZWVkcyB0byBwZXJzaXN0IGJldHdlZW4gaW1hZ2UgdHJhbnNjb2RlcyAoaXQgaG9sZHMgdGhlIHByZXZpb3VzIGZyYW1lKS4KLQkvLyBGb3IgdGhyZWFkaW5nIHlvdSBjYW4gdXNlIG9uZSBzdGF0ZSBwZXIgdGhyZWFkLgotCXN0cnVjdCBiYXNpc3VfdHJhbnNjb2Rlcl9zdGF0ZQotCXsKLQkJc3RydWN0IGJsb2NrX3ByZWRzCi0JCXsKLQkJCXVpbnQxNl90IG1fZW5kcG9pbnRfaW5kZXg7Ci0JCQl1aW50OF90IG1fcHJlZF9iaXRzOwotCQl9OwotCi0JCXN0ZDo6dmVjdG9yPGJsb2NrX3ByZWRzPiBtX2Jsb2NrX2VuZHBvaW50X3ByZWRzWzJdOwotCQkKLQkJZW51bSB7IGNNYXhQcmV2RnJhbWVMZXZlbHMgPSAxNiB9OwotCQlzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbV9wcmV2X2ZyYW1lX2luZGljZXNbMl1bY01heFByZXZGcmFtZUxldmVsc107IC8vIFthbHBoYV9mbGFnXVtsZXZlbF9pbmRleF0gCi0JfTsKLQkKLQkvLyBMb3ctbGV2ZWwgaGVscGVyIGNsYXNzIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHRyYW5zY29kaW5nLgotCWNsYXNzIGJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyCi0JewotCQlmcmllbmQgY2xhc3MgYmFzaXN1X3RyYW5zY29kZXI7Ci0JCi0JcHVibGljOgotCQliYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcihjb25zdCBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rICpwR2xvYmFsX3NlbF9jb2RlYm9vayk7Ci0KLQkJYm9vbCBkZWNvZGVfcGFsZXR0ZXMoCi0JCQl1aW50MzJfdCBudW1fZW5kcG9pbnRzLCBjb25zdCB1aW50OF90ICpwRW5kcG9pbnRzX2RhdGEsIHVpbnQzMl90IGVuZHBvaW50c19kYXRhX3NpemUsCi0JCQl1aW50MzJfdCBudW1fc2VsZWN0b3JzLCBjb25zdCB1aW50OF90ICpwU2VsZWN0b3JzX2RhdGEsIHVpbnQzMl90IHNlbGVjdG9yc19kYXRhX3NpemUpOwotCi0JCWJvb2wgZGVjb2RlX3RhYmxlcyhjb25zdCB1aW50OF90ICpwVGFibGVfZGF0YSwgdWludDMyX3QgdGFibGVfZGF0YV9zaXplKTsKLQotCQlib29sIHRyYW5zY29kZV9zbGljZSh2b2lkICpwRHN0X2Jsb2NrcywgdWludDMyX3QgbnVtX2Jsb2Nrc194LCB1aW50MzJfdCBudW1fYmxvY2tzX3ksIGNvbnN0IHVpbnQ4X3QgKnBJbWFnZV9kYXRhLCB1aW50MzJfdCBpbWFnZV9kYXRhX3NpemUsIGJsb2NrX2Zvcm1hdCBmbXQsIAotCQkJdWludDMyX3Qgb3V0cHV0X2Jsb2NrX29yX3BpeGVsX3N0cmlkZV9pbl9ieXRlcywgYm9vbCBiYzFfYWxsb3dfdGhyZWVjb2xvcl9ibG9ja3MsIGNvbnN0IGJhc2lzX2ZpbGVfaGVhZGVyICZoZWFkZXIsIGNvbnN0IGJhc2lzX3NsaWNlX2Rlc2MmIHNsaWNlX2Rlc2MsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IDAsCi0JCQliYXNpc3VfdHJhbnNjb2Rlcl9zdGF0ZSAqcFN0YXRlID0gbnVsbHB0ciwgYm9vbCBhc3RjX3RyYW5zY29kZV9hbHBoYSA9IGZhbHNlLCB2b2lkKiBwQWxwaGFfYmxvY2tzID0gbnVsbHB0ciwgdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gMCk7Ci0KLQkJdm9pZCBjbGVhcigpCi0JCXsKLQkJCW1fZW5kcG9pbnRzLmNsZWFyKCk7Ci0JCQltX3NlbGVjdG9ycy5jbGVhcigpOwotCQkJbV9lbmRwb2ludF9wcmVkX21vZGVsLmNsZWFyKCk7Ci0JCQltX2RlbHRhX2VuZHBvaW50X21vZGVsLmNsZWFyKCk7Ci0JCQltX3NlbGVjdG9yX21vZGVsLmNsZWFyKCk7Ci0JCQltX3NlbGVjdG9yX2hpc3RvcnlfYnVmX3JsZV9tb2RlbC5jbGVhcigpOwotCQkJbV9zZWxlY3Rvcl9oaXN0b3J5X2J1Zl9zaXplID0gMDsKLQkJfQotCi0JcHJpdmF0ZToKLQkJdHlwZWRlZiBzdGQ6OnZlY3RvcjxlbmRwb2ludD4gZW5kcG9pbnRfdmVjOwotCQllbmRwb2ludF92ZWMgbV9lbmRwb2ludHM7Ci0KLQkJdHlwZWRlZiBzdGQ6OnZlY3RvcjxzZWxlY3Rvcj4gc2VsZWN0b3JfdmVjOwotCQlzZWxlY3Rvcl92ZWMgbV9zZWxlY3RvcnM7Ci0KLQkJY29uc3QgZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sgKm1fcEdsb2JhbF9zZWxfY29kZWJvb2s7Ci0KLQkJaHVmZm1hbl9kZWNvZGluZ190YWJsZSBtX2VuZHBvaW50X3ByZWRfbW9kZWwsIG1fZGVsdGFfZW5kcG9pbnRfbW9kZWwsIG1fc2VsZWN0b3JfbW9kZWwsIG1fc2VsZWN0b3JfaGlzdG9yeV9idWZfcmxlX21vZGVsOwotCi0JCXVpbnQzMl90IG1fc2VsZWN0b3JfaGlzdG9yeV9idWZfc2l6ZTsKLQkJCi0JCWJhc2lzdV90cmFuc2NvZGVyX3N0YXRlIG1fZGVmX3N0YXRlOwotCX07Ci0KLQllbnVtCi0JewotCQkvLyBQVlJUQzE6IGRlY29kZSBub24tcG93MiBFVEMxUyB0ZXh0dXJlIGxldmVsIHRvIHRoZSBuZXh0IGxhcmdlciBwb3dlciBvZiAyIChub3QgaW1wbGVtZW50ZWQgeWV0LCBidXQgd2UncmUgZ29pbmcgdG8gc3VwcG9ydCBpdCkuIElnbm9yZWQgaWYgdGhlIHNsaWNlJ3MgZGltZW5zaW9ucyBhcmUgYWxyZWFkeSBhIHBvd2VyIG9mIDIuCi0JCWNEZWNvZGVGbGFnc1BWUlRDRGVjb2RlVG9OZXh0UG93MiA9IDIsCi0KLQkJLy8gV2hlbiBkZWNvZGluZyB0byBhbiBvcGFxdWUgdGV4dHVyZSBmb3JtYXQsIGlmIHRoZSBiYXNpcyBmaWxlIGhhcyBhbHBoYSwgZGVjb2RlIHRoZSBhbHBoYSBzbGljZSBpbnN0ZWFkIG9mIHRoZSBjb2xvciBzbGljZSB0byB0aGUgb3V0cHV0IHRleHR1cmUgZm9ybWF0LgotCQkvLyBUaGlzIGlzIHByaW1hcmlseSB0byBhbGxvdyBkZWNvZGluZyBvZiB0ZXh0dXJlcyB3aXRoIGFscGhhIHRvIG11bHRpcGxlIEVUQzEgdGV4dHVyZXMgKG9uZSBmb3IgY29sb3IsIGFub3RoZXIgZm9yIGFscGhhKS4KLQkJY0RlY29kZUZsYWdzVHJhbnNjb2RlQWxwaGFEYXRhVG9PcGFxdWVGb3JtYXRzID0gNCwKLQotCQkvLyBGb3JiaWQgdXNhZ2Ugb2YgQkMxIDMgY29sb3IgYmxvY2tzICh3ZSBkb24ndCBzdXBwb3J0IEJDMSBwdW5jaHRocm91Z2ggYWxwaGEgeWV0KS4KLQkJLy8gVGhpcyBmbGFnIGlzIHVzZWQgaW50ZXJuYWxseSB3aGVuIGRlY29kaW5nIHRvIEJDMy4KLQkJY0RlY29kZUZsYWdzQkMxRm9yYmlkVGhyZWVDb2xvckJsb2NrcyA9IDgsCi0KLQkJLy8gVGhlIG91dHB1dCBidWZmZXIgY29udGFpbnMgYWxwaGEgZW5kcG9pbnQvc2VsZWN0b3IgaW5kaWNlcy4gCi0JCS8vIFVzZWQgaW50ZXJuYWxseSB3aGVuIGRlY29kaW5nIGZvcm1hdHMgbGlrZSBBU1RDIHRoYXQgcmVxdWlyZSBib3RoIGNvbG9yIGFuZCBhbHBoYSBkYXRhIHRvIGJlIGF2YWlsYWJsZSB3aGVuIHRyYW5zY29kaW5nIHRvIHRoZSBvdXRwdXQgZm9ybWF0LgotCQljRGVjb2RlRmxhZ3NPdXRwdXRIYXNBbHBoYUluZGljZXMgPSAxNiwKLQotCQljRGVjb2RlRmxhZ3NIaWdoUXVhbGl0eSA9IDMyCi0JfTsKLQotCWNsYXNzIGJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyCi0JewotCQlmcmllbmQgY2xhc3MgYmFzaXN1X3RyYW5zY29kZXI7Ci0KLQlwdWJsaWM6Ci0JCWJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyKCk7Ci0KLQkJYm9vbCB0cmFuc2NvZGVfc2xpY2Uodm9pZCogcERzdF9ibG9ja3MsIHVpbnQzMl90IG51bV9ibG9ja3NfeCwgdWludDMyX3QgbnVtX2Jsb2Nrc195LCBjb25zdCB1aW50OF90KiBwSW1hZ2VfZGF0YSwgdWludDMyX3QgaW1hZ2VfZGF0YV9zaXplLCBibG9ja19mb3JtYXQgZm10LAotCQkJdWludDMyX3Qgb3V0cHV0X2Jsb2NrX29yX3BpeGVsX3N0cmlkZV9pbl9ieXRlcywgYm9vbCBiYzFfYWxsb3dfdGhyZWVjb2xvcl9ibG9ja3MsIGNvbnN0IGJhc2lzX2ZpbGVfaGVhZGVyJiBoZWFkZXIsIGNvbnN0IGJhc2lzX3NsaWNlX2Rlc2MmIHNsaWNlX2Rlc2MsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IDAsCi0JCQliYXNpc3VfdHJhbnNjb2Rlcl9zdGF0ZSogcFN0YXRlID0gbnVsbHB0ciwgdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gMCwgaW50IGNoYW5uZWwwID0gLTEsIGludCBjaGFubmVsMSA9IC0xLCB1aW50MzJfdCBkZWNvZGVfZmxhZ3MgPSAwKTsKLQl9OwotCi0Jc3RydWN0IGJhc2lzdV9zbGljZV9pbmZvCi0JewotCQl1aW50MzJfdCBtX29yaWdfd2lkdGg7Ci0JCXVpbnQzMl90IG1fb3JpZ19oZWlnaHQ7Ci0KLQkJdWludDMyX3QgbV93aWR0aDsKLQkJdWludDMyX3QgbV9oZWlnaHQ7Ci0KLQkJdWludDMyX3QgbV9udW1fYmxvY2tzX3g7Ci0JCXVpbnQzMl90IG1fbnVtX2Jsb2Nrc195OwotCQl1aW50MzJfdCBtX3RvdGFsX2Jsb2NrczsKLQotCQl1aW50MzJfdCBtX2NvbXByZXNzZWRfc2l6ZTsKLQotCQl1aW50MzJfdCBtX3NsaWNlX2luZGV4OwkvLyB0aGUgc2xpY2UgaW5kZXggaW4gdGhlIC5iYXNpcyBmaWxlCi0JCXVpbnQzMl90IG1faW1hZ2VfaW5kZXg7CS8vIHRoZSBzb3VyY2UgaW1hZ2UgaW5kZXggb3JpZ2luYWxseSBwcm92aWRlZCB0byB0aGUgZW5jb2RlcgotCQl1aW50MzJfdCBtX2xldmVsX2luZGV4OwkvLyB0aGUgbWlwbWFwIGxldmVsIHdpdGhpbiB0aGlzIGltYWdlCi0JCQotCQl1aW50MzJfdCBtX3VucGFja2VkX3NsaWNlX2NyYzE2OwotCQkKLQkJYm9vbCBtX2FscGhhX2ZsYWc7CQkvLyB0cnVlIGlmIHRoZSBzbGljZSBoYXMgYWxwaGEgZGF0YQotCQlib29sIG1faWZyYW1lX2ZsYWc7CQkvLyB0cnVlIGlmIHRoZSBzbGljZSBpcyBhbiBJLUZyYW1lCi0JfTsKLQotCXR5cGVkZWYgc3RkOjp2ZWN0b3I8YmFzaXN1X3NsaWNlX2luZm8+IGJhc2lzdV9zbGljZV9pbmZvX3ZlYzsKLQotCXN0cnVjdCBiYXNpc3VfaW1hZ2VfaW5mbwotCXsKLQkJdWludDMyX3QgbV9pbWFnZV9pbmRleDsKLQkJdWludDMyX3QgbV90b3RhbF9sZXZlbHM7CQotCi0JCXVpbnQzMl90IG1fb3JpZ193aWR0aDsKLQkJdWludDMyX3QgbV9vcmlnX2hlaWdodDsKLQotCQl1aW50MzJfdCBtX3dpZHRoOwotCQl1aW50MzJfdCBtX2hlaWdodDsKLQotCQl1aW50MzJfdCBtX251bV9ibG9ja3NfeDsKLQkJdWludDMyX3QgbV9udW1fYmxvY2tzX3k7Ci0JCXVpbnQzMl90IG1fdG90YWxfYmxvY2tzOwotCi0JCXVpbnQzMl90IG1fZmlyc3Rfc2xpY2VfaW5kZXg7CQotCQkJCQkJCQkKLQkJYm9vbCBtX2FscGhhX2ZsYWc7CQkvLyB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgYWxwaGEgZGF0YQotCQlib29sIG1faWZyYW1lX2ZsYWc7CQkvLyB0cnVlIGlmIHRoZSBpbWFnZSBpcyBhbiBJLUZyYW1lCi0JfTsKLQotCXN0cnVjdCBiYXNpc3VfaW1hZ2VfbGV2ZWxfaW5mbwotCXsKLQkJdWludDMyX3QgbV9pbWFnZV9pbmRleDsKLQkJdWludDMyX3QgbV9sZXZlbF9pbmRleDsKLQotCQl1aW50MzJfdCBtX29yaWdfd2lkdGg7Ci0JCXVpbnQzMl90IG1fb3JpZ19oZWlnaHQ7Ci0KLQkJdWludDMyX3QgbV93aWR0aDsKLQkJdWludDMyX3QgbV9oZWlnaHQ7Ci0KLQkJdWludDMyX3QgbV9udW1fYmxvY2tzX3g7Ci0JCXVpbnQzMl90IG1fbnVtX2Jsb2Nrc195OwotCQl1aW50MzJfdCBtX3RvdGFsX2Jsb2NrczsKLQotCQl1aW50MzJfdCBtX2ZpcnN0X3NsaWNlX2luZGV4OwkKLQkJCQkJCQkJCi0JCWJvb2wgbV9hbHBoYV9mbGFnOwkJLy8gdHJ1ZSBpZiB0aGUgaW1hZ2UgaGFzIGFscGhhIGRhdGEKLQkJYm9vbCBtX2lmcmFtZV9mbGFnOwkJLy8gdHJ1ZSBpZiB0aGUgaW1hZ2UgaXMgYW4gSS1GcmFtZQotCX07Ci0KLQlzdHJ1Y3QgYmFzaXN1X2ZpbGVfaW5mbwotCXsKLQkJdWludDMyX3QgbV92ZXJzaW9uOwotCQl1aW50MzJfdCBtX3RvdGFsX2hlYWRlcl9zaXplOwotCi0JCXVpbnQzMl90IG1fdG90YWxfc2VsZWN0b3JzOwotCQl1aW50MzJfdCBtX3NlbGVjdG9yX2NvZGVib29rX3NpemU7Ci0KLQkJdWludDMyX3QgbV90b3RhbF9lbmRwb2ludHM7Ci0JCXVpbnQzMl90IG1fZW5kcG9pbnRfY29kZWJvb2tfc2l6ZTsKLQotCQl1aW50MzJfdCBtX3RhYmxlc19zaXplOwotCQl1aW50MzJfdCBtX3NsaWNlc19zaXplOwkKLQotCQliYXNpc190ZXh0dXJlX3R5cGUgbV90ZXhfdHlwZTsKLQkJdWludDMyX3QgbV91c19wZXJfZnJhbWU7Ci0KLQkJLy8gTG93LWxldmVsIHNsaWNlIGluZm9ybWF0aW9uICgxIHNsaWNlIHBlciBpbWFnZSBmb3IgY29sb3Itb25seSBiYXNpcyBmaWxlcywgMiBmb3IgYWxwaGEgYmFzaXMgZmlsZXMpCi0JCWJhc2lzdV9zbGljZV9pbmZvX3ZlYyBtX3NsaWNlX2luZm87Ci0KLQkJdWludDMyX3QgbV90b3RhbF9pbWFnZXM7CSAvLyB0b3RhbCAjIG9mIGltYWdlcwotCQlzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbV9pbWFnZV9taXBtYXBfbGV2ZWxzOyAvLyB0aGUgIyBvZiBtaXBtYXAgbGV2ZWxzIGZvciBlYWNoIGltYWdlCi0KLQkJdWludDMyX3QgbV91c2VyZGF0YTA7Ci0JCXVpbnQzMl90IG1fdXNlcmRhdGExOwotCi0JCWJhc2lzX3RleF9mb3JtYXQgbV90ZXhfZm9ybWF0OyAvLyBFVEMxUywgVUFTVEMsIGV0Yy4KLQkJCQkKLQkJYm9vbCBtX3lfZmxpcHBlZDsJCQkJLy8gdHJ1ZSBpZiB0aGUgaW1hZ2Ugd2FzIFkgZmxpcHBlZAotCQlib29sIG1fZXRjMXM7CQkJCQkvLyB0cnVlIGlmIHRoZSBmaWxlIGlzIEVUQzFTCi0JCWJvb2wgbV9oYXNfYWxwaGFfc2xpY2VzOwkvLyB0cnVlIGlmIHRoZSB0ZXh0dXJlIGhhcyBhbHBoYSBzbGljZXMgKGZvciBFVEMxUzogZXZlbiBzbGljZXMgUkdCLCBvZGQgc2xpY2VzIGFscGhhKQotCX07Ci0KLQkvLyBIaWdoLWxldmVsIHRyYW5zY29kZXIgY2xhc3Mgd2hpY2ggYWNjZXB0cyAuYmFzaXMgZmlsZSBkYXRhIGFuZCBhbGxvd3MgdGhlIGNhbGxlciB0byBxdWVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSBhbmQgdHJhbnNjb2RlIGltYWdlIGxldmVscyB0byB2YXJpb3VzIHRleHR1cmUgZm9ybWF0cy4KLQkvLyBJZiB5b3UncmUganVzdCBzdGFydGluZyBvdXQgdGhpcyBpcyB0aGUgY2xhc3MgeW91IGNhcmUgYWJvdXQuCi0JY2xhc3MgYmFzaXN1X3RyYW5zY29kZXIKLQl7Ci0JCWJhc2lzdV90cmFuc2NvZGVyKGJhc2lzdV90cmFuc2NvZGVyJik7Ci0JCWJhc2lzdV90cmFuc2NvZGVyJiBvcGVyYXRvcj0gKGNvbnN0IGJhc2lzdV90cmFuc2NvZGVyJik7Ci0KLQlwdWJsaWM6Ci0JCWJhc2lzdV90cmFuc2NvZGVyKGNvbnN0IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rICpwR2xvYmFsX3NlbF9jb2RlYm9vayk7Ci0KLQkJLy8gVmFsaWRhdGVzIHRoZSAuYmFzaXMgZmlsZS4gVGhpcyBjb21wdXRlcyBhIGNyYzE2IG92ZXIgdGhlIGVudGlyZSBmaWxlLCBzbyBpdCdzIHNsb3cuCi0JCWJvb2wgdmFsaWRhdGVfZmlsZV9jaGVja3N1bXMoY29uc3Qgdm9pZCAqcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgYm9vbCBmdWxsX3ZhbGlkYXRpb24pIGNvbnN0OwotCi0JCS8vIFF1aWNrIGhlYWRlciB2YWxpZGF0aW9uIC0gbm8gY3JjMTYgY2hlY2tzLgotCQlib29sIHZhbGlkYXRlX2hlYWRlcihjb25zdCB2b2lkICpwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKSBjb25zdDsKLQotCQliYXNpc190ZXh0dXJlX3R5cGUgZ2V0X3RleHR1cmVfdHlwZShjb25zdCB2b2lkICpwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKSBjb25zdDsKLQkJYm9vbCBnZXRfdXNlcmRhdGEoY29uc3Qgdm9pZCAqcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgdWludDMyX3QgJnVzZXJkYXRhMCwgdWludDMyX3QgJnVzZXJkYXRhMSkgY29uc3Q7Ci0JCQotCQkvLyBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgaW1hZ2VzIGluIHRoZSBiYXNpcyBmaWxlIChhbHdheXMgMSBvciBtb3JlKS4KLQkJLy8gTm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgbWlwbWFwIGxldmVscyBmb3IgZWFjaCBpbWFnZSBtYXkgZGlmZmVyLCBhbmQgdGhhdCBpbWFnZXMgbWF5IGhhdmUgZGlmZmVyZW50IHJlc29sdXRpb25zLgotCQl1aW50MzJfdCBnZXRfdG90YWxfaW1hZ2VzKGNvbnN0IHZvaWQgKnBEYXRhLCB1aW50MzJfdCBkYXRhX3NpemUpIGNvbnN0OwotCi0JCWJhc2lzX3RleF9mb3JtYXQgZ2V0X3RleF9mb3JtYXQoY29uc3Qgdm9pZCogcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSkgY29uc3Q7Ci0KLQkJLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMgaW4gYW4gaW1hZ2UuCi0JCXVpbnQzMl90IGdldF90b3RhbF9pbWFnZV9sZXZlbHMoY29uc3Qgdm9pZCAqcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgdWludDMyX3QgaW1hZ2VfaW5kZXgpIGNvbnN0OwotCQkKLQkJLy8gUmV0dXJucyBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbWFnZS4gTm90ZSB0aGF0IG9yaWdfd2lkdGgvb3JpZ19oZWlnaHQgbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIDQuCi0JCWJvb2wgZ2V0X2ltYWdlX2xldmVsX2Rlc2MoY29uc3Qgdm9pZCAqcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgdWludDMyX3QgaW1hZ2VfaW5kZXgsIHVpbnQzMl90IGxldmVsX2luZGV4LCB1aW50MzJfdCAmb3JpZ193aWR0aCwgdWludDMyX3QgJm9yaWdfaGVpZ2h0LCB1aW50MzJfdCAmdG90YWxfYmxvY2tzKSBjb25zdDsKLQotCQkvLyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgaW1hZ2UuCi0JCWJvb2wgZ2V0X2ltYWdlX2luZm8oY29uc3Qgdm9pZCAqcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgYmFzaXN1X2ltYWdlX2luZm8gJmltYWdlX2luZm8sIHVpbnQzMl90IGltYWdlX2luZGV4KSBjb25zdDsKLQotCQkvLyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgaW1hZ2UncyBtaXBtYXAgbGV2ZWwuCi0JCWJvb2wgZ2V0X2ltYWdlX2xldmVsX2luZm8oY29uc3Qgdm9pZCAqcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgYmFzaXN1X2ltYWdlX2xldmVsX2luZm8gJmxldmVsX2luZm8sIHVpbnQzMl90IGltYWdlX2luZGV4LCB1aW50MzJfdCBsZXZlbF9pbmRleCkgY29uc3Q7Ci0JCQkJCi0JCS8vIEdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBiYXNpcyBmaWxlIGFuZCBsb3ctbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBzbGljZS4KLQkJYm9vbCBnZXRfZmlsZV9pbmZvKGNvbnN0IHZvaWQgKnBEYXRhLCB1aW50MzJfdCBkYXRhX3NpemUsIGJhc2lzdV9maWxlX2luZm8gJmZpbGVfaW5mbykgY29uc3Q7Ci0JCQkJCi0JCS8vIHN0YXJ0X3RyYW5zY29kaW5nKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgdHJhbnNjb2RlX3NsaWNlKCkgb3IgdHJhbnNjb2RlX2ltYWdlX2xldmVsKCkuCi0JCS8vIEZvciBFVEMxUyBmaWxlcywgdGhpcyBjYWxsIGRlY29tcHJlc3NlcyB0aGUgc2VsZWN0b3IvZW5kcG9pbnQgY29kZWJvb2tzLCBzbyBpZGVhbGx5IHlvdSB3b3VsZCBvbmx5IGNhbGwgdGhpcyBvbmNlIHBlciAuYmFzaXMgZmlsZSAobm90IGVhY2ggaW1hZ2UvbWlwbWFwIGxldmVsKS4KLQkJYm9vbCBzdGFydF90cmFuc2NvZGluZyhjb25zdCB2b2lkICpwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKTsKLQkJCi0JCWJvb2wgc3RvcF90cmFuc2NvZGluZygpOwotCQkKLQkJLy8gUmV0dXJucyB0cnVlIGlmIHN0YXJ0X3RyYW5zY29kaW5nKCkgaGFzIGJlZW4gY2FsbGVkLgotCQlib29sIGdldF9yZWFkeV90b190cmFuc2NvZGUoKSBjb25zdCB7IHJldHVybiBtX3JlYWR5X3RvX3RyYW5zY29kZTsgfQotCQkJCQkJCQkJCQkKLQkJLy8gdHJhbnNjb2RlX2ltYWdlX2xldmVsKCkgZGVjb2RlcyBhIHNpbmdsZSBtaXBtYXAgbGV2ZWwgZnJvbSB0aGUgLmJhc2lzIGZpbGUgdG8gYW55IG9mIHRoZSBzdXBwb3J0ZWQgb3V0cHV0IHRleHR1cmUgZm9ybWF0cy4KLQkJLy8gSXQnbGwgZmlyc3QgZmluZCB0aGUgc2xpY2UocykgdG8gdHJhbnNjb2RlLCB0aGVuIGNhbGwgdHJhbnNjb2RlX3NsaWNlKCkgb25lIG9yIHR3byB0aW1lcyB0byBkZWNvZGUgYm90aCB0aGUgY29sb3IgYW5kIGFscGhhIHRleHR1cmUgZGF0YSAob3IgUkcgdGV4dHVyZSBkYXRhIGZyb20gdHdvIHNsaWNlcyBmb3IgQkM1KS4KLQkJLy8gSWYgdGhlIC5iYXNpcyBmaWxlIGRvZXNuJ3QgaGF2ZSBhbHBoYSBzbGljZXMsIHRoZSBvdXRwdXQgYWxwaGEgYmxvY2tzIHdpbGwgYmUgc2V0IHRvIGZ1bGx5IG9wYXF1ZSAoYWxsIDI1NSdzKS4KLQkJLy8gQ3VycmVudGx5LCB0byBkZWNvZGUgdG8gUFZSVEMxIHRoZSBiYXNpcyB0ZXh0dXJlJ3MgZGltZW5zaW9ucyBpbiBwaXhlbHMgbXVzdCBiZSBhIHBvd2VyIG9mIDIsIGR1ZSB0byBQVlJUQzEgZm9ybWF0IHJlcXVpcmVtZW50cy4gCi0JCS8vIG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscyBzaG91bGQgYmUgYXQgbGVhc3QgdGhlIGltYWdlIGxldmVsJ3MgdG90YWxfYmxvY2tzIChudW1fYmxvY2tzX3ggKiBudW1fYmxvY2tzX3kpLCBvciB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCBwaXhlbHMgaWYgZm10PT1jVEZSR0JBMzIuCi0JCS8vIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVsczogTnVtYmVyIG9mIGJsb2NrcyBvciBwaXhlbHMgcGVyIHJvdy4gSWYgMCwgdGhlIHRyYW5zY29kZXIgdXNlcyB0aGUgc2xpY2UncyBudW1fYmxvY2tzX3ggb3Igb3JpZ193aWR0aCAoTk9UIG51bV9ibG9ja3NfeCAqIDQpLiBJZ25vcmVkIGZvciBQVlJUQzEgKGR1ZSB0byB0ZXh0dXJlIHN3aXp6bGluZykuCi0JCS8vIG91dHB1dF9yb3dzX2luX3BpeGVsczogSWdub3JlZCB1bmxlc3MgZm10IGlzIGNSR0JBMzIuIFRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0cHV0IHJvd3MgaW4gdGhlIG91dHB1dCBidWZmZXIuIElmIDAsIHRoZSB0cmFuc2NvZGVyIGFzc3VtZXMgdGhlIHNsaWNlJ3Mgb3JpZ19oZWlnaHQgKE5PVCBudW1fYmxvY2tzX3kgKiA0KS4KLQkJLy8gTm90ZXM6IAotCQkvLyAtIGJhc2lzdV90cmFuc2NvZGVyX2luaXQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgZmlyc3QgdG8gaW5pdGlhbGl6ZSB0aGUgdHJhbnNjb2RlciBsb29rdXAgdGFibGVzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0JCS8vIC0gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgb3V0cHV0IHRleHR1cmUgYnVmZmVyIGlzIHJlYWRhYmxlLiBJbiBzb21lIGNhc2VzIHRvIGhhbmRsZSBhbHBoYSwgdGhlIHRyYW5zY29kZXIgd2lsbCB3cml0ZSB0ZW1wb3JhcnkgZGF0YSB0byB0aGUgb3V0cHV0IHRleHR1cmUgaW4KLQkJLy8gYSBmaXJzdCBwYXNzLCB3aGljaCB3aWxsIGJlIHJlYWQgaW4gYSBzZWNvbmQgcGFzcy4KLQkJYm9vbCB0cmFuc2NvZGVfaW1hZ2VfbGV2ZWwoCi0JCQljb25zdCB2b2lkICpwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplLCAKLQkJCXVpbnQzMl90IGltYWdlX2luZGV4LCB1aW50MzJfdCBsZXZlbF9pbmRleCwgCi0JCQl2b2lkICpwT3V0cHV0X2Jsb2NrcywgdWludDMyX3Qgb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzLAotCQkJdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCBmbXQsCi0JCQl1aW50MzJfdCBkZWNvZGVfZmxhZ3MgPSAwLCB1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMgPSAwLCBiYXNpc3VfdHJhbnNjb2Rlcl9zdGF0ZSAqcFN0YXRlID0gbnVsbHB0ciwgdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gMCkgY29uc3Q7Ci0KLQkJLy8gRmluZHMgdGhlIGJhc2lzIHNsaWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbWFnZS9sZXZlbC9hbHBoYSBwYXJhbXMsIG9yIC0xIGlmIHRoZSBzbGljZSBjYW4ndCBiZSBmb3VuZC4KLQkJaW50IGZpbmRfc2xpY2UoY29uc3Qgdm9pZCAqcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgdWludDMyX3QgaW1hZ2VfaW5kZXgsIHVpbnQzMl90IGxldmVsX2luZGV4LCBib29sIGFscGhhX2RhdGEpIGNvbnN0OwotCi0JCS8vIHRyYW5zY29kZV9zbGljZSgpIGRlY29kZXMgYSBzaW5nbGUgc2xpY2UgZnJvbSB0aGUgLmJhc2lzIGZpbGUuIEl0J3MgYSBsb3ctbGV2ZWwgQVBJIC0gbW9zdCBsaWtlbHkgeW91IHdhbnQgdG8gdXNlIHRyYW5zY29kZV9pbWFnZV9sZXZlbCgpLgotCQkvLyBUaGlzIGlzIGEgbG93LWxldmVsIEFQSSwgYW5kIHdpbGwgYmUgbmVlZGVkIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBkZWNvZGUgc29tZSB0ZXh0dXJlIGZvcm1hdHMgKGxpa2UgQkMzLCBCQzUsIG9yIEVUQzIpLgotCQkvLyBvdXRwdXRfYmxvY2tzX2J1Zl9zaXplX2luX2Jsb2Nrc19vcl9waXhlbHMgaXMganVzdCB1c2VkIGZvciB2ZXJpZmljYXRpb24gdG8gbWFrZSBzdXJlIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaC4KLQkJLy8gb3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzIHNob3VsZCBiZSBhdCBsZWFzdCB0aGUgaW1hZ2UgbGV2ZWwncyB0b3RhbF9ibG9ja3MgKG51bV9ibG9ja3NfeCAqIG51bV9ibG9ja3NfeSksIG9yIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0cHV0IHBpeGVscyBpZiBmbXQ9PWNURlJHQkEzMi4KLQkJLy8gb3V0cHV0X2Jsb2NrX3N0cmlkZV9pbl9ieXRlczogTnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gZWFjaCBvdXRwdXQgYmxvY2suCi0JCS8vIG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVsczogTnVtYmVyIG9mIGJsb2NrcyBvciBwaXhlbHMgcGVyIHJvdy4gSWYgMCwgdGhlIHRyYW5zY29kZXIgdXNlcyB0aGUgc2xpY2UncyBudW1fYmxvY2tzX3ggb3Igb3JpZ193aWR0aCAoTk9UIG51bV9ibG9ja3NfeCAqIDQpLiBJZ25vcmVkIGZvciBQVlJUQzEgKGR1ZSB0byB0ZXh0dXJlIHN3aXp6bGluZykuCi0JCS8vIG91dHB1dF9yb3dzX2luX3BpeGVsczogSWdub3JlZCB1bmxlc3MgZm10IGlzIGNSR0JBMzIuIFRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0cHV0IHJvd3MgaW4gdGhlIG91dHB1dCBidWZmZXIuIElmIDAsIHRoZSB0cmFuc2NvZGVyIGFzc3VtZXMgdGhlIHNsaWNlJ3Mgb3JpZ19oZWlnaHQgKE5PVCBudW1fYmxvY2tzX3kgKiA0KS4KLQkJLy8gTm90ZXM6Ci0JCS8vIC0gYmFzaXN1X3RyYW5zY29kZXJfaW5pdCgpIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBmaXJzdCB0byBpbml0aWFsaXplIHRoZSB0cmFuc2NvZGVyIGxvb2t1cCB0YWJsZXMgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLQkJYm9vbCB0cmFuc2NvZGVfc2xpY2UoY29uc3Qgdm9pZCAqcERhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSwgdWludDMyX3Qgc2xpY2VfaW5kZXgsIAotCQkJdm9pZCAqcE91dHB1dF9ibG9ja3MsIHVpbnQzMl90IG91dHB1dF9ibG9ja3NfYnVmX3NpemVfaW5fYmxvY2tzX29yX3BpeGVscywKLQkJCWJsb2NrX2Zvcm1hdCBmbXQsIHVpbnQzMl90IG91dHB1dF9ibG9ja19zdHJpZGVfaW5fYnl0ZXMsIHVpbnQzMl90IGRlY29kZV9mbGFncyA9IDAsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscyA9IDAsIGJhc2lzdV90cmFuc2NvZGVyX3N0YXRlICogcFN0YXRlID0gbnVsbHB0ciwgdm9pZCogcEFscGhhX2Jsb2NrcyA9IG51bGxwdHIsIAotCQkJdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gMCwgaW50IGNoYW5uZWwwID0gLTEsIGludCBjaGFubmVsMSA9IC0xKSBjb25zdDsKLQotCXByaXZhdGU6Ci0JCW11dGFibGUgYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIgbV9sb3dsZXZlbF9ldGMxc19kZWNvZGVyOwotCQltdXRhYmxlIGJhc2lzdV9sb3dsZXZlbF91YXN0Y190cmFuc2NvZGVyIG1fbG93bGV2ZWxfdWFzdGNfZGVjb2RlcjsKLQotCQlib29sIG1fcmVhZHlfdG9fdHJhbnNjb2RlOwotCi0JCWludCBmaW5kX2ZpcnN0X3NsaWNlX2luZGV4KGNvbnN0IHZvaWQqIHBEYXRhLCB1aW50MzJfdCBkYXRhX3NpemUsIHVpbnQzMl90IGltYWdlX2luZGV4LCB1aW50MzJfdCBsZXZlbF9pbmRleCkgY29uc3Q7Ci0JCQotCQlib29sIHZhbGlkYXRlX2hlYWRlcl9xdWljayhjb25zdCB2b2lkKiBwRGF0YSwgdWludDMyX3QgZGF0YV9zaXplKSBjb25zdDsKLQl9OwotCi0JLy8gYmFzaXN1X3RyYW5zY29kZXJfaW5pdCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhIC5iYXNpcyBmaWxlIGNhbiBiZSB0cmFuc2NvZGVkLgotCXZvaWQgYmFzaXN1X3RyYW5zY29kZXJfaW5pdCgpOwotCi0JZW51bSBkZWJ1Z19mbGFnc190Ci0JewotCQljRGVidWdGbGFnVmlzQ1JzID0gMSwKLQkJY0RlYnVnRmxhZ1Zpc0JDMVNlbHMgPSAyLAotCQljRGVidWdGbGFnVmlzQkMxRW5kcG9pbnRzID0gNAotCX07Ci0JdWludDMyX3QgZ2V0X2RlYnVnX2ZsYWdzKCk7Ci0Jdm9pZCBzZXRfZGVidWdfZmxhZ3ModWludDMyX3QgZik7Ci0KLX0gLy8gbmFtZXNwYWNlIGJhc2lzdQpkaWZmIC0tZ2l0IGEvY29udHJpYi9wcmV2aWV3ZXJzL3dpbi9iYXNpc3RodW1icHJvdmlkZXIuY3BwIGIvY29udHJpYi9wcmV2aWV3ZXJzL3dpbi9iYXNpc3RodW1icHJvdmlkZXIuY3BwCmluZGV4IDRhOGM2YmEuLjI5MjM3NmUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcHJldmlld2Vycy93aW4vYmFzaXN0aHVtYnByb3ZpZGVyLmNwcAorKysgYi9jb250cmliL3ByZXZpZXdlcnMvd2luL2Jhc2lzdGh1bWJwcm92aWRlci5jcHAKQEAgLTIsNyArMiw3IEBACiAKICNpbmNsdWRlIDxTaGx3YXBpLmg+CiAKLSNpbmNsdWRlICJiYXNpc3VfdHJhbnNjb2Rlci5oIgorI2luY2x1ZGUgImJhc2lzdV90cmFuc2NvZGVyLmNwcCIKIAogI2luY2x1ZGUgImhlbHBlcnMuaCIKIApAQCAtMTAsMTQgKzEwLDkgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGJhc2lzdDsKIAotc3RhdGljIGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKiBnbG9iYWxDb2RlYm9vayA9IE5VTEw7Ci0KIEJhc2lzVGh1bWJQcm92aWRlcjo6QmFzaXNUaHVtYlByb3ZpZGVyKCkgOiBjb3VudCgxKSwgc3RyZWFtKE5VTEwpIHsKIAlkcHJpbnRmKCJCYXNpc1RodW1iUHJvdmlkZXIgY3RvciIpOwogCWJhc2lzdV90cmFuc2NvZGVyX2luaXQoKTsKLQlpZiAoIWdsb2JhbENvZGVib29rKSB7Ci0JCSBnbG9iYWxDb2RlYm9vayA9IG5ldyBldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayhnX2dsb2JhbF9zZWxlY3Rvcl9jYl9zaXplLCBnX2dsb2JhbF9zZWxlY3Rvcl9jYik7Ci0JfQogfQogCiBCYXNpc1RodW1iUHJvdmlkZXI6On5CYXNpc1RodW1iUHJvdmlkZXIoKSB7CkBAIC02Niw3ICs2MSw3IEBACiAJCQlVTE9ORyBzaXplID0gMDsKIAkJCWlmIChTVUNDRUVERUQoc3RyZWFtLT5SZWFkKGRhdGEsIHN0YXRpY19jYXN0PFVMT05HPihzdGF0LmNiU2l6ZS5Mb3dQYXJ0KSwgJnNpemUpKSkgewogCQkJCWlmIChzaXplID09IHN0YXQuY2JTaXplLkxvd1BhcnQpIHsKLQkJCQkJYmFzaXN1X3RyYW5zY29kZXIgdHJhbnNjb2RlcihnbG9iYWxDb2RlYm9vayk7CisJCQkJCWJhc2lzdV90cmFuc2NvZGVyIHRyYW5zY29kZXI7CiAJCQkJCWlmICh0cmFuc2NvZGVyLnZhbGlkYXRlX2hlYWRlcihkYXRhLCBzaXplKSkgewogCQkJCQkJZHByaW50ZigiUmVxdWVzdGVkICVkIGJ5dGVzIGZvciAlZHglZCBpbWFnZSIsIHNpemUsIGN4LCBjeCk7CiAJCQkJCQliYXNpc3VfaW1hZ2VfaW5mbyBpbmZvOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wcmV2aWV3ZXJzL3dpbi9wcmV2aWV3ZXJzLnZjeHByb2ogYi9jb250cmliL3ByZXZpZXdlcnMvd2luL3ByZXZpZXdlcnMudmN4cHJvagppbmRleCAyYTRiMjJlLi5mZmVmZjk2IDEwMDY0NAotLS0gYS9jb250cmliL3ByZXZpZXdlcnMvd2luL3ByZXZpZXdlcnMudmN4cHJvagorKysgYi9jb250cmliL3ByZXZpZXdlcnMvd2luL3ByZXZpZXdlcnMudmN4cHJvagpAQCAtMTY1LDcgKzE2NSw2IEBACiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iYmFzaXN0aHVtYnByb3ZpZGVyLmNwcCIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxpYlxiYXNpc3VfdHJhbnNjb2Rlci5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJoZWxwZXJzLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InByZXZpZXdlcnMuY3BwIj4KICAgICAgIDxDb21waWxlQXNNYW5hZ2VkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcHJldmlld2Vycy93aW4vcHJldmlld2Vycy52Y3hwcm9qLmZpbHRlcnMgYi9jb250cmliL3ByZXZpZXdlcnMvd2luL3ByZXZpZXdlcnMudmN4cHJvai5maWx0ZXJzCmluZGV4IDljYThjNjMuLjkwZjcwMTcgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcHJldmlld2Vycy93aW4vcHJldmlld2Vycy52Y3hwcm9qLmZpbHRlcnMKKysrIGIvY29udHJpYi9wcmV2aWV3ZXJzL3dpbi9wcmV2aWV3ZXJzLnZjeHByb2ouZmlsdGVycwpAQCAtMzQsOCArMzQsNSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iaGVscGVycy5jcHAiPgogICAgICAgPEZpbHRlcj5zcmM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGxpYlxiYXNpc3VfdHJhbnNjb2Rlci5jcHAiPgotICAgICAgPEZpbHRlcj5zcmM8L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiA8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zaW5nbGVfZmlsZV90cmFuc2NvZGVyL1JFQURNRS5tZCBiL2NvbnRyaWIvc2luZ2xlX2ZpbGVfdHJhbnNjb2Rlci9SRUFETUUubWQKaW5kZXggZDM3Nzg4ZS4uODBjN2ZlMSAxMDA2NDQKLS0tIGEvY29udHJpYi9zaW5nbGVfZmlsZV90cmFuc2NvZGVyL1JFQURNRS5tZAorKysgYi9jb250cmliL3NpbmdsZV9maWxlX3RyYW5zY29kZXIvUkVBRE1FLm1kCkBAIC0xLDMwICsxLDMwIEBACiAjIFNpbmdsZSBGaWxlIEJhc2lzIFVuaXZlcnNhbCBUcmFuc2NvZGVyCiAKLVRoZSBzY3JpcHQgYGNvbWJpbmUuc2hgIGNyZWF0ZXMgYW4gX2FtYWxnYW1hdGVkXyBDKysgc291cmNlIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIG9yIHdpdGhvdXQgYGJhc2lzdV90cmFuc2NvZGVyLmhgLiBUaGlzIF9pc24ndF8gYSBoZWFkZXItb25seSBmaWxlIGJ1dCBpdCBkb2VzIG9mZmVyIGEgc2ltaWxhciBsZXZlbCBvZiBzaW1wbGljaXR5IHdoZW4gaW50ZWdyYXRpbmcgaW50byBhIHByb2plY3QuCitUaGUgc2NyaXB0IGBjb21iaW5lLnB5YCBjcmVhdGVzIGFuIF9hbWFsZ2FtYXRlZF8gQysrIHNvdXJjZSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBvciB3aXRob3V0IGBiYXNpc3VfdHJhbnNjb2Rlci5oYC4gVGhpcyBfaXNuJ3RfIGEgaGVhZGVyLW9ubHkgZmlsZSBidXQgaXQgZG9lcyBvZmZlciBhIHNpbWlsYXIgbGV2ZWwgb2Ygc2ltcGxpY2l0eSB3aGVuIGludGVncmF0aW5nIGludG8gYSBwcm9qZWN0LgogCiBDcmVhdGUgYGJhc2lzdV90cmFuc2NvZGVyLmNwcGAgZnJvbSB0aGUgdHJhbnNjb2RlciBzb3VyY2VzIHVzaW5nOgogYGBgCiBjZCBiYXNpc191bml2ZXJzYWwvY29udHJpYi9zaW5nbGVfZmlsZV90cmFuc2NvZGVyCiAKLS4vY29tYmluZS5zaCAtciAuLi8uLi90cmFuc2NvZGVyIC1vIGJhc2lzdV90cmFuc2NvZGVyLmNwcCBiYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHAKK3B5dGhvbjMgY29tYmluZS5weSAtciAuLi8uLi90cmFuc2NvZGVyIC1vIGJhc2lzdV90cmFuc2NvZGVyLmNwcCBiYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHAKIGBgYAogVGhlbiBhZGQgdGhlIHJlc3VsdGluZyBmaWxlIHRvIHlvdXIgcHJvamVjdCAoc2VlIHRoZSBbZXhhbXBsZSBmaWxlc10oZXhhbXBsZXMpKS4KIAotSWYgY2VydGFpbiBmZWF0dXJlcyB3aWxsIF9uZXZlcl9fIGJlIGVuYWJsZWQsIGUuZy4gYEJBU0lTRF9TVVBQT1JUX0JDN19NT0RFNl9PUEFRVUVfT05MWWAsIHRoZW4gYGNvbWJpbmUuc2hgIGNhbiBiZSB0b2xkIHRvIGV4Y2x1ZGUgZmlsZXMgd2l0aCB0aGUgYC14YCBvcHRpb246CitJZiBjZXJ0YWluIGZlYXR1cmVzIHdpbGwgX25ldmVyX18gYmUgZW5hYmxlZCwgZS5nLiBgQkFTSVNEX1NVUFBPUlRfQkM3X01PREU2X09QQVFVRV9PTkxZYCwgdGhlbiBgY29tYmluZS5weWAgY2FuIGJlIHRvbGQgdG8gZXhjbHVkZSBmaWxlcyB3aXRoIHRoZSBgLXhgIG9wdGlvbjoKIGBgYAotLi9jb21iaW5lLnNoIC1yIC4uLy4uL3RyYW5zY29kZXIgLXggYmFzaXN1X3RyYW5zY29kZXJfdGFibGVzX2JjN19tNi5pbmMgLW8gYmFzaXN1X3RyYW5zY29kZXIuY3BwIGJhc2lzdV90cmFuc2NvZGVyLWluLmNwcAorcHl0aG9uMyBjb21iaW5lLnB5IC1yIC4uLy4uL3RyYW5zY29kZXIgLXggYmFzaXN1X3RyYW5zY29kZXJfdGFibGVzX2JjN19tNi5pbmMgLW8gYmFzaXN1X3RyYW5zY29kZXIuY3BwIGJhc2lzdV90cmFuc2NvZGVyLWluLmNwcAogYGBgCiBFeGNsdWRpbmcgdGhlIEJDNyBtb2RlIDYgc3VwcG9ydCByZWR1Y2VzIHRoZSBnZW5lcmF0ZWQgc291cmNlIGJ5IDEuMk1CLCB3aGljaCBpcyB0aGUgY2hvaWNlIHRha2VuIGluIGBiYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHBgIGFuZCB1c2VkIGluIHRoZSBleGFtcGxlcywgd2l0aCBgY3JlYXRlX3RyYW5zY29kZXIuc2hgIHJ1bm5pbmcgdGhlIGFib3ZlIHNjcmlwdCwgY3JlYXRpbmcgdGhlIGZpbmFsIGBiYXNpc3VfdHJhbnNjb2Rlci5jcHBgLgogCiBUaGUgY29tYmluZXIgc2NyaXB0IGNhbiBhbHNvIGdlbmVyYXRlIHNlcGFyYXRlIGFtYWxnYW1hdGVkIGhlYWRlciBhbmQgc291cmNlIGZpbGVzLCB1c2luZyB0aGUgYC1rYCBvcHRpb24gdG8ga2VlcCB0aGUgc3BlY2lmaWVkIGlubGluZSBkaXJlY3RpdmUsIGFuZCBgLXBgIHRvIGtlZXAgdGhlIGAjcHJhZ21hIG9uY2VgIGRpcmVjdGl2ZXMgaW4gdGhlIGhlYWRlcjoKIGBgYAotLi9jb21iaW5lLnNoIC1yIC4uLy4uL3RyYW5zY29kZXIgLW8gYmFzaXN1X3RyYW5zY29kZXIuaCAtcCAuLi8uLi90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmgKK3B5dGhvbjMgY29tYmluZS5weSAtciAuLi8uLi90cmFuc2NvZGVyIC1vIGJhc2lzdV90cmFuc2NvZGVyLmggLXAgLi4vLi4vdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlci5oCiAKLS4vY29tYmluZS5zaCAtciAuLi8uLi90cmFuc2NvZGVyIC14IGJhc2lzdV90cmFuc2NvZGVyX3RhYmxlc19iYzdfbTYuaW5jIC1rIGJhc2lzdV90cmFuc2NvZGVyLmggLW8gYmFzaXN1X3RyYW5zY29kZXIuY3BwIGJhc2lzdV90cmFuc2NvZGVyLWluLmNwcCAKK3B5dGhvbjMgY29tYmluZS5weSAtciAuLi8uLi90cmFuc2NvZGVyIC14IGJhc2lzdV90cmFuc2NvZGVyX3RhYmxlc19iYzdfbTYuaW5jIC1rIGJhc2lzdV90cmFuc2NvZGVyLmggLW8gYmFzaXN1X3RyYW5zY29kZXIuY3BwIGJhc2lzdV90cmFuc2NvZGVyLWluLmNwcCAKIAogYGBgCiAKLU5vdGU6IHRoZSBhbWFsZ2FtYXRpb24gc2NyaXB0IHdpbGwgcnVuIG9uIHByZXR0eSBtdWNoIGFueXRoaW5nIGJ1dCBpcyBfZXh0cmVtZWx5XyBzbG93IG9uIFdpbmRvd3Mgd2l0aCB0aGUgYGJhc2hgIGluY2x1ZGVkIHdpdGggR2l0LgorTm90ZTogdGhlIGFtYWxnYW1hdGlvbiBzY3JpcHQgd2FzIHRlc3RlZCBvbiBXaW5kb3dzIGFuZCBNYWMsIHJlcXVpcmluZyBQeXRob24gMy44LCB3aXRoIGEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gYXMgYSBzaGVsbCBzY3JpcHQgdGhhdCB3aWxsIHJ1biBvbiBwcmV0dHkgbXVjaCBhbnl0aGluZy4KIAogV2h5PwogLS0tLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9zaW5nbGVfZmlsZV90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLWluLmNwcCBiL2NvbnRyaWIvc2luZ2xlX2ZpbGVfdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHAKaW5kZXggODMwY2QzNS4uMjdiYzI3OCAxMDA2NDQKLS0tIGEvY29udHJpYi9zaW5nbGVfZmlsZV90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLWluLmNwcAorKysgYi9jb250cmliL3NpbmdsZV9maWxlX3RyYW5zY29kZXIvYmFzaXN1X3RyYW5zY29kZXItaW4uY3BwCkBAIC0xLDcgKzEsNyBAQAogLyoqCiAgKiBCYXNpcyBVbml2ZXJzYWwgc2luZ2xlIGZpbGUgbGlicmFyeS4gR2VuZXJhdGVkIHVzaW5nOgogICogXGNvZGUKLSAqCS4vY29tYmluZS5zaCAtciAuLi8uLi90cmFuc2NvZGVyIC1vIGJhc2lzdV90cmFuc2NvZGVyLmNwcCBiYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHAKKyAqCS4vY29tYmluZS5weSAtciAuLi8uLi90cmFuc2NvZGVyIC1vIGJhc2lzdV90cmFuc2NvZGVyLmNwcCBiYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHAKICAqIFxlbmRjb2RlCiAgKi8KIApkaWZmIC0tZ2l0IGEvY29udHJpYi9zaW5nbGVfZmlsZV90cmFuc2NvZGVyL2NvbWJpbmUucHkgYi9jb250cmliL3NpbmdsZV9maWxlX3RyYW5zY29kZXIvY29tYmluZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDEwMThkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9zaW5nbGVfZmlsZV90cmFuc2NvZGVyL2NvbWJpbmUucHkKQEAgLTAsMCArMSwyMzQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKworIyBUb29sIHRvIGJ1bmRsZSBtdWx0aXBsZSBDL0MrKyBzb3VyY2UgZmlsZXMsIGlubGluaW5nIGFueSBpbmNsdWRlcy4KKyMgCisjIE5vdGU6IHRoZXJlIGFyZSB0d28gdHlwZXMgb2YgZXhjbHVzaW9uIG9wdGlvbnM6IHRoZSAnLXgnIGZsYWcsIHdoaWNoIGJlc2lkZXMKKyMgZXhjbHVkaW5nIGEgZmlsZSBhbHNvIGFkZHMgYW4gI2Vycm9yIGRpcmVjdGl2ZSBpbiBwbGFjZSBvZiB0aGUgI2luY2x1ZGUsIGFuZAorIyB0aGUgJy1rJyBmbGFnLCB3aGljaCBrZWVwcyB0aGUgI2luY2x1ZGUgYW5kIGRvZXNuJ3QgaW5saW5lIHRoZSBmaWxlLiBUaGUKKyMgaW50ZW5kZWQgdXNlIGNhc2VzIGFyZTogJy14JyBmb3IgZmlsZXMgdGhhdCB3b3VsZCBub3JtYWxseSBiZSAjaWYnZCBvdXQsIHNvCisjIGZlYXR1cmVzIHRoYXQgMTAwJSB3b24ndCBiZSB1c2VkIGluIHRoZSBhbWFsZ2FtYXRlZCBmaWxlLCBmb3Igd2hpY2ggZXZlcnkKKyMgb2NjdXJyZW5jZSBhZGRzIHRoZSBlcnJvciwgYW5kICctaycgZm9yIGhlYWRlcnMgdGhhdCB3ZSB3aXNoIHRvIG1hbnVhbGx5CisjIGluY2x1ZGUsIHN1Y2ggYXMgYSBwcm9qZWN0J3MgcHVibGljIEFQSSwgZm9yIHdoaWNoIG9jY3VycmVuY2VzIGFmdGVyIHRoZSBmaXJzdAorIyBhcmUgcmVtb3ZlZC4KKyMgCisjIFRvZG86IHRoZSBlcnJvciBoYW5kbGluZyBjb3VsZCBiZSBiZXR0ZXIsIHdoaWNoIGN1cnJlbnRseSB0aHJvd3MgYW5kIGhhbHRzCisjICh3aGljaCBpcyBmdW5jdGlvbmFsIGp1c3Qgbm90IHZlcnkgZnJpZW5kbHkpLgorIyAKKyMgQXV0aG9yOiBDYXJsIFdvZmZlbmRlbiwgTnVtZnVtIEdtYkggKHRoaXMgc2NyaXB0IGlzIHJlbGVhc2VkIHVuZGVyIGEgQ0MwIGxpY2Vuc2UvUHVibGljIERvbWFpbikKKworaW1wb3J0IGFyZ3BhcnNlLCByZSwgc3lzCisKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgTGlzdCwgT3B0aW9uYWwsIFBhdHRlcm4sIFNldCwgVGV4dElPCisKKyMgU2V0IG9mIGZpbGUgcm9vdHMgd2hlbiBzZWFyY2hpbmcgKGVxdWl2YWxlbnQgdG8gLUkgcGF0aHMgZm9yIHRoZSBjb21waWxlcikuCityb290czogU2V0W1BhdGhdID0gc2V0KCkKKworIyBTZXQgb2YgKGNhbm9uaWNhbCkgZmlsZSBQYXRoIG9iamVjdHMgdG8gZXhjbHVkZSBmcm9tIGlubGluaW5nIChhbmQgbm90IG9ubHkKKyMgZXhjbHVkZSBidXQgdG8gYWRkIGEgY29tcGlsZXIgZXJyb3IgZGlyZWN0aXZlIHdoZW4gdGhleSdyZSBlbmNvdW50ZXJlZCkuCitleGNsdWRlczogU2V0W1BhdGhdID0gc2V0KCkKKworIyBTZXQgb2YgKGNhbm9uaWNhbCkgZmlsZSBQYXRoIG9iamVjdHMgdG8ga2VlcCBhcyBpbmNsdWRlIGRpcmVjdGl2ZXMuCitrZWVwczogU2V0W1BhdGhdID0gc2V0KCkKKworIyBXaGV0aGVyIHRvIGtlZXAgdGhlICNwcmFnbWEgb25jZSBkaXJlY3RpdmVzICh1bmxpa2VseSwgc2luY2UgdGhpcyB3aWxsIHJlc3VsdAorIyBpbiBhIHdhcm5pbmcsIGJ1dCB0aGUgb3B0aW9uIGlzIHRoZXJlKS4KK2tlZXBfcHJhZ21hOiBib29sID0gRmFsc2UKKworIyBEZXN0aW5hdGlvbiBmaWxlIG9iamVjdCAob3Igc3Rkb3V0IGlmIG5vIG91dHB1dCBmaWxlIHdhcyBzdXBwbGllZCkuCitkZXN0bjpUZXh0SU8gPSBzeXMuc3Rkb3V0CisKKyMgU2V0IG9mIGZpbGUgUGF0aCBvYmplY3RzIHByZXZpb3VzbHkgaW5saW5lZCAoYW5kIHRvIGlnbm9yZSBpZiByZWVuY291bnRlcmluZykuCitmb3VuZDogU2V0W1BhdGhdID0gc2V0KCkKKworIyBDb21waWxlZCByZWdleCBQYXRlcm4gdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgdHlwZSBvZiBmaWxlIGluY2x1ZGVzOgorIyAKKyMgICAjaW5jbHVkZSAiZmlsZSIKKyMgICAgICNpbmNsdWRlICJmaWxlIgorIyAgICMgIGluY2x1ZGUgImZpbGUiCisjICAgI2luY2x1ZGUgICAiZmlsZSIKKyMgICAjaW5jbHVkZSAiZmlsZSIgLy8gY29tbWVudAorIyAgICNpbmNsdWRlICJmaWxlIiAvLyBjb21tZW50IHdpdGggcXVvdGUgIgorIyAKKyMgQW5kIGFsbCBjb21iaW5hdGlvbnMgb2YsIGFzIHdlbGwgYXMgaWdub3JpbmcgdGhlIGZvbGxvd2luZzoKKyMgCisjICAgI2luY2x1ZGUgPGZpbGU+CisjICAgLy8jaW5jbHVkZSAiZmlsZSIKKyMgICAvKiNpbmNsdWRlICJmaWxlIiovCisjIAorIyBXZSBkb24ndCB0cnkgdG8gY2F0Y2ggZXJyb3JzIHNpbmNlIHRoZSBjb21waWxlciB3aWxsIGRvIHRoaXMgKGFuZCB0aGUgY29kZSBpcworIyBleHBlY3RlZCB0byBiZSB2YWxpZCBiZWZvcmUgcHJvY2Vzc2luZykgYW5kIHdlIGRvbid0IGNhcmUgd2hhdCBmb2xsb3dzIHRoZQorIyBmaWxlICh3aGV0aGVyIGl0J3MgYSB2YWxpZCBjb21tZW50IG9yIG5vdCwgc2luY2UgYW55dGhpbmcgYWZ0ZXIgdGhlIHF1b3RlZAorIyBzdHJpbmcgaXMgaWdub3JlZCkKKyMgCitpbmNsdWRlX3JlZ2V4OiBQYXR0ZXJuID0gcmUuY29tcGlsZShyJ15ccyojXHMqaW5jbHVkZVxzKiIoLis/KSInKQorCisjIFNpbXBsZSB0ZXN0cyB0byBwcm92ZSBpbmNsdWRlX3JlZ2V4J3MgY2FzZXMuCisjIAorZGVmIHRlc3RfbWF0Y2hfaW5jbHVkZSgpIC0+IGJvb2w6CisgICAgaWYgKGluY2x1ZGVfcmVnZXgubWF0Y2goJyNpbmNsdWRlICJmaWxlIicpICAgYW5kCisgICAgICAgIGluY2x1ZGVfcmVnZXgubWF0Y2goJyAgI2luY2x1ZGUgImZpbGUiJykgYW5kCisgICAgICAgIGluY2x1ZGVfcmVnZXgubWF0Y2goJyMgIGluY2x1ZGUgImZpbGUiJykgYW5kCisgICAgICAgIGluY2x1ZGVfcmVnZXgubWF0Y2goJyNpbmNsdWRlICAgImZpbGUiJykgYW5kCisgICAgICAgIGluY2x1ZGVfcmVnZXgubWF0Y2goJyNpbmNsdWRlICJmaWxlIiAvLyBjb21tZW50JykpOgorICAgICAgICAgICAgaWYgKG5vdCBpbmNsdWRlX3JlZ2V4Lm1hdGNoKCcjaW5jbHVkZSA8ZmlsZT4nKSAgIGFuZAorICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRlX3JlZ2V4Lm1hdGNoKCcvLyNpbmNsdWRlICJmaWxlIicpIGFuZAorICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRlX3JlZ2V4Lm1hdGNoKCcvKiNpbmNsdWRlICJmaWxlIiovJykpOgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGluY2x1ZGVfcmVnZXgubWF0Y2goJyNpbmNsdWRlICJmaWxlIiAvLyAiJykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kIGFuZCBmb3VuZC5ncm91cCgxKSA9PSAnZmlsZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJyNpbmNsdWRlIG1hdGNoIHZhbGlkJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKyMgQ29tcGlsZWQgcmVnZXggUGF0ZXJuIHRvIGhhbmRsZSAiI3ByYWdtYSBvbmNlIiBpbiB2YXJpb3VzIGZvcm1hdHM6CisjIAorIyAgICNwcmFnbWEgb25jZQorIyAgICAgI3ByYWdtYSBvbmNlCisjICAgIyAgcHJhZ21hIG9uY2UKKyMgICAjcHJhZ21hICAgb25jZQorIyAgICNwcmFnbWEgb25jZSAvLyBjb21tZW50CisjIAorIyBJZ25vcmluZyBjb21tZW50ZWQgdmVyc2lvbnMsIHNhbWUgYXMgaW5jbHVkZV9yZWdleC4KKyMgCitwcmFnbWFfcmVnZXg6IFBhdHRlcm4gPSByZS5jb21waWxlKHInXlxzKiNccypwcmFnbWFccypvbmNlXHMqJykKKworIyBTaW1wbGUgdGVzdHMgdG8gcHJvdmUgcHJhZ21hX3JlZ2V4J3MgY2FzZXMuCisjIAorZGVmIHRleHRfbWF0Y2hfcHJhZ21hKCkgLT4gYm9vbDoKKyAgICBpZiAocHJhZ21hX3JlZ2V4Lm1hdGNoKCcjcHJhZ21hIG9uY2UnKSAgIGFuZAorICAgICAgICBwcmFnbWFfcmVnZXgubWF0Y2goJyAgI3ByYWdtYSBvbmNlJykgYW5kCisgICAgICAgIHByYWdtYV9yZWdleC5tYXRjaCgnIyAgcHJhZ21hIG9uY2UnKSBhbmQKKyAgICAgICAgcHJhZ21hX3JlZ2V4Lm1hdGNoKCcjcHJhZ21hICAgb25jZScpIGFuZAorICAgICAgICBwcmFnbWFfcmVnZXgubWF0Y2goJyNwcmFnbWEgb25jZSAvLyBjb21tZW50JykpOgorICAgICAgICAgICAgaWYgKG5vdCBwcmFnbWFfcmVnZXgubWF0Y2goJy8vI3ByYWdtYSBvbmNlJykgYW5kCisgICAgICAgICAgICAgICAgbm90IHByYWdtYV9yZWdleC5tYXRjaCgnLyojcHJhZ21hIG9uY2UqLycpKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJyNwcmFnbWEgb25jZSBtYXRjaCB2YWxpZCcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKyMgRmluZHMgJ2ZpbGUnLiBGaXJzdCB0aGUgbGlzdCBvZiAncm9vdCcgcGF0aHMgYXJlIHNlYXJjaGVkLCBmb2xsb3dlZCBieSB0aGUKKyMgdGhlIGN1cnJlbnRseSBwcm9jZXNzaW5nIGZpbGUncyAncGFyZW50JyBwYXRoLCByZXR1cm5pbmcgYSB2YWxpZCBQYXRoIGluCisjIGNhbm9uaWNhbCBmb3JtLiBJZiBubyBtYXRjaCBpcyBmb3VuZCBOb25lIGlzIHJldHVybmVkLgorIyAKK2RlZiByZXNvbHZlX2luY2x1ZGUoZmlsZTogc3RyLCBwYXJlbnQ6IE9wdGlvbmFsW1BhdGhdID0gTm9uZSkgLT4gT3B0aW9uYWxbUGF0aF06CisgICAgZm9yIHJvb3QgaW4gcm9vdHM6CisgICAgICAgIGZvdW5kID0gcm9vdC5qb2lucGF0aChmaWxlKS5yZXNvbHZlKCkKKyAgICAgICAgaWYgKGZvdW5kLmlzX2ZpbGUoKSk6CisgICAgICAgICAgICByZXR1cm4gZm91bmQKKyAgICBpZiAocGFyZW50KToKKyAgICAgICAgZm91bmQgPSBwYXJlbnQuam9pbnBhdGgoZmlsZSkucmVzb2x2ZSgpOworICAgIGVsc2U6CisgICAgICAgIGZvdW5kID0gUGF0aChmaWxlKQorICAgIGlmIChmb3VuZC5pc19maWxlKCkpOgorICAgICAgICByZXR1cm4gZm91bmQKKyAgICByZXR1cm4gTm9uZQorCisjIEhlbHBlciB0byByZXNvbHZlIGxpc3RzIG9mIGZpbGVzLiAnZmlsZV9saXN0JyBpcyBwYXNzZWQgaW4gZnJvbSB0aGUgYXJndW1lbnRzCisjIGFuZCBlYWNoIGVudHJ5IHJlc29sdmVkIHRvIGl0cyBjYW5vbmljYWwgcGF0aCAobGlrZSBhbnkgaW5jbHVkZSBlbnRyeSwgZWl0aGVyCisjIGZyb20gdGhlIGxpc3Qgb2Ygcm9vdCBwYXRocyBvciB0aGUgb3duaW5nIGZpbGUncyAncGFyZW50Jywgd2hpY2ggaW4gdGhpcyBjYXNlCisjIGlzIGNhc2UgaXMgdGhlIGlucHV0IGZpbGUpLiBUaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGluICdyZXNvbHZlZCcuCisjIAorZGVmIHJlc29sdmVfZXhjbHVkZWRfZmlsZXMoZmlsZV9saXN0OiBPcHRpb25hbFtMaXN0W3N0cl1dLCByZXNvbHZlZDogU2V0W1BhdGhdLCBwYXJlbnQ6IE9wdGlvbmFsW1BhdGhdID0gTm9uZSkgLT4gTm9uZToKKyAgICBpZiAoZmlsZV9saXN0KToKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVfbGlzdDoKKyAgICAgICAgICAgIGZvdW5kID0gcmVzb2x2ZV9pbmNsdWRlKGZpbGVuYW1lLCBwYXJlbnQpCisgICAgICAgICAgICBpZiAoZm91bmQpOgorICAgICAgICAgICAgICAgIHJlc29sdmVkLmFkZChmb3VuZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXJyb3JfbGluZShmJ1dhcm5pbmc6IGV4Y2x1ZGVkIGZpbGUgbm90IGZvdW5kOiB7ZmlsZW5hbWV9JykKKworIyBXcml0ZXMgJ2xpbmUnIHRvIHRoZSBvcGVuICdkZXN0bicgKG9yIHN0ZG91dCkuCisjIAorZGVmIHdyaXRlX2xpbmUobGluZTogc3RyKSAtPiBOb25lOgorICAgIHByaW50KGxpbmUsIGZpbGU9ZGVzdG4pCisKKyMgTG9ncyAnbGluZScgdG8gc3RkZXJyLiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgZ2VuZXJhbCBub3RpZmljYXRpb25zIHRoYXQgd2UKKyMgZG9uJ3Qgd2FudCB0byBnbyB0byBzdGRvdXQgKHNvIHRoZSBzb3VyY2UgY2FuIGJlIHBpcGVkKS4KKyMgCitkZWYgZXJyb3JfbGluZShsaW5lOiBBbnkpIC0+IE5vbmU6CisgICAgcHJpbnQobGluZSwgZmlsZT1zeXMuc3RkZXJyKQorCisjIElubGluZSB0aGUgY29udGVudHMgb2YgJ2ZpbGUnICh3aXRoIGFueSBvZiBpdHMgaW5jbHVkZXMgYWxzbyBpbmxpbmVkLCBldGMuKS4KKyMgCisjIE5vdGU6IHRleHQgZW5jb2RpbmcgZXJyb3JzIGFyZSBpZ25vcmVkIGFuZCByZXBsYWNlZCB3aXRoID8gd2hlbiByZWFkaW5nIHRoZQorIyBpbnB1dCBmaWxlcy4gVGhpcyBpc24ndCBpZGVhbCwgYnV0IGl0J3MgbW9yZSB0aGFuIGxpa2VseSBpbiB0aGUgY29tbWVudHMgdGhhbgorIyBjb2RlIGFuZCBhKSB0aGUgdGV4dCBlZGl0b3IgaGFzIHByb2JhYmx5IGFsc28gZmFpbGVkIHRvIHJlYWQgdGhlIHNhbWUgY29udGVudCwKKyMgYW5kIGIpIHRoZSBjb21waWxlciBwcm9iYWJseSBkaWQgdG9vLgorIyAKK2RlZiBhZGRfZmlsZShmaWxlOiBQYXRoLCBmaWxlX25hbWU6IHN0ciA9IE5vbmUpIC0+IE5vbmU6CisgICAgaWYgKGZpbGUuaXNfZmlsZSgpKToKKyAgICAgICAgaWYgKG5vdCBmaWxlX25hbWUpOgorICAgICAgICAgICAgZmlsZV9uYW1lID0gZmlsZS5uYW1lCisgICAgICAgIGVycm9yX2xpbmUoZidQcm9jZXNzaW5nOiB7ZmlsZV9uYW1lfScpCisgICAgICAgIHdpdGggZmlsZS5vcGVuKCdyJywgZXJyb3JzPSdyZXBsYWNlJykgYXMgb3BlbmVkOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gb3BlbmVkOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgnXG4nKQorICAgICAgICAgICAgICAgIG1hdGNoX2luY2x1ZGUgPSBpbmNsdWRlX3JlZ2V4Lm1hdGNoKGxpbmUpOworICAgICAgICAgICAgICAgIGlmIChtYXRjaF9pbmNsdWRlKToKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBoYXZlIGEgcXVvdGVkIGluY2x1ZGUgZGlyZWN0aXZlIHNvIGdyYWIgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgaW5jX25hbWUgPSBtYXRjaF9pbmNsdWRlLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkID0gcmVzb2x2ZV9pbmNsdWRlKGluY19uYW1lLCBmaWxlLnBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZCBpbiBleGNsdWRlcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgZmlsZSB3YXMgZXhjbHVkZWQgc28gZXJyb3IgaWYgdGhlIGNvbXBpbGVyIHVzZXMgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9saW5lKGYnI2Vycm9yIFVzaW5nIGV4Y2x1ZGVkIGZpbGU6IHtpbmNfbmFtZX0nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2xpbmUoZidFeGNsdWRpbmc6IHtpbmNfbmFtZX0nKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQgbm90IGluIGZvdW5kKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgZmlsZSB3YXMgbm90IHByZXZpb3VzbHkgZW5jb3VudGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuYWRkKHJlc29sdmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQgaW4ga2VlcHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBCdXQgdGhlIGluY2x1ZGUgd2FzIGZsYWdnZWQgdG8ga2VlcCBhcyBpbmNsdWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbGluZShmJy8qKioqICpOT1QqIGlubGluaW5nIHtpbmNfbmFtZX0gKioqKi8nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbGluZShsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbGluZShmJ05vdCBpbmxpbmluZzoge2luY19uYW1lfScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBmaWxlIHdhcyBuZWl0aGVyIGV4Y2x1ZGVkIG5vciBzZWVuIGJlZm9yZSBzbyBpbmxpbmUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2xpbmUoZicvKioqKiBzdGFydCBpbmxpbmluZyB7aW5jX25hbWV9ICoqKiovJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9maWxlKHJlc29sdmVkLCBpbmNfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2xpbmUoZicvKioqKiBlbmRlZCBpbmxpbmluZyB7aW5jX25hbWV9ICoqKiovJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9saW5lKGYnLyoqKiogc2tpcHBpbmcgZmlsZToge2luY19uYW1lfSAqKioqLycpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBpbmNsdWRlIGZpbGUgZGlkbid0IHJlc29sdmUgdG8gYSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9saW5lKGYnI2Vycm9yIFVuYWJsZSB0byBmaW5kOiB7aW5jX25hbWV9JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2xpbmUoZidFcnJvcjogVW5hYmxlIHRvIGZpbmQ6IHtpbmNfbmFtZX0nKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgU2tpcCBhbnkgJ3ByYWdtYSBvbmNlJyBkaXJlY3RpdmVzLCBvdGhlcndpc2Ugd3JpdGUgdGhlIHNvdXJjZSBsaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChrZWVwX3ByYWdtYSBvciBub3QgcHJhZ21hX3JlZ2V4Lm1hdGNoKGxpbmUpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2xpbmUobGluZSkKKyAgICBlbHNlOgorICAgICAgICBlcnJvcl9saW5lKGYnRXJyb3I6IEludmFsaWQgZmlsZToge2ZpbGV9JykKKworIyBTdGFydCBoZXJlCitwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0nQW1hbGdhbWF0ZSBUb29sJywgZXBpbG9nPWYnZXhhbXBsZToge3N5cy5hcmd2WzBdfSAtciAuLi9teS9wYXRoIC1yIC4uL290aGVyL3BhdGggLW8gb3V0LmMgaW4uYycpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCctcicsICctLXJvb3QnLCBhY3Rpb249J2FwcGVuZCcsIHR5cGU9UGF0aCwgaGVscD0nZmlsZSByb290IHNlYXJjaCBwYXRoJykKK3BhcnNlci5hZGRfYXJndW1lbnQoJy14JywgJy0tZXhjbHVkZScsICBhY3Rpb249J2FwcGVuZCcsIGhlbHA9J2ZpbGUgdG8gY29tcGxldGVseSBleGNsdWRlIGZyb20gaW5saW5pbmcnKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnLWsnLCAnLS1rZWVwJywgYWN0aW9uPSdhcHBlbmQnLCBoZWxwPSdmaWxlIHRvIGV4Y2x1ZGUgZnJvbSBpbmxpbmluZyBidXQga2VlcCB0aGUgaW5jbHVkZSBkaXJlY3RpdmUnKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnLXAnLCAnLS1wcmFnbWEnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdrZWVwIGFueSAiI3ByYWdtYSBvbmNlIiBkaXJlY3RpdmVzIChyZW1vdmVkIGJ5IGRlZmF1bHQpJykKK3BhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgJy0tb3V0cHV0JywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgndycpLCBoZWxwPSdvdXRwdXQgZmlsZSAob3RoZXJ3aXNlIHN0ZG91dCknKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnaW5wdXQnLCB0eXBlPVBhdGgsIGhlbHA9J2lucHV0IGZpbGUnKQorYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworIyBGYWlsIGVhcmx5IG9uIGFuIGludmFsaWQgaW5wdXQgKGFuZCBzdG9yZSBpdCBzbyB3ZSBkb24ndCByZWN1cnNlKQorYXJncy5pbnB1dCA9IGFyZ3MuaW5wdXQucmVzb2x2ZShzdHJpY3Q9VHJ1ZSkKK2ZvdW5kLmFkZChhcmdzLmlucHV0KQorCisjIFJlc29sdmUgYWxsIG9mIHRoZSByb290IHBhdGhzIHVwZnJvbnQgKHdlJ2xsIGhhbHQgaGVyZSBvbiBpbnZhbGlkIHJvb3RzKQoraWYgKGFyZ3Mucm9vdCk6CisgICAgZm9yIHBhdGggaW4gYXJncy5yb290OgorICAgICAgICByb290cy5hZGQocGF0aC5yZXNvbHZlKHN0cmljdD1UcnVlKSkKKworIyBUaGUgcmVtYWluaW5nIHBhcmFtczogc28gcmVzb2x2ZSB0aGUgZXhjbHVkZWQgZmlsZXMgYW5kICNwcmFnbWEgb25jZSBkaXJlY3RpdmUKK3Jlc29sdmVfZXhjbHVkZWRfZmlsZXMoYXJncy5leGNsdWRlLCBleGNsdWRlcywgYXJncy5pbnB1dC5wYXJlbnQpCityZXNvbHZlX2V4Y2x1ZGVkX2ZpbGVzKGFyZ3Mua2VlcCwgICAga2VlcHMsICAgIGFyZ3MuaW5wdXQucGFyZW50KQora2VlcF9wcmFnbWEgPSBhcmdzLnByYWdtYTsKKworIyBUaGVuIHJlY3Vyc2l2ZWx5IHByb2Nlc3MgdGhlIGlucHV0IGZpbGUKK3RyeToKKyAgICBpZiAoYXJncy5vdXRwdXQpOgorICAgICAgICBkZXN0biA9IGFyZ3Mub3V0cHV0CisgICAgYWRkX2ZpbGUoYXJncy5pbnB1dCkKK2ZpbmFsbHk6CisgICAgaWYgKG5vdCBkZXN0bik6CisgICAgICAgIGRlc3RuLmNsb3NlKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc2luZ2xlX2ZpbGVfdHJhbnNjb2Rlci9jcmVhdGVfdHJhbnNjb2Rlci5zaCBiL2NvbnRyaWIvc2luZ2xlX2ZpbGVfdHJhbnNjb2Rlci9jcmVhdGVfdHJhbnNjb2Rlci5zaAppbmRleCBhMDQxZDJhLi42MDE2NTQ5IDEwMDc1NQotLS0gYS9jb250cmliL3NpbmdsZV9maWxlX3RyYW5zY29kZXIvY3JlYXRlX3RyYW5zY29kZXIuc2gKKysrIGIvY29udHJpYi9zaW5nbGVfZmlsZV90cmFuc2NvZGVyL2NyZWF0ZV90cmFuc2NvZGVyLnNoCkBAIC00LDcgKzQsMTIgQEAKIE9VVF9GSUxFPSJ0ZW1wYmluIgogCiBlY2hvICJBbWFsZ2FtYXRpbmcgZmlsZXMuLi4gdGhpcyBjYW4gdGFrZSBhIHdoaWxlIgotLi9jb21iaW5lLnNoIC1yIC4uLy4uL3RyYW5zY29kZXIgLW8gYmFzaXN1X3RyYW5zY29kZXIuY3BwIGJhc2lzdV90cmFuc2NvZGVyLWluLmNwcAorIyBVc2UgdGhlIGZhc3RlciBQeXRob24gc2NyaXB0IGlmIHdlIGhhdmUgMy44IG9yIGhpZ2hlcgoraWYgcHl0aG9uMyAtYyAnaW1wb3J0IHN5czsgYXNzZXJ0IHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsOCknIDI+L2Rldi9udWxsOyB0aGVuCisgIC4vY29tYmluZS5weSAtciAuLi8uLi90cmFuc2NvZGVyIC1vIGJhc2lzdV90cmFuc2NvZGVyLmNwcCBiYXNpc3VfdHJhbnNjb2Rlci1pbi5jcHAKK2Vsc2UKKyAgLi9jb21iaW5lLnNoIC1yIC4uLy4uL3RyYW5zY29kZXIgLW8gYmFzaXN1X3RyYW5zY29kZXIuY3BwIGJhc2lzdV90cmFuc2NvZGVyLWluLmNwcAorZmkKICMgRGlkIGNvbWJpbmluZyB3b3JrPwogaWYgWyAkPyAtbmUgMCBdOyB0aGVuCiAgIGVjaG8gIkNvbWJpbmUgc2NyaXB0OiBGQUlMRUQiCkBAIC0xNyw3ICsyMiw3IEBACiBpZiBbICQ/IC1uZSAwIF07IHRoZW4KICAgZWNobyAiKFNraXBwaW5nIGNvbXBpbGUgdGVzdCkiCiBlbHNlCi0gIGNjIC1zdGQ9YysrMTEgLWxzdGRjKysgLVdhbGwgLVdleHRyYSAtV2Vycm9yIC1PcyAtZzAgLWZuby1leGNlcHRpb25zIC1mbm8tcnR0aSAtbyAkT1VUX0ZJTEUgZXhhbXBsZXMvc2ltcGxlLmNwcAorICBjYyAtbG0gLXN0ZD1jKysxMSAtbHN0ZGMrKyAtV2FsbCAtV2V4dHJhIC1XZXJyb3IgLU9zIC1nMCAtZm5vLWV4Y2VwdGlvbnMgLWZuby1ydHRpIC1vICRPVVRfRklMRSBleGFtcGxlcy9zaW1wbGUuY3BwCiAgICMgRGlkIGNvbXBpbGF0aW9uIHdvcms/CiAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgogICAgIGVjaG8gIkNvbXBpbGluZyBzaW1wbGUuY3BwOiBGQUlMRUQiCmRpZmYgLS1naXQgYS9jb250cmliL3NpbmdsZV9maWxlX3RyYW5zY29kZXIvZXhhbXBsZXMvc2ltcGxlLmNwcCBiL2NvbnRyaWIvc2luZ2xlX2ZpbGVfdHJhbnNjb2Rlci9leGFtcGxlcy9zaW1wbGUuY3BwCmluZGV4IDlmNjFjMjYuLjY0YzhiMDkgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvc2luZ2xlX2ZpbGVfdHJhbnNjb2Rlci9leGFtcGxlcy9zaW1wbGUuY3BwCisrKyBiL2NvbnRyaWIvc2luZ2xlX2ZpbGVfdHJhbnNjb2Rlci9leGFtcGxlcy9zaW1wbGUuY3BwCkBAIC0zMSwyMCArMzEsMTQgQEAKIAogLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKioKLSAqIFNoYXJlZCBjb2RlYm9vayBpbnN0YW5jZS4KLSAqLwotc3RhdGljIGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKiBnbG9iYWxDb2RlYm9vayA9IE5VTEw7CiAKIC8qKgogICogU2ltcGxlIHNpbmdsZS1maWxlIHRlc3QgdG8gdGVzdCB0aGUgdHJhbnNjb2RlciBjYW4gYnVpbGQgYW5kIHJ1bi4KICAqLwogaW50IG1haW4oKSB7CiAJYmFzaXN1X3RyYW5zY29kZXJfaW5pdCgpOwotCWlmICghZ2xvYmFsQ29kZWJvb2spIHsKLQkJIGdsb2JhbENvZGVib29rID0gbmV3IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKGdfZ2xvYmFsX3NlbGVjdG9yX2NiX3NpemUsIGdfZ2xvYmFsX3NlbGVjdG9yX2NiKTsKLQl9Ci0JYmFzaXN1X3RyYW5zY29kZXIgdHJhbnNjb2RlcihnbG9iYWxDb2RlYm9vayk7CisJCisJYmFzaXN1X3RyYW5zY29kZXIgdHJhbnNjb2RlcjsKIAlpZiAodHJhbnNjb2Rlci52YWxpZGF0ZV9oZWFkZXIoc3JjUmdiLCBzaXplb2Ygc3JjUmdiKSkgewogCQliYXNpc3VfZmlsZV9pbmZvIGZpbGVJbmZvOwogCQlpZiAodHJhbnNjb2Rlci5nZXRfZmlsZV9pbmZvKHNyY1JnYiwgc2l6ZW9mIHNyY1JnYiwgZmlsZUluZm8pKSB7CmRpZmYgLS1naXQgYS9lbmNvZGVyL2FwZ19ibXAuYyBiL2VuY29kZXIvYXBnX2JtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQyYjIwLi4wMDAwMDAwCi0tLSBhL2VuY29kZXIvYXBnX2JtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qCi1CTVAgRmlsZSBSZWFkZXIvV3JpdGVyIEltcGxlbWVudGF0aW9uCi1BbnRvbiBHZXJkZWxhbgotVmVyc2lvbjogMwotTGljZW5jZTogc2VlIGFwZ19ibXAuaAotQzk5Ci0qLwotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgMQotI2VuZGlmCi0KLSNpbmNsdWRlICJhcGdfYm1wLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qIE1heGltdW0gcGl4ZWwgZGltZW5zaW9ucyBvZiB3aWR0aCBvciBoZWlnaHQgb2YgYW4gaW1hZ2UuIFNob3VsZCBhY2NvbW1vZGF0ZSBtYXggdXNlZCBpbiBncmFwaGljcyBBUElzLgotICAgTk9URTogNjU1MzYqNjU1MzYgaXMgdGhlIGJpZ2dlc3QgbnVtYmVyIHN0b3JhYmxlIGluIDMyIGJpdHMuCi0gICBUaGlzIG5lZWRzIHRvIGJlIG11bHRpcGxpZWQgYnkgbl9jaGFubmVscyBzbyBhY3R1YWwgbWVtb3J5IGluZGljZXMgYXJlIG5vdCB1aW50MzIgYnV0IHNpemVfdCB0byBhdm9pZCBvdmVyZmxvdy4KLSAgIE5vdGUgdGhpcyB3aWxsIGNyYXNoIHN0Yl9pbWFnZV93cml0ZSBldCBhbCBhdCBtYXhpbXVtIHNpemUgd2hpY2ggdXNlIDMyYml0cywgc28gcmVkdWNlIG1heCBzaXplIHRvIGFjY29tLiAqLwotI2RlZmluZSBfQk1QX01BWF9ESU1TIDY1NTM2Ci0jZGVmaW5lIF9CTVBfRklMRV9IRFJfU1ogMTQKLSNkZWZpbmUgX0JNUF9NSU5fRElCX0hEUl9TWiA0MAotI2RlZmluZSBfQk1QX01JTl9IRFJfU1ogKCBfQk1QX0ZJTEVfSERSX1NaICsgX0JNUF9NSU5fRElCX0hEUl9TWiApCi0jZGVmaW5lIF9CTVBfTUFYX0lNQUdFX0ZJTEVfU0laRSAoMTAyNFVMTCoxMDI0VUxMKjEwMjRVTEwpCi0KLSNwcmFnbWEgcGFjayggcHVzaCwgMSApIC8vIHN1cHBvcnRlZCBvbiBHQ0MgaW4gYWRkaXRpb24gdG8gaW5kaXZpZHVhbCBwYWNraW5nIGF0dHJpYnMKLS8qIEFsbCBCTVAgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgdHlwZSwgc3RhcnQgd2l0aCB0aGlzIGZpbGUgaGVhZGVyICovCi10eXBlZGVmIHN0cnVjdCBfYm1wX2ZpbGVfaGVhZGVyX3QgewotICBjaGFyIGZpbGVfdHlwZVsyXTsKLSAgdWludDMyX3QgZmlsZV9zejsKLSAgdWludDE2X3QgcmVzZXJ2ZWQxOwotICB1aW50MTZfdCByZXNlcnZlZDI7Ci0gIHVpbnQzMl90IGltYWdlX2RhdGFfb2Zmc2V0OwotfSBfYm1wX2ZpbGVfaGVhZGVyX3Q7Ci0KLS8qIEZvbGxvd2luZyB0aGUgZmlsZSBoZWFkZXIgaXMgdGhlIEJNUCB0eXBlIGhlYWRlci4gdGhpcyBpcyB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZvcm1hdCAqLwotdHlwZWRlZiBzdHJ1Y3QgX2JtcF9kaWJfQklUTUFQSU5GT0hFQURFUl90IHsKLSAgdWludDMyX3QgdGhpc19oZWFkZXJfc3o7Ci0gIGludDMyX3QgdzsgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gb2xkZXIgaGVhZGVycyB3ICYgaCB0aGVzZSBhcmUgc2hvcnRzIGFuZCBtYXkgYmUgdW5zaWduZWQKLSAgaW50MzJfdCBoOyAgICAgICAgICAgICAgICAgICAgICAvLwotICB1aW50MTZfdCBuX3BsYW5lczsgICAgICAgICAgICAgIC8vIG11c3QgYmUgMQotICB1aW50MTZfdCBicHA7ICAgICAgICAgICAgICAgICAgIC8vIGJpdHMgcGVyIHBpeGVsLiAxLDQsOCwxNiwyNCwzMi4KLSAgdWludDMyX3QgY29tcHJlc3Npb25fbWV0aG9kOyAgICAvLyAxNiBhbmQgMzItYml0IGltYWdlcyBtdXN0IGhhdmUgYSB2YWx1ZSBvZiAzIGhlcmUKLSAgdWludDMyX3QgaW1hZ2VfdW5jb21wcmVzc2VkX3N6OyAvLyBub3QgY29uc2lzdGVudGx5IHVzZWQgaW4gdGhlIHdpbGQsIHNvIGlnbm9yZWQgaGVyZS4KLSAgaW50MzJfdCBob3Jpel9waXhlbHNfcGVyX21ldGVyOyAvLyBub3QgdXNlZC4KLSAgaW50MzJfdCB2ZXJ0X3BpeGVsc19wZXJfbWV0ZXI7ICAvLyBub3QgdXNlZC4KLSAgdWludDMyX3Qgbl9jb2xvdXJzX2luX3BhbGV0dGU7ICAvLwotICB1aW50MzJfdCBuX2ltcG9ydGFudF9jb2xvdXJzOyAgIC8vIG5vdCB1c2VkLgotICAvKiBOT1RFKEFudG9uKSBhIERJQiBoZWFkZXIgbWF5IGVuZCBoZXJlIGF0IDQwLWJ5dGVzLiBiZSBjYXJlZnVsIHVzaW5nIHNpemVvZigpICovCi0gIC8qIGlmICdjb21wcmVzc2lvbicgdmFsdWUsIGFib3ZlLCBpcyBzZXQgdG8gMyBpZSB0aGUgaW1hZ2UgaXMgMTYgb3IgMzItYml0LCB0aGVuIHRoZXNlIGNvbG91ciBjaGFubmVsIG1hc2tzIGZvbGxvdyB0aGUgaGVhZGVycy4KLSAgdGhlc2UgYXJlIGJpZy1lbmRpYW4gb3JkZXIgYml0IG1hc2tzIHRvIGFzc2lnbiBiaXRzIG9mIGVhY2ggcGl4ZWwgdG8gZGlmZmVyZW50IGNvbG91cnMuIGJpdHMgdXNlZCBtdXN0IGJlIGNvbnRpZ3VvdXMgYW5kIG5vdCBvdmVybGFwLiAqLwotICB1aW50MzJfdCBiaXRtYXNrX3I7Ci0gIHVpbnQzMl90IGJpdG1hc2tfZzsKLSAgdWludDMyX3QgYml0bWFza19iOwotfSBfYm1wX2RpYl9CSVRNQVBJTkZPSEVBREVSX3Q7Ci0jcHJhZ21hIHBhY2soIHBvcCApCi0KLXR5cGVkZWYgZW51bSBfYm1wX2NvbXByZXNzaW9uX3QgewotICBCSV9SR0IgICAgICAgICAgICA9IDAsCi0gIEJJX1JMRTggICAgICAgICAgID0gMSwKLSAgQklfUkxFNCAgICAgICAgICAgPSAyLAotICBCSV9CSVRGSUVMRFMgICAgICA9IDMsCi0gIEJJX0pQRUcgICAgICAgICAgID0gNCwKLSAgQklfUE5HICAgICAgICAgICAgPSA1LAotICBCSV9BTFBIQUJJVEZJRUxEUyA9IDYsCi0gIEJJX0NNWUsgICAgICAgICAgID0gMTEsCi0gIEJJX0NNWUtSTEU4ICAgICAgID0gMTIsCi0gIEJJX0NNWVJMRTQgICAgICAgID0gMTMKLX0gX2JtcF9jb21wcmVzc2lvbl90OwotCi0vKiBjb252ZW5pZW5jZSBzdHJ1Y3QgYW5kIGZpbGUtPm1lbW9yeSBmdW5jdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2VudGlyZV9maWxlX3QgewotICB2b2lkKiBkYXRhOwotICBzaXplX3Qgc3o7Ci19IF9lbnRpcmVfZmlsZV90OwotCi0vKgotUkVUVVJOUwotLSB0cnVlIG9uIHN1Y2Nlc3MuIHJlY29yZC0+ZGF0YSBpcyBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0tIGZhbHNlIG9uIGFueSBlcnJvci4gQW55IGFsbG9jYXRlZCBtZW1vcnkgaXMgZnJlZWQgaWYgZmFsc2UgaXMgcmV0dXJuZWQgKi8KLXN0YXRpYyBib29sIF9yZWFkX2VudGlyZV9maWxlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgX2VudGlyZV9maWxlX3QqIHJlY29yZCApIHsKLSAgRklMRSogZnAgPSBmb3BlbiggZmlsZW5hbWUsICJyYiIgKTsKLSAgaWYgKCAhZnAgKSB7IHJldHVybiBmYWxzZTsgfQotICBmc2VlayggZnAsIDBMLCBTRUVLX0VORCApOwotICByZWNvcmQtPnN6ICAgPSAoc2l6ZV90KWZ0ZWxsKCBmcCApOwotCi0gIC8vIEltbWVkaWF0ZWx5IGJhaWwgb24gYW55dGhpbmcgbGFyZ2VyIHRoYW4gX0JNUF9NQVhfSU1BR0VfRklMRV9TSVpFLiAKLSAgaWYgKHJlY29yZC0+c3ogPiBfQk1QX01BWF9JTUFHRV9GSUxFX1NJWkUpIHsKLSAgICBmY2xvc2UoIGZwICk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmVjb3JkLT5kYXRhID0gbWFsbG9jKCByZWNvcmQtPnN6ICk7Ci0gIGlmICggIXJlY29yZC0+ZGF0YSApIHsKLSAgICBmY2xvc2UoIGZwICk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJld2luZCggZnAgKTsKLSAgc2l6ZV90IG5yID0gZnJlYWQoIHJlY29yZC0+ZGF0YSwgcmVjb3JkLT5zeiwgMSwgZnAgKTsKLSAgZmNsb3NlKCBmcCApOwotICBpZiAoIDEgIT0gbnIgKSB7IHJldHVybiBmYWxzZTsgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgX3ZhbGlkYXRlX2ZpbGVfaGRyKCBfYm1wX2ZpbGVfaGVhZGVyX3QqIGZpbGVfaGRyX3B0ciwgc2l6ZV90IGZpbGVfc3ogKSB7Ci0gIGlmICggIWZpbGVfaGRyX3B0ciApIHsgcmV0dXJuIGZhbHNlOyB9Ci0gIGlmICggZmlsZV9oZHJfcHRyLT5maWxlX3R5cGVbMF0gIT0gJ0InIHx8IGZpbGVfaGRyX3B0ci0+ZmlsZV90eXBlWzFdICE9ICdNJyApIHsgcmV0dXJuIGZhbHNlOyB9Ci0gIGlmICggZmlsZV9oZHJfcHRyLT5pbWFnZV9kYXRhX29mZnNldCA+IGZpbGVfc3ogKSB7IHJldHVybiBmYWxzZTsgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgX3ZhbGlkYXRlX2RpYl9oZHIoIF9ibXBfZGliX0JJVE1BUElORk9IRUFERVJfdCogZGliX2hkcl9wdHIsIHNpemVfdCBmaWxlX3N6ICkgewotICBpZiAoICFkaWJfaGRyX3B0ciApIHsgcmV0dXJuIGZhbHNlOyB9Ci0gIGlmICggX0JNUF9GSUxFX0hEUl9TWiArIGRpYl9oZHJfcHRyLT50aGlzX2hlYWRlcl9zeiA+IGZpbGVfc3ogKSB7IHJldHVybiBmYWxzZTsgfQotICBpZiAoICggMzIgPT0gZGliX2hkcl9wdHItPmJwcCB8fCAxNiA9PSBkaWJfaGRyX3B0ci0+YnBwICkgJiYgKCBCSV9CSVRGSUVMRFMgIT0gZGliX2hkcl9wdHItPmNvbXByZXNzaW9uX21ldGhvZCAmJiBCSV9BTFBIQUJJVEZJRUxEUyAhPSBkaWJfaGRyX3B0ci0+Y29tcHJlc3Npb25fbWV0aG9kICkgKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICggQklfUkdCICE9IGRpYl9oZHJfcHRyLT5jb21wcmVzc2lvbl9tZXRob2QgJiYgQklfQklURklFTERTICE9IGRpYl9oZHJfcHRyLT5jb21wcmVzc2lvbl9tZXRob2QgJiYgQklfQUxQSEFCSVRGSUVMRFMgIT0gZGliX2hkcl9wdHItPmNvbXByZXNzaW9uX21ldGhvZCApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTk9URShBbnRvbikgdXNpbmcgYWJzKCkgaW4gdGhlIGlmLXN0YXRlbWVudCB3YXMgYmxvd2luZyB1cCBvbiBsYXJnZSBuZWdhdGl2ZSBudW1iZXJzLiBzd2l0Y2hlZCB0byBsYWJzKCkKLSAgaWYgKCAwID09IGRpYl9oZHJfcHRyLT53IHx8IDAgPT0gZGliX2hkcl9wdHItPmggfHwgbGFicyggZGliX2hkcl9wdHItPncgKSA+IF9CTVBfTUFYX0RJTVMgfHwgbGFicyggZGliX2hkcl9wdHItPmggKSA+IF9CTVBfTUFYX0RJTVMgKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qIE5PVEUoQW50b24pIGlmIGltYWdlcyByZWxpYWJseSB1c2VkIG5fY29sb3Vyc19pbl9wYWxldHRlIHdlIGNvdWxkIGhhdmUgZG9uZSBhIHBhbGV0dGUvZmlsZSBzaXplIGludGVncml0eSBjaGVjayBoZXJlLgotICBiZWNhdXNlIHNvbWUgYWx3YXlzIHNldCAwIHRoZW4gd2UgaGF2ZSB0byBjaGVjayBldmVyeSBwYWxldHRlIGluZGV4aW5nIGFzIHdlIHJlYWQgdGhlbSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTk9URShBbnRvbikgdGhpcyBjb3VsZCBoYXZlIGlmZGVmIGJyYW5jaGVzIG9uIGRpZmZlcmVudCBjb21waWxlcnMgZm9yIHRoZSBpbnRyaW5zaWNzIHZlcnNpb25zIGZvciBwZXJmICovCi1zdGF0aWMgdWludDMyX3QgX2JpdHNjYW4oIHVpbnQzMl90IGR3b3JkICkgewotICBmb3IgKCB1aW50MzJfdCBpID0gMDsgaSA8IDMyOyBpKysgKSB7Ci0gICAgaWYgKCAxICYgZHdvcmQgKSB7IHJldHVybiBpOyB9Ci0gICAgZHdvcmQgPSBkd29yZCA+PiAxOwotICB9Ci0gIHJldHVybiAodWludDMyX3QpLTE7Ci19Ci0KLXVuc2lnbmVkIGNoYXIqIGFwZ19ibXBfcmVhZCggY29uc3QgY2hhciogZmlsZW5hbWUsIGludCogdywgaW50KiBoLCB1bnNpZ25lZCBpbnQqIG5fY2hhbnMgKSB7Ci0gIGlmICggIWZpbGVuYW1lIHx8ICF3IHx8ICFoIHx8ICFuX2NoYW5zICkgeyByZXR1cm4gTlVMTDsgfQotCi0gIC8vIHJlYWQgaW4gdGhlIHdob2xlIGZpbGUgaW50byBtZW1vcnkgZmlyc3QgLSBtdWNoIGZhc3RlciB0aGFuIHBhcnNpbmcgb24tdGhlLWZseQotICBfZW50aXJlX2ZpbGVfdCByZWNvcmQ7Ci0gIGlmICggIV9yZWFkX2VudGlyZV9maWxlKCBmaWxlbmFtZSwgJnJlY29yZCApICkgeyByZXR1cm4gTlVMTDsgfQotICBpZiAoIHJlY29yZC5zeiA8IF9CTVBfTUlOX0hEUl9TWiApIHsKLSAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gZ3JhYiBhbmQgdmFsaWRhdGUgdGhlIGZpcnN0LCBmaWxlLCBoZWFkZXIKLSAgX2JtcF9maWxlX2hlYWRlcl90KiBmaWxlX2hkcl9wdHIgPSAoX2JtcF9maWxlX2hlYWRlcl90KilyZWNvcmQuZGF0YTsKLSAgaWYgKCAhX3ZhbGlkYXRlX2ZpbGVfaGRyKCBmaWxlX2hkcl9wdHIsIHJlY29yZC5zeiApICkgewotICAgIGZyZWUoIHJlY29yZC5kYXRhICk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBncmFkIGFuZCB2YWxpZGF0ZSB0aGUgc2Vjb25kLCBESUIsIGhlYWRlcgotICBfYm1wX2RpYl9CSVRNQVBJTkZPSEVBREVSX3QqIGRpYl9oZHJfcHRyID0gKF9ibXBfZGliX0JJVE1BUElORk9IRUFERVJfdCopKCAodWludDhfdCopcmVjb3JkLmRhdGEgKyBfQk1QX0ZJTEVfSERSX1NaICk7Ci0gIGlmICggIV92YWxpZGF0ZV9kaWJfaGRyKCBkaWJfaGRyX3B0ciwgcmVjb3JkLnN6ICkgKSB7Ci0gICAgZnJlZSggcmVjb3JkLmRhdGEgKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIGJpdG1hcHMgY2FuIGhhdmUgbmVnYXRpdmUgZGltcyB0byBpbmRpY2F0ZSB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGZsaXBwZWQKLSAgdWludDMyX3Qgd2lkdGggPSAqdyA9IGFicyggZGliX2hkcl9wdHItPncgKTsKLSAgdWludDMyX3QgaGVpZ2h0ID0gKmggPSBhYnMoIGRpYl9oZHJfcHRyLT5oICk7Ci0KLSAgLy8gVE9ETyhBbnRvbikgZmxpcCBpbWFnZSBtZW1vcnkgYXQgdGhlIGVuZCBpZiB0aGlzIGlzIHRydWUuIGJlY2F1c2UgZG9pbmcgaXQgcGVyIHJvdyB3YXMgbWFraW5nIG1lIHdyaXRlIGJ1Z3MuCi0gIC8vIGJvb2wgdmVydGljYWxseV9mbGlwID0gZGliX2hkcl9wdHItPmggPiAwID8gZmFsc2UgOiB0cnVlOwotCi0gIC8vIGNoYW5uZWwgY291bnQgYW5kIHBhbGV0dGUgYXJlIG5vdCB3ZWxsIGRlZmluZWQgaW4gdGhlIGhlYWRlciBzbyB3ZSBtYWtlIGEgZ29vZCBndWVzcyBoZXJlCi0gIHVpbnQzMl90IG5fZHN0X2NoYW5zID0gMywgbl9zcmNfY2hhbnMgPSAzOwotICBib29sIGhhc19wYWxldHRlID0gZmFsc2U7Ci0gIHN3aXRjaCAoIGRpYl9oZHJfcHRyLT5icHAgKSB7Ci0gIGNhc2UgMzI6IG5fZHN0X2NoYW5zID0gbl9zcmNfY2hhbnMgPSA0OyBicmVhazsgLy8gdGVjaG5pY2FsbHkgY2FuIGJlIFJHQiBidXQgbm90IHN1cHBvcnRlZAotICBjYXNlIDI0OiBuX2RzdF9jaGFucyA9IG5fc3JjX2NoYW5zID0gMzsgYnJlYWs7IC8vIHRlY2huaWNhbGx5IGNhbiBiZSBSR0JBIGJ1dCBub3Qgc3VwcG9ydGVkCi0gIGNhc2UgODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlbXMgdG8gYWx3YXlzIHVzZSBhIEJHUjAgcGFsZXR0ZSwgZXZlbiBmb3IgZ3JleXNjYWxlCi0gICAgbl9kc3RfY2hhbnMgPSAzOwotICAgIGhhc19wYWxldHRlID0gdHJ1ZTsKLSAgICBuX3NyY19jaGFucyA9IDE7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDogLy8gYWx3YXlzIGhhcyBhIHBhbGV0dGUgLSBuZWVkZWQgZm9yIGEgTVMtc2F2ZWQgQk1QCi0gICAgbl9kc3RfY2hhbnMgPSAzOwotICAgIGhhc19wYWxldHRlID0gdHJ1ZTsKLSAgICBuX3NyY19jaGFucyA9IDE7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMTogLy8gMS1icHAgbWVhbnMgdGhlIHBhbGV0dGUgaGFzIDMgY29sb3VyIGNoYW5uZWxzIHdpdGggMiBjb2xvdXJzIGkuZS4gbW9ub2Nocm9tZSBidXQgbm90IGFsd2F5cyBibGFjayAmIHdoaXRlCi0gICAgbl9kc3RfY2hhbnMgPSAzOwotICAgIGhhc19wYWxldHRlID0gdHJ1ZTsKLSAgICBuX3NyY19jaGFucyA9IDE7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6IC8vIHRoaXMgaW5jbHVkZXMgMmJwcCBhbmQgMTZicHAKLSAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgIHJldHVybiBOVUxMOwotICB9IC8vIGVuZHN3aXRjaAotICAqbl9jaGFucyA9IG5fZHN0X2NoYW5zOwotICAvLyBOT1RFKEFudG9uKSBzb21lIGltYWdlIGZvcm1hdHMgYXJlIG5vdCBhbGxvd2VkIGEgcGFsZXR0ZSAtIGNvdWxkIGNoZWNrIGZvciBhIGJhZCBoZWFkZXIgc3BlYyBoZXJlIGFsc28KLSAgaWYgKCBkaWJfaGRyX3B0ci0+bl9jb2xvdXJzX2luX3BhbGV0dGUgPiAwICkgeyBoYXNfcGFsZXR0ZSA9IHRydWU7IH0KLQotI2lmZGVmIEFQR19CTVBfREVCVUdfT1VUUFVUCi0gIHByaW50ZiggImFwZ19ibXBfZGVidWc6IHJlYWRpbmcgaW1hZ2VcbnwtZmlsZW5hbWUgYCVzYFxufC1kaW1zICV1eCV1IHBpeGVsc1xufC1icHAgJXVcbnwtbl9zcmNfY2hhbnMgJXVcbnwtbl9kc3RfY2hhbnMgJXVcbiIsIGZpbGVuYW1lLCAqdywgKmgsCi0gICAgZGliX2hkcl9wdHItPmJwcCwgbl9zcmNfY2hhbnMsIG5fZHN0X2NoYW5zICk7Ci0jZW5kaWYKLQotICB1aW50MzJfdCBwYWxldHRlX29mZnNldCA9IF9CTVBfRklMRV9IRFJfU1ogKyBkaWJfaGRyX3B0ci0+dGhpc19oZWFkZXJfc3o7Ci0gIGJvb2wgaGFzX2JpdG1hc2tzICAgICAgID0gZmFsc2U7Ci0gIGlmICggQklfQklURklFTERTID09IGRpYl9oZHJfcHRyLT5jb21wcmVzc2lvbl9tZXRob2QgfHwgQklfQUxQSEFCSVRGSUVMRFMgPT0gZGliX2hkcl9wdHItPmNvbXByZXNzaW9uX21ldGhvZCApIHsKLSAgICBoYXNfYml0bWFza3MgPSB0cnVlOwotICAgIHBhbGV0dGVfb2Zmc2V0ICs9IDEyOwotICB9Ci0gIGlmICggcGFsZXR0ZV9vZmZzZXQgPiByZWNvcmQuc3ogKSB7Ci0gICAgZnJlZSggcmVjb3JkLmRhdGEgKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIHdvcmsgb3V0IGlmIGFueSBwYWRkaW5nIGhvdyBtdWNoIHRvIHNraXAgYXQgZW5kIG9mIGVhY2ggcm93Ci0gIHVpbnQzMl90IHVucGFkZGVkX3Jvd19zeiA9IHdpZHRoICogbl9zcmNfY2hhbnM7Ci0gIC8vIGJpdC1lbmNvZGVkIHBhbGV0dGUgaW5kaWNlcyBoYXZlIGRpZmZlcmVudCBwYWRkaW5nIHByb3BlcnRpZXMKLSAgaWYgKCA0ID09IGRpYl9oZHJfcHRyLT5icHAgKSB7Ci0gICAgdW5wYWRkZWRfcm93X3N6ID0gd2lkdGggJSAyID4gMCA/IHdpZHRoIC8gMiArIDEgOiB3aWR0aCAvIDI7IC8vIGZpbmQgaG93IG1hbnkgd2hvbGUgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoaXMgYml0IHdpZHRoCi0gIH0KLSAgaWYgKCAxID09IGRpYl9oZHJfcHRyLT5icHAgKSB7Ci0gICAgdW5wYWRkZWRfcm93X3N6ID0gd2lkdGggJSA4ID4gMCA/IHdpZHRoIC8gOCArIDEgOiB3aWR0aCAvIDg7IC8vIGZpbmQgaG93IG1hbnkgd2hvbGUgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoaXMgYml0IHdpZHRoCi0gIH0KLSAgdWludDMyX3Qgcm93X3BhZGRpbmdfc3ogPSAwID09IHVucGFkZGVkX3Jvd19zeiAlIDQgPyAwIDogNCAtICggdW5wYWRkZWRfcm93X3N6ICUgNCApOyAvLyBOT1RFKEFudG9uKSBkaWRuJ3QgZXhwZWN0IG9wZXJhdG9yIHByZWNlZGVuY2Ugb2YgLSBvdmVyICUKLQotICAvLyBhbm90aGVyIGZpbGUgc2l6ZSBpbnRlZ3JpdHkgY2hlY2s6IHBhcnRpYWxseSB2YWxpZGF0ZSBzb3VyY2UgaW1hZ2UgZGF0YSBzaXplCi0gIC8vICdpbWFnZV9kYXRhX29mZnNldCcgaXMgYnkgcm93IHBhZGRlZCB0byA0IGJ5dGVzIGFuZCBpcyBlaXRoZXIgY29sb3VyIGRhdGEgb3IgcGFsZXR0ZSBpbmRpY2VzLgotICBpZiAoIGZpbGVfaGRyX3B0ci0+aW1hZ2VfZGF0YV9vZmZzZXQgKyAoIHVucGFkZGVkX3Jvd19zeiArIHJvd19wYWRkaW5nX3N6ICkgKiBoZWlnaHQgPiByZWNvcmQuc3ogKSB7Ci0gICAgZnJlZSggcmVjb3JkLmRhdGEgKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIGZpbmQgd2hpY2ggYml0IG51bWJlciBlYWNoIGNvbG91ciBjaGFubmVsIHN0YXJ0cyBhdCwgc28gd2UgY2FuIHNlcGFyYXRlIGNvbG91cnMgb3V0Ci0gIHVpbnQzMl90IGJpdHNoaWZ0X3JnYmFbNF0gPSB7MCwgMCwgMCwgMH07IC8vIE5PVEUoQW50b24pIG5vdGljZWQgdGhpcyB3YXMgaW50IGFuZCBub3QgdWludDMyX3Qgc28gY2hhbmdlZCBpdC4gMTcgTWFyIDIwMjAKLSAgdWludDMyX3QgYml0bWFza19hICAgICAgICA9IDA7Ci0gIGlmICggaGFzX2JpdG1hc2tzICkgewotICAgIGJpdG1hc2tfYSAgICAgICAgPSB+KCBkaWJfaGRyX3B0ci0+Yml0bWFza19yIHwgZGliX2hkcl9wdHItPmJpdG1hc2tfZyB8IGRpYl9oZHJfcHRyLT5iaXRtYXNrX2IgKTsKLSAgICBiaXRzaGlmdF9yZ2JhWzBdID0gX2JpdHNjYW4oIGRpYl9oZHJfcHRyLT5iaXRtYXNrX3IgKTsKLSAgICBiaXRzaGlmdF9yZ2JhWzFdID0gX2JpdHNjYW4oIGRpYl9oZHJfcHRyLT5iaXRtYXNrX2cgKTsKLSAgICBiaXRzaGlmdF9yZ2JhWzJdID0gX2JpdHNjYW4oIGRpYl9oZHJfcHRyLT5iaXRtYXNrX2IgKTsKLSAgICBiaXRzaGlmdF9yZ2JhWzNdID0gX2JpdHNjYW4oIGJpdG1hc2tfYSApOwotICB9Ci0KLSAgLy8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgb3V0cHV0IHBpeGVscyBibG9jay4gY2FzdCB0byBzaXplX3QgaW4gY2FzZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHRoZSBtYXggb2YgNjU1MzYgYW5kIG5fZHN0X2NoYW5zID4gMQotICB1bnNpZ25lZCBjaGFyKiBkc3RfaW1nX3B0ciA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoIChzaXplX3Qpd2lkdGggKiAoc2l6ZV90KWhlaWdodCAqIChzaXplX3Qpbl9kc3RfY2hhbnMgKTsKLSAgaWYgKCAhZHN0X2ltZ19wdHIgKSB7Ci0gICAgZnJlZSggcmVjb3JkLmRhdGEgKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHVpbnQ4X3QqIHBhbGV0dGVfZGF0YV9wdHIgPSAodWludDhfdCopcmVjb3JkLmRhdGEgKyBwYWxldHRlX29mZnNldDsKLSAgdWludDhfdCogc3JjX2ltZ19wdHIgICAgICA9ICh1aW50OF90KilyZWNvcmQuZGF0YSArIGZpbGVfaGRyX3B0ci0+aW1hZ2VfZGF0YV9vZmZzZXQ7Ci0gIHNpemVfdCBkc3Rfc3RyaWRlX3N6ICAgICAgPSB3aWR0aCAqIG5fZHN0X2NoYW5zOwotCi0gIC8vICAgPT0gMzItYnBwIC0+IDMyLWJpdCBSR0JBLiA9PSAzMi1iaXQgYW5kIDE2LWJpdCByZXF1aXJlIGJpdG1hc2tzCi0gIGlmICggMzIgPT0gZGliX2hkcl9wdHItPmJwcCApIHsKLSAgICAvLyBjaGVjayBzb3VyY2UgaW1hZ2UgaGFzIGVub3VnaCBkYXRhIGluIGl0IHRvIHJlYWQgZnJvbQotICAgIGlmICggKHNpemVfdClmaWxlX2hkcl9wdHItPmltYWdlX2RhdGFfb2Zmc2V0ICsgKHNpemVfdCloZWlnaHQgKiAoc2l6ZV90KXdpZHRoICogKHNpemVfdCluX3NyY19jaGFucyA+IHJlY29yZC5zeiApIHsKLSAgICAgIGZyZWUoIHJlY29yZC5kYXRhICk7Ci0gICAgICBmcmVlKCBkc3RfaW1nX3B0ciApOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHNpemVfdCBzcmNfYnl0ZV9pZHggPSAwOwotICAgIGZvciAoIHVpbnQzMl90IHIgPSAwOyByIDwgaGVpZ2h0OyByKysgKSB7Ci0gICAgICBzaXplX3QgZHN0X3BpeGVsc19pZHggPSByICogZHN0X3N0cmlkZV9zejsKLSAgICAgIGZvciAoIHVpbnQzMl90IGMgPSAwOyBjIDwgd2lkdGg7IGMrKyApIHsKLSAgICAgICAgdWludDMyX3QgcGl4ZWw7Ci0gICAgICAgIG1lbWNweSggJnBpeGVsLCAmc3JjX2ltZ19wdHJbc3JjX2J5dGVfaWR4XSwgNCApOwotICAgICAgICAvLyBOT1RFKEFudG9uKSB0aGUgYmVsb3cgYXNzdW1lcyAzMi1iaXRzIGlzIGFsd2F5cyBSR0JBIDEgYnl0ZSBwZXIgY2hhbm5lbC4gMTAsMTAsMTAgUkdCIGV4aXN0cyB0aG91Z2ggYW5kIGlzbid0IGhhbmRsZWQuCi0gICAgICAgIGRzdF9pbWdfcHRyW2RzdF9waXhlbHNfaWR4KytdID0gKCB1aW50OF90ICkoICggcGl4ZWwgJiBkaWJfaGRyX3B0ci0+Yml0bWFza19yICkgPj4gYml0c2hpZnRfcmdiYVswXSApOwotICAgICAgICBkc3RfaW1nX3B0cltkc3RfcGl4ZWxzX2lkeCsrXSA9ICggdWludDhfdCApKCAoIHBpeGVsICYgZGliX2hkcl9wdHItPmJpdG1hc2tfZyApID4+IGJpdHNoaWZ0X3JnYmFbMV0gKTsKLSAgICAgICAgZHN0X2ltZ19wdHJbZHN0X3BpeGVsc19pZHgrK10gPSAoIHVpbnQ4X3QgKSggKCBwaXhlbCAmIGRpYl9oZHJfcHRyLT5iaXRtYXNrX2IgKSA+PiBiaXRzaGlmdF9yZ2JhWzJdICk7Ci0gICAgICAgIGRzdF9pbWdfcHRyW2RzdF9waXhlbHNfaWR4KytdID0gKCB1aW50OF90ICkoICggcGl4ZWwgJiBiaXRtYXNrX2EgKSA+PiBiaXRzaGlmdF9yZ2JhWzNdICk7Ci0gICAgICAgIHNyY19ieXRlX2lkeCArPSA0OwotICAgICAgfQotICAgICAgc3JjX2J5dGVfaWR4ICs9IHJvd19wYWRkaW5nX3N6OwotICAgIH0KLQotICAgIC8vID09IDgtYnBwIC0+IDI0LWJpdCBSR0IgPT0KLSAgfSBlbHNlIGlmICggOCA9PSBkaWJfaGRyX3B0ci0+YnBwICYmIGhhc19wYWxldHRlICkgewotICAgIC8vIHZhbGlkYXRlIGluZGljZXMgKGJvZHkgb2YgaW1hZ2UgZGF0YSkgZml0cyBpbiBmaWxlCi0gICAgaWYgKCBmaWxlX2hkcl9wdHItPmltYWdlX2RhdGFfb2Zmc2V0ICsgaGVpZ2h0ICogd2lkdGggPiByZWNvcmQuc3ogKSB7Ci0gICAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgICAgZnJlZSggZHN0X2ltZ19wdHIgKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzaXplX3Qgc3JjX2J5dGVfaWR4ID0gMDsKLSAgICBmb3IgKCB1aW50MzJfdCByID0gMDsgciA8IGhlaWdodDsgcisrICkgewotICAgICAgc2l6ZV90IGRzdF9waXhlbHNfaWR4ID0gKCBoZWlnaHQgLSAxIC0gciApICogZHN0X3N0cmlkZV9zejsKLSAgICAgIGZvciAoIHVpbnQzMl90IGMgPSAwOyBjIDwgd2lkdGg7IGMrKyApIHsKLSAgICAgICAgLy8gIm1vc3QgcGFsZXR0ZXMgYXJlIDQgYnl0ZXMgaW4gUkdCMCBvcmRlciBidXQgMyBmb3IuLi4iIC0gaXQgd2FzIGFjdHVhbGx5IEJSRzAgaW4gb2xkIGltYWdlcyAtLSBBbnRvbgotICAgICAgICB1aW50OF90IGluZGV4ID0gc3JjX2ltZ19wdHJbc3JjX2J5dGVfaWR4XTsgLy8gOC1iaXQgaW5kZXggdmFsdWUgcGVyIHBpeGVsCi0KLSAgICAgICAgaWYgKCBwYWxldHRlX29mZnNldCArIGluZGV4ICogNCArIDIgPj0gcmVjb3JkLnN6ICkgewotICAgICAgICAgIGZyZWUoIHJlY29yZC5kYXRhICk7Ci0gICAgICAgICAgcmV0dXJuIGRzdF9pbWdfcHRyOwotICAgICAgICB9Ci0gICAgICAgIGRzdF9pbWdfcHRyW2RzdF9waXhlbHNfaWR4KytdID0gcGFsZXR0ZV9kYXRhX3B0cltpbmRleCAqIDQgKyAyXTsKLSAgICAgICAgZHN0X2ltZ19wdHJbZHN0X3BpeGVsc19pZHgrK10gPSBwYWxldHRlX2RhdGFfcHRyW2luZGV4ICogNCArIDFdOwotICAgICAgICBkc3RfaW1nX3B0cltkc3RfcGl4ZWxzX2lkeCsrXSA9IHBhbGV0dGVfZGF0YV9wdHJbaW5kZXggKiA0ICsgMF07Ci0gICAgICAgIHNyY19ieXRlX2lkeCsrOwotICAgICAgfQotICAgICAgc3JjX2J5dGVfaWR4ICs9IHJvd19wYWRkaW5nX3N6OwotICAgIH0KLQotICAgIC8vID09IDQtYnBwICgxNi1jb2xvdXIpIC0+IDI0LWJpdCBSR0IgPT0KLSAgfSBlbHNlIGlmICggNCA9PSBkaWJfaGRyX3B0ci0+YnBwICYmIGhhc19wYWxldHRlICkgewotICAgIHNpemVfdCBzcmNfYnl0ZV9pZHggPSAwOwotICAgIGZvciAoIHVpbnQzMl90IHIgPSAwOyByIDwgaGVpZ2h0OyByKysgKSB7Ci0gICAgICBzaXplX3QgZHN0X3BpeGVsc19pZHggPSAoIGhlaWdodCAtIDEgLSByICkgKiBkc3Rfc3RyaWRlX3N6OwotICAgICAgZm9yICggdWludDMyX3QgYyA9IDA7IGMgPCB3aWR0aDsgYysrICkgewotICAgICAgICBpZiAoIGZpbGVfaGRyX3B0ci0+aW1hZ2VfZGF0YV9vZmZzZXQgKyBzcmNfYnl0ZV9pZHggPiByZWNvcmQuc3ogKSB7Ci0gICAgICAgICAgZnJlZSggcmVjb3JkLmRhdGEgKTsKLSAgICAgICAgICBmcmVlKCBkc3RfaW1nX3B0ciApOwotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8vIGhhbmRsZSAyIHBpeGVscyBhdCBhIHRpbWUKLSAgICAgICAgdWludDhfdCBwaXhlbF9kdW8gPSBzcmNfaW1nX3B0cltzcmNfYnl0ZV9pZHhdOwotICAgICAgICB1aW50OF90IGFfaW5kZXggICA9ICggMHhGRiAmIHBpeGVsX2R1byApID4+IDQ7Ci0gICAgICAgIHVpbnQ4X3QgYl9pbmRleCAgID0gMHhGICYgcGl4ZWxfZHVvOwotCi0gICAgICAgIGlmICggcGFsZXR0ZV9vZmZzZXQgKyBhX2luZGV4ICogNCArIDIgPj0gcmVjb3JkLnN6ICkgeyAvLyBpbnZhbGlkIHNyYyBpbWFnZQotICAgICAgICAgIGZyZWUoIHJlY29yZC5kYXRhICk7Ci0gICAgICAgICAgcmV0dXJuIGRzdF9pbWdfcHRyOwotICAgICAgICB9Ci0gICAgICAgIGlmICggZHN0X3BpeGVsc19pZHggKyAzID4gd2lkdGggKiBoZWlnaHQgKiBuX2RzdF9jaGFucyApIHsgLy8gZG9uZQotICAgICAgICAgIGZyZWUoIHJlY29yZC5kYXRhICk7Ci0gICAgICAgICAgcmV0dXJuIGRzdF9pbWdfcHRyOwotICAgICAgICB9Ci0gICAgICAgIGRzdF9pbWdfcHRyW2RzdF9waXhlbHNfaWR4KytdID0gcGFsZXR0ZV9kYXRhX3B0clthX2luZGV4ICogNCArIDJdOwotICAgICAgICBkc3RfaW1nX3B0cltkc3RfcGl4ZWxzX2lkeCsrXSA9IHBhbGV0dGVfZGF0YV9wdHJbYV9pbmRleCAqIDQgKyAxXTsKLSAgICAgICAgZHN0X2ltZ19wdHJbZHN0X3BpeGVsc19pZHgrK10gPSBwYWxldHRlX2RhdGFfcHRyW2FfaW5kZXggKiA0ICsgMF07Ci0gICAgICAgIGlmICggKytjID49IHdpZHRoICkgeyAvLyBhZHZhbmNlIGEgY29sdW1uCi0gICAgICAgICAgYyA9IDA7Ci0gICAgICAgICAgcisrOwotICAgICAgICAgIGlmICggciA+PSBoZWlnaHQgKSB7IC8vIGRvbmUuIG5vIG5lZWQgdG8gZ2V0IHNlY29uZCBwaXhlbC4gZWcgYSAxeDEgcGl4ZWwgaW1hZ2UuCi0gICAgICAgICAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgICAgICAgICAgcmV0dXJuIGRzdF9pbWdfcHRyOwotICAgICAgICAgIH0KLSAgICAgICAgICBkc3RfcGl4ZWxzX2lkeCA9ICggaGVpZ2h0IC0gMSAtIHIgKSAqIGRzdF9zdHJpZGVfc3o7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHBhbGV0dGVfb2Zmc2V0ICsgYl9pbmRleCAqIDQgKyAyID49IHJlY29yZC5zeiApIHsgLy8gaW52YWxpZCBzcmMgaW1hZ2UKLSAgICAgICAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgICAgICAgIHJldHVybiBkc3RfaW1nX3B0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGRzdF9waXhlbHNfaWR4ICsgMyA+IHdpZHRoICogaGVpZ2h0ICogbl9kc3RfY2hhbnMgKSB7IC8vIGRvbmUuIHByb2JhYmx5IHJlZHVuZGFudCBjaGVjayBzaW5jZSBjaGVja2luZyByID49IGhlaWdodC4KLSAgICAgICAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgICAgICAgIHJldHVybiBkc3RfaW1nX3B0cjsKLSAgICAgICAgfQotICAgICAgICBkc3RfaW1nX3B0cltkc3RfcGl4ZWxzX2lkeCsrXSA9IHBhbGV0dGVfZGF0YV9wdHJbYl9pbmRleCAqIDQgKyAyXTsKLSAgICAgICAgZHN0X2ltZ19wdHJbZHN0X3BpeGVsc19pZHgrK10gPSBwYWxldHRlX2RhdGFfcHRyW2JfaW5kZXggKiA0ICsgMV07Ci0gICAgICAgIGRzdF9pbWdfcHRyW2RzdF9waXhlbHNfaWR4KytdID0gcGFsZXR0ZV9kYXRhX3B0cltiX2luZGV4ICogNCArIDBdOwotICAgICAgICBzcmNfYnl0ZV9pZHgrKzsKLSAgICAgIH0KLSAgICAgIHNyY19ieXRlX2lkeCArPSByb3dfcGFkZGluZ19zejsKLSAgICB9Ci0KLSAgICAvLyA9PSAxLWJwcCAtPiAyNC1iaXQgUkdCID09Ci0gIH0gZWxzZSBpZiAoIDEgPT0gZGliX2hkcl9wdHItPmJwcCAmJiBoYXNfcGFsZXR0ZSApIHsKLSAgICAvKiBlbmNvZGluZyBtZXRob2QgZm9yIG1vbm9jaHJvbWUgaXMgbm90IHdlbGwgZG9jdW1lbnRlZC4KLSAgICBhIDJ4MiBwaXhlbCBpbWFnZSBpcyBzdG9yZWQgYXMgNCAxLWJpdCBwYWxldHRlIGluZGV4ZXMKLSAgICB0aGUgcGFsZXR0ZSBpcyBzdG9yZWQgYXMgYW55IDIgUkdCMCBjb2xvdXJzIChub3QgbmVjZXNzYXJpbHkgQiZXKQotICAgIHNvIGZvciBhbiBpbWFnZSB3aXRoIGluZGV4ZXMgbGlrZSBzbzoKLSAgICAxIDEKLSAgICAwIDEKLSAgICBpdCBpcyBiaXQtZW5jb2RlZCBhcyBmb2xsb3dzLCBzdGFydGluZyBhdCBNU0I6Ci0gICAgMDEwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgKGZpcnN0IGJ5dGUgdmFsICA2NCkKLSAgICAxMTAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAoZmlyc3QgYnl0ZSB2YWwgMTkyKQotICAgIGRhdGEgaXMgc3RpbGwgc3BsaXQgYnkgcm93IGFuZCBlYWNoIHJvdyBwYWRkZWQgdG8gNCBieXRlIG11bHRpcGxlcwotICAgICAqLwotICAgIHNpemVfdCBzcmNfYnl0ZV9pZHggPSAwOwotICAgIGZvciAoIHVpbnQzMl90IHIgPSAwOyByIDwgaGVpZ2h0OyByKysgKSB7Ci0gICAgICB1aW50OF90IGJpdF9pZHggICAgICAgPSAwOyAvLyB1c2VkIGluIG1vbm9jaHJvbWUKLSAgICAgIHNpemVfdCBkc3RfcGl4ZWxzX2lkeCA9ICggaGVpZ2h0IC0gMSAtIHIgKSAqIGRzdF9zdHJpZGVfc3o7Ci0gICAgICBmb3IgKCB1aW50MzJfdCBjID0gMDsgYyA8IHdpZHRoOyBjKysgKSB7Ci0gICAgICAgIGlmICggOCA9PSBiaXRfaWR4ICkgeyAvLyBzdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgYnl0ZQotICAgICAgICAgIHNyY19ieXRlX2lkeCsrOwotICAgICAgICAgIGJpdF9pZHggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICggZmlsZV9oZHJfcHRyLT5pbWFnZV9kYXRhX29mZnNldCArIHNyY19ieXRlX2lkeCA+IHJlY29yZC5zeiApIHsKLSAgICAgICAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgICAgICAgIHJldHVybiBkc3RfaW1nX3B0cjsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IHBpeGVsX29jdCAgID0gc3JjX2ltZ19wdHJbc3JjX2J5dGVfaWR4XTsKLSAgICAgICAgdWludDhfdCBiaXQgICAgICAgICA9IDEyOCA+PiBiaXRfaWR4OwotICAgICAgICB1aW50OF90IG1hc2tlZCAgICAgID0gcGl4ZWxfb2N0ICYgYml0OwotICAgICAgICB1aW50OF90IHBhbGV0dGVfaWR4ID0gbWFza2VkID4gMCA/IDEgOiAwOwotCi0gICAgICAgIGlmICggcGFsZXR0ZV9vZmZzZXQgKyBwYWxldHRlX2lkeCAqIDQgKyAyID49IHJlY29yZC5zeiApIHsKLSAgICAgICAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgICAgICAgIHJldHVybiBkc3RfaW1nX3B0cjsKLSAgICAgICAgfQotICAgICAgICBkc3RfaW1nX3B0cltkc3RfcGl4ZWxzX2lkeCsrXSA9IHBhbGV0dGVfZGF0YV9wdHJbcGFsZXR0ZV9pZHggKiA0ICsgMl07Ci0gICAgICAgIGRzdF9pbWdfcHRyW2RzdF9waXhlbHNfaWR4KytdID0gcGFsZXR0ZV9kYXRhX3B0cltwYWxldHRlX2lkeCAqIDQgKyAxXTsKLSAgICAgICAgZHN0X2ltZ19wdHJbZHN0X3BpeGVsc19pZHgrK10gPSBwYWxldHRlX2RhdGFfcHRyW3BhbGV0dGVfaWR4ICogNCArIDBdOwotICAgICAgICBiaXRfaWR4Kys7Ci0gICAgICB9Ci0gICAgICBzcmNfYnl0ZV9pZHggKz0gKCByb3dfcGFkZGluZ19zeiArIDEgKTsgLy8gMWJwcCBpcyBzcGVjaWFsIGhlcmUKLSAgICB9Ci0KLSAgICAvLyA9PSAyNC1icHAgLT4gMjQtYml0IFJHQiA9PSAoYnV0IGFsc28gc2hvdWxkIGhhbmRsZSBzb21lIG90aGVyIG5fY2hhbnMgY2FzZXMpCi0gIH0gZWxzZSB7Ci0gICAgLy8gTk9URShBbnRvbikgdGhpcyBvbmx5IHN1cHBvcnRzIDEgYnl0ZSBwZXIgY2hhbm5lbAotICAgIGlmICggZmlsZV9oZHJfcHRyLT5pbWFnZV9kYXRhX29mZnNldCArIGhlaWdodCAqIHdpZHRoICogbl9kc3RfY2hhbnMgPiByZWNvcmQuc3ogKSB7Ci0gICAgICBmcmVlKCByZWNvcmQuZGF0YSApOwotICAgICAgZnJlZSggZHN0X2ltZ19wdHIgKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzaXplX3Qgc3JjX2J5dGVfaWR4ID0gMDsKLSAgICBmb3IgKCB1aW50MzJfdCByID0gMDsgciA8IGhlaWdodDsgcisrICkgewotICAgICAgc2l6ZV90IGRzdF9waXhlbHNfaWR4ID0gKCBoZWlnaHQgLSAxIC0gciApICogZHN0X3N0cmlkZV9zejsKLSAgICAgIGZvciAoIHVpbnQzMl90IGMgPSAwOyBjIDwgd2lkdGg7IGMrKyApIHsKLSAgICAgICAgLy8gcmUtb3JkZXJzIGZyb20gQkdSIHRvIFJHQgotICAgICAgICBpZiAoIG5fZHN0X2NoYW5zID4gMyApIHsgZHN0X2ltZ19wdHJbZHN0X3BpeGVsc19pZHgrK10gPSBzcmNfaW1nX3B0cltzcmNfYnl0ZV9pZHggKyAzXTsgfQotICAgICAgICBpZiAoIG5fZHN0X2NoYW5zID4gMiApIHsgZHN0X2ltZ19wdHJbZHN0X3BpeGVsc19pZHgrK10gPSBzcmNfaW1nX3B0cltzcmNfYnl0ZV9pZHggKyAyXTsgfQotICAgICAgICBpZiAoIG5fZHN0X2NoYW5zID4gMSApIHsgZHN0X2ltZ19wdHJbZHN0X3BpeGVsc19pZHgrK10gPSBzcmNfaW1nX3B0cltzcmNfYnl0ZV9pZHggKyAxXTsgfQotICAgICAgICBkc3RfaW1nX3B0cltkc3RfcGl4ZWxzX2lkeCsrXSA9IHNyY19pbWdfcHRyW3NyY19ieXRlX2lkeF07Ci0gICAgICAgIHNyY19ieXRlX2lkeCArPSBuX3NyY19jaGFuczsKLSAgICAgIH0KLSAgICAgIHNyY19ieXRlX2lkeCArPSByb3dfcGFkZGluZ19zejsKLSAgICB9Ci0gIH0gLy8gZW5kaWYgYnBwCi0KLSAgZnJlZSggcmVjb3JkLmRhdGEgKTsKLSAgcmV0dXJuIGRzdF9pbWdfcHRyOwotfQotCi12b2lkIGFwZ19ibXBfZnJlZSggdW5zaWduZWQgY2hhciogcGl4ZWxzX3B0ciApIHsKLSAgaWYgKCAhcGl4ZWxzX3B0ciApIHsgcmV0dXJuOyB9Ci0gIGZyZWUoIHBpeGVsc19wdHIgKTsKLX0KLQotdW5zaWduZWQgaW50IGFwZ19ibXBfd3JpdGUoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCB1bnNpZ25lZCBjaGFyKiBwaXhlbHNfcHRyLCBpbnQgdywgaW50IGgsIHVuc2lnbmVkIGludCBuX2NoYW5zICkgewotICBpZiAoICFmaWxlbmFtZSB8fCAhcGl4ZWxzX3B0ciApIHsgcmV0dXJuIDA7IH0KLSAgaWYgKCAwID09IHcgfHwgMCA9PSBoICkgeyByZXR1cm4gMDsgfQotICBpZiAoIGxhYnMoIHcgKSA+IF9CTVBfTUFYX0RJTVMgfHwgbGFicyggaCApID4gX0JNUF9NQVhfRElNUyApIHsgcmV0dXJuIDA7IH0KLSAgaWYgKCBuX2NoYW5zICE9IDMgJiYgbl9jaGFucyAhPSA0ICkgeyByZXR1cm4gMDsgfQotCi0gIHVpbnQzMl90IGhlaWdodCA9ICh1aW50MzJfdClsYWJzKCBoICk7Ci0gIHVpbnQzMl90IHdpZHRoICA9ICh1aW50MzJfdClsYWJzKCB3ICk7Ci0gIC8vIHdvcmsgb3V0IGlmIGFueSBwYWRkaW5nIGhvdyBtdWNoIHRvIHNraXAgYXQgZW5kIG9mIGVhY2ggcm93Ci0gIGNvbnN0IHNpemVfdCB1bnBhZGRlZF9yb3dfc3ogICAgICA9IHdpZHRoICogbl9jaGFuczsKLSAgY29uc3Qgc2l6ZV90IHJvd19wYWRkaW5nX3N6ICAgICAgID0gMCA9PSB1bnBhZGRlZF9yb3dfc3ogJSA0ID8gMCA6IDQgLSB1bnBhZGRlZF9yb3dfc3ogJSA0OwotICBjb25zdCBzaXplX3Qgcm93X3N6ICAgICAgICAgICAgICAgPSB1bnBhZGRlZF9yb3dfc3ogKyByb3dfcGFkZGluZ19zejsKLSAgY29uc3Qgc2l6ZV90IGRzdF9waXhlbHNfcGFkZGVkX3N6ID0gcm93X3N6ICogaGVpZ2h0OwotCi0gIGNvbnN0IHNpemVfdCBkaWJfaGRyX3N6ID0gc2l6ZW9mKCBfYm1wX2RpYl9CSVRNQVBJTkZPSEVBREVSX3QgKTsKLSAgX2JtcF9maWxlX2hlYWRlcl90IGZpbGVfaGRyOwotICB7Ci0gICAgZmlsZV9oZHIuZmlsZV90eXBlWzBdICAgICAgPSAnQic7Ci0gICAgZmlsZV9oZHIuZmlsZV90eXBlWzFdICAgICAgPSAnTSc7Ci0gICAgZmlsZV9oZHIuZmlsZV9zeiAgICAgICAgICAgPSBfQk1QX0ZJTEVfSERSX1NaICsgKHVpbnQzMl90KWRpYl9oZHJfc3ogKyAodWludDMyX3QpZHN0X3BpeGVsc19wYWRkZWRfc3o7Ci0gICAgZmlsZV9oZHIucmVzZXJ2ZWQxICAgICAgICAgPSAwOwotICAgIGZpbGVfaGRyLnJlc2VydmVkMiAgICAgICAgID0gMDsKLSAgICBmaWxlX2hkci5pbWFnZV9kYXRhX29mZnNldCA9IF9CTVBfRklMRV9IRFJfU1ogKyAodWludDMyX3QpZGliX2hkcl9zejsKLSAgfQotICBfYm1wX2RpYl9CSVRNQVBJTkZPSEVBREVSX3QgZGliX2hkcjsKLSAgewotICAgIGRpYl9oZHIudGhpc19oZWFkZXJfc3ogICAgICAgICA9IF9CTVBfTUlOX0RJQl9IRFJfU1o7IC8vIE5PVEU6IG11c3QgYmUgNDAgYW5kIG5vdCBpbmNsdWRlIHRoZSBiaXRtYXNrIG1lbW9yeSBpbiBzaXplIGhlcmUKLSAgICBkaWJfaGRyLncgICAgICAgICAgICAgICAgICAgICAgPSB3OwotICAgIGRpYl9oZHIuaCAgICAgICAgICAgICAgICAgICAgICA9IGg7Ci0gICAgZGliX2hkci5uX3BsYW5lcyAgICAgICAgICAgICAgID0gMTsKLSAgICBkaWJfaGRyLmJwcCAgICAgICAgICAgICAgICAgICAgPSAzID09IG5fY2hhbnMgPyAyNCA6IDMyOwotICAgIGRpYl9oZHIuY29tcHJlc3Npb25fbWV0aG9kICAgICA9IDMgPT0gbl9jaGFucyA/IEJJX1JHQiA6IEJJX0JJVEZJRUxEUzsKLSAgICBkaWJfaGRyLmltYWdlX3VuY29tcHJlc3NlZF9zeiAgPSAwOwotICAgIGRpYl9oZHIuaG9yaXpfcGl4ZWxzX3Blcl9tZXRlciA9IDA7Ci0gICAgZGliX2hkci52ZXJ0X3BpeGVsc19wZXJfbWV0ZXIgID0gMDsKLSAgICBkaWJfaGRyLm5fY29sb3Vyc19pbl9wYWxldHRlICAgPSAwOwotICAgIGRpYl9oZHIubl9pbXBvcnRhbnRfY29sb3VycyAgICA9IDA7Ci0gICAgLy8gYmlnLWVuZGlhbiBtYXNrcy4gb25seSB1c2VkIGluIEJJX0JJVEZJRUxEUyBhbmQgQklfQUxQSEFCSVRGSUVMRFMgKCAxNiBhbmQgMzItYml0IGltYWdlcyApCi0gICAgLy8gaW1wb3J0YW50IG5vdGU6IEdJTVAgc3RvcmVzIEJNUCBkYXRhIGluIHRoaXMgYXJyYXkgb3JkZXIgZm9yIDMyLWJpdDogW0FdW0JdW0ddW1JdCi0gICAgZGliX2hkci5iaXRtYXNrX3IgPSAweEZGMDAwMDAwOwotICAgIGRpYl9oZHIuYml0bWFza19nID0gMHgwMEZGMDAwMDsKLSAgICBkaWJfaGRyLmJpdG1hc2tfYiA9IDB4MDAwMEZGMDA7Ci0gIH0KLQotICB1aW50OF90KiBkc3RfcGl4ZWxzX3B0ciA9ICh1aW50OF90KiltYWxsb2MoIGRzdF9waXhlbHNfcGFkZGVkX3N6ICk7Ci0gIGlmICggIWRzdF9waXhlbHNfcHRyICkgeyByZXR1cm4gMDsgfQotICB7Ci0gICAgc2l6ZV90IGRzdF9ieXRlX2lkeCA9IDA7Ci0gICAgdWludDhfdCBwYWRkaW5nWzRdICA9IHswLCAwLCAwLCAwfTsKLSAgICB1aW50OF90IHJnYmFbNF0gICAgID0gezAsIDAsIDAsIDB9OwotICAgIHVpbnQ4X3QgYmdyYVs0XSAgICAgPSB7MCwgMCwgMCwgMH07Ci0KLSAgICBmb3IgKCB1aW50MzJfdCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrICkgewotICAgICAgc2l6ZV90IHNyY19ieXRlX2lkeCA9ICggaGVpZ2h0IC0gMSAtIHJvdyApICogbl9jaGFucyAqIHdpZHRoOwotICAgICAgZm9yICggdWludDMyX3QgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrICkgewotICAgICAgICBmb3IgKCB1aW50MzJfdCBjaGFuID0gMDsgY2hhbiA8IG5fY2hhbnM7IGNoYW4rKyApIHsgcmdiYVtjaGFuXSA9IHBpeGVsc19wdHJbc3JjX2J5dGVfaWR4KytdOyB9Ci0gICAgICAgIGlmICggMyA9PSBuX2NoYW5zICkgewotICAgICAgICAgIGJncmFbMF0gPSByZ2JhWzJdOwotICAgICAgICAgIGJncmFbMV0gPSByZ2JhWzFdOwotICAgICAgICAgIGJncmFbMl0gPSByZ2JhWzBdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIE5PVEUoQW50b24pIFJHQkEgd2l0aCBhbHBoYSBjaGFubmVsIHdvdWxkIGJlIGJldHRlciBzdXBwb3J0ZWQgd2l0aCBhbiBleHRlbmRlZCBESUIgaGVhZGVyICovCi0gICAgICAgICAgYmdyYVswXSA9IHJnYmFbM107Ci0gICAgICAgICAgYmdyYVsxXSA9IHJnYmFbMl07Ci0gICAgICAgICAgYmdyYVsyXSA9IHJnYmFbMV07Ci0gICAgICAgICAgYmdyYVszXSA9IHJnYmFbMF07IC8vIGFscGhhCi0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCAmZHN0X3BpeGVsc19wdHJbZHN0X2J5dGVfaWR4XSwgYmdyYSwgbl9jaGFucyApOwotICAgICAgICBkc3RfYnl0ZV9pZHggKz0gKHNpemVfdCluX2NoYW5zOwotICAgICAgfSAvLyBlbmRmb3IgY29sCi0gICAgICBpZiAoIHJvd19wYWRkaW5nX3N6ID4gMCApIHsKLSAgICAgICAgbWVtY3B5KCAmZHN0X3BpeGVsc19wdHJbZHN0X2J5dGVfaWR4XSwgcGFkZGluZywgcm93X3BhZGRpbmdfc3ogKTsKLSAgICAgICAgZHN0X2J5dGVfaWR4ICs9IHJvd19wYWRkaW5nX3N6OwotICAgICAgfQotICAgIH0gLy8gZW5kZm9yIHJvdwotICB9Ci0gIHsKLSAgICBGSUxFKiBmcCA9IGZvcGVuKCBmaWxlbmFtZSwgIndiIiApOwotICAgIGlmICggIWZwICkgewotICAgICAgZnJlZSggZHN0X3BpeGVsc19wdHIgKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoIDEgIT0gZndyaXRlKCAmZmlsZV9oZHIsIF9CTVBfRklMRV9IRFJfU1osIDEsIGZwICkgKSB7Ci0gICAgICBmcmVlKCBkc3RfcGl4ZWxzX3B0ciApOwotICAgICAgZmNsb3NlKCBmcCApOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICggMSAhPSBmd3JpdGUoICZkaWJfaGRyLCBkaWJfaGRyX3N6LCAxLCBmcCApICkgewotICAgICAgZnJlZSggZHN0X3BpeGVsc19wdHIgKTsKLSAgICAgIGZjbG9zZSggZnAgKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoIDEgIT0gZndyaXRlKCBkc3RfcGl4ZWxzX3B0ciwgZHN0X3BpeGVsc19wYWRkZWRfc3osIDEsIGZwICkgKSB7Ci0gICAgICBmcmVlKCBkc3RfcGl4ZWxzX3B0ciApOwotICAgICAgZmNsb3NlKCBmcCApOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGZjbG9zZSggZnAgKTsKLSAgfQotICBmcmVlKCBkc3RfcGl4ZWxzX3B0ciApOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZW5jb2Rlci9hcGdfYm1wLmggYi9lbmNvZGVyL2FwZ19ibXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkNzNiNi4uMDAwMDAwMAotLS0gYS9lbmNvZGVyL2FwZ19ibXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotQk1QIEZpbGUgUmVhZGVyL1dyaXRlciBJbXBsZW1lbnRhdGlvbgotQW50b24gR2VyZGVsYW4KLVZlcnNpb246IDMuMSAxOCBNYXJjaCAyMDIwLgotTGljZW5jZTogc2VlIGJvdHRvbSBvZiBmaWxlLgotQzg5ICggSW1wbGVtZW50YXRpb24gaXMgQzk5ICkKLQotQ29udHJpYnV0b3JzOgotLSBBbnRvbiBHZXJkZWxhbiAtIEluaXRpYWwgY29kZS4KLS0gU2FpamEgU29yc2EgICAgLSBGdXp6IHRlc3RpbmcuCi0KLUluc3RydWN0aW9uczoKLS0gSnVzdCBkcm9wIHRoaXMgaGVhZGVyLCBhbmQgdGhlIG1hdGNoaW5nIC5jIGZpbGUgaW50byB5b3VyIHByb2plY3QuCi0tIFRvIGdldCBkZWJ1ZyBwcmludG91dHMgZHVyaW5nIHBhcnNpbmcgZGVmaW5lIEFQR19CTVBfREVCVUdfT1VUUFVULgotCi1BZHZhbnRhZ2VzOgotLSBUaGUgaW1wbGVtZW50YXRpb24gaXMgZmFzdCwgc2ltcGxlLCBhbmQgc3VwcG9ydHMgbW9yZSBmb3JtYXRzIHRoYW4gbW9zdCBCTVAgcmVhZGVyIGxpYnJhcmllcy4KLS0gVGhlIHJlYWRlciBmdW5jdGlvbiBpcyBmdXp6ZWQgd2l0aCBBRkwgaHR0cHM6Ly9sY2FtdHVmLmNvcmVkdW1wLmN4L2FmbC8uCi0tIFRoZSByZWFkZXIgaXMgcm9idXN0IHRvIGxhcmdlIGZpbGVzIGFuZCBtYWxmb3JtZWQgZmlsZXMsIGFuZCB3aWxsIHJldHVybiBhbnkgdmFsaWQgcGFydGlhbCBkYXRhIGluIGFuIGltYWdlLgotLSBSZWFkZXIgc3VwcG9ydHMgMzJicHAgKHdpdGggYWxwaGEgY2hhbm5lbCksIDI0YnBwLCA4YnBwLCA0YnBwLCBhbmQgMWJwcCBtb25vY2hyb21lIEJNUCBpbWFnZXMuCi0tIFJlYWRlciBoYW5kbGVzIGluZGV4ZWQgQk1QIGltYWdlcyB1c2luZyBhIGNvbG91ciBwYWxldHRlLgotLSBXcml0ZXIgc3VwcG9ydHMgMzJicHAgUkdCQSBhbmQgMjRicHAgdW5jb21wcmVzc2VkIFJHQiBpbWFnZXMuCi0KLUN1cnJlbnQgTGltaXRhdGlvbnM6Ci0tIDE2LWJpdCBpbWFnZXMgbm90IHN1cHBvcnRlZCAoZG9uJ3QgaGF2ZSBhbnkgc2FtcGxlcyB0byB0ZXN0IG9uKS4KLS0gTm8gc3VwcG9ydCBmb3IgaW50ZXJsZWF2ZWQgY2hhbm5lbCBiaXQgbGF5b3V0cyBlZyBSR0IxMDEwMTAgUkdCNTU1IFJHQjU2NS4KLS0gTm8gc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBCTVAgaW1hZ2VzLCBhbHRob3VnaCBpbiBwcmFjdGljZSB0aGVzZSBhcmUgbm90IHVzZWQuCi0tIE91dHB1dCBpbWFnZXMgd2l0aCBhbHBoYSBjaGFubmVsIGFyZSB3cml0dGVuIGluIEJJVE1BUElORk9IRUFERVIgZm9ybWF0LgotICBGb3IgYmV0dGVyIGFscGhhIHN1cHBvcnQgaW4gb3RoZXIgYXBwcyB0aGUgMTI0LWJpdCB2NSBoZWFkZXIgY291bGQgYmUgdXNlZCBpbnN0ZWFkLAotCWF0IHRoZSBjb3N0IG9mIHNvbWUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgYmxvYXQuCi0KLVRvIERvOgotLSBGVVpaSU5HCi0gIC0gY3JlYXRlIGEgdW5pcXVlIGZ1enogdGVzdCBzZXQgZm9yICg4LDQsMSBCUFApLgotLSAobWF5YmUpIEZFQVRVUkUgRmxpcHBpbmcgdGhlIGltYWdlIGJhc2VkIG9uIG5lZ2F0aXZlIHdpZHRoIGFuZCBoZWlnaHQgaW4gaGVhZGVyLCBhbmQvb3IgZnVuY3Rpb24gYXJndW1lbnRzLiAKLS0gKG1heWJlKSBQRVJGIGlmZGVmIGludHJpbnNpY3MvYXNtIGZvciBiaXRzY2FuLiBQbGF0Zm9ybS1zcGVjaWZpYyBjb2RlIHNvIHdvbid0IGluY2x1ZGUgdW5sZXNzIG5lY2Vzc2FyeS4KLS0gKG1heWJlKSBGRUFUVVJFIEFkZCBwYXJhbWV0ZXIgZm9yIHBhZGRpbmcgb3V0cHV0IG1lbW9yeSB0byBlZyA0LWJ5dGUgYWxpZ25tZW50IG9yIG4gY2hhbm5lbHMuCi0tIChtYXliZSkgRkVBVFVSRSBJbXByb3ZlZCBhcHBzIHN1cHBvcnQgaW4gYWxwaGEgY2hhbm5lbCB3cml0aW5nICh1c2luZyB2NSBoZWFkZXIpLgotKi8KLQotI2lmbmRlZiBBUEdfQk1QX0hfCi0jZGVmaW5lIEFQR19CTVBfSF8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBDUFAgKi8KLQotLyogUmVhZHMgYSBiaXRtYXAgZnJvbSBhIGZpbGUsIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSByYXcgaW1hZ2UgZGF0YSwgYW5kIHJldHVybnMgaXQuCi1QQVJBTVMKLSAgKiB3LGgsICAgICAtIFJldHJpZXZlcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgQk1QIGluIHBpeGVscy4KLSAgKiBuX2NoYW5zICAtIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBCTVAuCi1SRVRVUk5TCi0gICogVGlnaHRseS1wYWNrZWQgcGl4ZWwgbWVtb3J5IGluIFJHQkEgb3JkZXIuIFRoZSBjYWxsZXIgbXVzdCBjYWxsIGZyZWUoKSBvbiB0aGUgbWVtb3J5LgotICAqIE5VTEwgb24gYW55IGVycm9yLiBBbnkgYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZCBiZWZvcmUgcmV0dXJuaW5nIE5VTEwuICovCi11bnNpZ25lZCBjaGFyKiBhcGdfYm1wX3JlYWQoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQqIHcsIGludCogaCwgdW5zaWduZWQgaW50KiBuX2NoYW5zICk7Ci0KLS8qIENhbGxzIGZyZWUoKSBvbiBtZW1vcnkgY3JlYXRlZCBieSBhcGdfYm1wX3JlYWQgKi8KLXZvaWQgYXBnX2JtcF9mcmVlKCB1bnNpZ25lZCBjaGFyKiBwaXhlbHNfcHRyICk7Ci0KLS8qIFdyaXRlcyBhIGJpdG1hcCB0byBhIGZpbGUuCi1QQVJBTVMKLSAgKiBmaWxlbmFtZSAgIC0gZS5nLiJteV9iaXRtYXAuYm1wIi4gTXVzdCBub3QgYmUgTlVMTC4KLSAgKiBwaXhlbHNfcHRyIC0gUG9pbnRlciB0byB0aWdodGx5LXBhY2tlZCBwaXhlbCBtZW1vcnkgaW4gUkdCQSBvcmRlci4gTXVzdCBub3QgYmUgTlVMTC4gVGhlcmUgbXVzdCBiZSBhYnModykqYWJzKGgpKm5fY2hhbnMgYnl0ZXMgaW4gdGhlIG1lbW9yeSBwb2ludGVkIHRvLgotICAqIHcsaCwgICAgICAgLSBXaWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuCi0gICogbl9jaGFucyAgICAtIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIEJNUC4gMyBvciA0IHN1cHBvcnRlZCBmb3Igd3JpdGluZywgd2hpY2ggbWVhbnMgUkdCIG9yIFJHQkEgbWVtb3J5LCByZXNwZWN0aXZlbHkuCi1SRVRVUk5TCi0gICogWmVybyBvbiBhbnkgZXJyb3IsIG5vbiB6ZXJvIG9uIHN1Y2Nlc3MuICovCi11bnNpZ25lZCBpbnQgYXBnX2JtcF93cml0ZSggY29uc3QgY2hhciogZmlsZW5hbWUsIHVuc2lnbmVkIGNoYXIqIHBpeGVsc19wdHIsIGludCB3LCBpbnQgaCwgdW5zaWduZWQgaW50IG5fY2hhbnMgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogQ1BQICovCi0KLSNlbmRpZiAvKl9BUEdfQk1QX0hfICovCi0KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB1bmRlciB0d28gbGljZW5jZXMgLSB5b3UgbWF5IHVzZSBpdCB1bmRlciBlaXRoZXIgbGljZW5jZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUZJUlNUIExJQ0VOQ0UgT1BUSU9OCi0KLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotPiAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0+ICAgIENvcHlyaWdodCAyMDE5IEFudG9uIEdlcmRlbGFuLgotPiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLT4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotPiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLT4gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotPiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0+ICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0+ICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotPiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0+ICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU0VDT05EIExJQ0VOQ0UgT1BUSU9OCi0KLT4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KLT4KLT4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yCi0+IGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZAotPiBiaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueQotPiBtZWFucy4KLT4KLT4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzCi0+IG9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotPiBzb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0Ci0+IG9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZAotPiBzdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZgotPiByZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXMKLT4gc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy4KLT4KLT4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0+IEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotPiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0+IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0+IE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotPiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLT4gT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotPgotPiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZz4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCmRpZmYgLS1naXQgYS9lbmNvZGVyL2Jhc2lzdV9hc3RjX2RlY29tcC5jcHAgYi9lbmNvZGVyL2Jhc2lzdV9hc3RjX2RlY29tcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYmNjZmMuLjAwMDAwMDAKLS0tIGEvZW5jb2Rlci9iYXNpc3VfYXN0Y19kZWNvbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU2MSArMCwwIEBACi0vLyBiYXNpc3VfYXN0Y19kZWNvbXAuY3BwOiBPbmx5IHVzZWQgZm9yIEFTVEMgZGVjb21wcmVzc2lvbiwgdG8gdmFsaWRhdGUgdGhlIHRyYW5zY29kZXIncyBvdXRwdXQuCi0vLyBUaGlzIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCBIRFIuCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogZHJhd0VsZW1lbnRzIFF1YWxpdHkgUHJvZ3JhbSBUZXN0ZXIgQ29yZQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogcmc6IFJlbW92ZWQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLCByZW1hcmtlZCBvdXQgSERSIHN1cHBvcnQgYmVjYXVzZQotICogd2UgZG9uJ3QgbmVlZCBpdCwgbWlub3IgZml4IHRvIGRlY29tcHJlc3MoKSBzbyBpdCBjb252ZXJ0cyBub24tc1JHQgotICogb3V0cHV0IHRvIDgtYml0cyBjb3JyZWN0bHkuIEkndmUgY29tcGFyZWQgdGhpcyBkZWNvZGVyJ3Mgb3V0cHV0Ci0gKiB2cy4gYXN0Yy1jb2RlYyB3aXRoIHJhbmRvbSBpbnB1dHMgb24gNHg0IGJsb2NrcywgYW5kIGFmdGVyIGZpeGluZyBhIGZldyBvYnZpb3VzCi0gKiBidWdzIGluIGFzdGMtY29kZWMgd2hlcmUgaXQgZGlkbid0IGNvcnJlY3RseSBmb2xsb3cgdGhlIHNwZWMgdGhleSBtYXRjaCBzbyAKLSAqIEknbSBhc3N1bWluZyB0aGV5IGFyZSBib3RoIGNvcnJlY3QgZm9yIDR4NCBub3cuCi0gKiBIRFIgc3VwcG9ydCBzaG91bGQgYmUgZWFzaWx5IGFkZGVkIGJhY2sgaW4sIGJ1dCBhcyB3ZSBkb24ndCBuZWVkIGl0IAotICogSSdtIGxlYXZpbmcgdGhpcyBmb3Igc29tZW9uZSBlbHNlLgotICogCi0gKi8vKiEKLSAqIFxmaWxlCi0gKiBcYnJpZWYgQVNUQyBVdGlsaXRpZXMuCi0gKi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJiYXNpc3VfYXN0Y19kZWNvbXAuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNkZWZpbmUgREVfTEVOR1RIX09GX0FSUkFZKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQotI2RlZmluZSBERV9VTlJFRih4KSAodm9pZCl4Ci0KLXR5cGVkZWYgdWludDhfdCBkZVVpbnQ4OwotdHlwZWRlZiBpbnQ4X3QgZGVJbnQ4OwotdHlwZWRlZiB1aW50MzJfdCBkZVVpbnQzMjsKLXR5cGVkZWYgaW50MzJfdCBkZUludDMyOwotdHlwZWRlZiB1aW50MTZfdCBkZVVpbnQxNjsKLXR5cGVkZWYgaW50MTZfdCBkZUludDE2OwotdHlwZWRlZiBpbnQ2NF90IGRlSW50NjQ7Ci10eXBlZGVmIHVpbnQ2NF90IGRlVWludDY0OwotCi0jZGVmaW5lIERFX0FTU0VSVCBhc3NlcnQKLQotI2lmZGVmIF9NU0NfVkVSCi0jcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6NDUwNSkgLy8gdW5yZWZlcmVuY2VkIGxvY2FsIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCi0jZW5kaWYKLQotbmFtZXNwYWNlIGJhc2lzdV9hc3RjCi17Ci0Jc3RhdGljIGJvb2wgaW5Cb3VuZHMoaW50IHYsIGludCBsLCBpbnQgaCkKLQl7Ci0JCXJldHVybiAodiA+PSBsKSAmJiAodiA8IGgpOwotCX0KLQotCXN0YXRpYyBib29sIGluUmFuZ2UoaW50IHYsIGludCBsLCBpbnQgaCkKLQl7Ci0JCXJldHVybiAodiA+PSBsKSAmJiAodiA8PSBoKTsKLQl9Ci0KLQl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotCXN0YXRpYyBpbmxpbmUgVCBtYXgoVCBhLCBUIGIpCi0JewotCQlyZXR1cm4gKGEgPiBiKSA/IGEgOiBiOwotCX0KLQotCXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0Jc3RhdGljIGlubGluZSBUIG1pbihUIGEsIFQgYikKLQl7Ci0JCXJldHVybiAoYSA8IGIpID8gYSA6IGI7Ci0JfQotCi0JdGVtcGxhdGU8dHlwZW5hbWUgVD4KLQlzdGF0aWMgaW5saW5lIFQgY2xhbXAoVCBhLCBUIGwsIFQgaCkKLQl7Ci0JCWlmIChhIDwgbCkKLQkJCXJldHVybiBsOwotCQllbHNlIGlmIChhID4gaCkKLQkJCXJldHVybiBoOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQlzdHJ1Y3QgVVZlYzQKLQl7Ci0JCXVpbnQzMl90IG1fY1s0XTsKLQotCQlVVmVjNCgpCi0JCXsKLQkJCW1fY1swXSA9IDA7Ci0JCQltX2NbMV0gPSAwOwotCQkJbV9jWzJdID0gMDsKLQkJCW1fY1szXSA9IDA7Ci0JCX0KLQotCQlVVmVjNCh1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6LCB1aW50MzJfdCB3KQotCQl7Ci0JCQltX2NbMF0gPSB4OwotCQkJbV9jWzFdID0geTsKLQkJCW1fY1syXSA9IHo7Ci0JCQltX2NbM10gPSB3OwotCQl9Ci0KLQkJdWludDMyX3QgeCgpIGNvbnN0IHsgcmV0dXJuIG1fY1swXTsgfQotCQl1aW50MzJfdCB5KCkgY29uc3QgeyByZXR1cm4gbV9jWzFdOyB9Ci0JCXVpbnQzMl90IHooKSBjb25zdCB7IHJldHVybiBtX2NbMl07IH0KLQkJdWludDMyX3QgdygpIGNvbnN0IHsgcmV0dXJuIG1fY1szXTsgfQotCi0JCXVpbnQzMl90JiB4KCkgeyByZXR1cm4gbV9jWzBdOyB9Ci0JCXVpbnQzMl90JiB5KCkgeyByZXR1cm4gbV9jWzFdOyB9Ci0JCXVpbnQzMl90JiB6KCkgeyByZXR1cm4gbV9jWzJdOyB9Ci0JCXVpbnQzMl90JiB3KCkgeyByZXR1cm4gbV9jWzNdOyB9Ci0KLQkJdWludDMyX3Qgb3BlcmF0b3JbXSAodWludDMyX3QgaWR4KSBjb25zdCB7IGFzc2VydChpZHggPCA0KTsgIHJldHVybiBtX2NbaWR4XTsgfQotCQl1aW50MzJfdCYgb3BlcmF0b3JbXSAodWludDMyX3QgaWR4KSB7IGFzc2VydChpZHggPCA0KTsgIHJldHVybiBtX2NbaWR4XTsgfQotCX07Ci0KLQlzdHJ1Y3QgSVZlYzQKLQl7Ci0JCWludDMyX3QgbV9jWzRdOwotCi0JCUlWZWM0KCkKLQkJewotCQkJbV9jWzBdID0gMDsKLQkJCW1fY1sxXSA9IDA7Ci0JCQltX2NbMl0gPSAwOwotCQkJbV9jWzNdID0gMDsKLQkJfQotCi0JCUlWZWM0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHosIGludDMyX3QgdykKLQkJewotCQkJbV9jWzBdID0geDsKLQkJCW1fY1sxXSA9IHk7Ci0JCQltX2NbMl0gPSB6OwotCQkJbV9jWzNdID0gdzsKLQkJfQotCi0JCWludDMyX3QgeCgpIGNvbnN0IHsgcmV0dXJuIG1fY1swXTsgfQotCQlpbnQzMl90IHkoKSBjb25zdCB7IHJldHVybiBtX2NbMV07IH0KLQkJaW50MzJfdCB6KCkgY29uc3QgeyByZXR1cm4gbV9jWzJdOyB9Ci0JCWludDMyX3QgdygpIGNvbnN0IHsgcmV0dXJuIG1fY1szXTsgfQotCi0JCWludDMyX3QmIHgoKSB7IHJldHVybiBtX2NbMF07IH0KLQkJaW50MzJfdCYgeSgpIHsgcmV0dXJuIG1fY1sxXTsgfQotCQlpbnQzMl90JiB6KCkgeyByZXR1cm4gbV9jWzJdOyB9Ci0JCWludDMyX3QmIHcoKSB7IHJldHVybiBtX2NbM107IH0KLQotCQlVVmVjNCBhc1VpbnQoKSBjb25zdAotCQl7Ci0JCQlyZXR1cm4gVVZlYzQoYmFzaXN1OjptYXhpbXVtKDAsIG1fY1swXSksIGJhc2lzdTo6bWF4aW11bSgwLCBtX2NbMV0pLCBiYXNpc3U6Om1heGltdW0oMCwgbV9jWzJdKSwgYmFzaXN1OjptYXhpbXVtKDAsIG1fY1szXSkpOwotCQl9Ci0KLQkJaW50MzJfdCBvcGVyYXRvcltdICh1aW50MzJfdCBpZHgpIGNvbnN0IHsgYXNzZXJ0KGlkeCA8IDQpOyAgcmV0dXJuIG1fY1tpZHhdOyB9Ci0JCWludDMyX3QmIG9wZXJhdG9yW10gKHVpbnQzMl90IGlkeCkgeyBhc3NlcnQoaWR4IDwgNCk7ICByZXR1cm4gbV9jW2lkeF07IH0KLQl9OwotCi0Jc3RydWN0IElWZWMzCi0JewotCQlpbnQzMl90IG1fY1szXTsKLQotCQlJVmVjMygpCi0JCXsKLQkJCW1fY1swXSA9IDA7Ci0JCQltX2NbMV0gPSAwOwotCQkJbV9jWzJdID0gMDsKLQkJfQotCi0JCUlWZWMzKGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHopCi0JCXsKLQkJCW1fY1swXSA9IHg7Ci0JCQltX2NbMV0gPSB5OwotCQkJbV9jWzJdID0gejsKLQkJfQotCi0JCWludDMyX3QgeCgpIGNvbnN0IHsgcmV0dXJuIG1fY1swXTsgfQotCQlpbnQzMl90IHkoKSBjb25zdCB7IHJldHVybiBtX2NbMV07IH0KLQkJaW50MzJfdCB6KCkgY29uc3QgeyByZXR1cm4gbV9jWzJdOyB9Ci0KLQkJaW50MzJfdCYgeCgpIHsgcmV0dXJuIG1fY1swXTsgfQotCQlpbnQzMl90JiB5KCkgeyByZXR1cm4gbV9jWzFdOyB9Ci0JCWludDMyX3QmIHooKSB7IHJldHVybiBtX2NbMl07IH0KLQotCQlpbnQzMl90IG9wZXJhdG9yW10gKHVpbnQzMl90IGlkeCkgY29uc3QgeyBhc3NlcnQoaWR4IDwgMyk7ICByZXR1cm4gbV9jW2lkeF07IH0KLQkJaW50MzJfdCYgb3BlcmF0b3JbXSAodWludDMyX3QgaWR4KSB7IGFzc2VydChpZHggPCAzKTsgIHJldHVybiBtX2NbaWR4XTsgfQotCX07Ci0KLQlzdGF0aWMgdWludDMyX3QgZGVEaXZSb3VuZFVwMzIodWludDMyX3QgYSwgdWludDMyX3QgYikKLQl7Ci0JCXJldHVybiAoYSArIGIgLSAxKSAvIGI7Ci0JfQotCi0Jc3RhdGljIGJvb2wgZGVJbkJvdW5kczMyKHVpbnQzMl90IHYsIHVpbnQzMl90IGwsIHVpbnQzMl90IGgpCi0JewotCQlyZXR1cm4gKHYgPj0gbCkgJiYgKHYgPCBoKTsKLQl9Ci0KLW5hbWVzcGFjZSBhc3RjCi17Ci11c2luZyBzdGQ6OnZlY3RvcjsKLW5hbWVzcGFjZQotewotLy8gQ29tbW9uIHV0aWxpdGllcwotZW51bQotewotCU1BWF9CTE9DS19XSURUSAkJPSAxMiwKLQlNQVhfQkxPQ0tfSEVJR0hUCT0gMTIKLX07Ci1pbmxpbmUgZGVVaW50MzIgZ2V0Qml0IChkZVVpbnQzMiBzcmMsIGludCBuZHgpCi17Ci0JREVfQVNTRVJUKGJhc2lzdV9hc3RjOjppbkJvdW5kcyhuZHgsIDAsIDMyKSk7Ci0JcmV0dXJuIChzcmMgPj4gbmR4KSAmIDE7Ci19Ci1pbmxpbmUgZGVVaW50MzIgZ2V0Qml0cyAoZGVVaW50MzIgc3JjLCBpbnQgbG93LCBpbnQgaGlnaCkKLXsKLQljb25zdCBpbnQgbnVtQml0cyA9IChoaWdoLWxvdykgKyAxOwotCURFX0FTU0VSVChiYXNpc3VfYXN0Yzo6aW5SYW5nZShudW1CaXRzLCAxLCAzMikpOwotCWlmIChudW1CaXRzIDwgMzIpCi0JCXJldHVybiAoZGVVaW50MzIpKChzcmMgPj4gbG93KSAmICgoMXU8PG51bUJpdHMpLTEpKTsKLQllbHNlCi0JCXJldHVybiAoZGVVaW50MzIpKChzcmMgPj4gbG93KSAmIDB4RkZGRkZGRkZ1KTsKLX0KLWlubGluZSBib29sIGlzQml0U2V0IChkZVVpbnQzMiBzcmMsIGludCBuZHgpCi17Ci0JcmV0dXJuIGdldEJpdChzcmMsIG5keCkgIT0gMDsKLX0KLWlubGluZSBkZVVpbnQzMiByZXZlcnNlQml0cyAoZGVVaW50MzIgc3JjLCBpbnQgbnVtQml0cykKLXsKLQlERV9BU1NFUlQoYmFzaXN1X2FzdGM6OmluUmFuZ2UobnVtQml0cywgMCwgMzIpKTsKLQlkZVVpbnQzMiByZXN1bHQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQml0czsgaSsrKQotCQlyZXN1bHQgfD0gKChzcmMgPj4gaSkgJiAxKSA8PCAobnVtQml0cy0xLWkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci1pbmxpbmUgZGVVaW50MzIgYml0UmVwbGljYXRpb25TY2FsZSAoZGVVaW50MzIgc3JjLCBpbnQgbnVtU3JjQml0cywgaW50IG51bURzdEJpdHMpCi17Ci0JREVfQVNTRVJUKG51bVNyY0JpdHMgPD0gbnVtRHN0Qml0cyk7Ci0JREVfQVNTRVJUKChzcmMgJiAoKDE8PG51bVNyY0JpdHMpLTEpKSA9PSBzcmMpOwotCWRlVWludDMyIGRzdCA9IDA7Ci0JZm9yIChpbnQgc2hpZnQgPSBudW1Ec3RCaXRzLW51bVNyY0JpdHM7IHNoaWZ0ID4gLW51bVNyY0JpdHM7IHNoaWZ0IC09IG51bVNyY0JpdHMpCi0JCWRzdCB8PSBzaGlmdCA+PSAwID8gc3JjIDw8IHNoaWZ0IDogc3JjID4+IC1zaGlmdDsKLQlyZXR1cm4gZHN0OwotfQotCi1pbmxpbmUgZGVJbnQzMiBzaWduRXh0ZW5kIChkZUludDMyIHNyYywgaW50IG51bVNyY0JpdHMpCi17Ci0JREVfQVNTRVJUKGJhc2lzdV9hc3RjOjppblJhbmdlKG51bVNyY0JpdHMsIDIsIDMxKSk7Ci0JY29uc3QgYm9vbCBuZWdhdGl2ZSA9IChzcmMgJiAoMSA8PCAobnVtU3JjQml0cy0xKSkpICE9IDA7Ci0JcmV0dXJuIHNyYyB8IChuZWdhdGl2ZSA/IH4oKDEgPDwgbnVtU3JjQml0cykgLSAxKSA6IDApOwotfQotCi0vL2lubGluZSBib29sIGlzRmxvYXQxNkluZk9yTmFuIChkZUZsb2F0MTYgdikKLS8vewotLy8JcmV0dXJuIGdldEJpdHModiwgMTAsIDE0KSA9PSAzMTsKLS8vfQotCi1lbnVtIElTRU1vZGUKLXsKLQlJU0VNT0RFX1RSSVQgPSAwLAotCUlTRU1PREVfUVVJTlQsCi0JSVNFTU9ERV9QTEFJTl9CSVQsCi0JSVNFTU9ERV9MQVNUCi19Owotc3RydWN0IElTRVBhcmFtcwotewotCUlTRU1vZGUJCW1vZGU7Ci0JaW50CQkJbnVtQml0czsKLQlJU0VQYXJhbXMgKElTRU1vZGUgbW9kZV8sIGludCBudW1CaXRzXykgOiBtb2RlKG1vZGVfKSwgbnVtQml0cyhudW1CaXRzXykge30KLX07Ci1pbmxpbmUgaW50IGNvbXB1dGVOdW1SZXF1aXJlZEJpdHMgKGNvbnN0IElTRVBhcmFtcyYgaXNlUGFyYW1zLCBpbnQgbnVtVmFsdWVzKQotewotCXN3aXRjaCAoaXNlUGFyYW1zLm1vZGUpCi0JewotCQljYXNlIElTRU1PREVfVFJJVDoJCQlyZXR1cm4gZGVEaXZSb3VuZFVwMzIobnVtVmFsdWVzKjgsIDUpICsgbnVtVmFsdWVzKmlzZVBhcmFtcy5udW1CaXRzOwotCQljYXNlIElTRU1PREVfUVVJTlQ6CQkJcmV0dXJuIGRlRGl2Um91bmRVcDMyKG51bVZhbHVlcyo3LCAzKSArIG51bVZhbHVlcyppc2VQYXJhbXMubnVtQml0czsKLQkJY2FzZSBJU0VNT0RFX1BMQUlOX0JJVDoJCXJldHVybiBudW1WYWx1ZXMqaXNlUGFyYW1zLm51bUJpdHM7Ci0JCWRlZmF1bHQ6Ci0JCQlERV9BU1NFUlQoZmFsc2UpOwotCQkJcmV0dXJuIC0xOwotCX0KLX0KLUlTRVBhcmFtcyBjb21wdXRlTWF4aW11bVJhbmdlSVNFUGFyYW1zIChpbnQgbnVtQXZhaWxhYmxlQml0cywgaW50IG51bVZhbHVlc0luU2VxdWVuY2UpCi17Ci0JaW50IGN1ckJpdHNGb3JUcml0TW9kZQkJPSA2OwotCWludCBjdXJCaXRzRm9yUXVpbnRNb2RlCQk9IDU7Ci0JaW50IGN1ckJpdHNGb3JQbGFpbkJpdE1vZGUJPSA4OwotCXdoaWxlICh0cnVlKQotCXsKLQkJREVfQVNTRVJUKGN1ckJpdHNGb3JUcml0TW9kZSA+IDAgfHwgY3VyQml0c0ZvclF1aW50TW9kZSA+IDAgfHwgY3VyQml0c0ZvclBsYWluQml0TW9kZSA+IDApOwotCQljb25zdCBpbnQgdHJpdFJhbmdlCQkJPSBjdXJCaXRzRm9yVHJpdE1vZGUgPiAwCQk/ICgzIDw8IGN1ckJpdHNGb3JUcml0TW9kZSkgLSAxCQkJOiAtMTsKLQkJY29uc3QgaW50IHF1aW50UmFuZ2UJCT0gY3VyQml0c0ZvclF1aW50TW9kZSA+IDAJCT8gKDUgPDwgY3VyQml0c0ZvclF1aW50TW9kZSkgLSAxCQk6IC0xOwotCQljb25zdCBpbnQgcGxhaW5CaXRSYW5nZQkJPSBjdXJCaXRzRm9yUGxhaW5CaXRNb2RlID4gMAk/ICgxIDw8IGN1ckJpdHNGb3JQbGFpbkJpdE1vZGUpIC0gMQkJOiAtMTsKLQkJY29uc3QgaW50IG1heFJhbmdlCQkJPSBiYXNpc3VfYXN0Yzo6bWF4KGJhc2lzdV9hc3RjOjptYXgodHJpdFJhbmdlLCBxdWludFJhbmdlKSwgcGxhaW5CaXRSYW5nZSk7Ci0JCWlmIChtYXhSYW5nZSA9PSB0cml0UmFuZ2UpCi0JCXsKLQkJCWNvbnN0IElTRVBhcmFtcyBwYXJhbXMoSVNFTU9ERV9UUklULCBjdXJCaXRzRm9yVHJpdE1vZGUpOwotCQkJaWYgKGNvbXB1dGVOdW1SZXF1aXJlZEJpdHMocGFyYW1zLCBudW1WYWx1ZXNJblNlcXVlbmNlKSA8PSBudW1BdmFpbGFibGVCaXRzKQotCQkJCXJldHVybiBJU0VQYXJhbXMoSVNFTU9ERV9UUklULCBjdXJCaXRzRm9yVHJpdE1vZGUpOwotCQkJY3VyQml0c0ZvclRyaXRNb2RlLS07Ci0JCX0KLQkJZWxzZSBpZiAobWF4UmFuZ2UgPT0gcXVpbnRSYW5nZSkKLQkJewotCQkJY29uc3QgSVNFUGFyYW1zIHBhcmFtcyhJU0VNT0RFX1FVSU5ULCBjdXJCaXRzRm9yUXVpbnRNb2RlKTsKLQkJCWlmIChjb21wdXRlTnVtUmVxdWlyZWRCaXRzKHBhcmFtcywgbnVtVmFsdWVzSW5TZXF1ZW5jZSkgPD0gbnVtQXZhaWxhYmxlQml0cykKLQkJCQlyZXR1cm4gSVNFUGFyYW1zKElTRU1PREVfUVVJTlQsIGN1ckJpdHNGb3JRdWludE1vZGUpOwotCQkJY3VyQml0c0ZvclF1aW50TW9kZS0tOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY29uc3QgSVNFUGFyYW1zIHBhcmFtcyhJU0VNT0RFX1BMQUlOX0JJVCwgY3VyQml0c0ZvclBsYWluQml0TW9kZSk7Ci0JCQlERV9BU1NFUlQobWF4UmFuZ2UgPT0gcGxhaW5CaXRSYW5nZSk7Ci0JCQlpZiAoY29tcHV0ZU51bVJlcXVpcmVkQml0cyhwYXJhbXMsIG51bVZhbHVlc0luU2VxdWVuY2UpIDw9IG51bUF2YWlsYWJsZUJpdHMpCi0JCQkJcmV0dXJuIElTRVBhcmFtcyhJU0VNT0RFX1BMQUlOX0JJVCwgY3VyQml0c0ZvclBsYWluQml0TW9kZSk7Ci0JCQljdXJCaXRzRm9yUGxhaW5CaXRNb2RlLS07Ci0JCX0KLQl9Ci19Ci1pbmxpbmUgaW50IGNvbXB1dGVOdW1Db2xvckVuZHBvaW50VmFsdWVzIChkZVVpbnQzMiBlbmRwb2ludE1vZGUpCi17Ci0JREVfQVNTRVJUKGVuZHBvaW50TW9kZSA8IDE2KTsKLQlyZXR1cm4gKGVuZHBvaW50TW9kZS80ICsgMSkgKiAyOwotfQotLy8gRGVjb21wcmVzc2lvbiB1dGlsaXRpZXMKLWVudW0gRGVjb21wcmVzc1Jlc3VsdAotewotCURFQ09NUFJFU1NfUkVTVUxUX1ZBTElEX0JMT0NLCT0gMCwJLy8hPCBEZWNvbXByZXNzZWQgdmFsaWQgYmxvY2sKLQlERUNPTVBSRVNTX1JFU1VMVF9FUlJPUiwJCQkJLy8hPCBFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSBkZWNvbXByZXNzaW5nLCBlcnJvciBjb2xvciB3cml0dGVuCi0JREVDT01QUkVTU19SRVNVTFRfTEFTVAotfTsKLS8vIEEgaGVscGVyIGZvciBnZXR0aW5nIGJpdHMgZnJvbSBhIDEyOC1iaXQgYmxvY2suCi1jbGFzcyBCbG9jazEyOAotewotcHJpdmF0ZToKLQl0eXBlZGVmIGRlVWludDY0IFdvcmQ7Ci0JZW51bQotCXsKLQkJV09SRF9CWVRFUwk9IHNpemVvZihXb3JkKSwKLQkJV09SRF9CSVRTCT0gOCpXT1JEX0JZVEVTLAotCQlOVU1fV09SRFMJPSAxMjggLyBXT1JEX0JJVFMKLQl9OwotCS8vREVfU1RBVElDX0FTU0VSVCgxMjggJSBXT1JEX0JJVFMgPT0gMCk7Ci1wdWJsaWM6Ci0JQmxvY2sxMjggKGNvbnN0IGRlVWludDgqIHNyYykKLQl7Ci0JCWZvciAoaW50IHdvcmROZHggPSAwOyB3b3JkTmR4IDwgTlVNX1dPUkRTOyB3b3JkTmR4KyspCi0JCXsKLQkJCW1fd29yZHNbd29yZE5keF0gPSAwOwotCQkJZm9yIChpbnQgYnl0ZU5keCA9IDA7IGJ5dGVOZHggPCBXT1JEX0JZVEVTOyBieXRlTmR4KyspCi0JCQkJbV93b3Jkc1t3b3JkTmR4XSB8PSAoV29yZClzcmNbd29yZE5keCpXT1JEX0JZVEVTICsgYnl0ZU5keF0gPDwgKDgqYnl0ZU5keCk7Ci0JCX0KLQl9Ci0JZGVVaW50MzIgZ2V0Qml0IChpbnQgbmR4KSBjb25zdAotCXsKLQkJREVfQVNTRVJUKGJhc2lzdV9hc3RjOjppbkJvdW5kcyhuZHgsIDAsIDEyOCkpOwotCQlyZXR1cm4gKG1fd29yZHNbbmR4IC8gV09SRF9CSVRTXSA+PiAobmR4ICUgV09SRF9CSVRTKSkgJiAxOwotCX0KLQlkZVVpbnQzMiBnZXRCaXRzIChpbnQgbG93LCBpbnQgaGlnaCkgY29uc3QKLQl7Ci0JCURFX0FTU0VSVChiYXNpc3VfYXN0Yzo6aW5Cb3VuZHMobG93LCAwLCAxMjgpKTsKLQkJREVfQVNTRVJUKGJhc2lzdV9hc3RjOjppbkJvdW5kcyhoaWdoLCAwLCAxMjgpKTsKLQkJREVfQVNTRVJUKGJhc2lzdV9hc3RjOjppblJhbmdlKGhpZ2gtbG93KzEsIDAsIDMyKSk7Ci0JCWlmIChoaWdoLWxvdysxID09IDApCi0JCQlyZXR1cm4gMDsKLQkJY29uc3QgaW50IHdvcmQwTmR4ID0gbG93IC8gV09SRF9CSVRTOwotCQljb25zdCBpbnQgd29yZDFOZHggPSBoaWdoIC8gV09SRF9CSVRTOwotCQkvLyBcbm90ZSAiZm9vIDw8IGJhciA8PCAxIiBkb25lIGluc3RlYWQgb2YgImZvbyA8PCAoYmFyKzEpIiB0byBhdm9pZCBvdmVyZmxvdywgaS5lLiBzaGlmdCBhbW91bnQgYmVpbmcgdG9vIGJpZy4KLQkJaWYgKHdvcmQwTmR4ID09IHdvcmQxTmR4KQotCQkJcmV0dXJuIChkZVVpbnQzMikoKG1fd29yZHNbd29yZDBOZHhdICYgKCgoKFdvcmQpMSA8PCBoaWdoJVdPUkRfQklUUyA8PCAxKSAtIDEpKSkgPj4gKChXb3JkKWxvdyAlIFdPUkRfQklUUykpOwotCQllbHNlCi0JCXsKLQkJCURFX0FTU0VSVCh3b3JkMU5keCA9PSB3b3JkME5keCArIDEpOwotCQkJcmV0dXJuIChkZVVpbnQzMikobV93b3Jkc1t3b3JkME5keF0gPj4gKGxvdyVXT1JEX0JJVFMpKSB8Ci0JCQkJICAgKGRlVWludDMyKSgobV93b3Jkc1t3b3JkMU5keF0gJiAoKChXb3JkKTEgPDwgaGlnaCVXT1JEX0JJVFMgPDwgMSkgLSAxKSkgPDwgKGhpZ2gtbG93IC0gaGlnaCVXT1JEX0JJVFMpKTsKLQkJfQotCX0KLQlib29sIGlzQml0U2V0IChpbnQgbmR4KSBjb25zdAotCXsKLQkJREVfQVNTRVJUKGJhc2lzdV9hc3RjOjppbkJvdW5kcyhuZHgsIDAsIDEyOCkpOwotCQlyZXR1cm4gZ2V0Qml0KG5keCkgIT0gMDsKLQl9Ci1wcml2YXRlOgotCVdvcmQgbV93b3Jkc1tOVU1fV09SRFNdOwotfTsKLS8vIEEgaGVscGVyIGZvciBzZXF1ZW50aWFsIGFjY2VzcyBpbnRvIGEgQmxvY2sxMjguCi1jbGFzcyBCaXRBY2Nlc3NTdHJlYW0KLXsKLXB1YmxpYzoKLQlCaXRBY2Nlc3NTdHJlYW0gKGNvbnN0IEJsb2NrMTI4JiBzcmMsIGludCBzdGFydE5keEluU3JjLCBpbnQgbGVuZ3RoLCBib29sIGZvcndhcmQpCi0JCTogbV9zcmMJCQkJKHNyYykKLQkJLCBtX3N0YXJ0TmR4SW5TcmMJKHN0YXJ0TmR4SW5TcmMpCi0JCSwgbV9sZW5ndGgJCQkobGVuZ3RoKQotCQksIG1fZm9yd2FyZAkJCShmb3J3YXJkKQotCQksIG1fbmR4CQkJCSgwKQotCXsKLQl9Ci0JLy8gR2V0IHRoZSBuZXh0IG51bSBiaXRzLiBCaXRzIGF0IHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbV9sZW5ndGggYXJlIHplcm9zLgotCWRlVWludDMyIGdldE5leHQgKGludCBudW0pCi0JewotCQlpZiAobnVtID09IDAgfHwgbV9uZHggPj0gbV9sZW5ndGgpCi0JCQlyZXR1cm4gMDsKLQkJY29uc3QgaW50IGVuZAkJCQk9IG1fbmR4ICsgbnVtOwotCQljb25zdCBpbnQgbnVtQml0c0Zyb21TcmMJPSBiYXNpc3VfYXN0Yzo6bWF4KDAsIGJhc2lzdV9hc3RjOjptaW4obV9sZW5ndGgsIGVuZCkgLSBtX25keCk7Ci0JCWNvbnN0IGludCBsb3cJCQkJPSBtX25keDsKLQkJY29uc3QgaW50IGhpZ2gJCQkJPSBtX25keCArIG51bUJpdHNGcm9tU3JjIC0gMTsKLQkJbV9uZHggKz0gbnVtOwotCQlyZXR1cm4gbV9mb3J3YXJkID8JCQkgICBtX3NyYy5nZXRCaXRzKG1fc3RhcnROZHhJblNyYyArIGxvdywgIG1fc3RhcnROZHhJblNyYyArIGhpZ2gpCi0JCQkJCQkgOiByZXZlcnNlQml0cyhtX3NyYy5nZXRCaXRzKG1fc3RhcnROZHhJblNyYyAtIGhpZ2gsIG1fc3RhcnROZHhJblNyYyAtIGxvdyksIG51bUJpdHNGcm9tU3JjKTsKLQl9Ci1wcml2YXRlOgotCWNvbnN0IEJsb2NrMTI4JgkJbV9zcmM7Ci0JY29uc3QgaW50CQkJbV9zdGFydE5keEluU3JjOwotCWNvbnN0IGludAkJCW1fbGVuZ3RoOwotCWNvbnN0IGJvb2wJCQltX2ZvcndhcmQ7Ci0JaW50CQkJCQltX25keDsKLX07Ci1zdHJ1Y3QgSVNFRGVjb2RlZFJlc3VsdAotewotCWRlVWludDMyIG07Ci0JZGVVaW50MzIgdHE7IC8vITwgVHJpdCBvciBxdWludCB2YWx1ZSwgZGVwZW5kaW5nIG9uIElTRSBtb2RlLgotCWRlVWludDMyIHY7Ci19OwotLy8gRGF0YSBmcm9tIGFuIEFTVEMgYmxvY2sncyAiYmxvY2sgbW9kZSIgcGFydCAoaS5lLiBiaXRzIFswLDEwXSkuCi1zdHJ1Y3QgQVNUQ0Jsb2NrTW9kZQotewotCWJvb2wJCWlzRXJyb3I7Ci0JLy8gXG5vdGUgRm9sbG93aW5nIGZpZWxkcyBvbmx5IHJlbGV2YW50IGlmICFpc0Vycm9yLgotCWJvb2wJCWlzVm9pZEV4dGVudDsKLQkvLyBcbm90ZSBGb2xsb3dpbmcgZmllbGRzIG9ubHkgcmVsZXZhbnQgaWYgIWlzVm9pZEV4dGVudC4KLQlib29sCQlpc0R1YWxQbGFuZTsKLQlpbnQJCQl3ZWlnaHRHcmlkV2lkdGg7Ci0JaW50CQkJd2VpZ2h0R3JpZEhlaWdodDsKLQlJU0VQYXJhbXMJd2VpZ2h0SVNFUGFyYW1zOwotCUFTVENCbG9ja01vZGUgKHZvaWQpCi0JCTogaXNFcnJvcgkJCSh0cnVlKQotCQksIGlzVm9pZEV4dGVudAkJKHRydWUpCi0JCSwgaXNEdWFsUGxhbmUJCSh0cnVlKQotCQksIHdlaWdodEdyaWRXaWR0aAkoLTEpCi0JCSwgd2VpZ2h0R3JpZEhlaWdodAkoLTEpCi0JCSwgd2VpZ2h0SVNFUGFyYW1zCShJU0VNT0RFX0xBU1QsIC0xKQotCXsKLQl9Ci19OwotaW5saW5lIGludCBjb21wdXRlTnVtV2VpZ2h0cyAoY29uc3QgQVNUQ0Jsb2NrTW9kZSYgbW9kZSkKLXsKLQlyZXR1cm4gbW9kZS53ZWlnaHRHcmlkV2lkdGggKiBtb2RlLndlaWdodEdyaWRIZWlnaHQgKiAobW9kZS5pc0R1YWxQbGFuZSA/IDIgOiAxKTsKLX0KLXN0cnVjdCBDb2xvckVuZHBvaW50UGFpcgotewotCVVWZWM0IGUwOwotCVVWZWM0IGUxOwotfTsKLXN0cnVjdCBUZXhlbFdlaWdodFBhaXIKLXsKLQlkZVVpbnQzMiB3WzJdOwotfTsKLUFTVENCbG9ja01vZGUgZ2V0QVNUQ0Jsb2NrTW9kZSAoZGVVaW50MzIgYmxvY2tNb2RlRGF0YSkKLXsKLQlBU1RDQmxvY2tNb2RlIGJsb2NrTW9kZTsKLQlibG9ja01vZGUuaXNFcnJvciA9IHRydWU7IC8vIFxub3RlIFNldCB0byBmYWxzZSBsYXRlciwgaWYgbm90IGVycm9yLgotCWJsb2NrTW9kZS5pc1ZvaWRFeHRlbnQgPSBnZXRCaXRzKGJsb2NrTW9kZURhdGEsIDAsIDgpID09IDB4MWZjOwotCWlmICghYmxvY2tNb2RlLmlzVm9pZEV4dGVudCkKLQl7Ci0JCWlmICgoZ2V0Qml0cyhibG9ja01vZGVEYXRhLCAwLCAxKSA9PSAwICYmIGdldEJpdHMoYmxvY2tNb2RlRGF0YSwgNiwgOCkgPT0gNykgfHwgZ2V0Qml0cyhibG9ja01vZGVEYXRhLCAwLCAzKSA9PSAwKQotCQkJcmV0dXJuIGJsb2NrTW9kZTsgLy8gSW52YWxpZCAoInJlc2VydmVkIikuCi0JCWRlVWludDMyIHIgPSAoZGVVaW50MzIpLTE7IC8vIFxub3RlIFNldCBpbiB0aGUgZm9sbG93aW5nIGJyYW5jaGVzLgotCQlpZiAoZ2V0Qml0cyhibG9ja01vZGVEYXRhLCAwLCAxKSA9PSAwKQotCQl7Ci0JCQljb25zdCBkZVVpbnQzMiByMAk9IGdldEJpdChibG9ja01vZGVEYXRhLCA0KTsKLQkJCWNvbnN0IGRlVWludDMyIHIxCT0gZ2V0Qml0KGJsb2NrTW9kZURhdGEsIDIpOwotCQkJY29uc3QgZGVVaW50MzIgcjIJPSBnZXRCaXQoYmxvY2tNb2RlRGF0YSwgMyk7Ci0JCQljb25zdCBkZVVpbnQzMiBpNzgJPSBnZXRCaXRzKGJsb2NrTW9kZURhdGEsIDcsIDgpOwotCQkJciA9IChyMiA8PCAyKSB8IChyMSA8PCAxKSB8IChyMCA8PCAwKTsKLQkJCWlmIChpNzggPT0gMykKLQkJCXsKLQkJCQljb25zdCBib29sIGk1ID0gaXNCaXRTZXQoYmxvY2tNb2RlRGF0YSwgNSk7Ci0JCQkJYmxvY2tNb2RlLndlaWdodEdyaWRXaWR0aAk9IGk1ID8gMTAgOiA2OwotCQkJCWJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0CT0gaTUgPyA2ICA6IDEwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWNvbnN0IGRlVWludDMyIGEgPSBnZXRCaXRzKGJsb2NrTW9kZURhdGEsIDUsIDYpOwotCQkJCXN3aXRjaCAoaTc4KQotCQkJCXsKLQkJCQkJY2FzZSAwOgkJYmxvY2tNb2RlLndlaWdodEdyaWRXaWR0aCA9IDEyOwkJYmxvY2tNb2RlLndlaWdodEdyaWRIZWlnaHQgPSBhICsgMjsJCQkJCQkJCQlicmVhazsKLQkJCQkJY2FzZSAxOgkJYmxvY2tNb2RlLndlaWdodEdyaWRXaWR0aCA9IGEgKyAyOwlibG9ja01vZGUud2VpZ2h0R3JpZEhlaWdodCA9IDEyOwkJCQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6CQlibG9ja01vZGUud2VpZ2h0R3JpZFdpZHRoID0gYSArIDY7CWJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0ID0gZ2V0Qml0cyhibG9ja01vZGVEYXRhLCA5LCAxMCkgKyA2OwkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6IERFX0FTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJY29uc3QgZGVVaW50MzIgcjAJPSBnZXRCaXQoYmxvY2tNb2RlRGF0YSwgNCk7Ci0JCQljb25zdCBkZVVpbnQzMiByMQk9IGdldEJpdChibG9ja01vZGVEYXRhLCAwKTsKLQkJCWNvbnN0IGRlVWludDMyIHIyCT0gZ2V0Qml0KGJsb2NrTW9kZURhdGEsIDEpOwotCQkJY29uc3QgZGVVaW50MzIgaTIzCT0gZ2V0Qml0cyhibG9ja01vZGVEYXRhLCAyLCAzKTsKLQkJCWNvbnN0IGRlVWludDMyIGEJPSBnZXRCaXRzKGJsb2NrTW9kZURhdGEsIDUsIDYpOwotCQkJciA9IChyMiA8PCAyKSB8IChyMSA8PCAxKSB8IChyMCA8PCAwKTsKLQkJCWlmIChpMjMgPT0gMykKLQkJCXsKLQkJCQljb25zdCBkZVVpbnQzMgliCT0gZ2V0Qml0KGJsb2NrTW9kZURhdGEsIDcpOwotCQkJCWNvbnN0IGJvb2wJCWk4CT0gaXNCaXRTZXQoYmxvY2tNb2RlRGF0YSwgOCk7Ci0JCQkJYmxvY2tNb2RlLndlaWdodEdyaWRXaWR0aAk9IGk4ID8gYisyIDogYSsyOwotCQkJCWJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0CT0gaTggPyBhKzIgOiBiKzY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJY29uc3QgZGVVaW50MzIgYiA9IGdldEJpdHMoYmxvY2tNb2RlRGF0YSwgNywgOCk7Ci0JCQkJc3dpdGNoIChpMjMpCi0JCQkJewotCQkJCQljYXNlIDA6CQlibG9ja01vZGUud2VpZ2h0R3JpZFdpZHRoID0gYiArIDQ7CWJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0ID0gYSArIDI7CWJyZWFrOwotCQkJCQljYXNlIDE6CQlibG9ja01vZGUud2VpZ2h0R3JpZFdpZHRoID0gYiArIDg7CWJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0ID0gYSArIDI7CWJyZWFrOwotCQkJCQljYXNlIDI6CQlibG9ja01vZGUud2VpZ2h0R3JpZFdpZHRoID0gYSArIDI7CWJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0ID0gYiArIDg7CWJyZWFrOwotCQkJCQlkZWZhdWx0OiBERV9BU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljb25zdCBib29sCXplcm9ESAkJPSBnZXRCaXRzKGJsb2NrTW9kZURhdGEsIDAsIDEpID09IDAgJiYgZ2V0Qml0cyhibG9ja01vZGVEYXRhLCA3LCA4KSA9PSAyOwotCQljb25zdCBib29sCWgJCQk9IHplcm9ESCA/IDAgOiBpc0JpdFNldChibG9ja01vZGVEYXRhLCA5KTsKLQkJYmxvY2tNb2RlLmlzRHVhbFBsYW5lCT0gemVyb0RIID8gMCA6IGlzQml0U2V0KGJsb2NrTW9kZURhdGEsIDEwKTsKLQkJewotCQkJSVNFTW9kZSYJbQk9IGJsb2NrTW9kZS53ZWlnaHRJU0VQYXJhbXMubW9kZTsKLQkJCWludCYJCWIJPSBibG9ja01vZGUud2VpZ2h0SVNFUGFyYW1zLm51bUJpdHM7Ci0JCQltID0gSVNFTU9ERV9QTEFJTl9CSVQ7Ci0JCQliID0gMDsKLQkJCWlmIChoKQotCQkJewotCQkJCXN3aXRjaCAocikKLQkJCQl7Ci0JCQkJCWNhc2UgMjoJCQkJCQkJbSA9IElTRU1PREVfUVVJTlQ7CWIgPSAxOwlicmVhazsKLQkJCQkJY2FzZSAzOgkJbSA9IElTRU1PREVfVFJJVDsJCQkJCQliID0gMjsJYnJlYWs7Ci0JCQkJCWNhc2UgNDoJCQkJCQkJCQkJCQliID0gNDsJYnJlYWs7Ci0JCQkJCWNhc2UgNToJCQkJCQkJbSA9IElTRU1PREVfUVVJTlQ7CWIgPSAyOwlicmVhazsKLQkJCQkJY2FzZSA2OgkJbSA9IElTRU1PREVfVFJJVDsJCQkJCQliID0gMzsJYnJlYWs7Ci0JCQkJCWNhc2UgNzoJCQkJCQkJCQkJCQliID0gNTsJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6CURFX0FTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXN3aXRjaCAocikKLQkJCQl7Ci0JCQkJCWNhc2UgMjoJCQkJCQkJCQkJCQliID0gMTsJYnJlYWs7Ci0JCQkJCWNhc2UgMzoJCW0gPSBJU0VNT0RFX1RSSVQ7CQkJCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgkJCQkJCQkJCQkJCWIgPSAyOwlicmVhazsKLQkJCQkJY2FzZSA1OgkJCQkJCQltID0gSVNFTU9ERV9RVUlOVDsJCQlicmVhazsKLQkJCQkJY2FzZSA2OgkJbSA9IElTRU1PREVfVFJJVDsJCQkJCQliID0gMTsJYnJlYWs7Ci0JCQkJCWNhc2UgNzoJCQkJCQkJCQkJCQliID0gMzsJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6CURFX0FTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWJsb2NrTW9kZS5pc0Vycm9yID0gZmFsc2U7Ci0JcmV0dXJuIGJsb2NrTW9kZTsKLX0KLWlubGluZSB2b2lkIHNldEFTVENFcnJvckNvbG9yQmxvY2sgKHZvaWQqIGRzdCwgaW50IGJsb2NrV2lkdGgsIGludCBibG9ja0hlaWdodCwgYm9vbCBpc1NSR0IpCi17Ci0JaWYgKGlzU1JHQikKLQl7Ci0JCWRlVWludDgqIGNvbnN0IGRzdFUgPSAoZGVVaW50OCopZHN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrV2lkdGgqYmxvY2tIZWlnaHQ7IGkrKykKLQkJewotCQkJZHN0VVs0KmkgKyAwXSA9IDB4ZmY7Ci0JCQlkc3RVWzQqaSArIDFdID0gMDsKLQkJCWRzdFVbNCppICsgMl0gPSAweGZmOwotCQkJZHN0VVs0KmkgKyAzXSA9IDB4ZmY7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJZmxvYXQqIGNvbnN0IGRzdEYgPSAoZmxvYXQqKWRzdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja1dpZHRoKmJsb2NrSGVpZ2h0OyBpKyspCi0JCXsKLQkJCWRzdEZbNCppICsgMF0gPSAxLjBmOwotCQkJZHN0Rls0KmkgKyAxXSA9IDAuMGY7Ci0JCQlkc3RGWzQqaSArIDJdID0gMS4wZjsKLQkJCWRzdEZbNCppICsgM10gPSAxLjBmOwotCQl9Ci0JfQotfQotRGVjb21wcmVzc1Jlc3VsdCBkZWNvZGVWb2lkRXh0ZW50QmxvY2sgKHZvaWQqIGRzdCwgY29uc3QgQmxvY2sxMjgmIGJsb2NrRGF0YSwgaW50IGJsb2NrV2lkdGgsIGludCBibG9ja0hlaWdodCwgYm9vbCBpc1NSR0IsIGJvb2wgaXNMRFJNb2RlKQotewotCWNvbnN0IGRlVWludDMyCW1pblNFeHRlbnQJCQk9IGJsb2NrRGF0YS5nZXRCaXRzKDEyLCAyNCk7Ci0JY29uc3QgZGVVaW50MzIJbWF4U0V4dGVudAkJCT0gYmxvY2tEYXRhLmdldEJpdHMoMjUsIDM3KTsKLQljb25zdCBkZVVpbnQzMgltaW5URXh0ZW50CQkJPSBibG9ja0RhdGEuZ2V0Qml0cygzOCwgNTApOwotCWNvbnN0IGRlVWludDMyCW1heFRFeHRlbnQJCQk9IGJsb2NrRGF0YS5nZXRCaXRzKDUxLCA2Myk7Ci0JY29uc3QgYm9vbAkJYWxsRXh0ZW50c0FsbE9uZXMJPSBtaW5TRXh0ZW50ID09IDB4MWZmZiAmJiBtYXhTRXh0ZW50ID09IDB4MWZmZiAmJiBtaW5URXh0ZW50ID09IDB4MWZmZiAmJiBtYXhURXh0ZW50ID09IDB4MWZmZjsKLQljb25zdCBib29sCQlpc0hEUkJsb2NrCQkJPSBibG9ja0RhdGEuaXNCaXRTZXQoOSk7Ci0JaWYgKChpc0xEUk1vZGUgJiYgaXNIRFJCbG9jaykgfHwgKCFhbGxFeHRlbnRzQWxsT25lcyAmJiAobWluU0V4dGVudCA+PSBtYXhTRXh0ZW50IHx8IG1pblRFeHRlbnQgPj0gbWF4VEV4dGVudCkpKQotCXsKLQkJc2V0QVNUQ0Vycm9yQ29sb3JCbG9jayhkc3QsIGJsb2NrV2lkdGgsIGJsb2NrSGVpZ2h0LCBpc1NSR0IpOwotCQlyZXR1cm4gREVDT01QUkVTU19SRVNVTFRfRVJST1I7Ci0JfQotCWNvbnN0IGRlVWludDMyIHJnYmFbNF0gPQotCXsKLQkJYmxvY2tEYXRhLmdldEJpdHMoNjQsICA3OSksCi0JCWJsb2NrRGF0YS5nZXRCaXRzKDgwLCAgOTUpLAotCQlibG9ja0RhdGEuZ2V0Qml0cyg5NiwgIDExMSksCi0JCWJsb2NrRGF0YS5nZXRCaXRzKDExMiwgMTI3KQotCX07Ci0JaWYgKGlzU1JHQikKLQl7Ci0JCWRlVWludDgqIGNvbnN0IGRzdFUgPSAoZGVVaW50OCopZHN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrV2lkdGgqYmxvY2tIZWlnaHQ7IGkrKykKLQkJZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspCi0JCQlkc3RVW2kqNCArIGNdID0gKGRlVWludDgpKChyZ2JhW2NdICYgMHhmZjAwKSA+PiA4KTsKLQl9Ci0JZWxzZQotCXsKLQkJZmxvYXQqIGNvbnN0IGRzdEYgPSAoZmxvYXQqKWRzdDsKLQkJaWYgKGlzSERSQmxvY2spCi0JCXsKLQkJCS8vIHJnIC0gUkVNT1ZJTkcgSERSIFNVUFBPUlQgRk9SIE5PVwotI2lmIDAKLQkJCWZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKQotCQkJewotCQkJCWlmIChpc0Zsb2F0MTZJbmZPck5hbigoZGVGbG9hdDE2KXJnYmFbY10pKQotCQkJCQl0aHJvdyBJbnRlcm5hbEVycm9yKCJJbmZpbml0eSBvciBOYU4gY29sb3IgY29tcG9uZW50IGluIEhEUiB2b2lkIGV4dGVudCBibG9jayBpbiBBU1RDIHRleHR1cmUgKGJlaGF2aW9yIHVuZGVmaW5lZCBieSBBU1RDIHNwZWNpZmljYXRpb24pIik7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrV2lkdGgqYmxvY2tIZWlnaHQ7IGkrKykKLQkJCWZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKQotCQkJCWRzdEZbaSo0ICsgY10gPSBkZUZsb2F0MTZUbzMyKChkZUZsb2F0MTYpcmdiYVtjXSk7Ci0jZW5kaWYKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tXaWR0aCpibG9ja0hlaWdodDsgaSsrKQotCQkJZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspCi0JCQkJZHN0RltpKjQgKyBjXSA9IHJnYmFbY10gPT0gNjU1MzUgPyAxLjBmIDogKGZsb2F0KXJnYmFbY10gLyA2NTUzNi4wZjsKLQkJfQotCX0KLQlyZXR1cm4gREVDT01QUkVTU19SRVNVTFRfVkFMSURfQkxPQ0s7Ci19Ci12b2lkIGRlY29kZUNvbG9yRW5kcG9pbnRNb2RlcyAoZGVVaW50MzIqIGVuZHBvaW50TW9kZXNEc3QsIGNvbnN0IEJsb2NrMTI4JiBibG9ja0RhdGEsIGludCBudW1QYXJ0aXRpb25zLCBpbnQgZXh0cmFDZW1CaXRzU3RhcnQpCi17Ci0JaWYgKG51bVBhcnRpdGlvbnMgPT0gMSkKLQkJZW5kcG9pbnRNb2Rlc0RzdFswXSA9IGJsb2NrRGF0YS5nZXRCaXRzKDEzLCAxNik7Ci0JZWxzZQotCXsKLQkJY29uc3QgZGVVaW50MzIgaGlnaExldmVsU2VsZWN0b3IgPSBibG9ja0RhdGEuZ2V0Qml0cygyMywgMjQpOwotCQlpZiAoaGlnaExldmVsU2VsZWN0b3IgPT0gMCkKLQkJewotCQkJY29uc3QgZGVVaW50MzIgbW9kZSA9IGJsb2NrRGF0YS5nZXRCaXRzKDI1LCAyOCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVBhcnRpdGlvbnM7IGkrKykKLQkJCQllbmRwb2ludE1vZGVzRHN0W2ldID0gbW9kZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZvciAoaW50IHBhcnROZHggPSAwOyBwYXJ0TmR4IDwgbnVtUGFydGl0aW9uczsgcGFydE5keCsrKQotCQkJewotCQkJCWNvbnN0IGRlVWludDMyIGNlbUNsYXNzCQk9IGhpZ2hMZXZlbFNlbGVjdG9yIC0gKGJsb2NrRGF0YS5pc0JpdFNldCgyNSArIHBhcnROZHgpID8gMCA6IDEpOwotCQkJCWNvbnN0IGRlVWludDMyIGxvd0JpdDBOZHgJPSBudW1QYXJ0aXRpb25zICsgMipwYXJ0TmR4OwotCQkJCWNvbnN0IGRlVWludDMyIGxvd0JpdDFOZHgJPSBudW1QYXJ0aXRpb25zICsgMipwYXJ0TmR4ICsgMTsKLQkJCQljb25zdCBkZVVpbnQzMiBsb3dCaXQwCQk9IGJsb2NrRGF0YS5nZXRCaXQobG93Qml0ME5keCA8IDQgPyAyNStsb3dCaXQwTmR4IDogZXh0cmFDZW1CaXRzU3RhcnQrbG93Qml0ME5keC00KTsKLQkJCQljb25zdCBkZVVpbnQzMiBsb3dCaXQxCQk9IGJsb2NrRGF0YS5nZXRCaXQobG93Qml0MU5keCA8IDQgPyAyNStsb3dCaXQxTmR4IDogZXh0cmFDZW1CaXRzU3RhcnQrbG93Qml0MU5keC00KTsKLQkJCQllbmRwb2ludE1vZGVzRHN0W3BhcnROZHhdID0gKGNlbUNsYXNzIDw8IDIpIHwgKGxvd0JpdDEgPDwgMSkgfCBsb3dCaXQwOwotCQkJfQotCQl9Ci0JfQotfQotaW50IGNvbXB1dGVOdW1Db2xvckVuZHBvaW50VmFsdWVzIChjb25zdCBkZVVpbnQzMiogZW5kcG9pbnRNb2RlcywgaW50IG51bVBhcnRpdGlvbnMpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QYXJ0aXRpb25zOyBpKyspCi0JCXJlc3VsdCArPSBjb21wdXRlTnVtQ29sb3JFbmRwb2ludFZhbHVlcyhlbmRwb2ludE1vZGVzW2ldKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotdm9pZCBkZWNvZGVJU0VUcml0QmxvY2sgKElTRURlY29kZWRSZXN1bHQqIGRzdCwgaW50IG51bVZhbHVlcywgQml0QWNjZXNzU3RyZWFtJiBkYXRhLCBpbnQgbnVtQml0cykKLXsKLQlERV9BU1NFUlQoYmFzaXN1X2FzdGM6OmluUmFuZ2UobnVtVmFsdWVzLCAxLCA1KSk7Ci0JZGVVaW50MzIgbVs1XTsKLQltWzBdCQkJPSBkYXRhLmdldE5leHQobnVtQml0cyk7Ci0JZGVVaW50MzIgVDAxCT0gZGF0YS5nZXROZXh0KDIpOwotCW1bMV0JCQk9IGRhdGEuZ2V0TmV4dChudW1CaXRzKTsKLQlkZVVpbnQzMiBUMjMJPSBkYXRhLmdldE5leHQoMik7Ci0JbVsyXQkJCT0gZGF0YS5nZXROZXh0KG51bUJpdHMpOwotCWRlVWludDMyIFQ0CQk9IGRhdGEuZ2V0TmV4dCgxKTsKLQltWzNdCQkJPSBkYXRhLmdldE5leHQobnVtQml0cyk7Ci0JZGVVaW50MzIgVDU2CT0gZGF0YS5nZXROZXh0KDIpOwotCW1bNF0JCQk9IGRhdGEuZ2V0TmV4dChudW1CaXRzKTsKLQlkZVVpbnQzMiBUNwkJPSBkYXRhLmdldE5leHQoMSk7Ci0Jc3dpdGNoIChudW1WYWx1ZXMpCi0JewotCQkvLyBcbm90ZSBGYWxsLXRocm91Z2hzLgotCQljYXNlIDE6IFQyMwkJPSAwOwotCQljYXNlIDI6IFQ0CQk9IDA7Ci0JCWNhc2UgMzogVDU2CQk9IDA7Ci0JCWNhc2UgNDogVDcJCT0gMDsKLQkJY2FzZSA1OiBicmVhazsKLQkJZGVmYXVsdDoKLQkJCURFX0FTU0VSVChmYWxzZSk7Ci0JfQotCWNvbnN0IGRlVWludDMyIFQgPSAoVDcgPDwgNykgfCAoVDU2IDw8IDUpIHwgKFQ0IDw8IDQpIHwgKFQyMyA8PCAyKSB8IChUMDEgPDwgMCk7Ci0Jc3RhdGljIGNvbnN0IGRlVWludDMyIHRyaXRzRnJvbVRbMjU2XVs1XSA9Ci0JewotCQl7IDAsMCwwLDAsMCB9LCB7IDEsMCwwLDAsMCB9LCB7IDIsMCwwLDAsMCB9LCB7IDAsMCwyLDAsMCB9LCB7IDAsMSwwLDAsMCB9LCB7IDEsMSwwLDAsMCB9LCB7IDIsMSwwLDAsMCB9LCB7IDEsMCwyLDAsMCB9LCB7IDAsMiwwLDAsMCB9LCB7IDEsMiwwLDAsMCB9LCB7IDIsMiwwLDAsMCB9LCB7IDIsMCwyLDAsMCB9LCB7IDAsMiwyLDAsMCB9LCB7IDEsMiwyLDAsMCB9LCB7IDIsMiwyLDAsMCB9LCB7IDIsMCwyLDAsMCB9LAotCQl7IDAsMCwxLDAsMCB9LCB7IDEsMCwxLDAsMCB9LCB7IDIsMCwxLDAsMCB9LCB7IDAsMSwyLDAsMCB9LCB7IDAsMSwxLDAsMCB9LCB7IDEsMSwxLDAsMCB9LCB7IDIsMSwxLDAsMCB9LCB7IDEsMSwyLDAsMCB9LCB7IDAsMiwxLDAsMCB9LCB7IDEsMiwxLDAsMCB9LCB7IDIsMiwxLDAsMCB9LCB7IDIsMSwyLDAsMCB9LCB7IDAsMCwwLDIsMiB9LCB7IDEsMCwwLDIsMiB9LCB7IDIsMCwwLDIsMiB9LCB7IDAsMCwyLDIsMiB9LAotCQl7IDAsMCwwLDEsMCB9LCB7IDEsMCwwLDEsMCB9LCB7IDIsMCwwLDEsMCB9LCB7IDAsMCwyLDEsMCB9LCB7IDAsMSwwLDEsMCB9LCB7IDEsMSwwLDEsMCB9LCB7IDIsMSwwLDEsMCB9LCB7IDEsMCwyLDEsMCB9LCB7IDAsMiwwLDEsMCB9LCB7IDEsMiwwLDEsMCB9LCB7IDIsMiwwLDEsMCB9LCB7IDIsMCwyLDEsMCB9LCB7IDAsMiwyLDEsMCB9LCB7IDEsMiwyLDEsMCB9LCB7IDIsMiwyLDEsMCB9LCB7IDIsMCwyLDEsMCB9LAotCQl7IDAsMCwxLDEsMCB9LCB7IDEsMCwxLDEsMCB9LCB7IDIsMCwxLDEsMCB9LCB7IDAsMSwyLDEsMCB9LCB7IDAsMSwxLDEsMCB9LCB7IDEsMSwxLDEsMCB9LCB7IDIsMSwxLDEsMCB9LCB7IDEsMSwyLDEsMCB9LCB7IDAsMiwxLDEsMCB9LCB7IDEsMiwxLDEsMCB9LCB7IDIsMiwxLDEsMCB9LCB7IDIsMSwyLDEsMCB9LCB7IDAsMSwwLDIsMiB9LCB7IDEsMSwwLDIsMiB9LCB7IDIsMSwwLDIsMiB9LCB7IDEsMCwyLDIsMiB9LAotCQl7IDAsMCwwLDIsMCB9LCB7IDEsMCwwLDIsMCB9LCB7IDIsMCwwLDIsMCB9LCB7IDAsMCwyLDIsMCB9LCB7IDAsMSwwLDIsMCB9LCB7IDEsMSwwLDIsMCB9LCB7IDIsMSwwLDIsMCB9LCB7IDEsMCwyLDIsMCB9LCB7IDAsMiwwLDIsMCB9LCB7IDEsMiwwLDIsMCB9LCB7IDIsMiwwLDIsMCB9LCB7IDIsMCwyLDIsMCB9LCB7IDAsMiwyLDIsMCB9LCB7IDEsMiwyLDIsMCB9LCB7IDIsMiwyLDIsMCB9LCB7IDIsMCwyLDIsMCB9LAotCQl7IDAsMCwxLDIsMCB9LCB7IDEsMCwxLDIsMCB9LCB7IDIsMCwxLDIsMCB9LCB7IDAsMSwyLDIsMCB9LCB7IDAsMSwxLDIsMCB9LCB7IDEsMSwxLDIsMCB9LCB7IDIsMSwxLDIsMCB9LCB7IDEsMSwyLDIsMCB9LCB7IDAsMiwxLDIsMCB9LCB7IDEsMiwxLDIsMCB9LCB7IDIsMiwxLDIsMCB9LCB7IDIsMSwyLDIsMCB9LCB7IDAsMiwwLDIsMiB9LCB7IDEsMiwwLDIsMiB9LCB7IDIsMiwwLDIsMiB9LCB7IDIsMCwyLDIsMiB9LAotCQl7IDAsMCwwLDAsMiB9LCB7IDEsMCwwLDAsMiB9LCB7IDIsMCwwLDAsMiB9LCB7IDAsMCwyLDAsMiB9LCB7IDAsMSwwLDAsMiB9LCB7IDEsMSwwLDAsMiB9LCB7IDIsMSwwLDAsMiB9LCB7IDEsMCwyLDAsMiB9LCB7IDAsMiwwLDAsMiB9LCB7IDEsMiwwLDAsMiB9LCB7IDIsMiwwLDAsMiB9LCB7IDIsMCwyLDAsMiB9LCB7IDAsMiwyLDAsMiB9LCB7IDEsMiwyLDAsMiB9LCB7IDIsMiwyLDAsMiB9LCB7IDIsMCwyLDAsMiB9LAotCQl7IDAsMCwxLDAsMiB9LCB7IDEsMCwxLDAsMiB9LCB7IDIsMCwxLDAsMiB9LCB7IDAsMSwyLDAsMiB9LCB7IDAsMSwxLDAsMiB9LCB7IDEsMSwxLDAsMiB9LCB7IDIsMSwxLDAsMiB9LCB7IDEsMSwyLDAsMiB9LCB7IDAsMiwxLDAsMiB9LCB7IDEsMiwxLDAsMiB9LCB7IDIsMiwxLDAsMiB9LCB7IDIsMSwyLDAsMiB9LCB7IDAsMiwyLDIsMiB9LCB7IDEsMiwyLDIsMiB9LCB7IDIsMiwyLDIsMiB9LCB7IDIsMCwyLDIsMiB9LAotCQl7IDAsMCwwLDAsMSB9LCB7IDEsMCwwLDAsMSB9LCB7IDIsMCwwLDAsMSB9LCB7IDAsMCwyLDAsMSB9LCB7IDAsMSwwLDAsMSB9LCB7IDEsMSwwLDAsMSB9LCB7IDIsMSwwLDAsMSB9LCB7IDEsMCwyLDAsMSB9LCB7IDAsMiwwLDAsMSB9LCB7IDEsMiwwLDAsMSB9LCB7IDIsMiwwLDAsMSB9LCB7IDIsMCwyLDAsMSB9LCB7IDAsMiwyLDAsMSB9LCB7IDEsMiwyLDAsMSB9LCB7IDIsMiwyLDAsMSB9LCB7IDIsMCwyLDAsMSB9LAotCQl7IDAsMCwxLDAsMSB9LCB7IDEsMCwxLDAsMSB9LCB7IDIsMCwxLDAsMSB9LCB7IDAsMSwyLDAsMSB9LCB7IDAsMSwxLDAsMSB9LCB7IDEsMSwxLDAsMSB9LCB7IDIsMSwxLDAsMSB9LCB7IDEsMSwyLDAsMSB9LCB7IDAsMiwxLDAsMSB9LCB7IDEsMiwxLDAsMSB9LCB7IDIsMiwxLDAsMSB9LCB7IDIsMSwyLDAsMSB9LCB7IDAsMCwxLDIsMiB9LCB7IDEsMCwxLDIsMiB9LCB7IDIsMCwxLDIsMiB9LCB7IDAsMSwyLDIsMiB9LAotCQl7IDAsMCwwLDEsMSB9LCB7IDEsMCwwLDEsMSB9LCB7IDIsMCwwLDEsMSB9LCB7IDAsMCwyLDEsMSB9LCB7IDAsMSwwLDEsMSB9LCB7IDEsMSwwLDEsMSB9LCB7IDIsMSwwLDEsMSB9LCB7IDEsMCwyLDEsMSB9LCB7IDAsMiwwLDEsMSB9LCB7IDEsMiwwLDEsMSB9LCB7IDIsMiwwLDEsMSB9LCB7IDIsMCwyLDEsMSB9LCB7IDAsMiwyLDEsMSB9LCB7IDEsMiwyLDEsMSB9LCB7IDIsMiwyLDEsMSB9LCB7IDIsMCwyLDEsMSB9LAotCQl7IDAsMCwxLDEsMSB9LCB7IDEsMCwxLDEsMSB9LCB7IDIsMCwxLDEsMSB9LCB7IDAsMSwyLDEsMSB9LCB7IDAsMSwxLDEsMSB9LCB7IDEsMSwxLDEsMSB9LCB7IDIsMSwxLDEsMSB9LCB7IDEsMSwyLDEsMSB9LCB7IDAsMiwxLDEsMSB9LCB7IDEsMiwxLDEsMSB9LCB7IDIsMiwxLDEsMSB9LCB7IDIsMSwyLDEsMSB9LCB7IDAsMSwxLDIsMiB9LCB7IDEsMSwxLDIsMiB9LCB7IDIsMSwxLDIsMiB9LCB7IDEsMSwyLDIsMiB9LAotCQl7IDAsMCwwLDIsMSB9LCB7IDEsMCwwLDIsMSB9LCB7IDIsMCwwLDIsMSB9LCB7IDAsMCwyLDIsMSB9LCB7IDAsMSwwLDIsMSB9LCB7IDEsMSwwLDIsMSB9LCB7IDIsMSwwLDIsMSB9LCB7IDEsMCwyLDIsMSB9LCB7IDAsMiwwLDIsMSB9LCB7IDEsMiwwLDIsMSB9LCB7IDIsMiwwLDIsMSB9LCB7IDIsMCwyLDIsMSB9LCB7IDAsMiwyLDIsMSB9LCB7IDEsMiwyLDIsMSB9LCB7IDIsMiwyLDIsMSB9LCB7IDIsMCwyLDIsMSB9LAotCQl7IDAsMCwxLDIsMSB9LCB7IDEsMCwxLDIsMSB9LCB7IDIsMCwxLDIsMSB9LCB7IDAsMSwyLDIsMSB9LCB7IDAsMSwxLDIsMSB9LCB7IDEsMSwxLDIsMSB9LCB7IDIsMSwxLDIsMSB9LCB7IDEsMSwyLDIsMSB9LCB7IDAsMiwxLDIsMSB9LCB7IDEsMiwxLDIsMSB9LCB7IDIsMiwxLDIsMSB9LCB7IDIsMSwyLDIsMSB9LCB7IDAsMiwxLDIsMiB9LCB7IDEsMiwxLDIsMiB9LCB7IDIsMiwxLDIsMiB9LCB7IDIsMSwyLDIsMiB9LAotCQl7IDAsMCwwLDEsMiB9LCB7IDEsMCwwLDEsMiB9LCB7IDIsMCwwLDEsMiB9LCB7IDAsMCwyLDEsMiB9LCB7IDAsMSwwLDEsMiB9LCB7IDEsMSwwLDEsMiB9LCB7IDIsMSwwLDEsMiB9LCB7IDEsMCwyLDEsMiB9LCB7IDAsMiwwLDEsMiB9LCB7IDEsMiwwLDEsMiB9LCB7IDIsMiwwLDEsMiB9LCB7IDIsMCwyLDEsMiB9LCB7IDAsMiwyLDEsMiB9LCB7IDEsMiwyLDEsMiB9LCB7IDIsMiwyLDEsMiB9LCB7IDIsMCwyLDEsMiB9LAotCQl7IDAsMCwxLDEsMiB9LCB7IDEsMCwxLDEsMiB9LCB7IDIsMCwxLDEsMiB9LCB7IDAsMSwyLDEsMiB9LCB7IDAsMSwxLDEsMiB9LCB7IDEsMSwxLDEsMiB9LCB7IDIsMSwxLDEsMiB9LCB7IDEsMSwyLDEsMiB9LCB7IDAsMiwxLDEsMiB9LCB7IDEsMiwxLDEsMiB9LCB7IDIsMiwxLDEsMiB9LCB7IDIsMSwyLDEsMiB9LCB7IDAsMiwyLDIsMiB9LCB7IDEsMiwyLDIsMiB9LCB7IDIsMiwyLDIsMiB9LCB7IDIsMSwyLDIsMiB9Ci0JfTsKLQljb25zdCBkZVVpbnQzMiAoJiB0cml0cylbNV0gPSB0cml0c0Zyb21UW1RdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspCi0JewotCQlkc3RbaV0ubQk9IG1baV07Ci0JCWRzdFtpXS50cQk9IHRyaXRzW2ldOwotCQlkc3RbaV0udgk9ICh0cml0c1tpXSA8PCBudW1CaXRzKSArIG1baV07Ci0JfQotfQotdm9pZCBkZWNvZGVJU0VRdWludEJsb2NrIChJU0VEZWNvZGVkUmVzdWx0KiBkc3QsIGludCBudW1WYWx1ZXMsIEJpdEFjY2Vzc1N0cmVhbSYgZGF0YSwgaW50IG51bUJpdHMpCi17Ci0JREVfQVNTRVJUKGJhc2lzdV9hc3RjOjppblJhbmdlKG51bVZhbHVlcywgMSwgMykpOwotCWRlVWludDMyIG1bM107Ci0JbVswXQkJCT0gZGF0YS5nZXROZXh0KG51bUJpdHMpOwotCWRlVWludDMyIFEwMTIJPSBkYXRhLmdldE5leHQoMyk7Ci0JbVsxXQkJCT0gZGF0YS5nZXROZXh0KG51bUJpdHMpOwotCWRlVWludDMyIFEzNAk9IGRhdGEuZ2V0TmV4dCgyKTsKLQltWzJdCQkJPSBkYXRhLmdldE5leHQobnVtQml0cyk7Ci0JZGVVaW50MzIgUTU2CT0gZGF0YS5nZXROZXh0KDIpOwotCXN3aXRjaCAobnVtVmFsdWVzKQotCXsKLQkJLy8gXG5vdGUgRmFsbC10aHJvdWdocy4KLQkJY2FzZSAxOiBRMzQJCT0gMDsKLQkJY2FzZSAyOiBRNTYJCT0gMDsKLQkJY2FzZSAzOiBicmVhazsKLQkJZGVmYXVsdDoKLQkJCURFX0FTU0VSVChmYWxzZSk7Ci0JfQotCWNvbnN0IGRlVWludDMyIFEgPSAoUTU2IDw8IDUpIHwgKFEzNCA8PCAzKSB8IChRMDEyIDw8IDApOwotCXN0YXRpYyBjb25zdCBkZVVpbnQzMiBxdWludHNGcm9tUVsyNTZdWzNdID0KLQl7Ci0JCXsgMCwwLDAgfSwgeyAxLDAsMCB9LCB7IDIsMCwwIH0sIHsgMywwLDAgfSwgeyA0LDAsMCB9LCB7IDAsNCwwIH0sIHsgNCw0LDAgfSwgeyA0LDQsNCB9LCB7IDAsMSwwIH0sIHsgMSwxLDAgfSwgeyAyLDEsMCB9LCB7IDMsMSwwIH0sIHsgNCwxLDAgfSwgeyAxLDQsMCB9LCB7IDQsNCwxIH0sIHsgNCw0LDQgfSwKLQkJeyAwLDIsMCB9LCB7IDEsMiwwIH0sIHsgMiwyLDAgfSwgeyAzLDIsMCB9LCB7IDQsMiwwIH0sIHsgMiw0LDAgfSwgeyA0LDQsMiB9LCB7IDQsNCw0IH0sIHsgMCwzLDAgfSwgeyAxLDMsMCB9LCB7IDIsMywwIH0sIHsgMywzLDAgfSwgeyA0LDMsMCB9LCB7IDMsNCwwIH0sIHsgNCw0LDMgfSwgeyA0LDQsNCB9LAotCQl7IDAsMCwxIH0sIHsgMSwwLDEgfSwgeyAyLDAsMSB9LCB7IDMsMCwxIH0sIHsgNCwwLDEgfSwgeyAwLDQsMSB9LCB7IDQsMCw0IH0sIHsgMCw0LDQgfSwgeyAwLDEsMSB9LCB7IDEsMSwxIH0sIHsgMiwxLDEgfSwgeyAzLDEsMSB9LCB7IDQsMSwxIH0sIHsgMSw0LDEgfSwgeyA0LDEsNCB9LCB7IDEsNCw0IH0sCi0JCXsgMCwyLDEgfSwgeyAxLDIsMSB9LCB7IDIsMiwxIH0sIHsgMywyLDEgfSwgeyA0LDIsMSB9LCB7IDIsNCwxIH0sIHsgNCwyLDQgfSwgeyAyLDQsNCB9LCB7IDAsMywxIH0sIHsgMSwzLDEgfSwgeyAyLDMsMSB9LCB7IDMsMywxIH0sIHsgNCwzLDEgfSwgeyAzLDQsMSB9LCB7IDQsMyw0IH0sIHsgMyw0LDQgfSwKLQkJeyAwLDAsMiB9LCB7IDEsMCwyIH0sIHsgMiwwLDIgfSwgeyAzLDAsMiB9LCB7IDQsMCwyIH0sIHsgMCw0LDIgfSwgeyAyLDAsNCB9LCB7IDMsMCw0IH0sIHsgMCwxLDIgfSwgeyAxLDEsMiB9LCB7IDIsMSwyIH0sIHsgMywxLDIgfSwgeyA0LDEsMiB9LCB7IDEsNCwyIH0sIHsgMiwxLDQgfSwgeyAzLDEsNCB9LAotCQl7IDAsMiwyIH0sIHsgMSwyLDIgfSwgeyAyLDIsMiB9LCB7IDMsMiwyIH0sIHsgNCwyLDIgfSwgeyAyLDQsMiB9LCB7IDIsMiw0IH0sIHsgMywyLDQgfSwgeyAwLDMsMiB9LCB7IDEsMywyIH0sIHsgMiwzLDIgfSwgeyAzLDMsMiB9LCB7IDQsMywyIH0sIHsgMyw0LDIgfSwgeyAyLDMsNCB9LCB7IDMsMyw0IH0sCi0JCXsgMCwwLDMgfSwgeyAxLDAsMyB9LCB7IDIsMCwzIH0sIHsgMywwLDMgfSwgeyA0LDAsMyB9LCB7IDAsNCwzIH0sIHsgMCwwLDQgfSwgeyAxLDAsNCB9LCB7IDAsMSwzIH0sIHsgMSwxLDMgfSwgeyAyLDEsMyB9LCB7IDMsMSwzIH0sIHsgNCwxLDMgfSwgeyAxLDQsMyB9LCB7IDAsMSw0IH0sIHsgMSwxLDQgfSwKLQkJeyAwLDIsMyB9LCB7IDEsMiwzIH0sIHsgMiwyLDMgfSwgeyAzLDIsMyB9LCB7IDQsMiwzIH0sIHsgMiw0LDMgfSwgeyAwLDIsNCB9LCB7IDEsMiw0IH0sIHsgMCwzLDMgfSwgeyAxLDMsMyB9LCB7IDIsMywzIH0sIHsgMywzLDMgfSwgeyA0LDMsMyB9LCB7IDMsNCwzIH0sIHsgMCwzLDQgfSwgeyAxLDMsNCB9Ci0JfTsKLQljb25zdCBkZVVpbnQzMiAoJiBxdWludHMpWzNdID0gcXVpbnRzRnJvbVFbUV07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykKLQl7Ci0JCWRzdFtpXS5tCT0gbVtpXTsKLQkJZHN0W2ldLnRxCT0gcXVpbnRzW2ldOwotCQlkc3RbaV0udgk9IChxdWludHNbaV0gPDwgbnVtQml0cykgKyBtW2ldOwotCX0KLX0KLWlubGluZSB2b2lkIGRlY29kZUlTRUJpdEJsb2NrIChJU0VEZWNvZGVkUmVzdWx0KiBkc3QsIEJpdEFjY2Vzc1N0cmVhbSYgZGF0YSwgaW50IG51bUJpdHMpCi17Ci0JZHN0WzBdLm0gPSBkYXRhLmdldE5leHQobnVtQml0cyk7Ci0JZHN0WzBdLnYgPSBkc3RbMF0ubTsKLX0KLXZvaWQgZGVjb2RlSVNFIChJU0VEZWNvZGVkUmVzdWx0KiBkc3QsIGludCBudW1WYWx1ZXMsIEJpdEFjY2Vzc1N0cmVhbSYgZGF0YSwgY29uc3QgSVNFUGFyYW1zJiBwYXJhbXMpCi17Ci0JaWYgKHBhcmFtcy5tb2RlID09IElTRU1PREVfVFJJVCkKLQl7Ci0JCWNvbnN0IGludCBudW1CbG9ja3MgPSBkZURpdlJvdW5kVXAzMihudW1WYWx1ZXMsIDUpOwotCQlmb3IgKGludCBibG9ja05keCA9IDA7IGJsb2NrTmR4IDwgbnVtQmxvY2tzOyBibG9ja05keCsrKQotCQl7Ci0JCQljb25zdCBpbnQgbnVtVmFsdWVzSW5CbG9jayA9IGJsb2NrTmR4ID09IG51bUJsb2Nrcy0xID8gbnVtVmFsdWVzIC0gNSoobnVtQmxvY2tzLTEpIDogNTsKLQkJCWRlY29kZUlTRVRyaXRCbG9jaygmZHN0WzUqYmxvY2tOZHhdLCBudW1WYWx1ZXNJbkJsb2NrLCBkYXRhLCBwYXJhbXMubnVtQml0cyk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAocGFyYW1zLm1vZGUgPT0gSVNFTU9ERV9RVUlOVCkKLQl7Ci0JCWNvbnN0IGludCBudW1CbG9ja3MgPSBkZURpdlJvdW5kVXAzMihudW1WYWx1ZXMsIDMpOwotCQlmb3IgKGludCBibG9ja05keCA9IDA7IGJsb2NrTmR4IDwgbnVtQmxvY2tzOyBibG9ja05keCsrKQotCQl7Ci0JCQljb25zdCBpbnQgbnVtVmFsdWVzSW5CbG9jayA9IGJsb2NrTmR4ID09IG51bUJsb2Nrcy0xID8gbnVtVmFsdWVzIC0gMyoobnVtQmxvY2tzLTEpIDogMzsKLQkJCWRlY29kZUlTRVF1aW50QmxvY2soJmRzdFszKmJsb2NrTmR4XSwgbnVtVmFsdWVzSW5CbG9jaywgZGF0YSwgcGFyYW1zLm51bUJpdHMpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURFX0FTU0VSVChwYXJhbXMubW9kZSA9PSBJU0VNT0RFX1BMQUlOX0JJVCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspCi0JCQlkZWNvZGVJU0VCaXRCbG9jaygmZHN0W2ldLCBkYXRhLCBwYXJhbXMubnVtQml0cyk7Ci0JfQotfQotdm9pZCB1bnF1YW50aXplQ29sb3JFbmRwb2ludHMgKGRlVWludDMyKiBkc3QsIGNvbnN0IElTRURlY29kZWRSZXN1bHQqIGlzZVJlc3VsdHMsIGludCBudW1FbmRwb2ludHMsIGNvbnN0IElTRVBhcmFtcyYgaXNlUGFyYW1zKQotewotCWlmIChpc2VQYXJhbXMubW9kZSA9PSBJU0VNT0RFX1RSSVQgfHwgaXNlUGFyYW1zLm1vZGUgPT0gSVNFTU9ERV9RVUlOVCkKLQl7Ci0JCWNvbnN0IGludCByYW5nZUNhc2UJCQkJPSBpc2VQYXJhbXMubnVtQml0cyoyIC0gKGlzZVBhcmFtcy5tb2RlID09IElTRU1PREVfVFJJVCA/IDIgOiAxKTsKLQkJREVfQVNTRVJUKGJhc2lzdV9hc3RjOjppblJhbmdlKHJhbmdlQ2FzZSwgMCwgMTApKTsKLQkJc3RhdGljIGNvbnN0IGRlVWludDMyCUNhWzExXQk9IHsgMjA0LCAxMTMsIDkzLCA1NCwgNDQsIDI2LCAyMiwgMTMsIDExLCA2LCA1IH07Ci0JCWNvbnN0IGRlVWludDMyCQkJQwkJPSBDYVtyYW5nZUNhc2VdOwotCQlmb3IgKGludCBlbmRwb2ludE5keCA9IDA7IGVuZHBvaW50TmR4IDwgbnVtRW5kcG9pbnRzOyBlbmRwb2ludE5keCsrKQotCQl7Ci0JCQljb25zdCBkZVVpbnQzMiBhID0gZ2V0Qml0KGlzZVJlc3VsdHNbZW5kcG9pbnROZHhdLm0sIDApOwotCQkJY29uc3QgZGVVaW50MzIgYiA9IGdldEJpdChpc2VSZXN1bHRzW2VuZHBvaW50TmR4XS5tLCAxKTsKLQkJCWNvbnN0IGRlVWludDMyIGMgPSBnZXRCaXQoaXNlUmVzdWx0c1tlbmRwb2ludE5keF0ubSwgMik7Ci0JCQljb25zdCBkZVVpbnQzMiBkID0gZ2V0Qml0KGlzZVJlc3VsdHNbZW5kcG9pbnROZHhdLm0sIDMpOwotCQkJY29uc3QgZGVVaW50MzIgZSA9IGdldEJpdChpc2VSZXN1bHRzW2VuZHBvaW50TmR4XS5tLCA0KTsKLQkJCWNvbnN0IGRlVWludDMyIGYgPSBnZXRCaXQoaXNlUmVzdWx0c1tlbmRwb2ludE5keF0ubSwgNSk7Ci0JCQljb25zdCBkZVVpbnQzMiBBID0gYSA9PSAwID8gMCA6ICgxPDw5KS0xOwotCQkJY29uc3QgZGVVaW50MzIgQiA9IHJhbmdlQ2FzZSA9PSAwCT8gMAotCQkJCQkJCSA6IHJhbmdlQ2FzZSA9PSAxCT8gMAotCQkJCQkJCSA6IHJhbmdlQ2FzZSA9PSAyCT8gKGIgPDwgOCkgfAkJCQkJCQkJCShiIDw8IDQpIHwJCQkJKGIgPDwgMikgfAkoYiA8PCAxKQotCQkJCQkJCSA6IHJhbmdlQ2FzZSA9PSAzCT8gKGIgPDwgOCkgfAkJCQkJCQkJCQkJCShiIDw8IDMpIHwJKGIgPDwgMikKLQkJCQkJCQkgOiByYW5nZUNhc2UgPT0gNAk/IChjIDw8IDgpIHwgKGIgPDwgNykgfAkJCQkJCQkJCQkoYyA8PCAzKSB8CShiIDw8IDIpIHwJKGMgPDwgMSkgfAkoYiA8PCAwKQotCQkJCQkJCSA6IHJhbmdlQ2FzZSA9PSA1CT8gKGMgPDwgOCkgfCAoYiA8PCA3KSB8CQkJCQkJCQkJCQkJCShjIDw8IDIpIHwJKGIgPDwgMSkgfAkoYyA8PCAwKQotCQkJCQkJCSA6IHJhbmdlQ2FzZSA9PSA2CT8gKGQgPDwgOCkgfCAoYyA8PCA3KSB8IChiIDw8IDYpIHwJCQkJCQkJCQkJKGQgPDwgMikgfAkoYyA8PCAxKSB8CShiIDw8IDApCi0JCQkJCQkJIDogcmFuZ2VDYXNlID09IDcJPyAoZCA8PCA4KSB8IChjIDw8IDcpIHwgKGIgPDwgNikgfAkJCQkJCQkJCQkJCQkoZCA8PCAxKSB8CShjIDw8IDApCi0JCQkJCQkJIDogcmFuZ2VDYXNlID09IDgJPyAoZSA8PCA4KSB8IChkIDw8IDcpIHwgKGMgPDwgNikgfCAoYiA8PCA1KSB8CQkJCQkJCQkJCShlIDw8IDEpIHwJKGQgPDwgMCkKLQkJCQkJCQkgOiByYW5nZUNhc2UgPT0gOQk/IChlIDw8IDgpIHwgKGQgPDwgNykgfCAoYyA8PCA2KSB8IChiIDw8IDUpIHwJCQkJCQkJCQkJCQkJKGUgPDwgMCkKLQkJCQkJCQkgOiByYW5nZUNhc2UgPT0gMTAJPyAoZiA8PCA4KSB8IChlIDw8IDcpIHwgKGQgPDwgNikgfCAoYyA8PCA1KSB8CShiIDw8IDQpIHwJCQkJCQkJCQkJKGYgPDwgMCkKLQkJCQkJCQkgOiAoZGVVaW50MzIpLTE7Ci0JCQlERV9BU1NFUlQoQiAhPSAoZGVVaW50MzIpLTEpOwotCQkJZHN0W2VuZHBvaW50TmR4XSA9ICgoKGlzZVJlc3VsdHNbZW5kcG9pbnROZHhdLnRxKkMgKyBCKSBeIEEpID4+IDIpIHwgKEEgJiAweDgwKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlERV9BU1NFUlQoaXNlUGFyYW1zLm1vZGUgPT0gSVNFTU9ERV9QTEFJTl9CSVQpOwotCQlmb3IgKGludCBlbmRwb2ludE5keCA9IDA7IGVuZHBvaW50TmR4IDwgbnVtRW5kcG9pbnRzOyBlbmRwb2ludE5keCsrKQotCQkJZHN0W2VuZHBvaW50TmR4XSA9IGJpdFJlcGxpY2F0aW9uU2NhbGUoaXNlUmVzdWx0c1tlbmRwb2ludE5keF0udiwgaXNlUGFyYW1zLm51bUJpdHMsIDgpOwotCX0KLX0KLWlubGluZSB2b2lkIGJpdFRyYW5zZmVyU2lnbmVkIChkZUludDMyJiBhLCBkZUludDMyJiBiKQotewotCWIgPj49IDE7Ci0JYiB8PSBhICYgMHg4MDsKLQlhID4+PSAxOwotCWEgJj0gMHgzZjsKLQlpZiAoaXNCaXRTZXQoYSwgNSkpCi0JCWEgLT0gMHg0MDsKLX0KLWlubGluZSBVVmVjNCBjbGFtcGVkUkdCQSAoY29uc3QgSVZlYzQmIHJnYmEpCi17Ci0JcmV0dXJuIFVWZWM0KGJhc2lzdV9hc3RjOjpjbGFtcChyZ2JhLngoKSwgMCwgMHhmZiksCi0JCWJhc2lzdV9hc3RjOjpjbGFtcChyZ2JhLnkoKSwgMCwgMHhmZiksCi0JCWJhc2lzdV9hc3RjOjpjbGFtcChyZ2JhLnooKSwgMCwgMHhmZiksCi0JCWJhc2lzdV9hc3RjOjpjbGFtcChyZ2JhLncoKSwgMCwgMHhmZikpOwotfQotaW5saW5lIElWZWM0IGJsdWVDb250cmFjdCAoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEpCi17Ci0JcmV0dXJuIElWZWM0KChyK2IpPj4xLCAoZytiKT4+MSwgYiwgYSk7Ci19Ci1pbmxpbmUgYm9vbCBpc0NvbG9yRW5kcG9pbnRNb2RlSERSIChkZVVpbnQzMiBtb2RlKQotewotCXJldHVybiBtb2RlID09IDIJfHwKLQkJICAgbW9kZSA9PSAzCXx8Ci0JCSAgIG1vZGUgPT0gNwl8fAotCQkgICBtb2RlID09IDExCXx8Ci0JCSAgIG1vZGUgPT0gMTQJfHwKLQkJICAgbW9kZSA9PSAxNTsKLX0KLXZvaWQgZGVjb2RlSERSRW5kcG9pbnRNb2RlNyAoVVZlYzQmIGUwLCBVVmVjNCYgZTEsIGRlVWludDMyIHYwLCBkZVVpbnQzMiB2MSwgZGVVaW50MzIgdjIsIGRlVWludDMyIHYzKQotewotCWNvbnN0IGRlVWludDMyIG0xMAkJPSBnZXRCaXQodjEsIDcpIHwgKGdldEJpdCh2MiwgNykgPDwgMSk7Ci0JY29uc3QgZGVVaW50MzIgbTIzCQk9IGdldEJpdHModjAsIDYsIDcpOwotCWNvbnN0IGRlVWludDMyIG1hakNvbXAJPSBtMTAgIT0gMwk/IG0xMAotCQkJCQkJCTogbTIzICE9IDMJPyBtMjMKLQkJCQkJCQk6CQkJICAwOwotCWNvbnN0IGRlVWludDMyIG1vZGUJCT0gbTEwICE9IDMJPyBtMjMKLQkJCQkJCQk6IG0yMyAhPSAzCT8gNAotCQkJCQkJCToJCQkgIDU7Ci0JZGVJbnQzMgkJCXJlZAkJPSAoZGVJbnQzMilnZXRCaXRzKHYwLCAwLCA1KTsKLQlkZUludDMyCQkJZ3JlZW4JPSAoZGVJbnQzMilnZXRCaXRzKHYxLCAwLCA0KTsKLQlkZUludDMyCQkJYmx1ZQk9IChkZUludDMyKWdldEJpdHModjIsIDAsIDQpOwotCWRlSW50MzIJCQlzY2FsZQk9IChkZUludDMyKWdldEJpdHModjMsIDAsIDQpOwotCXsKLSNkZWZpbmUgU0hPUihEU1RfVkFSLCBTSElGVCwgQklUX1ZBUikgKERTVF9WQVIpIHw9IChCSVRfVkFSKSA8PCAoU0hJRlQpCi0jZGVmaW5lIEFTU0lHTl9YX0JJVFMoVjAsUzAsIFYxLFMxLCBWMixTMiwgVjMsUzMsIFY0LFM0LCBWNSxTNSwgVjYsUzYpIGRvIHsgU0hPUihWMCxTMCx4MCk7IFNIT1IoVjEsUzEseDEpOyBTSE9SKFYyLFMyLHgyKTsgU0hPUihWMyxTMyx4Myk7IFNIT1IoVjQsUzQseDQpOyBTSE9SKFY1LFM1LHg1KTsgU0hPUihWNixTNix4Nik7IH0gd2hpbGUgKGZhbHNlKQotCQljb25zdCBkZVVpbnQzMgl4MAk9IGdldEJpdCh2MSwgNik7Ci0JCWNvbnN0IGRlVWludDMyCXgxCT0gZ2V0Qml0KHYxLCA1KTsKLQkJY29uc3QgZGVVaW50MzIJeDIJPSBnZXRCaXQodjIsIDYpOwotCQljb25zdCBkZVVpbnQzMgl4Mwk9IGdldEJpdCh2MiwgNSk7Ci0JCWNvbnN0IGRlVWludDMyCXg0CT0gZ2V0Qml0KHYzLCA3KTsKLQkJY29uc3QgZGVVaW50MzIJeDUJPSBnZXRCaXQodjMsIDYpOwotCQljb25zdCBkZVVpbnQzMgl4Ngk9IGdldEJpdCh2MywgNSk7Ci0JCWRlSW50MzImCQlSCT0gcmVkOwotCQlkZUludDMyJgkJRwk9IGdyZWVuOwotCQlkZUludDMyJgkJQgk9IGJsdWU7Ci0JCWRlSW50MzImCQlTCT0gc2NhbGU7Ci0JCXN3aXRjaCAobW9kZSkKLQkJewotCQkJY2FzZSAwOiBBU1NJR05fWF9CSVRTKFIsOSwgIFIsOCwgIFIsNywgIFIsMTAsICBSLDYsICBTLDYsICAgUyw1KTsgYnJlYWs7Ci0JCQljYXNlIDE6IEFTU0lHTl9YX0JJVFMoUiw4LCAgRyw1LCAgUiw3LCAgQiw1LCAgIFIsNiwgIFIsMTAsICBSLDkpOyBicmVhazsKLQkJCWNhc2UgMjogQVNTSUdOX1hfQklUUyhSLDksICBSLDgsICBSLDcsICBSLDYsICAgUyw3LCAgUyw2LCAgIFMsNSk7IGJyZWFrOwotCQkJY2FzZSAzOiBBU1NJR05fWF9CSVRTKFIsOCwgIEcsNSwgIFIsNywgIEIsNSwgICBSLDYsICBTLDYsICAgUyw1KTsgYnJlYWs7Ci0JCQljYXNlIDQ6IEFTU0lHTl9YX0JJVFMoRyw2LCAgRyw1LCAgQiw2LCAgQiw1LCAgIFIsNiwgIFIsNywgICBTLDUpOyBicmVhazsKLQkJCWNhc2UgNTogQVNTSUdOX1hfQklUUyhHLDYsICBHLDUsICBCLDYsICBCLDUsICAgUiw2LCAgUyw2LCAgIFMsNSk7IGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlERV9BU1NFUlQoZmFsc2UpOwotCQl9Ci0jdW5kZWYgQVNTSUdOX1hfQklUUwotI3VuZGVmIFNIT1IKLQl9Ci0Jc3RhdGljIGNvbnN0IGludCBzaGlmdEFtb3VudHNbXSA9IHsgMSwgMSwgMiwgMywgNCwgNSB9OwotCURFX0FTU0VSVChtb2RlIDwgREVfTEVOR1RIX09GX0FSUkFZKHNoaWZ0QW1vdW50cykpOwotCXJlZAkJPDw9IHNoaWZ0QW1vdW50c1ttb2RlXTsKLQlncmVlbgk8PD0gc2hpZnRBbW91bnRzW21vZGVdOwotCWJsdWUJPDw9IHNoaWZ0QW1vdW50c1ttb2RlXTsKLQlzY2FsZQk8PD0gc2hpZnRBbW91bnRzW21vZGVdOwotCWlmIChtb2RlICE9IDUpCi0JewotCQlncmVlbgk9IHJlZCAtIGdyZWVuOwotCQlibHVlCT0gcmVkIC0gYmx1ZTsKLQl9Ci0JaWYgKG1hakNvbXAgPT0gMSkKLQkJc3RkOjpzd2FwKHJlZCwgZ3JlZW4pOwotCWVsc2UgaWYgKG1hakNvbXAgPT0gMikKLQkJc3RkOjpzd2FwKHJlZCwgYmx1ZSk7Ci0JZTAgPSBVVmVjNChiYXNpc3VfYXN0Yzo6Y2xhbXAocmVkCS0gc2NhbGUsCTAsIDB4ZmZmKSwKLQkJYmFzaXN1X2FzdGM6OmNsYW1wKGdyZWVuCS0gc2NhbGUsCTAsIDB4ZmZmKSwKLQkJYmFzaXN1X2FzdGM6OmNsYW1wKGJsdWUJLSBzY2FsZSwJMCwgMHhmZmYpLAotCQkJICAgMHg3ODApOwotCWUxID0gVVZlYzQoYmFzaXN1X2FzdGM6OmNsYW1wKHJlZCwJCQkJMCwgMHhmZmYpLAotCQliYXNpc3VfYXN0Yzo6Y2xhbXAoZ3JlZW4sCQkJCTAsIDB4ZmZmKSwKLQkJYmFzaXN1X2FzdGM6OmNsYW1wKGJsdWUsCQkJCTAsIDB4ZmZmKSwKLQkJCSAgIDB4NzgwKTsKLX0KLXZvaWQgZGVjb2RlSERSRW5kcG9pbnRNb2RlMTEgKFVWZWM0JiBlMCwgVVZlYzQmIGUxLCBkZVVpbnQzMiB2MCwgZGVVaW50MzIgdjEsIGRlVWludDMyIHYyLCBkZVVpbnQzMiB2MywgZGVVaW50MzIgdjQsIGRlVWludDMyIHY1KQotewotCWNvbnN0IGRlVWludDMyIG1ham9yID0gKGdldEJpdCh2NSwgNykgPDwgMSkgfCBnZXRCaXQodjQsIDcpOwotCWlmIChtYWpvciA9PSAzKQotCXsKLQkJZTAgPSBVVmVjNCh2MDw8NCwgdjI8PDQsIGdldEJpdHModjQsMCw2KTw8NSwgMHg3ODApOwotCQllMSA9IFVWZWM0KHYxPDw0LCB2Mzw8NCwgZ2V0Qml0cyh2NSwwLDYpPDw1LCAweDc4MCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWNvbnN0IGRlVWludDMyIG1vZGUgPSAoZ2V0Qml0KHYzLCA3KSA8PCAyKSB8IChnZXRCaXQodjIsIDcpIDw8IDEpIHwgZ2V0Qml0KHYxLCA3KTsKLQkJZGVJbnQzMiBhCT0gKGRlSW50MzIpKChnZXRCaXQodjEsIDYpIDw8IDgpIHwgdjApOwotCQlkZUludDMyIGMJPSAoZGVJbnQzMikoZ2V0Qml0cyh2MSwgMCwgNSkpOwotCQlkZUludDMyIGIwCT0gKGRlSW50MzIpKGdldEJpdHModjIsIDAsIDUpKTsKLQkJZGVJbnQzMiBiMQk9IChkZUludDMyKShnZXRCaXRzKHYzLCAwLCA1KSk7Ci0JCWRlSW50MzIgZDAJPSAoZGVJbnQzMikoZ2V0Qml0cyh2NCwgMCwgNCkpOwotCQlkZUludDMyIGQxCT0gKGRlSW50MzIpKGdldEJpdHModjUsIDAsIDQpKTsKLQkJewotI2RlZmluZSBTSE9SKERTVF9WQVIsIFNISUZULCBCSVRfVkFSKSAoRFNUX1ZBUikgfD0gKEJJVF9WQVIpIDw8IChTSElGVCkKLSNkZWZpbmUgQVNTSUdOX1hfQklUUyhWMCxTMCwgVjEsUzEsIFYyLFMyLCBWMyxTMywgVjQsUzQsIFY1LFM1KSBkbyB7IFNIT1IoVjAsUzAseDApOyBTSE9SKFYxLFMxLHgxKTsgU0hPUihWMixTMix4Mik7IFNIT1IoVjMsUzMseDMpOyBTSE9SKFY0LFM0LHg0KTsgU0hPUihWNSxTNSx4NSk7IH0gd2hpbGUgKGZhbHNlKQotCQkJY29uc3QgZGVVaW50MzIgeDAgPSBnZXRCaXQodjIsIDYpOwotCQkJY29uc3QgZGVVaW50MzIgeDEgPSBnZXRCaXQodjMsIDYpOwotCQkJY29uc3QgZGVVaW50MzIgeDIgPSBnZXRCaXQodjQsIDYpOwotCQkJY29uc3QgZGVVaW50MzIgeDMgPSBnZXRCaXQodjUsIDYpOwotCQkJY29uc3QgZGVVaW50MzIgeDQgPSBnZXRCaXQodjQsIDUpOwotCQkJY29uc3QgZGVVaW50MzIgeDUgPSBnZXRCaXQodjUsIDUpOwotCQkJc3dpdGNoIChtb2RlKQotCQkJewotCQkJCWNhc2UgMDogQVNTSUdOX1hfQklUUyhiMCw2LCAgYjEsNiwgICBkMCw2LCAgZDEsNiwgIGQwLDUsICBkMSw1KTsgYnJlYWs7Ci0JCQkJY2FzZSAxOiBBU1NJR05fWF9CSVRTKGIwLDYsICBiMSw2LCAgIGIwLDcsICBiMSw3LCAgZDAsNSwgIGQxLDUpOyBicmVhazsKLQkJCQljYXNlIDI6IEFTU0lHTl9YX0JJVFMoYSw5LCAgIGMsNiwgICAgZDAsNiwgIGQxLDYsICBkMCw1LCAgZDEsNSk7IGJyZWFrOwotCQkJCWNhc2UgMzogQVNTSUdOX1hfQklUUyhiMCw2LCAgYjEsNiwgICBhLDksICAgYyw2LCAgIGQwLDUsICBkMSw1KTsgYnJlYWs7Ci0JCQkJY2FzZSA0OiBBU1NJR05fWF9CSVRTKGIwLDYsICBiMSw2LCAgIGIwLDcsICBiMSw3LCAgYSw5LCAgIGEsMTApOyBicmVhazsKLQkJCQljYXNlIDU6IEFTU0lHTl9YX0JJVFMoYSw5LCAgIGEsMTAsICAgYyw3LCAgIGMsNiwgICBkMCw1LCAgZDEsNSk7IGJyZWFrOwotCQkJCWNhc2UgNjogQVNTSUdOX1hfQklUUyhiMCw2LCAgYjEsNiwgICBhLDExLCAgYyw2LCAgIGEsOSwgICBhLDEwKTsgYnJlYWs7Ci0JCQkJY2FzZSA3OiBBU1NJR05fWF9CSVRTKGEsOSwgICBhLDEwLCAgIGEsMTEsICBjLDYsICAgZDAsNSwgIGQxLDUpOyBicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlERV9BU1NFUlQoZmFsc2UpOwotCQkJfQotI3VuZGVmIEFTU0lHTl9YX0JJVFMKLSN1bmRlZiBTSE9SCi0JCX0KLQkJc3RhdGljIGNvbnN0IGludCBudW1EQml0c1tdID0geyA3LCA2LCA3LCA2LCA1LCA2LCA1LCA2IH07Ci0JCURFX0FTU0VSVChtb2RlIDwgREVfTEVOR1RIX09GX0FSUkFZKG51bURCaXRzKSk7Ci0JCWQwID0gc2lnbkV4dGVuZChkMCwgbnVtREJpdHNbbW9kZV0pOwotCQlkMSA9IHNpZ25FeHRlbmQoZDEsIG51bURCaXRzW21vZGVdKTsKLQkJY29uc3QgaW50IHNoaWZ0QW1vdW50ID0gKG1vZGUgPj4gMSkgXiAzOwotCQlhCTw8PSBzaGlmdEFtb3VudDsKLQkJYwk8PD0gc2hpZnRBbW91bnQ7Ci0JCWIwCTw8PSBzaGlmdEFtb3VudDsKLQkJYjEJPDw9IHNoaWZ0QW1vdW50OwotCQlkMAk8PD0gc2hpZnRBbW91bnQ7Ci0JCWQxCTw8PSBzaGlmdEFtb3VudDsKLQkJZTAgPSBVVmVjNChiYXNpc3VfYXN0Yzo6Y2xhbXAoYS1jLAkJCTAsIDB4ZmZmKSwKLQkJCWJhc2lzdV9hc3RjOjpjbGFtcChhLWIwLWMtZDAsCQkwLCAweGZmZiksCi0JCQliYXNpc3VfYXN0Yzo6Y2xhbXAoYS1iMS1jLWQxLAkJMCwgMHhmZmYpLAotCQkJCSAgIDB4NzgwKTsKLQkJZTEgPSBVVmVjNChiYXNpc3VfYXN0Yzo6Y2xhbXAoYSwJCQkJMCwgMHhmZmYpLAotCQkJYmFzaXN1X2FzdGM6OmNsYW1wKGEtYjAsCQkJMCwgMHhmZmYpLAotCQkJYmFzaXN1X2FzdGM6OmNsYW1wKGEtYjEsCQkJMCwgMHhmZmYpLAotCQkJCSAgIDB4NzgwKTsKLQkJaWYgKG1ham9yID09IDEpCi0JCXsKLQkJCXN0ZDo6c3dhcChlMC54KCksIGUwLnkoKSk7Ci0JCQlzdGQ6OnN3YXAoZTEueCgpLCBlMS55KCkpOwotCQl9Ci0JCWVsc2UgaWYgKG1ham9yID09IDIpCi0JCXsKLQkJCXN0ZDo6c3dhcChlMC54KCksIGUwLnooKSk7Ci0JCQlzdGQ6OnN3YXAoZTEueCgpLCBlMS56KCkpOwotCQl9Ci0JfQotfQotdm9pZCBkZWNvZGVIRFJFbmRwb2ludE1vZGUxNShVVmVjNCYgZTAsIFVWZWM0JiBlMSwgZGVVaW50MzIgdjAsIGRlVWludDMyIHYxLCBkZVVpbnQzMiB2MiwgZGVVaW50MzIgdjMsIGRlVWludDMyIHY0LCBkZVVpbnQzMiB2NSwgZGVVaW50MzIgdjZJbiwgZGVVaW50MzIgdjdJbikKLXsKLQlkZWNvZGVIRFJFbmRwb2ludE1vZGUxMShlMCwgZTEsIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUpOwotCWNvbnN0IGRlVWludDMyCW1vZGUJPSAoZ2V0Qml0KHY3SW4sIDcpIDw8IDEpIHwgZ2V0Qml0KHY2SW4sIDcpOwotCWRlSW50MzIJCQl2NgkJPSAoZGVJbnQzMilnZXRCaXRzKHY2SW4sIDAsIDYpOwotCWRlSW50MzIJCQl2NwkJPSAoZGVJbnQzMilnZXRCaXRzKHY3SW4sIDAsIDYpOwotCWlmIChtb2RlID09IDMpCi0JewotCQllMC53KCkgPSB2NiA8PCA1OwotCQllMS53KCkgPSB2NyA8PCA1OwotCX0KLQllbHNlCi0JewotCQl2NiB8PSAodjcgPDwgKG1vZGUrMSkpICYgMHg3ODA7Ci0JCXY3ICY9ICgweDNmID4+IG1vZGUpOwotCQl2NyBePSAweDIwID4+IG1vZGU7Ci0JCXY3IC09IDB4MjAgPj4gbW9kZTsKLQkJdjYgPDw9IDQtbW9kZTsKLQkJdjcgPDw9IDQtbW9kZTsKLQkJdjcgKz0gdjY7Ci0JCXY3ID0gYmFzaXN1X2FzdGM6OmNsYW1wKHY3LCAwLCAweGZmZik7Ci0JCWUwLncoKSA9IHY2OwotCQllMS53KCkgPSB2NzsKLQl9Ci19Ci12b2lkIGRlY29kZUNvbG9yRW5kcG9pbnRzIChDb2xvckVuZHBvaW50UGFpciogZHN0LCBjb25zdCBkZVVpbnQzMiogdW5xdWFudGl6ZWRFbmRwb2ludHMsIGNvbnN0IGRlVWludDMyKiBlbmRwb2ludE1vZGVzLCBpbnQgbnVtUGFydGl0aW9ucykKLXsKLQlpbnQgdW5xdWFudGl6ZWROZHggPSAwOwotCWZvciAoaW50IHBhcnRpdGlvbk5keCA9IDA7IHBhcnRpdGlvbk5keCA8IG51bVBhcnRpdGlvbnM7IHBhcnRpdGlvbk5keCsrKQotCXsKLQkJY29uc3QgZGVVaW50MzIJCWVuZHBvaW50TW9kZQk9IGVuZHBvaW50TW9kZXNbcGFydGl0aW9uTmR4XTsKLQkJY29uc3QgZGVVaW50MzIqCQl2CQkJCT0gJnVucXVhbnRpemVkRW5kcG9pbnRzW3VucXVhbnRpemVkTmR4XTsKLQkJVVZlYzQmCQkJCWUwCQkJCT0gZHN0W3BhcnRpdGlvbk5keF0uZTA7Ci0JCVVWZWM0JgkJCQllMQkJCQk9IGRzdFtwYXJ0aXRpb25OZHhdLmUxOwotCQl1bnF1YW50aXplZE5keCArPSBjb21wdXRlTnVtQ29sb3JFbmRwb2ludFZhbHVlcyhlbmRwb2ludE1vZGUpOwotCQlzd2l0Y2ggKGVuZHBvaW50TW9kZSkKLQkJewotCQkJY2FzZSAwOgotCQkJCWUwID0gVVZlYzQodlswXSwgdlswXSwgdlswXSwgMHhmZik7Ci0JCQkJZTEgPSBVVmVjNCh2WzFdLCB2WzFdLCB2WzFdLCAweGZmKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCXsKLQkJCQljb25zdCBkZVVpbnQzMiBMMCA9ICh2WzBdID4+IDIpIHwgKGdldEJpdHModlsxXSwgNiwgNykgPDwgNik7Ci0JCQkJY29uc3QgZGVVaW50MzIgTDEgPSBiYXNpc3VfYXN0Yzo6bWluKDB4ZmZ1LCBMMCArIGdldEJpdHModlsxXSwgMCwgNSkpOwotCQkJCWUwID0gVVZlYzQoTDAsIEwwLCBMMCwgMHhmZik7Ci0JCQkJZTEgPSBVVmVjNChMMSwgTDEsIEwxLCAweGZmKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgMjoKLQkJCXsKLQkJCQljb25zdCBkZVVpbnQzMiB2MUdyCQk9IHZbMV0gPj0gdlswXTsKLQkJCQljb25zdCBkZVVpbnQzMiB5MAkJPSB2MUdyID8gdlswXTw8NCA6ICh2WzFdPDw0KSArIDg7Ci0JCQkJY29uc3QgZGVVaW50MzIgeTEJCT0gdjFHciA/IHZbMV08PDQgOiAodlswXTw8NCkgLSA4OwotCQkJCWUwID0gVVZlYzQoeTAsIHkwLCB5MCwgMHg3ODApOwotCQkJCWUxID0gVVZlYzQoeTEsIHkxLCB5MSwgMHg3ODApOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSAzOgotCQkJewotCQkJCWNvbnN0IGJvb2wJCW0JPSBpc0JpdFNldCh2WzBdLCA3KTsKLQkJCQljb25zdCBkZVVpbnQzMgl5MAk9IG0gPyAoZ2V0Qml0cyh2WzFdLCA1LCA3KSA8PCA5KSB8IChnZXRCaXRzKHZbMF0sIDAsIDYpIDw8IDIpCi0JCQkJCQkJCQkJOiAoZ2V0Qml0cyh2WzFdLCA0LCA3KSA8PCA4KSB8IChnZXRCaXRzKHZbMF0sIDAsIDYpIDw8IDEpOwotCQkJCWNvbnN0IGRlVWludDMyCWQJPSBtID8gZ2V0Qml0cyh2WzFdLCAwLCA0KSA8PCAyCi0JCQkJCQkJCQkJOiBnZXRCaXRzKHZbMV0sIDAsIDMpIDw8IDE7Ci0JCQkJY29uc3QgZGVVaW50MzIJeTEJPSBiYXNpc3VfYXN0Yzo6bWluKDB4ZmZmdSwgeTArZCk7Ci0JCQkJZTAgPSBVVmVjNCh5MCwgeTAsIHkwLCAweDc4MCk7Ci0JCQkJZTEgPSBVVmVjNCh5MSwgeTEsIHkxLCAweDc4MCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIDQ6Ci0JCQkJZTAgPSBVVmVjNCh2WzBdLCB2WzBdLCB2WzBdLCB2WzJdKTsKLQkJCQllMSA9IFVWZWM0KHZbMV0sIHZbMV0sIHZbMV0sIHZbM10pOwotCQkJCWJyZWFrOwotCQkJY2FzZSA1OgotCQkJewotCQkJCWRlSW50MzIgdjAgPSAoZGVJbnQzMil2WzBdOwotCQkJCWRlSW50MzIgdjEgPSAoZGVJbnQzMil2WzFdOwotCQkJCWRlSW50MzIgdjIgPSAoZGVJbnQzMil2WzJdOwotCQkJCWRlSW50MzIgdjMgPSAoZGVJbnQzMil2WzNdOwotCQkJCWJpdFRyYW5zZmVyU2lnbmVkKHYxLCB2MCk7Ci0JCQkJYml0VHJhbnNmZXJTaWduZWQodjMsIHYyKTsKLQkJCQllMCA9IGNsYW1wZWRSR0JBKElWZWM0KHYwLAkJdjAsCQl2MCwJCXYyKSk7Ci0JCQkJZTEgPSBjbGFtcGVkUkdCQShJVmVjNCh2MCt2MSwJdjArdjEsCXYwK3YxLAl2Mit2MykpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSA2OgotCQkJCWUwID0gVVZlYzQoKHZbMF0qdlszXSkgPj4gOCwJKHZbMV0qdlszXSkgPj4gOCwJKHZbMl0qdlszXSkgPj4gOCwJMHhmZik7Ci0JCQkJZTEgPSBVVmVjNCh2WzBdLAkJCQl2WzFdLAkJCQl2WzJdLAkJCQkweGZmKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNzoKLQkJCQlkZWNvZGVIRFJFbmRwb2ludE1vZGU3KGUwLCBlMSwgdlswXSwgdlsxXSwgdlsyXSwgdlszXSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJaWYgKHZbMV0rdlszXSt2WzVdID49IHZbMF0rdlsyXSt2WzRdKQotCQkJCXsKLQkJCQkJZTAgPSBVVmVjNCh2WzBdLCB2WzJdLCB2WzRdLCAweGZmKTsKLQkJCQkJZTEgPSBVVmVjNCh2WzFdLCB2WzNdLCB2WzVdLCAweGZmKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZTAgPSBibHVlQ29udHJhY3QodlsxXSwgdlszXSwgdls1XSwgMHhmZikuYXNVaW50KCk7Ci0JCQkJCWUxID0gYmx1ZUNvbnRyYWN0KHZbMF0sIHZbMl0sIHZbNF0sIDB4ZmYpLmFzVWludCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgOToKLQkJCXsKLQkJCQlkZUludDMyIHYwID0gKGRlSW50MzIpdlswXTsKLQkJCQlkZUludDMyIHYxID0gKGRlSW50MzIpdlsxXTsKLQkJCQlkZUludDMyIHYyID0gKGRlSW50MzIpdlsyXTsKLQkJCQlkZUludDMyIHYzID0gKGRlSW50MzIpdlszXTsKLQkJCQlkZUludDMyIHY0ID0gKGRlSW50MzIpdls0XTsKLQkJCQlkZUludDMyIHY1ID0gKGRlSW50MzIpdls1XTsKLQkJCQliaXRUcmFuc2ZlclNpZ25lZCh2MSwgdjApOwotCQkJCWJpdFRyYW5zZmVyU2lnbmVkKHYzLCB2Mik7Ci0JCQkJYml0VHJhbnNmZXJTaWduZWQodjUsIHY0KTsKLQkJCQlpZiAodjErdjMrdjUgPj0gMCkKLQkJCQl7Ci0JCQkJCWUwID0gY2xhbXBlZFJHQkEoSVZlYzQodjAsCQl2MiwJCXY0LAkJMHhmZikpOwotCQkJCQllMSA9IGNsYW1wZWRSR0JBKElWZWM0KHYwK3YxLAl2Mit2MywJdjQrdjUsCTB4ZmYpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZTAgPSBjbGFtcGVkUkdCQShibHVlQ29udHJhY3QodjArdjEsCXYyK3YzLAl2NCt2NSwJMHhmZikpOwotCQkJCQllMSA9IGNsYW1wZWRSR0JBKGJsdWVDb250cmFjdCh2MCwJCXYyLAkJdjQsCQkweGZmKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSAxMDoKLQkJCQllMCA9IFVWZWM0KCh2WzBdKnZbM10pID4+IDgsCSh2WzFdKnZbM10pID4+IDgsCSh2WzJdKnZbM10pID4+IDgsCXZbNF0pOwotCQkJCWUxID0gVVZlYzQodlswXSwJCQkJdlsxXSwJCQkJdlsyXSwJCQkJdls1XSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDExOgotCQkJCWRlY29kZUhEUkVuZHBvaW50TW9kZTExKGUwLCBlMSwgdlswXSwgdlsxXSwgdlsyXSwgdlszXSwgdls0XSwgdls1XSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEyOgotCQkJCWlmICh2WzFdK3ZbM10rdls1XSA+PSB2WzBdK3ZbMl0rdls0XSkKLQkJCQl7Ci0JCQkJCWUwID0gVVZlYzQodlswXSwgdlsyXSwgdls0XSwgdls2XSk7Ci0JCQkJCWUxID0gVVZlYzQodlsxXSwgdlszXSwgdls1XSwgdls3XSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWUwID0gY2xhbXBlZFJHQkEoYmx1ZUNvbnRyYWN0KHZbMV0sIHZbM10sIHZbNV0sIHZbN10pKTsKLQkJCQkJZTEgPSBjbGFtcGVkUkdCQShibHVlQ29udHJhY3QodlswXSwgdlsyXSwgdls0XSwgdls2XSkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgMTM6Ci0JCQl7Ci0JCQkJZGVJbnQzMiB2MCA9IChkZUludDMyKXZbMF07Ci0JCQkJZGVJbnQzMiB2MSA9IChkZUludDMyKXZbMV07Ci0JCQkJZGVJbnQzMiB2MiA9IChkZUludDMyKXZbMl07Ci0JCQkJZGVJbnQzMiB2MyA9IChkZUludDMyKXZbM107Ci0JCQkJZGVJbnQzMiB2NCA9IChkZUludDMyKXZbNF07Ci0JCQkJZGVJbnQzMiB2NSA9IChkZUludDMyKXZbNV07Ci0JCQkJZGVJbnQzMiB2NiA9IChkZUludDMyKXZbNl07Ci0JCQkJZGVJbnQzMiB2NyA9IChkZUludDMyKXZbN107Ci0JCQkJYml0VHJhbnNmZXJTaWduZWQodjEsIHYwKTsKLQkJCQliaXRUcmFuc2ZlclNpZ25lZCh2MywgdjIpOwotCQkJCWJpdFRyYW5zZmVyU2lnbmVkKHY1LCB2NCk7Ci0JCQkJYml0VHJhbnNmZXJTaWduZWQodjcsIHY2KTsKLQkJCQlpZiAodjErdjMrdjUgPj0gMCkKLQkJCQl7Ci0JCQkJCWUwID0gY2xhbXBlZFJHQkEoSVZlYzQodjAsCQl2MiwJCXY0LAkJdjYpKTsKLQkJCQkJZTEgPSBjbGFtcGVkUkdCQShJVmVjNCh2MCt2MSwJdjIrdjMsCXY0K3Y1LAl2Nit2NykpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQllMCA9IGNsYW1wZWRSR0JBKGJsdWVDb250cmFjdCh2MCt2MSwJdjIrdjMsCXY0K3Y1LAl2Nit2NykpOwotCQkJCQllMSA9IGNsYW1wZWRSR0JBKGJsdWVDb250cmFjdCh2MCwJCXYyLAkJdjQsCQl2NikpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgMTQ6Ci0JCQkJZGVjb2RlSERSRW5kcG9pbnRNb2RlMTEoZTAsIGUxLCB2WzBdLCB2WzFdLCB2WzJdLCB2WzNdLCB2WzRdLCB2WzVdKTsKLQkJCQllMC53KCkgPSB2WzZdOwotCQkJCWUxLncoKSA9IHZbN107Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE1OgotCQkJCWRlY29kZUhEUkVuZHBvaW50TW9kZTE1KGUwLCBlMSwgdlswXSwgdlsxXSwgdlsyXSwgdlszXSwgdls0XSwgdls1XSwgdls2XSwgdls3XSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCURFX0FTU0VSVChmYWxzZSk7Ci0JCX0KLQl9Ci19Ci12b2lkIGNvbXB1dGVDb2xvckVuZHBvaW50cyAoQ29sb3JFbmRwb2ludFBhaXIqIGRzdCwgY29uc3QgQmxvY2sxMjgmIGJsb2NrRGF0YSwgY29uc3QgZGVVaW50MzIqIGVuZHBvaW50TW9kZXMsIGludCBudW1QYXJ0aXRpb25zLCBpbnQgbnVtQ29sb3JFbmRwb2ludFZhbHVlcywgY29uc3QgSVNFUGFyYW1zJiBpc2VQYXJhbXMsIGludCBudW1CaXRzQXZhaWxhYmxlKQotewotCWNvbnN0IGludAkJCWNvbG9yRW5kcG9pbnREYXRhU3RhcnQgPSBudW1QYXJ0aXRpb25zID09IDEgPyAxNyA6IDI5OwotCUlTRURlY29kZWRSZXN1bHQJY29sb3JFbmRwb2ludERhdGFbMThdOwotCXsKLQkJQml0QWNjZXNzU3RyZWFtIGRhdGFTdHJlYW0oYmxvY2tEYXRhLCBjb2xvckVuZHBvaW50RGF0YVN0YXJ0LCBudW1CaXRzQXZhaWxhYmxlLCB0cnVlKTsKLQkJZGVjb2RlSVNFKCZjb2xvckVuZHBvaW50RGF0YVswXSwgbnVtQ29sb3JFbmRwb2ludFZhbHVlcywgZGF0YVN0cmVhbSwgaXNlUGFyYW1zKTsKLQl9Ci0JewotCQlkZVVpbnQzMiB1bnF1YW50aXplZEVuZHBvaW50c1sxOF07Ci0JCXVucXVhbnRpemVDb2xvckVuZHBvaW50cygmdW5xdWFudGl6ZWRFbmRwb2ludHNbMF0sICZjb2xvckVuZHBvaW50RGF0YVswXSwgbnVtQ29sb3JFbmRwb2ludFZhbHVlcywgaXNlUGFyYW1zKTsKLQkJZGVjb2RlQ29sb3JFbmRwb2ludHMoZHN0LCAmdW5xdWFudGl6ZWRFbmRwb2ludHNbMF0sICZlbmRwb2ludE1vZGVzWzBdLCBudW1QYXJ0aXRpb25zKTsKLQl9Ci19Ci12b2lkIHVucXVhbnRpemVXZWlnaHRzIChkZVVpbnQzMiBkc3RbNjRdLCBjb25zdCBJU0VEZWNvZGVkUmVzdWx0KiB3ZWlnaHRHcmlkLCBjb25zdCBBU1RDQmxvY2tNb2RlJiBibG9ja01vZGUpCi17Ci0JY29uc3QgaW50CQkJbnVtV2VpZ2h0cwk9IGNvbXB1dGVOdW1XZWlnaHRzKGJsb2NrTW9kZSk7Ci0JY29uc3QgSVNFUGFyYW1zJglpc2VQYXJhbXMJPSBibG9ja01vZGUud2VpZ2h0SVNFUGFyYW1zOwotCWlmIChpc2VQYXJhbXMubW9kZSA9PSBJU0VNT0RFX1RSSVQgfHwgaXNlUGFyYW1zLm1vZGUgPT0gSVNFTU9ERV9RVUlOVCkKLQl7Ci0JCWNvbnN0IGludCByYW5nZUNhc2UgPSBpc2VQYXJhbXMubnVtQml0cyoyICsgKGlzZVBhcmFtcy5tb2RlID09IElTRU1PREVfUVVJTlQgPyAxIDogMCk7Ci0JCWlmIChyYW5nZUNhc2UgPT0gMCB8fCByYW5nZUNhc2UgPT0gMSkKLQkJewotCQkJc3RhdGljIGNvbnN0IGRlVWludDMyIG1hcDBbM10JPSB7IDAsIDMyLCA2MyB9OwotCQkJc3RhdGljIGNvbnN0IGRlVWludDMyIG1hcDFbNV0JPSB7IDAsIDE2LCAzMiwgNDcsIDYzIH07Ci0JCQljb25zdCBkZVVpbnQzMiogY29uc3QgbWFwCQk9IHJhbmdlQ2FzZSA9PSAwID8gJm1hcDBbMF0gOiAmbWFwMVswXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtV2VpZ2h0czsgaSsrKQotCQkJewotCQkJCURFX0FTU0VSVCh3ZWlnaHRHcmlkW2ldLnYgPCAocmFuZ2VDYXNlID09IDAgPyAzdSA6IDV1KSk7Ci0JCQkJZHN0W2ldID0gbWFwW3dlaWdodEdyaWRbaV0udl07Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlERV9BU1NFUlQocmFuZ2VDYXNlIDw9IDYpOwotCQkJc3RhdGljIGNvbnN0IGRlVWludDMyCUNhWzVdCT0geyA1MCwgMjgsIDIzLCAxMywgMTEgfTsKLQkJCWNvbnN0IGRlVWludDMyCQkJQwkJPSBDYVtyYW5nZUNhc2UtMl07Ci0JCQlmb3IgKGludCB3ZWlnaHROZHggPSAwOyB3ZWlnaHROZHggPCBudW1XZWlnaHRzOyB3ZWlnaHROZHgrKykKLQkJCXsKLQkJCQljb25zdCBkZVVpbnQzMiBhID0gZ2V0Qml0KHdlaWdodEdyaWRbd2VpZ2h0TmR4XS5tLCAwKTsKLQkJCQljb25zdCBkZVVpbnQzMiBiID0gZ2V0Qml0KHdlaWdodEdyaWRbd2VpZ2h0TmR4XS5tLCAxKTsKLQkJCQljb25zdCBkZVVpbnQzMiBjID0gZ2V0Qml0KHdlaWdodEdyaWRbd2VpZ2h0TmR4XS5tLCAyKTsKLQkJCQljb25zdCBkZVVpbnQzMiBBID0gYSA9PSAwID8gMCA6ICgxPDw3KS0xOwotCQkJCWNvbnN0IGRlVWludDMyIEIgPSByYW5nZUNhc2UgPT0gMiA/IDAKLQkJCQkJCQkJIDogcmFuZ2VDYXNlID09IDMgPyAwCi0JCQkJCQkJCSA6IHJhbmdlQ2FzZSA9PSA0ID8gKGIgPDwgNikgfAkJCQkJKGIgPDwgMikgfAkJCQkoYiA8PCAwKQotCQkJCQkJCQkgOiByYW5nZUNhc2UgPT0gNSA/IChiIDw8IDYpIHwJCQkJCQkJCShiIDw8IDEpCi0JCQkJCQkJCSA6IHJhbmdlQ2FzZSA9PSA2ID8gKGMgPDwgNikgfCAoYiA8PCA1KSB8CQkJCQkoYyA8PCAxKSB8CShiIDw8IDApCi0JCQkJCQkJCSA6IChkZVVpbnQzMiktMTsKLQkJCQlkc3Rbd2VpZ2h0TmR4XSA9ICgoKHdlaWdodEdyaWRbd2VpZ2h0TmR4XS50cSpDICsgQikgXiBBKSA+PiAyKSB8IChBICYgMHgyMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREVfQVNTRVJUKGlzZVBhcmFtcy5tb2RlID09IElTRU1PREVfUExBSU5fQklUKTsKLQkJZm9yIChpbnQgd2VpZ2h0TmR4ID0gMDsgd2VpZ2h0TmR4IDwgbnVtV2VpZ2h0czsgd2VpZ2h0TmR4KyspCi0JCQlkc3Rbd2VpZ2h0TmR4XSA9IGJpdFJlcGxpY2F0aW9uU2NhbGUod2VpZ2h0R3JpZFt3ZWlnaHROZHhdLnYsIGlzZVBhcmFtcy5udW1CaXRzLCA2KTsKLQl9Ci0JZm9yIChpbnQgd2VpZ2h0TmR4ID0gMDsgd2VpZ2h0TmR4IDwgbnVtV2VpZ2h0czsgd2VpZ2h0TmR4KyspCi0JCWRzdFt3ZWlnaHROZHhdICs9IGRzdFt3ZWlnaHROZHhdID4gMzIgPyAxIDogMDsKLQkvLyBJbml0aWFsaXplIG5vbmV4aXN0ZW50IHdlaWdodHMgdG8gcG9pc29uIHZhbHVlcwotCWZvciAoaW50IHdlaWdodE5keCA9IG51bVdlaWdodHM7IHdlaWdodE5keCA8IDY0OyB3ZWlnaHROZHgrKykKLQkJZHN0W3dlaWdodE5keF0gPSB+MHU7Ci19Ci12b2lkIGludGVycG9sYXRlV2VpZ2h0cyAoVGV4ZWxXZWlnaHRQYWlyKiBkc3QsIGNvbnN0IGRlVWludDMyICgmdW5xdWFudGl6ZWRXZWlnaHRzKSBbNjRdLCBpbnQgYmxvY2tXaWR0aCwgaW50IGJsb2NrSGVpZ2h0LCBjb25zdCBBU1RDQmxvY2tNb2RlJiBibG9ja01vZGUpCi17Ci0JY29uc3QgaW50CQludW1XZWlnaHRzUGVyVGV4ZWwJPSBibG9ja01vZGUuaXNEdWFsUGxhbmUgPyAyIDogMTsKLQljb25zdCBkZVVpbnQzMglzY2FsZVgJCQkJPSAoMTAyNCArIGJsb2NrV2lkdGgvMikgLyAoYmxvY2tXaWR0aC0xKTsKLQljb25zdCBkZVVpbnQzMglzY2FsZVkJCQkJPSAoMTAyNCArIGJsb2NrSGVpZ2h0LzIpIC8gKGJsb2NrSGVpZ2h0LTEpOwotCURFX0FTU0VSVChibG9ja01vZGUud2VpZ2h0R3JpZFdpZHRoKmJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0Km51bVdlaWdodHNQZXJUZXhlbCA8PSAoaW50KURFX0xFTkdUSF9PRl9BUlJBWSh1bnF1YW50aXplZFdlaWdodHMpKTsKLQlmb3IgKGludCB0ZXhlbFkgPSAwOyB0ZXhlbFkgPCBibG9ja0hlaWdodDsgdGV4ZWxZKyspCi0JewotCQlmb3IgKGludCB0ZXhlbFggPSAwOyB0ZXhlbFggPCBibG9ja1dpZHRoOyB0ZXhlbFgrKykKLQkJewotCQkJY29uc3QgZGVVaW50MzIgZ1gJPSAoc2NhbGVYKnRleGVsWCooYmxvY2tNb2RlLndlaWdodEdyaWRXaWR0aC0xKSArIDMyKSA+PiA2OwotCQkJY29uc3QgZGVVaW50MzIgZ1kJPSAoc2NhbGVZKnRleGVsWSooYmxvY2tNb2RlLndlaWdodEdyaWRIZWlnaHQtMSkgKyAzMikgPj4gNjsKLQkJCWNvbnN0IGRlVWludDMyIGpYCT0gZ1ggPj4gNDsKLQkJCWNvbnN0IGRlVWludDMyIGpZCT0gZ1kgPj4gNDsKLQkJCWNvbnN0IGRlVWludDMyIGZYCT0gZ1ggJiAweGY7Ci0JCQljb25zdCBkZVVpbnQzMiBmWQk9IGdZICYgMHhmOwotCQkJY29uc3QgZGVVaW50MzIgdzExCT0gKGZYKmZZICsgOCkgPj4gNDsKLQkJCWNvbnN0IGRlVWludDMyIHcxMAk9IGZZIC0gdzExOwotCQkJY29uc3QgZGVVaW50MzIgdzAxCT0gZlggLSB3MTE7Ci0JCQljb25zdCBkZVVpbnQzMiB3MDAJPSAxNiAtIGZYIC0gZlkgKyB3MTE7Ci0JCQljb25zdCBkZVVpbnQzMiBpMDAJPSBqWSpibG9ja01vZGUud2VpZ2h0R3JpZFdpZHRoICsgalg7Ci0JCQljb25zdCBkZVVpbnQzMiBpMDEJPSBpMDAgKyAxOwotCQkJY29uc3QgZGVVaW50MzIgaTEwCT0gaTAwICsgYmxvY2tNb2RlLndlaWdodEdyaWRXaWR0aDsKLQkJCWNvbnN0IGRlVWludDMyIGkxMQk9IGkwMCArIGJsb2NrTW9kZS53ZWlnaHRHcmlkV2lkdGggKyAxOwotCQkJLy8gVGhlc2UgYWRkcmVzc2VzIGNhbiBiZSBvdXQgb2YgYm91bmRzLCBidXQgcmVzcGVjdGl2ZSB3ZWlnaHRzIHdpbGwgYmUgMCB0aGVuLgotCQkJREVfQVNTRVJUKGRlSW5Cb3VuZHMzMihpMDAsIDAsIGJsb2NrTW9kZS53ZWlnaHRHcmlkV2lkdGgqYmxvY2tNb2RlLndlaWdodEdyaWRIZWlnaHQpIHx8IHcwMCA9PSAwKTsKLQkJCURFX0FTU0VSVChkZUluQm91bmRzMzIoaTAxLCAwLCBibG9ja01vZGUud2VpZ2h0R3JpZFdpZHRoKmJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0KSB8fCB3MDEgPT0gMCk7Ci0JCQlERV9BU1NFUlQoZGVJbkJvdW5kczMyKGkxMCwgMCwgYmxvY2tNb2RlLndlaWdodEdyaWRXaWR0aCpibG9ja01vZGUud2VpZ2h0R3JpZEhlaWdodCkgfHwgdzEwID09IDApOwotCQkJREVfQVNTRVJUKGRlSW5Cb3VuZHMzMihpMTEsIDAsIGJsb2NrTW9kZS53ZWlnaHRHcmlkV2lkdGgqYmxvY2tNb2RlLndlaWdodEdyaWRIZWlnaHQpIHx8IHcxMSA9PSAwKTsKLQkJCWZvciAoaW50IHRleGVsV2VpZ2h0TmR4ID0gMDsgdGV4ZWxXZWlnaHROZHggPCBudW1XZWlnaHRzUGVyVGV4ZWw7IHRleGVsV2VpZ2h0TmR4KyspCi0JCQl7Ci0JCQkJLy8gJiAweDNmIGNsYW1wcyBhZGRyZXNzIHRvIGJvdW5kcyBvZiB1bnF1YW50aXplZFdlaWdodHMKLQkJCQljb25zdCBkZVVpbnQzMiBwMDAJPSB1bnF1YW50aXplZFdlaWdodHNbKGkwMCAqIG51bVdlaWdodHNQZXJUZXhlbCArIHRleGVsV2VpZ2h0TmR4KSAmIDB4M2ZdOwotCQkJCWNvbnN0IGRlVWludDMyIHAwMQk9IHVucXVhbnRpemVkV2VpZ2h0c1soaTAxICogbnVtV2VpZ2h0c1BlclRleGVsICsgdGV4ZWxXZWlnaHROZHgpICYgMHgzZl07Ci0JCQkJY29uc3QgZGVVaW50MzIgcDEwCT0gdW5xdWFudGl6ZWRXZWlnaHRzWyhpMTAgKiBudW1XZWlnaHRzUGVyVGV4ZWwgKyB0ZXhlbFdlaWdodE5keCkgJiAweDNmXTsKLQkJCQljb25zdCBkZVVpbnQzMiBwMTEJPSB1bnF1YW50aXplZFdlaWdodHNbKGkxMSAqIG51bVdlaWdodHNQZXJUZXhlbCArIHRleGVsV2VpZ2h0TmR4KSAmIDB4M2ZdOwotCQkJCWRzdFt0ZXhlbFkqYmxvY2tXaWR0aCArIHRleGVsWF0ud1t0ZXhlbFdlaWdodE5keF0gPSAocDAwKncwMCArIHAwMSp3MDEgKyBwMTAqdzEwICsgcDExKncxMSArIDgpID4+IDQ7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci12b2lkIGNvbXB1dGVUZXhlbFdlaWdodHMgKFRleGVsV2VpZ2h0UGFpciogZHN0LCBjb25zdCBCbG9jazEyOCYgYmxvY2tEYXRhLCBpbnQgYmxvY2tXaWR0aCwgaW50IGJsb2NrSGVpZ2h0LCBjb25zdCBBU1RDQmxvY2tNb2RlJiBibG9ja01vZGUpCi17Ci0JSVNFRGVjb2RlZFJlc3VsdCB3ZWlnaHRHcmlkWzY0XTsKLQl7Ci0JCUJpdEFjY2Vzc1N0cmVhbSBkYXRhU3RyZWFtKGJsb2NrRGF0YSwgMTI3LCBjb21wdXRlTnVtUmVxdWlyZWRCaXRzKGJsb2NrTW9kZS53ZWlnaHRJU0VQYXJhbXMsIGNvbXB1dGVOdW1XZWlnaHRzKGJsb2NrTW9kZSkpLCBmYWxzZSk7Ci0JCWRlY29kZUlTRSgmd2VpZ2h0R3JpZFswXSwgY29tcHV0ZU51bVdlaWdodHMoYmxvY2tNb2RlKSwgZGF0YVN0cmVhbSwgYmxvY2tNb2RlLndlaWdodElTRVBhcmFtcyk7Ci0JfQotCXsKLQkJZGVVaW50MzIgdW5xdWFudGl6ZWRXZWlnaHRzWzY0XTsKLQkJdW5xdWFudGl6ZVdlaWdodHMoJnVucXVhbnRpemVkV2VpZ2h0c1swXSwgJndlaWdodEdyaWRbMF0sIGJsb2NrTW9kZSk7Ci0JCWludGVycG9sYXRlV2VpZ2h0cyhkc3QsIHVucXVhbnRpemVkV2VpZ2h0cywgYmxvY2tXaWR0aCwgYmxvY2tIZWlnaHQsIGJsb2NrTW9kZSk7Ci0JfQotfQotaW5saW5lIGRlVWludDMyIGhhc2g1MiAoZGVVaW50MzIgdikKLXsKLQlkZVVpbnQzMiBwID0gdjsKLQlwIF49IHAgPj4gMTU7CXAgLT0gcCA8PCAxNzsJcCArPSBwIDw8IDc7CXAgKz0gcCA8PCA0OwotCXAgXj0gcCA+PiAgNTsJcCArPSBwIDw8IDE2OwlwIF49IHAgPj4gNzsJcCBePSBwID4+IDM7Ci0JcCBePSBwIDw8ICA2OwlwIF49IHAgPj4gMTc7Ci0JcmV0dXJuIHA7Ci19Ci1pbnQgY29tcHV0ZVRleGVsUGFydGl0aW9uIChkZVVpbnQzMiBzZWVkSW4sIGRlVWludDMyIHhJbiwgZGVVaW50MzIgeUluLCBkZVVpbnQzMiB6SW4sIGludCBudW1QYXJ0aXRpb25zLCBib29sIHNtYWxsQmxvY2spCi17Ci0JREVfQVNTRVJUKHpJbiA9PSAwKTsKLQljb25zdCBkZVVpbnQzMgl4CQk9IHNtYWxsQmxvY2sgPyB4SW4gPDwgMSA6IHhJbjsKLQljb25zdCBkZVVpbnQzMgl5CQk9IHNtYWxsQmxvY2sgPyB5SW4gPDwgMSA6IHlJbjsKLQljb25zdCBkZVVpbnQzMgl6CQk9IHNtYWxsQmxvY2sgPyB6SW4gPDwgMSA6IHpJbjsKLQljb25zdCBkZVVpbnQzMglzZWVkCT0gc2VlZEluICsgMTAyNCoobnVtUGFydGl0aW9ucy0xKTsKLQljb25zdCBkZVVpbnQzMglybnVtCT0gaGFzaDUyKHNlZWQpOwotCWRlVWludDgJCQlzZWVkMQk9IChkZVVpbnQ4KSggcm51bQkJCQkJCQkmIDB4Zik7Ci0JZGVVaW50OAkJCXNlZWQyCT0gKGRlVWludDgpKChybnVtID4+ICA0KQkJCQkJJiAweGYpOwotCWRlVWludDgJCQlzZWVkMwk9IChkZVVpbnQ4KSgocm51bSA+PiAgOCkJCQkJCSYgMHhmKTsKLQlkZVVpbnQ4CQkJc2VlZDQJPSAoZGVVaW50OCkoKHJudW0gPj4gMTIpCQkJCQkmIDB4Zik7Ci0JZGVVaW50OAkJCXNlZWQ1CT0gKGRlVWludDgpKChybnVtID4+IDE2KQkJCQkJJiAweGYpOwotCWRlVWludDgJCQlzZWVkNgk9IChkZVVpbnQ4KSgocm51bSA+PiAyMCkJCQkJCSYgMHhmKTsKLQlkZVVpbnQ4CQkJc2VlZDcJPSAoZGVVaW50OCkoKHJudW0gPj4gMjQpCQkJCQkmIDB4Zik7Ci0JZGVVaW50OAkJCXNlZWQ4CT0gKGRlVWludDgpKChybnVtID4+IDI4KQkJCQkJJiAweGYpOwotCWRlVWludDgJCQlzZWVkOQk9IChkZVVpbnQ4KSgocm51bSA+PiAxOCkJCQkJCSYgMHhmKTsKLQlkZVVpbnQ4CQkJc2VlZDEwCT0gKGRlVWludDgpKChybnVtID4+IDIyKQkJCQkJJiAweGYpOwotCWRlVWludDgJCQlzZWVkMTEJPSAoZGVVaW50OCkoKHJudW0gPj4gMjYpCQkJCQkmIDB4Zik7Ci0JZGVVaW50OAkJCXNlZWQxMgk9IChkZVVpbnQ4KSgoKHJudW0gPj4gMzApIHwgKHJudW0gPDwgMikpCSYgMHhmKTsKLQlzZWVkMSAgPSAoZGVVaW50OCkoc2VlZDEgICogc2VlZDEgKTsKLQlzZWVkMiAgPSAoZGVVaW50OCkoc2VlZDIgICogc2VlZDIgKTsKLQlzZWVkMyAgPSAoZGVVaW50OCkoc2VlZDMgICogc2VlZDMgKTsKLQlzZWVkNCAgPSAoZGVVaW50OCkoc2VlZDQgICogc2VlZDQgKTsKLQlzZWVkNSAgPSAoZGVVaW50OCkoc2VlZDUgICogc2VlZDUgKTsKLQlzZWVkNiAgPSAoZGVVaW50OCkoc2VlZDYgICogc2VlZDYgKTsKLQlzZWVkNyAgPSAoZGVVaW50OCkoc2VlZDcgICogc2VlZDcgKTsKLQlzZWVkOCAgPSAoZGVVaW50OCkoc2VlZDggICogc2VlZDggKTsKLQlzZWVkOSAgPSAoZGVVaW50OCkoc2VlZDkgICogc2VlZDkgKTsKLQlzZWVkMTAgPSAoZGVVaW50OCkoc2VlZDEwICogc2VlZDEwKTsKLQlzZWVkMTEgPSAoZGVVaW50OCkoc2VlZDExICogc2VlZDExKTsKLQlzZWVkMTIgPSAoZGVVaW50OCkoc2VlZDEyICogc2VlZDEyKTsKLQljb25zdCBpbnQgc2hBID0gKHNlZWQgJiAyKSAhPSAwCQk/IDQJCTogNTsKLQljb25zdCBpbnQgc2hCID0gbnVtUGFydGl0aW9ucyA9PSAzCT8gNgkJOiA1OwotCWNvbnN0IGludCBzaDEgPSAoc2VlZCAmIDEpICE9IDAJCT8gc2hBCTogc2hCOwotCWNvbnN0IGludCBzaDIgPSAoc2VlZCAmIDEpICE9IDAJCT8gc2hCCTogc2hBOwotCWNvbnN0IGludCBzaDMgPSAoc2VlZCAmIDB4MTApICE9IDAJPyBzaDEJOiBzaDI7Ci0Jc2VlZDEgID0gKGRlVWludDgpKHNlZWQxICA+PiBzaDEpOwotCXNlZWQyICA9IChkZVVpbnQ4KShzZWVkMiAgPj4gc2gyKTsKLQlzZWVkMyAgPSAoZGVVaW50OCkoc2VlZDMgID4+IHNoMSk7Ci0Jc2VlZDQgID0gKGRlVWludDgpKHNlZWQ0ICA+PiBzaDIpOwotCXNlZWQ1ICA9IChkZVVpbnQ4KShzZWVkNSAgPj4gc2gxKTsKLQlzZWVkNiAgPSAoZGVVaW50OCkoc2VlZDYgID4+IHNoMik7Ci0Jc2VlZDcgID0gKGRlVWludDgpKHNlZWQ3ICA+PiBzaDEpOwotCXNlZWQ4ICA9IChkZVVpbnQ4KShzZWVkOCAgPj4gc2gyKTsKLQlzZWVkOSAgPSAoZGVVaW50OCkoc2VlZDkgID4+IHNoMyk7Ci0Jc2VlZDEwID0gKGRlVWludDgpKHNlZWQxMCA+PiBzaDMpOwotCXNlZWQxMSA9IChkZVVpbnQ4KShzZWVkMTEgPj4gc2gzKTsKLQlzZWVkMTIgPSAoZGVVaW50OCkoc2VlZDEyID4+IHNoMyk7Ci0JY29uc3QgaW50IGEgPQkJCQkJCTB4M2YgJiAoc2VlZDEqeCArIHNlZWQyKnkgKyBzZWVkMTEqeiArIChybnVtID4+IDE0KSk7Ci0JY29uc3QgaW50IGIgPQkJCQkJCTB4M2YgJiAoc2VlZDMqeCArIHNlZWQ0KnkgKyBzZWVkMTIqeiArIChybnVtID4+IDEwKSk7Ci0JY29uc3QgaW50IGMgPSBudW1QYXJ0aXRpb25zID49IDMgPwkweDNmICYgKHNlZWQ1KnggKyBzZWVkNip5ICsgc2VlZDkqeiAgKyAocm51bSA+PiAgNikpCTogMDsKLQljb25zdCBpbnQgZCA9IG51bVBhcnRpdGlvbnMgPj0gNCA/CTB4M2YgJiAoc2VlZDcqeCArIHNlZWQ4KnkgKyBzZWVkMTAqeiArIChybnVtID4+ICAyKSkJOiAwOwotCXJldHVybiBhID49IGIgJiYgYSA+PSBjICYmIGEgPj0gZAk/IDAKLQkJIDogYiA+PSBjICYmIGIgPj0gZAkJCQk/IDEKLQkJIDogYyA+PSBkCQkJCQkJPyAyCi0JCSA6CQkJCQkJCQkgIDM7Ci19Ci1EZWNvbXByZXNzUmVzdWx0IHNldFRleGVsQ29sb3JzICh2b2lkKiBkc3QsIENvbG9yRW5kcG9pbnRQYWlyKiBjb2xvckVuZHBvaW50cywgVGV4ZWxXZWlnaHRQYWlyKiB0ZXhlbFdlaWdodHMsIGludCBjY3MsIGRlVWludDMyIHBhcnRpdGlvbkluZGV4U2VlZCwKLQkJCQkJCQkJIGludCBudW1QYXJ0aXRpb25zLCBpbnQgYmxvY2tXaWR0aCwgaW50IGJsb2NrSGVpZ2h0LCBib29sIGlzU1JHQiwgYm9vbCBpc0xEUk1vZGUsIGNvbnN0IGRlVWludDMyKiBjb2xvckVuZHBvaW50TW9kZXMpCi17Ci0JY29uc3QgYm9vbAkJCXNtYWxsQmxvY2sJPSBibG9ja1dpZHRoKmJsb2NrSGVpZ2h0IDwgMzE7Ci0JRGVjb21wcmVzc1Jlc3VsdAlyZXN1bHQJCT0gREVDT01QUkVTU19SRVNVTFRfVkFMSURfQkxPQ0s7Ci0JYm9vbAkJCQlpc0hEUkVuZHBvaW50WzRdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtUGFydGl0aW9uczsgaSsrKQotCXsKLQkJaXNIRFJFbmRwb2ludFtpXSA9IGlzQ29sb3JFbmRwb2ludE1vZGVIRFIoY29sb3JFbmRwb2ludE1vZGVzW2ldKTsKLQkJCi0JCS8vIHJnIC0gUkVNT1ZJTkcgSERSIFNVUFBPUlQgRk9SIE5PVwotCQlpZiAoaXNIRFJFbmRwb2ludFtpXSkKLQkJCXJldHVybiBERUNPTVBSRVNTX1JFU1VMVF9FUlJPUjsKLQl9Ci0KLQlmb3IgKGludCB0ZXhlbFkgPSAwOyB0ZXhlbFkgPCBibG9ja0hlaWdodDsgdGV4ZWxZKyspCi0JZm9yIChpbnQgdGV4ZWxYID0gMDsgdGV4ZWxYIDwgYmxvY2tXaWR0aDsgdGV4ZWxYKyspCi0JewotCQljb25zdCBpbnQJCQkJdGV4ZWxOZHgJCQk9IHRleGVsWSpibG9ja1dpZHRoICsgdGV4ZWxYOwotCQljb25zdCBpbnQJCQkJY29sb3JFbmRwb2ludE5keAk9IG51bVBhcnRpdGlvbnMgPT0gMSA/IDAgOiBjb21wdXRlVGV4ZWxQYXJ0aXRpb24ocGFydGl0aW9uSW5kZXhTZWVkLCB0ZXhlbFgsIHRleGVsWSwgMCwgbnVtUGFydGl0aW9ucywgc21hbGxCbG9jayk7Ci0JCURFX0FTU0VSVChjb2xvckVuZHBvaW50TmR4IDwgbnVtUGFydGl0aW9ucyk7Ci0JCWNvbnN0IFVWZWM0JgkJCWUwCQkJCQk9IGNvbG9yRW5kcG9pbnRzW2NvbG9yRW5kcG9pbnROZHhdLmUwOwotCQljb25zdCBVVmVjNCYJCQllMQkJCQkJPSBjb2xvckVuZHBvaW50c1tjb2xvckVuZHBvaW50TmR4XS5lMTsKLQkJY29uc3QgVGV4ZWxXZWlnaHRQYWlyJgl3ZWlnaHQJCQkJPSB0ZXhlbFdlaWdodHNbdGV4ZWxOZHhdOwotCQlpZiAoaXNMRFJNb2RlICYmIGlzSERSRW5kcG9pbnRbY29sb3JFbmRwb2ludE5keF0pCi0JCXsKLQkJCWlmIChpc1NSR0IpCi0JCQl7Ci0JCQkJKChkZVVpbnQ4Kilkc3QpW3RleGVsTmR4KjQgKyAwXSA9IDB4ZmY7Ci0JCQkJKChkZVVpbnQ4Kilkc3QpW3RleGVsTmR4KjQgKyAxXSA9IDA7Ci0JCQkJKChkZVVpbnQ4Kilkc3QpW3RleGVsTmR4KjQgKyAyXSA9IDB4ZmY7Ci0JCQkJKChkZVVpbnQ4Kilkc3QpW3RleGVsTmR4KjQgKyAzXSA9IDB4ZmY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJKChmbG9hdCopZHN0KVt0ZXhlbE5keCo0ICsgMF0gPSAxLjBmOwotCQkJCSgoZmxvYXQqKWRzdClbdGV4ZWxOZHgqNCArIDFdID0gMDsKLQkJCQkoKGZsb2F0Kilkc3QpW3RleGVsTmR4KjQgKyAyXSA9IDEuMGY7Ci0JCQkJKChmbG9hdCopZHN0KVt0ZXhlbE5keCo0ICsgM10gPSAxLjBmOwotCQkJfQotCQkJcmVzdWx0ID0gREVDT01QUkVTU19SRVNVTFRfRVJST1I7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmb3IgKGludCBjaGFubmVsTmR4ID0gMDsgY2hhbm5lbE5keCA8IDQ7IGNoYW5uZWxOZHgrKykKLQkJCXsKLQkJCQlpZiAoIWlzSERSRW5kcG9pbnRbY29sb3JFbmRwb2ludE5keF0gfHwgKGNoYW5uZWxOZHggPT0gMyAmJiBjb2xvckVuZHBvaW50TW9kZXNbY29sb3JFbmRwb2ludE5keF0gPT0gMTQpKSAvLyBcbm90ZSBBbHBoYSBmb3IgbW9kZSAxNCBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIExEUi4KLQkJCQl7Ci0JCQkJCWNvbnN0IGRlVWludDMyIGMwCT0gKGUwW2NoYW5uZWxOZHhdIDw8IDgpIHwgKGlzU1JHQiA/IDB4ODAgOiBlMFtjaGFubmVsTmR4XSk7Ci0JCQkJCWNvbnN0IGRlVWludDMyIGMxCT0gKGUxW2NoYW5uZWxOZHhdIDw8IDgpIHwgKGlzU1JHQiA/IDB4ODAgOiBlMVtjaGFubmVsTmR4XSk7Ci0JCQkJCWNvbnN0IGRlVWludDMyIHcJPSB3ZWlnaHQud1tjY3MgPT0gY2hhbm5lbE5keCA/IDEgOiAwXTsKLQkJCQkJY29uc3QgZGVVaW50MzIgYwk9IChjMCooNjQtdykgKyBjMSp3ICsgMzIpIC8gNjQ7Ci0JCQkJCWlmIChpc1NSR0IpCi0JCQkJCQkoKGRlVWludDgqKWRzdClbdGV4ZWxOZHgqNCArIGNoYW5uZWxOZHhdID0gKGRlVWludDgpKChjICYgMHhmZjAwKSA+PiA4KTsKLQkJCQkJZWxzZQotCQkJCQkJKChmbG9hdCopZHN0KVt0ZXhlbE5keCo0ICsgY2hhbm5lbE5keF0gPSBjID09IDY1NTM1ID8gMS4wZiA6IChmbG9hdCljIC8gNjU1MzYuMGY7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vREVfU1RBVElDX0FTU0VSVCgoYmFzaXN1X2FzdGM6Om1ldGE6OlR5cGVzU2FtZTxkZUZsb2F0MTYsIGRlVWludDE2Pjo6VmFsdWUpKTsKLQkJCQkJLy8gcmcgLSBSRU1PVklORyBIRFIgU1VQUE9SVCBGT1IgTk9XCi0jaWYgMAotCQkJCQljb25zdCBkZVVpbnQzMgkJYzAJPSBlMFtjaGFubmVsTmR4XSA8PCA0OwotCQkJCQljb25zdCBkZVVpbnQzMgkJYzEJPSBlMVtjaGFubmVsTmR4XSA8PCA0OwotCQkJCQljb25zdCBkZVVpbnQzMgkJdwk9IHdlaWdodC53W2NjcyA9PSBjaGFubmVsTmR4ID8gMSA6IDBdOwotCQkJCQljb25zdCBkZVVpbnQzMgkJYwk9IChjMCooNjQtdykgKyBjMSp3ICsgMzIpIC8gNjQ7Ci0JCQkJCWNvbnN0IGRlVWludDMyCQllCT0gZ2V0Qml0cyhjLCAxMSwgMTUpOwotCQkJCQljb25zdCBkZVVpbnQzMgkJbQk9IGdldEJpdHMoYywgMCwgMTApOwotCQkJCQljb25zdCBkZVVpbnQzMgkJbXQJPSBtIDwgNTEyCQk/IDMqbQotCQkJCQkJCQkJCQk6IG0gPj0gMTUzNgkJPyA1Km0gLSAyMDQ4Ci0JCQkJCQkJCQkJCToJCQkJICA0Km0gLSA1MTI7Ci0JCQkJCWNvbnN0IGRlRmxvYXQxNgkJY2YJPSAoZGVGbG9hdDE2KSgoZSA8PCAxMCkgKyAobXQgPj4gMykpOwotCQkJCQkoKGZsb2F0Kilkc3QpW3RleGVsTmR4KjQgKyBjaGFubmVsTmR4XSA9IGRlRmxvYXQxNlRvMzIoaXNGbG9hdDE2SW5mT3JOYW4oY2YpID8gMHg3YmZmIDogY2YpOwotI2VuZGlmCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci1EZWNvbXByZXNzUmVzdWx0IGRlY29tcHJlc3NCbG9jayAodm9pZCogZHN0LCBjb25zdCBCbG9jazEyOCYgYmxvY2tEYXRhLCBpbnQgYmxvY2tXaWR0aCwgaW50IGJsb2NrSGVpZ2h0LCBib29sIGlzU1JHQiwgYm9vbCBpc0xEUikKLXsKLQlERV9BU1NFUlQoaXNMRFIgfHwgIWlzU1JHQik7Ci0JLy8gRGVjb2RlIGJsb2NrIG1vZGUuCi0JY29uc3QgQVNUQ0Jsb2NrTW9kZSBibG9ja01vZGUgPSBnZXRBU1RDQmxvY2tNb2RlKGJsb2NrRGF0YS5nZXRCaXRzKDAsIDEwKSk7Ci0JLy8gQ2hlY2sgZm9yIGJsb2NrIG1vZGUgZXJyb3JzLgotCWlmIChibG9ja01vZGUuaXNFcnJvcikKLQl7Ci0JCXNldEFTVENFcnJvckNvbG9yQmxvY2soZHN0LCBibG9ja1dpZHRoLCBibG9ja0hlaWdodCwgaXNTUkdCKTsKLQkJcmV0dXJuIERFQ09NUFJFU1NfUkVTVUxUX0VSUk9SOwotCX0KLQkvLyBTZXBhcmF0ZSBwYXRoIGZvciB2b2lkLWV4dGVudC4KLQlpZiAoYmxvY2tNb2RlLmlzVm9pZEV4dGVudCkKLQkJcmV0dXJuIGRlY29kZVZvaWRFeHRlbnRCbG9jayhkc3QsIGJsb2NrRGF0YSwgYmxvY2tXaWR0aCwgYmxvY2tIZWlnaHQsIGlzU1JHQiwgaXNMRFIpOwotCS8vIENvbXB1dGUgd2VpZ2h0IGdyaWQgdmFsdWVzLgotCWNvbnN0IGludCBudW1XZWlnaHRzCQkJPSBjb21wdXRlTnVtV2VpZ2h0cyhibG9ja01vZGUpOwotCWNvbnN0IGludCBudW1XZWlnaHREYXRhQml0cwkJPSBjb21wdXRlTnVtUmVxdWlyZWRCaXRzKGJsb2NrTW9kZS53ZWlnaHRJU0VQYXJhbXMsIG51bVdlaWdodHMpOwotCWNvbnN0IGludCBudW1QYXJ0aXRpb25zCQkJPSAoaW50KWJsb2NrRGF0YS5nZXRCaXRzKDExLCAxMikgKyAxOwotCS8vIENoZWNrIGZvciBlcnJvcnMgaW4gd2VpZ2h0IGdyaWQsIHBhcnRpdGlvbiBhbmQgZHVhbC1wbGFuZSBwYXJhbWV0ZXJzLgotCWlmIChudW1XZWlnaHRzID4gNjQJCQkJCQkJCXx8Ci0JCW51bVdlaWdodERhdGFCaXRzID4gOTYJCQkJCQl8fAotCQludW1XZWlnaHREYXRhQml0cyA8IDI0CQkJCQkJfHwKLQkJYmxvY2tNb2RlLndlaWdodEdyaWRXaWR0aCA+IGJsb2NrV2lkdGgJCXx8Ci0JCWJsb2NrTW9kZS53ZWlnaHRHcmlkSGVpZ2h0ID4gYmxvY2tIZWlnaHQJfHwKLQkJKG51bVBhcnRpdGlvbnMgPT0gNCAmJiBibG9ja01vZGUuaXNEdWFsUGxhbmUpKQotCXsKLQkJc2V0QVNUQ0Vycm9yQ29sb3JCbG9jayhkc3QsIGJsb2NrV2lkdGgsIGJsb2NrSGVpZ2h0LCBpc1NSR0IpOwotCQlyZXR1cm4gREVDT01QUkVTU19SRVNVTFRfRVJST1I7Ci0JfQotCS8vIENvbXB1dGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIGZvciBjb2xvciBlbmRwb2ludCBkYXRhLgotCWNvbnN0IGJvb2wJaXNTaW5nbGVVbmlxdWVDZW0JCQk9IG51bVBhcnRpdGlvbnMgPT0gMSB8fCBibG9ja0RhdGEuZ2V0Qml0cygyMywgMjQpID09IDA7Ci0JY29uc3QgaW50CW51bUNvbmZpZ0RhdGFCaXRzCQkJPSAobnVtUGFydGl0aW9ucyA9PSAxID8gMTcgOiBpc1NpbmdsZVVuaXF1ZUNlbSA/IDI5IDogMjUgKyAzKm51bVBhcnRpdGlvbnMpICsKLQkJCQkJCQkJCQkJICAoYmxvY2tNb2RlLmlzRHVhbFBsYW5lID8gMiA6IDApOwotCWNvbnN0IGludAludW1CaXRzRm9yQ29sb3JFbmRwb2ludHMJPSAxMjggLSBudW1XZWlnaHREYXRhQml0cyAtIG51bUNvbmZpZ0RhdGFCaXRzOwotCWNvbnN0IGludAlleHRyYUNlbUJpdHNTdGFydAkJCT0gMTI3IC0gbnVtV2VpZ2h0RGF0YUJpdHMgLSAoaXNTaW5nbGVVbmlxdWVDZW0JCT8gLTEKLQkJCQkJCQkJCQkJCQkJCQkJCTogbnVtUGFydGl0aW9ucyA9PSA0CT8gNwotCQkJCQkJCQkJCQkJCQkJCQkJOiBudW1QYXJ0aXRpb25zID09IDMJPyA0Ci0JCQkJCQkJCQkJCQkJCQkJCQk6IG51bVBhcnRpdGlvbnMgPT0gMgk/IDEKLQkJCQkJCQkJCQkJCQkJCQkJCTogMCk7Ci0JLy8gRGVjb2RlIGNvbG9yIGVuZHBvaW50IG1vZGVzLgotCWRlVWludDMyIGNvbG9yRW5kcG9pbnRNb2Rlc1s0XTsKLQlkZWNvZGVDb2xvckVuZHBvaW50TW9kZXMoJmNvbG9yRW5kcG9pbnRNb2Rlc1swXSwgYmxvY2tEYXRhLCBudW1QYXJ0aXRpb25zLCBleHRyYUNlbUJpdHNTdGFydCk7Ci0JY29uc3QgaW50IG51bUNvbG9yRW5kcG9pbnRWYWx1ZXMgPSBjb21wdXRlTnVtQ29sb3JFbmRwb2ludFZhbHVlcyhjb2xvckVuZHBvaW50TW9kZXMsIG51bVBhcnRpdGlvbnMpOwotCS8vIENoZWNrIGZvciBlcnJvcnMgaW4gY29sb3IgZW5kcG9pbnQgdmFsdWUgY291bnQuCi0JaWYgKG51bUNvbG9yRW5kcG9pbnRWYWx1ZXMgPiAxOCB8fCBudW1CaXRzRm9yQ29sb3JFbmRwb2ludHMgPCAoaW50KWRlRGl2Um91bmRVcDMyKDEzKm51bUNvbG9yRW5kcG9pbnRWYWx1ZXMsIDUpKQotCXsKLQkJc2V0QVNUQ0Vycm9yQ29sb3JCbG9jayhkc3QsIGJsb2NrV2lkdGgsIGJsb2NrSGVpZ2h0LCBpc1NSR0IpOwotCQlyZXR1cm4gREVDT01QUkVTU19SRVNVTFRfRVJST1I7Ci0JfQotCS8vIENvbXB1dGUgY29sb3IgZW5kcG9pbnRzLgotCUNvbG9yRW5kcG9pbnRQYWlyIGNvbG9yRW5kcG9pbnRzWzRdOwotCWNvbXB1dGVDb2xvckVuZHBvaW50cygmY29sb3JFbmRwb2ludHNbMF0sIGJsb2NrRGF0YSwgJmNvbG9yRW5kcG9pbnRNb2Rlc1swXSwgbnVtUGFydGl0aW9ucywgbnVtQ29sb3JFbmRwb2ludFZhbHVlcywKLQkJCQkJCSAgY29tcHV0ZU1heGltdW1SYW5nZUlTRVBhcmFtcyhudW1CaXRzRm9yQ29sb3JFbmRwb2ludHMsIG51bUNvbG9yRW5kcG9pbnRWYWx1ZXMpLCBudW1CaXRzRm9yQ29sb3JFbmRwb2ludHMpOwotCS8vIENvbXB1dGUgdGV4ZWwgd2VpZ2h0cy4KLQlUZXhlbFdlaWdodFBhaXIgdGV4ZWxXZWlnaHRzW01BWF9CTE9DS19XSURUSCpNQVhfQkxPQ0tfSEVJR0hUXTsKLQljb21wdXRlVGV4ZWxXZWlnaHRzKCZ0ZXhlbFdlaWdodHNbMF0sIGJsb2NrRGF0YSwgYmxvY2tXaWR0aCwgYmxvY2tIZWlnaHQsIGJsb2NrTW9kZSk7Ci0JLy8gU2V0IHRleGVsIGNvbG9ycy4KLQljb25zdCBpbnQJCWNjcwkJCQkJCT0gYmxvY2tNb2RlLmlzRHVhbFBsYW5lID8gKGludClibG9ja0RhdGEuZ2V0Qml0cyhleHRyYUNlbUJpdHNTdGFydC0yLCBleHRyYUNlbUJpdHNTdGFydC0xKSA6IC0xOwotCWNvbnN0IGRlVWludDMyCXBhcnRpdGlvbkluZGV4U2VlZAkJPSBudW1QYXJ0aXRpb25zID4gMSA/IGJsb2NrRGF0YS5nZXRCaXRzKDEzLCAyMikgOiAoZGVVaW50MzIpLTE7Ci0JcmV0dXJuIHNldFRleGVsQ29sb3JzKGRzdCwgJmNvbG9yRW5kcG9pbnRzWzBdLCAmdGV4ZWxXZWlnaHRzWzBdLCBjY3MsIHBhcnRpdGlvbkluZGV4U2VlZCwgbnVtUGFydGl0aW9ucywgYmxvY2tXaWR0aCwgYmxvY2tIZWlnaHQsIGlzU1JHQiwgaXNMRFIsICZjb2xvckVuZHBvaW50TW9kZXNbMF0pOwotfQotCi19IC8vIGFub255bW91cwotCi1ib29sIGRlY29tcHJlc3ModWludDhfdCAqcERzdCwgY29uc3QgdWludDhfdCAqIGRhdGEsIGJvb2wgaXNTUkdCLCBpbnQgYmxvY2tXaWR0aCwgaW50IGJsb2NrSGVpZ2h0KQotewotCS8vIHJnIC0gV2Ugb25seSBzdXBwb3J0IExEUiBoZXJlLCBhbHRob3VnaCBhZGRpbmcgYmFjayBpbiBIRFIgd291bGQgYmUgZWFzeS4KLQljb25zdCBib29sIGlzTERSID0gdHJ1ZTsKLQlERV9BU1NFUlQoaXNMRFIgfHwgIWlzU1JHQik7Ci0JCi0JZmxvYXQgbGluZWFyW01BWF9CTE9DS19XSURUSCAqIE1BWF9CTE9DS19IRUlHSFQgKiA0XTsKLQotCWNvbnN0IEJsb2NrMTI4IGJsb2NrRGF0YShkYXRhKTsKLQlpZiAoZGVjb21wcmVzc0Jsb2NrKGlzU1JHQiA/ICh2b2lkKilwRHN0IDogKHZvaWQqKSYgbGluZWFyWzBdLAotCQlibG9ja0RhdGEsIGJsb2NrV2lkdGgsIGJsb2NrSGVpZ2h0LCBpc1NSR0IsIGlzTERSKSAhPSBERUNPTVBSRVNTX1JFU1VMVF9WQUxJRF9CTE9DSykKLQkJcmV0dXJuIGZhbHNlOwotCQotCWlmICghaXNTUkdCKQotCXsKLQkJaW50IHBpeCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tIZWlnaHQ7IGkrKykKLQkJewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBibG9ja1dpZHRoOyBqKyssIHBpeCsrKQotCQkJewotCQkJCXBEc3RbNCAqIHBpeCArIDBdID0gKHVpbnQ4X3QpKGJhc2lzdV9hc3RjOjpjbGFtcDxpbnQ+KChpbnQpKGxpbmVhcltwaXggKiA0ICsgMF0gKiA2NTUzNi4wZiArIC41ZiksIDAsIDY1NTM1KSA+PiA4KTsKLQkJCQlwRHN0WzQgKiBwaXggKyAxXSA9ICh1aW50OF90KShiYXNpc3VfYXN0Yzo6Y2xhbXA8aW50PigoaW50KShsaW5lYXJbcGl4ICogNCArIDFdICogNjU1MzYuMGYgKyAuNWYpLCAwLCA2NTUzNSkgPj4gOCk7Ci0JCQkJcERzdFs0ICogcGl4ICsgMl0gPSAodWludDhfdCkoYmFzaXN1X2FzdGM6OmNsYW1wPGludD4oKGludCkobGluZWFyW3BpeCAqIDQgKyAyXSAqIDY1NTM2LjBmICsgLjVmKSwgMCwgNjU1MzUpID4+IDgpOwotCQkJCXBEc3RbNCAqIHBpeCArIDNdID0gKHVpbnQ4X3QpKGJhc2lzdV9hc3RjOjpjbGFtcDxpbnQ+KChpbnQpKGxpbmVhcltwaXggKiA0ICsgM10gKiA2NTUzNi4wZiArIC41ZiksIDAsIDY1NTM1KSA+PiA4KTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi19IC8vIGFzdGMKLX0gLy8gYmFzaXN1X2FzdGMKLQotI2lmIGRlZmluZWQoX19HTlVDX18pCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCmRpZmYgLS1naXQgYS9lbmNvZGVyL2Jhc2lzdV9hc3RjX2RlY29tcC5oIGIvZW5jb2Rlci9iYXNpc3VfYXN0Y19kZWNvbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjMmU0Ni4uMDAwMDAwMAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9hc3RjX2RlY29tcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotI2lmbmRlZiBfVENVQVNUQ1VUSUxfSFBQCi0jZGVmaW5lIF9UQ1VBU1RDVVRJTF9IUFAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogZHJhd0VsZW1lbnRzIFF1YWxpdHkgUHJvZ3JhbSBUZXN0ZXIgQ29yZQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovLyohCi0gKiBcZmlsZQotICogXGJyaWVmIEFTVEMgVXRpbGl0aWVzLgotICovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICIuLi90cmFuc2NvZGVyL2Jhc2lzdS5oIiAvLyB0byBwaWNrIHVwIHRoZSBpdGVyYXRvciBkZWJ1ZyBsZXZlbCBtYWRuZXNzCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgYmFzaXN1X2FzdGMKLXsKLW5hbWVzcGFjZSBhc3RjCi17Ci0KLS8vIFVucGFja3MgYSBzaW5nbGUgQVNUQyBibG9jayB0byBwRHN0Ci0vLyBJZiBpc1NSR0IgaXMgdHJ1ZSwgdGhlIHNwZWMgcmVxdWlyZXMgdGhlIGRlY29kZXIgdG8gc2NhbGUgdGhlIExEUiA4LWJpdCBlbmRwb2ludHMgdG8gMTYtYml0IGJlZm9yZSBpbnRlcnBvbGF0aW9uIHNsaWdodGx5IGRpZmZlcmVudGx5LCAKLS8vIHdoaWNoIHdpbGwgbGVhZCB0byBkaWZmZXJlbnQgb3V0cHV0cy4gU28gYmUgc3VyZSB0byBzZXQgaXQgY29ycmVjdGx5IChpZGVhbGx5IGl0IHNob3VsZCBtYXRjaCB3aGF0ZXZlciB0aGUgZW5jb2RlciBkaWQpLgotYm9vbCBkZWNvbXByZXNzKHVpbnQ4X3QqIHBEc3QsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGJvb2wgaXNTUkdCLCBpbnQgYmxvY2tXaWR0aCwgaW50IGJsb2NrSGVpZ2h0KTsKLQotfSAvLyBhc3RjCi19IC8vIGJhc2lzdQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X2JhY2tlbmQuY3BwIGIvZW5jb2Rlci9iYXNpc3VfYmFja2VuZC5jcHAKaW5kZXggMTk5MTFmYy4uYWJiNjE3NSAxMDA2NDQKLS0tIGEvZW5jb2Rlci9iYXNpc3VfYmFja2VuZC5jcHAKKysrIGIvZW5jb2Rlci9iYXNpc3VfYmFja2VuZC5jcHAKQEAgLTQ5LDIyICs0OSwxNyBAQAogCQltX291dHB1dC5jbGVhcigpOwogCX0KIAotCXZvaWQgYmFzaXN1X2JhY2tlbmQ6OmluaXQoYmFzaXN1X2Zyb250ZW5kKiBwRnJvbnRfZW5kLCBiYXNpc3VfYmFja2VuZF9wYXJhbXMmIHBhcmFtcywgY29uc3QgYmFzaXN1X2JhY2tlbmRfc2xpY2VfZGVzY192ZWMmIHNsaWNlX2Rlc2NzLCBjb25zdCBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKiBwR2xvYmFsX3NlbF9jb2RlYm9vaykKKwl2b2lkIGJhc2lzdV9iYWNrZW5kOjppbml0KGJhc2lzdV9mcm9udGVuZCogcEZyb250X2VuZCwgYmFzaXN1X2JhY2tlbmRfcGFyYW1zJiBwYXJhbXMsIGNvbnN0IGJhc2lzdV9iYWNrZW5kX3NsaWNlX2Rlc2NfdmVjJiBzbGljZV9kZXNjcykKIAl7CiAJCW1fcEZyb250X2VuZCA9IHBGcm9udF9lbmQ7CiAJCW1fcGFyYW1zID0gcGFyYW1zOwogCQltX3NsaWNlcyA9IHNsaWNlX2Rlc2NzOwotCQltX3BHbG9iYWxfc2VsX2NvZGVib29rID0gcEdsb2JhbF9zZWxfY29kZWJvb2s7Ci0KLQkJZGVidWdfcHJpbnRmKCJiYXNpc3VfYmFja2VuZDo6SW5pdDogU2xpY2VzOiAldSwgRVRDMVM6ICV1LCBFbmRwb2ludFJET1F1YWxpdHlUaHJlc2g6ICVmLCBTZWxlY3RvclJET1F1YWxpdHlUaHJlc2g6ICVmLCBVc2VHbG9iYWxTZWxDb2RlYm9vazogJXUsIEdsb2JhbFNlbENvZGVib29rUGFsQml0czogJXUsIEdsb2JhbFNlbENvZGVib29rTW9kQml0czogJXUsIFVzZSBoeWJyaWQgc2VsZWN0b3IgY29kZWJvb2tzOiAldVxuIiwKKwkJCisJCWRlYnVnX3ByaW50ZigiYmFzaXN1X2JhY2tlbmQ6OkluaXQ6IFNsaWNlczogJXUsIEVUQzFTOiAldSwgRW5kcG9pbnRSRE9RdWFsaXR5VGhyZXNoOiAlZiwgU2VsZWN0b3JSRE9RdWFsaXR5VGhyZXNoOiAlZlxuIiwKIAkJCW1fc2xpY2VzLnNpemUoKSwKIAkJCXBhcmFtcy5tX2V0YzFzLAogCQkJcGFyYW1zLm1fZW5kcG9pbnRfcmRvX3F1YWxpdHlfdGhyZXNoLAotCQkJcGFyYW1zLm1fc2VsZWN0b3JfcmRvX3F1YWxpdHlfdGhyZXNoLAotCQkJcGFyYW1zLm1fdXNlX2dsb2JhbF9zZWxfY29kZWJvb2ssCi0JCQlwYXJhbXMubV9nbG9iYWxfc2VsX2NvZGVib29rX3BhbF9iaXRzLAotCQkJcGFyYW1zLm1fZ2xvYmFsX3NlbF9jb2RlYm9va19tb2RfYml0cywKLQkJCXBhcmFtcy5tX3VzZV9oeWJyaWRfc2VsX2NvZGVib29rcyk7CisJCQlwYXJhbXMubV9zZWxlY3Rvcl9yZG9fcXVhbGl0eV90aHJlc2gpOwogCiAJCWRlYnVnX3ByaW50ZigiRnJvbnRlbmQgZW5kcG9pbnRzOiAldSBzZWxlY3RvcnM6ICV1XG4iLCBtX3BGcm9udF9lbmQtPmdldF90b3RhbF9lbmRwb2ludF9jbHVzdGVycygpLCBtX3BGcm9udF9lbmQtPmdldF90b3RhbF9zZWxlY3Rvcl9jbHVzdGVycygpKTsKIApAQCAtMTA2LDYzICsxMDEsMTcgQEAKIAogCQltX3NlbGVjdG9yX3BhbGV0dGUucmVzaXplKHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCkpOwogCi0JCWlmIChtX3BhcmFtcy5tX3VzZV9nbG9iYWxfc2VsX2NvZGVib29rKQorCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgci5nZXRfdG90YWxfc2VsZWN0b3JfY2x1c3RlcnMoKTsgaSsrKQogCQl7Ci0JCQltX2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2Rlc2MucmVzaXplKHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCkpOworCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5JiBzID0gbV9zZWxlY3Rvcl9wYWxldHRlW2ldOwogCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PGludD4oci5nZXRfdG90YWxfc2VsZWN0b3JfY2x1c3RlcnMoKSk7IGkrKykKKwkJCWNvbnN0IGV0Y19ibG9jayYgc2VsZWN0b3JfYml0cyA9IHIuZ2V0X3NlbGVjdG9yX2NsdXN0ZXJfc2VsZWN0b3JfYml0cyhpKTsKKworCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKIAkJCXsKLQkJCQliYXNpc3Q6OmV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSYgc2VsZWN0b3JfcGFsX2VudHJ5ID0gbV9zZWxlY3Rvcl9wYWxldHRlW2ldOwotCi0JCQkJZXRjMV9nbG9iYWxfc2VsZWN0b3JfY2JfZW50cnlfZGVzYyYgcGFsX2VudHJ5X2Rlc2MgPSBtX2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2Rlc2NbaV07Ci0JCQkJcGFsX2VudHJ5X2Rlc2MubV9wYWxfaW5kZXggPSByLmdldF9zZWxlY3Rvcl9jbHVzdGVyX2dsb2JhbF9zZWxlY3Rvcl9lbnRyeV9pZHMoKVtpXS5tX3BhbGV0dGVfaW5kZXg7Ci0JCQkJcGFsX2VudHJ5X2Rlc2MubV9tb2RfaW5kZXggPSByLmdldF9zZWxlY3Rvcl9jbHVzdGVyX2dsb2JhbF9zZWxlY3Rvcl9lbnRyeV9pZHMoKVtpXS5tX21vZGlmaWVyLmdldF9pbmRleCgpOwotCi0JCQkJcGFsX2VudHJ5X2Rlc2MubV93YXNfdXNlZCA9IHRydWU7Ci0JCQkJaWYgKG1fcGFyYW1zLm1fdXNlX2h5YnJpZF9zZWxfY29kZWJvb2tzKQotCQkJCQlwYWxfZW50cnlfZGVzYy5tX3dhc191c2VkID0gci5nZXRfc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYl92ZWMoKVtpXTsKLQotCQkJCWlmIChwYWxfZW50cnlfZGVzYy5tX3dhc191c2VkKQorCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCiAJCQkJewotCQkJCQljb25zdCBldGNfYmxvY2smIHNlbGVjdG9yX2JpdHMgPSByLmdldF9zZWxlY3Rvcl9jbHVzdGVyX3NlbGVjdG9yX2JpdHMoaSk7Ci0JCQkJCSh2b2lkKXNlbGVjdG9yX2JpdHM7Ci0KLQkJCQkJYmFzaXN0OjpldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2xvYmFsX3BhbF9lbnRyeShtX3BHbG9iYWxfc2VsX2NvZGVib29rLT5nZXRfZW50cnkoci5nZXRfc2VsZWN0b3JfY2x1c3Rlcl9nbG9iYWxfc2VsZWN0b3JfZW50cnlfaWRzKClbaV0pKTsKLQotCQkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJCQl7Ci0JCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJewotCQkJCQkJCXNlbGVjdG9yX3BhbF9lbnRyeSh4LCB5KSA9IGdsb2JhbF9wYWxfZW50cnkoeCwgeSk7Ci0KLQkJCQkJCQlhc3NlcnQoc2VsZWN0b3JfYml0cy5nZXRfc2VsZWN0b3IoeCwgeSkgPT0gZ2xvYmFsX3BhbF9lbnRyeSh4LCB5KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJY29uc3QgZXRjX2Jsb2NrJiBzZWxlY3Rvcl9iaXRzID0gci5nZXRfc2VsZWN0b3JfY2x1c3Rlcl9zZWxlY3Rvcl9iaXRzKGkpOwotCi0JCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJCXNlbGVjdG9yX3BhbF9lbnRyeVt5ICogNCArIHhdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2VsZWN0b3JfYml0cy5nZXRfc2VsZWN0b3IoeCwgeSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCByLmdldF90b3RhbF9zZWxlY3Rvcl9jbHVzdGVycygpOyBpKyspCi0JCQl7Ci0JCQkJYmFzaXN0OjpldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkmIHMgPSBtX3NlbGVjdG9yX3BhbGV0dGVbaV07Ci0KLQkJCQljb25zdCBldGNfYmxvY2smIHNlbGVjdG9yX2JpdHMgPSByLmdldF9zZWxlY3Rvcl9jbHVzdGVyX3NlbGVjdG9yX2JpdHMoaSk7Ci0KLQkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJCXsKLQkJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQkJewotCQkJCQkJc1t5ICogNCArIHhdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2VsZWN0b3JfYml0cy5nZXRfc2VsZWN0b3IoeCwgeSkpOwotCQkJCQl9CisJCQkJCXNbeSAqIDQgKyB4XSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNlbGVjdG9yX2JpdHMuZ2V0X3NlbGVjdG9yKHgsIHkpKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM4OCw2ICszMzcsOCBAQAogCQlpZiAoIWlzX3ZpZGVvKQogCQkJcmV0dXJuOwogCisJCWRlYnVnX3ByaW50ZigiYmFzaXN1X2JhY2tlbmQ6OmNoZWNrX2Zvcl92YWxpZF9jcl9ibG9ja3NcbiIpOworCiAJCXVpbnQzMl90IHRvdGFsX2NycyA9IDA7CiAJCXVpbnQzMl90IHRvdGFsX2ludmFsaWRfY3JzID0gMDsKIApAQCAtNDU0LDYgKzQwNSwxMSBAQAogCiAJdm9pZCBiYXNpc3VfYmFja2VuZDo6Y3JlYXRlX2VuY29kZXJfYmxvY2tzKCkKIAl7CisJCWRlYnVnX3ByaW50ZigiYmFzaXN1X2JhY2tlbmQ6OmNyZWF0ZV9lbmNvZGVyX2Jsb2Nrc1xuIik7CisKKwkJaW50ZXJ2YWxfdGltZXIgdG07CisJCXRtLnN0YXJ0KCk7CisKIAkJYmFzaXN1X2Zyb250ZW5kJiByID0gKm1fcEZyb250X2VuZDsKIAkJY29uc3QgYm9vbCBpc192aWRlbyA9IHIuZ2V0X3BhcmFtcygpLm1fdGV4X3R5cGUgPT0gYmFzaXN0OjpjQkFTSVNUZXhUeXBlVmlkZW9GcmFtZXM7CiAKQEAgLTU2NSw2ICs1MjEsNyBAQAogCQkJCQkJCXsKIAkJCQkJCQkJaWYgKChpc192aWRlbykgJiYgKGVuZHBvaW50X3ByZWQgPT0gYmFzaXN0OjpDUl9FTkRQT0lOVF9QUkVEX0lOREVYKSkKIAkJCQkJCQkJCWNvbnRpbnVlOworCiAJCQkJCQkJCWludCBwcmVkX2Jsb2NrX3ggPSBibG9ja194ICsgZ19lbmRwb2ludF9wcmVkc1tlbmRwb2ludF9wcmVkXS5tX2R4OwogCQkJCQkJCQlpZiAoKHByZWRfYmxvY2tfeCA8IDApIHx8IChwcmVkX2Jsb2NrX3ggPj0gKGludCludW1fYmxvY2tzX3gpKQogCQkJCQkJCQkJY29udGludWU7CkBAIC01ODYsMTEgKzU0MywyMyBAQAogCQkJCQkJCQl1bnBhY2tfZXRjMSh0cmlhbF9ldGNfYmxvY2ssIHRyaWFsX2NvbG9ycyk7CiAKIAkJCQkJCQkJdWludDY0X3QgdHJpYWxfZXJyID0gMDsKLQkJCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IDE2OyBwKyspCisJCQkJCQkJCWlmIChyLmdldF9wYXJhbXMoKS5tX3BlcmNlcHR1YWwpCiAJCQkJCQkJCXsKLQkJCQkJCQkJCXRyaWFsX2VyciArPSBjb2xvcl9kaXN0YW5jZShyLmdldF9wYXJhbXMoKS5tX3BlcmNlcHR1YWwsIHNyY19waXhlbHMuZ2V0X3B0cigpW3BdLCB0cmlhbF9jb2xvcnNbcF0sIGZhbHNlKTsKLQkJCQkJCQkJCWlmICh0cmlhbF9lcnIgPiB0aHJlc2hfZXJyKQotCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IDE2OyBwKyspCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJdHJpYWxfZXJyICs9IGNvbG9yX2Rpc3RhbmNlKHRydWUsIHNyY19waXhlbHMuZ2V0X3B0cigpW3BdLCB0cmlhbF9jb2xvcnNbcF0sIGZhbHNlKTsKKwkJCQkJCQkJCQlpZiAodHJpYWxfZXJyID4gdGhyZXNoX2VycikKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgMTY7IHArKykKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQl0cmlhbF9lcnIgKz0gY29sb3JfZGlzdGFuY2UoZmFsc2UsIHNyY19waXhlbHMuZ2V0X3B0cigpW3BdLCB0cmlhbF9jb2xvcnNbcF0sIGZhbHNlKTsKKwkJCQkJCQkJCQlpZiAodHJpYWxfZXJyID4gdGhyZXNoX2VycikKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAogCQkJCQkJCQlpZiAodHJpYWxfZXJyIDw9IHRocmVzaF9lcnIpCkBAIC02NDMsNiArNjEyLDggQEAKIAogCQlzb3J0X3NlbGVjdG9yX2NvZGVib29rKCk7CiAJCWNoZWNrX2Zvcl92YWxpZF9jcl9ibG9ja3MoKTsKKwkJCisJCWRlYnVnX3ByaW50ZigiRWxhcHNlZCB0aW1lOiAlMy4zZiBzZWNzXG4iLCB0bS5nZXRfZWxhcHNlZF9zZWNzKCkpOwogCX0KIAogCXZvaWQgYmFzaXN1X2JhY2tlbmQ6OmNvbXB1dGVfc2xpY2VfY3JjcygpCkBAIC02NzAsNyArNjQxLDkgQEAKIAkJCQkJCWV0Y19ibG9jayYgb3V0cHV0X2Jsb2NrID0gKihldGNfYmxvY2sqKWdpLmdldF9ibG9ja19wdHIoYmxvY2tfeCwgYmxvY2tfeSk7CiAKIAkJCQkJCW91dHB1dF9ibG9jay5zZXRfZGlmZl9iaXQodHJ1ZSk7Ci0JCQkJCQlvdXRwdXRfYmxvY2suc2V0X2ZsaXBfYml0KHRydWUpOworCQkJCQkJLy8gU2V0dGluZyB0aGUgZmxpcCBiaXQgdG8gZmFsc2UgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBLaHJvbm9zIEtERlMuCisJCQkJCQkvL291dHB1dF9ibG9jay5zZXRfZmxpcF9iaXQodHJ1ZSk7CisJCQkJCQlvdXRwdXRfYmxvY2suc2V0X2ZsaXBfYml0KGZhbHNlKTsKIAogCQkJCQkJY29uc3QgdWludDMyX3QgZW5kcG9pbnRfaW5kZXggPSBtLm1fZW5kcG9pbnRfaW5kZXg7CiAKQEAgLTY3OSw3ICs2NTIsNyBAQAogCiAJCQkJCQljb25zdCB1aW50MzJfdCBzZWxlY3Rvcl9pZHggPSBtLm1fc2VsZWN0b3JfaW5kZXg7CiAKLQkJCQkJCWNvbnN0IGJhc2lzdDo6ZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5JiBzZWxlY3RvcnMgPSBtX3NlbGVjdG9yX3BhbGV0dGVbc2VsZWN0b3JfaWR4XTsKKwkJCQkJCWNvbnN0IGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSYgc2VsZWN0b3JzID0gbV9zZWxlY3Rvcl9wYWxldHRlW3NlbGVjdG9yX2lkeF07CiAJCQkJCQlmb3IgKHVpbnQzMl90IHN5ID0gMDsgc3kgPCA0OyBzeSsrKQogCQkJCQkJCWZvciAodWludDMyX3Qgc3ggPSAwOyBzeCA8IDQ7IHN4KyspCiAJCQkJCQkJCW91dHB1dF9ibG9jay5zZXRfc2VsZWN0b3Ioc3gsIHN5LCBzZWxlY3RvcnMoc3gsIHN5KSk7CkBAIC03MDcsNiArNjgwLDkgQEAKIAkJfSAvLyBzbGljZV9pbmRleAogCX0KIAorCS8vdWludDMyX3QgZ19jb2xvcl9kZWx0YV9oaXN0WzI1NSAqIDMgKyAxXTsKKwkvL3VpbnQzMl90IGdfY29sb3JfZGVsdGFfYmFkX2hpc3RbMjU1ICogMyArIDFdOworCQkKIAkvLyBUT0RPOiBTcGxpdCB0aGlzIGludG8gbXVsdGlwbGUgbWV0aG9kcy4KIAlib29sIGJhc2lzdV9iYWNrZW5kOjplbmNvZGVfaW1hZ2UoKQogCXsKQEAgLTczNyw2ICs3MTMsMTIgQEAKIAogCQl1aW50X3ZlYyBibG9ja19lbmRwb2ludF9pbmRpY2VzLCBibG9ja19zZWxlY3Rvcl9pbmRpY2VzOwogCisJCWludGVydmFsX3RpbWVyIHRtOworCQl0bS5zdGFydCgpOworCisJCWNvbnN0IGludCBDT0xPUl9ERUxUQV9USFJFU0ggPSA4OworCQljb25zdCBpbnQgU0VMX0RJRkZfVEhSRVNIT0xEID0gMTE7CisJCQogCQlmb3IgKHVpbnQzMl90IHNsaWNlX2luZGV4ID0gMDsgc2xpY2VfaW5kZXggPCBtX3NsaWNlcy5zaXplKCk7IHNsaWNlX2luZGV4KyspCiAJCXsKIAkJCS8vY29uc3QgaW50IHByZXZfZnJhbWVfc2xpY2VfaW5kZXggPSBpc192aWRlbyA/IGZpbmRfdmlkZW9fZnJhbWUoc2xpY2VfaW5kZXgsIC0xKSA6IC0xOwpAQCAtNzgyLDcgKzc2NCw3IEBACiAKIAkJCQl9ICAvLyBibG9ja194CiAJCQl9IC8vIGJsb2NrX3kKLQorCQkJCQkJCiAJCQlmb3IgKHVpbnQzMl90IGJsb2NrX3kgPSAwOyBibG9ja195IDwgbnVtX2Jsb2Nrc195OyBibG9ja195KyspCiAJCQl7CiAJCQkJZm9yICh1aW50MzJfdCBibG9ja194ID0gMDsgYmxvY2tfeCA8IG51bV9ibG9ja3NfeDsgYmxvY2tfeCsrKQpAQCAtODU3LDY4ICs4MzksMTcwIEBACiAJCQkJCQkJZXRjX2Jsb2NrIGV0Y19ibGsoci5nZXRfb3V0cHV0X2Jsb2NrKGJsb2NrX2luZGV4KSk7CiAKIAkJCQkJCQljb25zdCB1aW50NjRfdCBjdXJfZXJyID0gZXRjX2Jsay5ldmFsdWF0ZV9ldGMxX2Vycm9yKHNyY19waXhlbHMuZ2V0X3B0cigpLCByLmdldF9wYXJhbXMoKS5tX3BlcmNlcHR1YWwpOworCQkJCQkJCWNvbnN0IHVpbnQzMl90IGN1cl9pbnRlbjUgPSBldGNfYmxrLmdldF9pbnRlbl90YWJsZSgwKTsKIAorCQkJCQkJCWNvbnN0IGV0YzFfZW5kcG9pbnRfcGFsZXR0ZV9lbnRyeSYgY3VyX2VuZHBvaW50cyA9IG1fZW5kcG9pbnRfcGFsZXR0ZVttLm1fZW5kcG9pbnRfaW5kZXhdOworCQkJCQkJCQkJCQkJCQkKIAkJCQkJCQlpZiAoY3VyX2VycikKIAkJCQkJCQl7CiAJCQkJCQkJCWNvbnN0IGZsb2F0IGVuZHBvaW50X3JlbWFwX3RocmVzaCA9IG1heGltdW0oMS4wZiwgbV9wYXJhbXMubV9lbmRwb2ludF9yZG9fcXVhbGl0eV90aHJlc2gpOwogCQkJCQkJCQljb25zdCB1aW50NjRfdCB0aHJlc2hfZXJyID0gKHVpbnQ2NF90KShjdXJfZXJyICogZW5kcG9pbnRfcmVtYXBfdGhyZXNoKTsKIAotCQkJCQkJCQl1aW50NjRfdCBiZXN0X3RyaWFsX2VyciA9IFVJTlQ2NF9NQVg7Ci0JCQkJCQkJCWludCBiZXN0X3RyaWFsX2lkeCA9IDA7CisJCQkJCQkJCS8vY29uc3QgaW50IE1BWF9FTkRQT0lOVF9TRUFSQ0hfRElTVCA9IChtX3BhcmFtcy5tX2NvbXByZXNzaW9uX2xldmVsID49IDIpID8gNjQgOiAzMjsKKwkJCQkJCQkJY29uc3QgaW50IE1BWF9FTkRQT0lOVF9TRUFSQ0hfRElTVCA9IChtX3BhcmFtcy5tX2NvbXByZXNzaW9uX2xldmVsID49IDIpID8gNjQgOiAxNjsKIAotCQkJCQkJCQlldGNfYmxvY2sgdHJpYWxfZXRjX2JsayhldGNfYmxrKTsKLQotCQkJCQkJCQljb25zdCBpbnQgTUFYX0VORFBPSU5UX1NFQVJDSF9ESVNUID0gMzI7Ci0JCQkJCQkJCWNvbnN0IGludCBzZWFyY2hfZGlzdCA9IG1pbmltdW08aW50PihpYWJzKGVuZHBvaW50X2RlbHRhKSAtIDEsIE1BWF9FTkRQT0lOVF9TRUFSQ0hfRElTVCk7Ci0JCQkJCQkJCWZvciAoaW50IGQgPSAtc2VhcmNoX2Rpc3Q7IGQgPCBzZWFyY2hfZGlzdDsgZCsrKQorCQkJCQkJCQlpZiAoIWdfY3B1X3N1cHBvcnRzX3NzZTQxKQogCQkJCQkJCQl7Ci0JCQkJCQkJCQlpbnQgdHJpYWxfaWR4ID0gcHJldl9lbmRwb2ludF9pbmRleCArIGQ7Ci0JCQkJCQkJCQlpZiAodHJpYWxfaWR4IDwgMCkKLQkJCQkJCQkJCQl0cmlhbF9pZHggKz0gKGludClyLmdldF90b3RhbF9lbmRwb2ludF9jbHVzdGVycygpOwotCQkJCQkJCQkJZWxzZSBpZiAodHJpYWxfaWR4ID49IChpbnQpci5nZXRfdG90YWxfZW5kcG9pbnRfY2x1c3RlcnMoKSkKLQkJCQkJCQkJCQl0cmlhbF9pZHggLT0gKGludClyLmdldF90b3RhbF9lbmRwb2ludF9jbHVzdGVycygpOworCQkJCQkJCQkJY29uc3QgdWludDY0X3QgaW5pdGlhbF9iZXN0X3RyaWFsX2VyciA9IFVJTlQ2NF9NQVg7CisJCQkJCQkJCQl1aW50NjRfdCBiZXN0X3RyaWFsX2VyciA9IGluaXRpYWxfYmVzdF90cmlhbF9lcnI7CisJCQkJCQkJCQlpbnQgYmVzdF90cmlhbF9pZHggPSAwOwogCi0JCQkJCQkJCQlpZiAodHJpYWxfaWR4ID09IG5ld19lbmRwb2ludF9pbmRleCkKLQkJCQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJCQkJLy8gU2tpcCBpdCBpZiB0aGlzIG5ldyBlbmRwb2ludCBwYWxldHRlIGVudHJ5IGlzIGFjdHVhbGx5IG5ldmVyIHVzZWQuCi0JCQkJCQkJCQlpZiAoIW1fbmV3X2VuZHBvaW50X3dhc191c2VkW3RyaWFsX2lkeF0pCi0JCQkJCQkJCQkJY29udGludWU7Ci0KLQkJCQkJCQkJCWNvbnN0IGV0YzFfZW5kcG9pbnRfcGFsZXR0ZV9lbnRyeSYgcCA9IG1fZW5kcG9pbnRfcGFsZXR0ZVttX2VuZHBvaW50X3JlbWFwX3RhYmxlX25ld190b19vbGRbdHJpYWxfaWR4XV07Ci0JCQkJCQkJCQl0cmlhbF9ldGNfYmxrLnNldF9ibG9ja19jb2xvcjVfZXRjMXMocC5tX2NvbG9yNSk7Ci0JCQkJCQkJCQl0cmlhbF9ldGNfYmxrLnNldF9pbnRlbl90YWJsZXNfZXRjMXMocC5tX2ludGVuNSk7Ci0KLQkJCQkJCQkJCXVpbnQ2NF90IHRyaWFsX2VyciA9IHRyaWFsX2V0Y19ibGsuZXZhbHVhdGVfZXRjMV9lcnJvcihzcmNfcGl4ZWxzLmdldF9wdHIoKSwgci5nZXRfcGFyYW1zKCkubV9wZXJjZXB0dWFsKTsKLQotCQkJCQkJCQkJaWYgKHRyaWFsX2VyciA8PSB0aHJlc2hfZXJyKQorCQkJCQkJCQkJZXRjX2Jsb2NrIHRyaWFsX2V0Y19ibGsoZXRjX2Jsayk7CisJCQkJCQkJCQkJCQkJCQkJCQkKKwkJCQkJCQkJCWNvbnN0IGludCBzZWFyY2hfZGlzdCA9IG1pbmltdW08aW50PihpYWJzKGVuZHBvaW50X2RlbHRhKSAtIDEsIE1BWF9FTkRQT0lOVF9TRUFSQ0hfRElTVCk7CisJCQkJCQkJCQlmb3IgKGludCBkID0gLXNlYXJjaF9kaXN0OyBkIDwgc2VhcmNoX2Rpc3Q7IGQrKykKIAkJCQkJCQkJCXsKLQkJCQkJCQkJCQlpZiAodHJpYWxfZXJyIDwgYmVzdF90cmlhbF9lcnIpCisJCQkJCQkJCQkJaW50IHRyaWFsX2lkeCA9IHByZXZfZW5kcG9pbnRfaW5kZXggKyBkOworCQkJCQkJCQkJCWlmICh0cmlhbF9pZHggPCAwKQorCQkJCQkJCQkJCQl0cmlhbF9pZHggKz0gKGludClyLmdldF90b3RhbF9lbmRwb2ludF9jbHVzdGVycygpOworCQkJCQkJCQkJCWVsc2UgaWYgKHRyaWFsX2lkeCA+PSAoaW50KXIuZ2V0X3RvdGFsX2VuZHBvaW50X2NsdXN0ZXJzKCkpCisJCQkJCQkJCQkJCXRyaWFsX2lkeCAtPSAoaW50KXIuZ2V0X3RvdGFsX2VuZHBvaW50X2NsdXN0ZXJzKCk7CisKKwkJCQkJCQkJCQlpZiAodHJpYWxfaWR4ID09IG5ld19lbmRwb2ludF9pbmRleCkKKwkJCQkJCQkJCQkJY29udGludWU7CisKKwkJCQkJCQkJCQkvLyBTa2lwIGl0IGlmIHRoaXMgbmV3IGVuZHBvaW50IHBhbGV0dGUgZW50cnkgaXMgYWN0dWFsbHkgbmV2ZXIgdXNlZC4KKwkJCQkJCQkJCQlpZiAoIW1fbmV3X2VuZHBvaW50X3dhc191c2VkW3RyaWFsX2lkeF0pCisJCQkJCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQkJCQkJY29uc3QgZXRjMV9lbmRwb2ludF9wYWxldHRlX2VudHJ5JiBwID0gbV9lbmRwb2ludF9wYWxldHRlW21fZW5kcG9pbnRfcmVtYXBfdGFibGVfbmV3X3RvX29sZFt0cmlhbF9pZHhdXTsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJaWYgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPD0gMSkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWlmIChwLm1faW50ZW41ID4gY3VyX2ludGVuNSkKKwkJCQkJCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQkJCQkJCWludCBkZWx0YV9yID0gaWFicyhjdXJfZW5kcG9pbnRzLm1fY29sb3I1LnIgLSBwLm1fY29sb3I1LnIpOworCQkJCQkJCQkJCQlpbnQgZGVsdGFfZyA9IGlhYnMoY3VyX2VuZHBvaW50cy5tX2NvbG9yNS5nIC0gcC5tX2NvbG9yNS5nKTsKKwkJCQkJCQkJCQkJaW50IGRlbHRhX2IgPSBpYWJzKGN1cl9lbmRwb2ludHMubV9jb2xvcjUuYiAtIHAubV9jb2xvcjUuYik7CisJCQkJCQkJCQkJCWludCBjb2xvcl9kZWx0YSA9IGRlbHRhX3IgKyBkZWx0YV9nICsgZGVsdGFfYjsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJaWYgKGNvbG9yX2RlbHRhID4gQ09MT1JfREVMVEFfVEhSRVNIKQorCQkJCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCQkJfQorCisJCQkJCQkJCQkJdHJpYWxfZXRjX2Jsay5zZXRfYmxvY2tfY29sb3I1X2V0YzFzKHAubV9jb2xvcjUpOworCQkJCQkJCQkJCXRyaWFsX2V0Y19ibGsuc2V0X2ludGVuX3RhYmxlc19ldGMxcyhwLm1faW50ZW41KTsKKworCQkJCQkJCQkJCXVpbnQ2NF90IHRyaWFsX2VyciA9IHRyaWFsX2V0Y19ibGsuZXZhbHVhdGVfZXRjMV9lcnJvcihzcmNfcGl4ZWxzLmdldF9wdHIoKSwgci5nZXRfcGFyYW1zKCkubV9wZXJjZXB0dWFsKTsKKworCQkJCQkJCQkJCWlmICgodHJpYWxfZXJyIDwgYmVzdF90cmlhbF9lcnIpICYmICh0cmlhbF9lcnIgPD0gdGhyZXNoX2VycikpCiAJCQkJCQkJCQkJewogCQkJCQkJCQkJCQliZXN0X3RyaWFsX2VyciA9IHRyaWFsX2VycjsKIAkJCQkJCQkJCQkJYmVzdF90cmlhbF9pZHggPSB0cmlhbF9pZHg7CiAJCQkJCQkJCQkJfQogCQkJCQkJCQkJfQotCQkJCQkJCQl9CiAKLQkJCQkJCQkJaWYgKGJlc3RfdHJpYWxfZXJyICE9IFVJTlQ2NF9NQVgpCisJCQkJCQkJCQlpZiAoYmVzdF90cmlhbF9lcnIgIT0gaW5pdGlhbF9iZXN0X3RyaWFsX2VycikKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQltLm1fZW5kcG9pbnRfaW5kZXggPSBtX2VuZHBvaW50X3JlbWFwX3RhYmxlX25ld190b19vbGRbYmVzdF90cmlhbF9pZHhdOworCisJCQkJCQkJCQkJbmV3X2VuZHBvaW50X2luZGV4ID0gYmVzdF90cmlhbF9pZHg7CisKKwkJCQkJCQkJCQllbmRwb2ludF9kZWx0YSA9IG5ld19lbmRwb2ludF9pbmRleCAtIHByZXZfZW5kcG9pbnRfaW5kZXg7CisKKwkJCQkJCQkJCQl0b3RhbF9lbmRwb2ludF9pbmRpY2VzX3JlbWFwcGVkKys7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQogCQkJCQkJCQl7Ci0JCQkJCQkJCQltLm1fZW5kcG9pbnRfaW5kZXggPSBtX2VuZHBvaW50X3JlbWFwX3RhYmxlX25ld190b19vbGRbYmVzdF90cmlhbF9pZHhdOworI2lmIEJBU0lTVV9TVVBQT1JUX1NTRQorCQkJCQkJCQkJdWludDhfdCBibG9ja19zZWxlY3RvcnNbMTZdOworCQkJCQkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspCisJCQkJCQkJCQkJYmxvY2tfc2VsZWN0b3JzW2ldID0gKHVpbnQ4X3QpZXRjX2Jsay5nZXRfc2VsZWN0b3IoaSAmIDMsIGkgPj4gMik7CiAKLQkJCQkJCQkJCW5ld19lbmRwb2ludF9pbmRleCA9IGJlc3RfdHJpYWxfaWR4OworCQkJCQkJCQkJY29uc3QgaW50NjRfdCBpbml0aWFsX2Jlc3RfdHJpYWxfZXJyID0gSU5UNjRfTUFYOworCQkJCQkJCQkJaW50NjRfdCBiZXN0X3RyaWFsX2VyciA9IGluaXRpYWxfYmVzdF90cmlhbF9lcnI7CisJCQkJCQkJCQlpbnQgYmVzdF90cmlhbF9pZHggPSAwOworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCisJCQkJCQkJCQljb25zdCBpbnQgc2VhcmNoX2Rpc3QgPSBtaW5pbXVtPGludD4oaWFicyhlbmRwb2ludF9kZWx0YSkgLSAxLCBNQVhfRU5EUE9JTlRfU0VBUkNIX0RJU1QpOworCQkJCQkJCQkJZm9yIChpbnQgZCA9IC1zZWFyY2hfZGlzdDsgZCA8IHNlYXJjaF9kaXN0OyBkKyspCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJaW50IHRyaWFsX2lkeCA9IHByZXZfZW5kcG9pbnRfaW5kZXggKyBkOworCQkJCQkJCQkJCWlmICh0cmlhbF9pZHggPCAwKQorCQkJCQkJCQkJCQl0cmlhbF9pZHggKz0gKGludClyLmdldF90b3RhbF9lbmRwb2ludF9jbHVzdGVycygpOworCQkJCQkJCQkJCWVsc2UgaWYgKHRyaWFsX2lkeCA+PSAoaW50KXIuZ2V0X3RvdGFsX2VuZHBvaW50X2NsdXN0ZXJzKCkpCisJCQkJCQkJCQkJCXRyaWFsX2lkeCAtPSAoaW50KXIuZ2V0X3RvdGFsX2VuZHBvaW50X2NsdXN0ZXJzKCk7CiAKLQkJCQkJCQkJCWVuZHBvaW50X2RlbHRhID0gbmV3X2VuZHBvaW50X2luZGV4IC0gcHJldl9lbmRwb2ludF9pbmRleDsKKwkJCQkJCQkJCQlpZiAodHJpYWxfaWR4ID09IG5ld19lbmRwb2ludF9pbmRleCkKKwkJCQkJCQkJCQkJY29udGludWU7CiAKLQkJCQkJCQkJCXRvdGFsX2VuZHBvaW50X2luZGljZXNfcmVtYXBwZWQrKzsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KKwkJCQkJCQkJCQkvLyBTa2lwIGl0IGlmIHRoaXMgbmV3IGVuZHBvaW50IHBhbGV0dGUgZW50cnkgaXMgYWN0dWFsbHkgbmV2ZXIgdXNlZC4KKwkJCQkJCQkJCQlpZiAoIW1fbmV3X2VuZHBvaW50X3dhc191c2VkW3RyaWFsX2lkeF0pCisJCQkJCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQkJCQkJY29uc3QgZXRjMV9lbmRwb2ludF9wYWxldHRlX2VudHJ5JiBwID0gbV9lbmRwb2ludF9wYWxldHRlW21fZW5kcG9pbnRfcmVtYXBfdGFibGVfbmV3X3RvX29sZFt0cmlhbF9pZHhdXTsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJaWYgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPD0gMSkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWlmIChwLm1faW50ZW41ID4gY3VyX2ludGVuNSkKKwkJCQkJCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQkJCQkJCWludCBkZWx0YV9yID0gaWFicyhjdXJfZW5kcG9pbnRzLm1fY29sb3I1LnIgLSBwLm1fY29sb3I1LnIpOworCQkJCQkJCQkJCQlpbnQgZGVsdGFfZyA9IGlhYnMoY3VyX2VuZHBvaW50cy5tX2NvbG9yNS5nIC0gcC5tX2NvbG9yNS5nKTsKKwkJCQkJCQkJCQkJaW50IGRlbHRhX2IgPSBpYWJzKGN1cl9lbmRwb2ludHMubV9jb2xvcjUuYiAtIHAubV9jb2xvcjUuYik7CisJCQkJCQkJCQkJCWludCBjb2xvcl9kZWx0YSA9IGRlbHRhX3IgKyBkZWx0YV9nICsgZGVsdGFfYjsKKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCWlmIChjb2xvcl9kZWx0YSA+IENPTE9SX0RFTFRBX1RIUkVTSCkKKwkJCQkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQkJCX0KKworCQkJCQkJCQkJCWNvbG9yX3JnYmEgYmxvY2tfY29sb3JzWzRdOworCQkJCQkJCQkJCWV0Y19ibG9jazo6Z2V0X2Jsb2NrX2NvbG9yc19ldGMxcyhibG9ja19jb2xvcnMsIHAubV9jb2xvcjUsIHAubV9pbnRlbjUpOworCisJCQkJCQkJCQkJaW50NjRfdCB0cmlhbF9lcnI7CisJCQkJCQkJCQkJaWYgKHIuZ2V0X3BhcmFtcygpLm1fcGVyY2VwdHVhbCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCXBlcmNlcHR1YWxfZGlzdGFuY2VfcmdiXzRfTl9zc2U0MSgmdHJpYWxfZXJyLCBibG9ja19zZWxlY3RvcnMsIGJsb2NrX2NvbG9ycywgc3JjX3BpeGVscy5nZXRfcHRyKCksIDE2LCBiZXN0X3RyaWFsX2Vycik7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWxpbmVhcl9kaXN0YW5jZV9yZ2JfNF9OX3NzZTQxKCZ0cmlhbF9lcnIsIGJsb2NrX3NlbGVjdG9ycywgYmxvY2tfY29sb3JzLCBzcmNfcGl4ZWxzLmdldF9wdHIoKSwgMTYsIGJlc3RfdHJpYWxfZXJyKTsKKwkJCQkJCQkJCQl9CisKKwkJCQkJCQkJCQkvL2lmICh0cmlhbF9lcnIgPiB0aHJlc2hfZXJyKQorCQkJCQkJCQkJCS8vCWdfY29sb3JfZGVsdGFfYmFkX2hpc3RbY29sb3JfZGVsdGFdKys7CisKKwkJCQkJCQkJCQlpZiAoKHRyaWFsX2VyciA8IGJlc3RfdHJpYWxfZXJyKSAmJiAodHJpYWxfZXJyIDw9IChpbnQ2NF90KXRocmVzaF9lcnIpKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJYmVzdF90cmlhbF9lcnIgPSB0cmlhbF9lcnI7CisJCQkJCQkJCQkJCWJlc3RfdHJpYWxfaWR4ID0gdHJpYWxfaWR4OworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJaWYgKGJlc3RfdHJpYWxfZXJyICE9IGluaXRpYWxfYmVzdF90cmlhbF9lcnIpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJbS5tX2VuZHBvaW50X2luZGV4ID0gbV9lbmRwb2ludF9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW2Jlc3RfdHJpYWxfaWR4XTsKKworCQkJCQkJCQkJCW5ld19lbmRwb2ludF9pbmRleCA9IGJlc3RfdHJpYWxfaWR4OworCisJCQkJCQkJCQkJZW5kcG9pbnRfZGVsdGEgPSBuZXdfZW5kcG9pbnRfaW5kZXggLSBwcmV2X2VuZHBvaW50X2luZGV4OworCisJCQkJCQkJCQkJdG90YWxfZW5kcG9pbnRfaW5kaWNlc19yZW1hcHBlZCsrOworCQkJCQkJCQkJfQorI2VuZGlmIC8vIEJBU0lTVV9TVVBQT1JUX1NTRQorCQkJCQkJCQl9IC8vIGlmICghZ19jcHVfc3VwcG9ydHNfc3NlNDEpCisJCQkJCQkJCQkJCQkJCQkKKwkJCQkJCQl9IC8vIGlmIChjdXJfZXJyKQorCisJCQkJCQl9IC8vIGlmICgobV9wYXJhbXMubV9lbmRwb2ludF9yZG9fcXVhbGl0eV90aHJlc2ggPiAxLjBmKSAmJiAoaWFicyhlbmRwb2ludF9kZWx0YSkgPiAxKSAmJiAoIWJsb2NrX2VuZHBvaW50c19hcmVfcmVmZXJlbmNlZChibG9ja194LCBibG9ja195KSkpCiAKIAkJCQkJCWlmIChlbmRwb2ludF9kZWx0YSA8IDApCiAJCQkJCQkJZW5kcG9pbnRfZGVsdGEgKz0gKGludClyLmdldF90b3RhbF9lbmRwb2ludF9jbHVzdGVycygpOwogCiAJCQkJCQlkZWx0YV9lbmRwb2ludF9oaXN0b2dyYW0uaW5jKGVuZHBvaW50X2RlbHRhKTsKLQkJCQkJfQorCisJCQkJCX0gLy8gaWYgKG0ubV9lbmRwb2ludF9wcmVkaWN0b3IgPT0gYmFzaXN0OjpOT19FTkRQT0lOVF9QUkVEX0lOREVYKQogCiAJCQkJCWJsb2NrX2VuZHBvaW50X2luZGljZXMucHVzaF9iYWNrKG1fZW5kcG9pbnRfcmVtYXBfdGFibGVfbmV3X3RvX29sZFtuZXdfZW5kcG9pbnRfaW5kZXhdKTsKIApAQCAtOTI3LDEwICsxMDExLDEzIEBACiAJCQkJCWlmICgoIWlzX3ZpZGVvKSB8fCAobS5tX2VuZHBvaW50X3ByZWRpY3RvciAhPSBiYXNpc3Q6OkNSX0VORFBPSU5UX1BSRURfSU5ERVgpKQogCQkJCQl7CiAJCQkJCQlpbnQgbmV3X3NlbGVjdG9yX2luZGV4ID0gbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9vbGRfdG9fbmV3W20ubV9zZWxlY3Rvcl9pbmRleF07CisJCQkJCQkJCQkJCQkKKwkJCQkJCWNvbnN0IGZsb2F0IHNlbGVjdG9yX3JlbWFwX3RocmVzaCA9IG1heGltdW0oMS4wZiwgbV9wYXJhbXMubV9zZWxlY3Rvcl9yZG9fcXVhbGl0eV90aHJlc2gpOyAvLzIuNWY7CiAKIAkJCQkJCWludCBzZWxlY3Rvcl9oaXN0b3J5X2J1Zl9pbmRleCA9IC0xOwogCi0JCQkJCQlpZiAobS5tX2lzX2NyX3RhcmdldCkKKwkJCQkJCS8vIEF0IGxvdyBjb21wIGxldmVscyB0aGlzIGh1cnRzIGNvbXByZXNzaW9uIGEgdGlueSBhbW91bnQsIGJ1dCBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBzbyBpdCdzIGEgZ29vZCB0cmFkZW9mZi4KKwkJCQkJCWlmICgobS5tX2lzX2NyX3RhcmdldCkgfHwgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPD0gMSkpCiAJCQkJCQl7CiAJCQkJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHNlbGVjdG9yX2hpc3RvcnlfYnVmLnNpemUoKTsgaisrKQogCQkJCQkJCXsKQEAgLTk0NCw4OSArMTAzMSw5OSBAQAogCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJZWxzZQorCisJCQkJCQkvLyBJZiB0aGUgYmxvY2sgaXMgYSBDUiB0YXJnZXQgd2UgY2FuJ3Qgb3ZlcnJpZGUgaXRzIHNlbGVjdG9ycy4KKwkJCQkJCWlmICgoIW0ubV9pc19jcl90YXJnZXQpICYmIChzZWxlY3Rvcl9oaXN0b3J5X2J1Zl9pbmRleCA9PSAtMSkpCiAJCQkJCQl7CiAJCQkJCQkJY29uc3QgcGl4ZWxfYmxvY2smIHNyY19waXhlbHMgPSByLmdldF9zb3VyY2VfcGl4ZWxfYmxvY2soYmxvY2tfaW5kZXgpOwogCi0JCQkJCQkJY29uc3QgZXRjX2Jsb2NrJiBldGNfYmxrID0gci5nZXRfb3V0cHV0X2Jsb2NrKGJsb2NrX2luZGV4KTsKKwkJCQkJCQlldGNfYmxvY2sgZXRjX2JsayA9IHIuZ2V0X291dHB1dF9ibG9jayhibG9ja19pbmRleCk7CiAKLQkJCQkJCQljb2xvcl9yZ2JhIGV0Y19ibGtfdW5wYWNrZWRbMTZdOwotCQkJCQkJCXVucGFja19ldGMxKGV0Y19ibGssIGV0Y19ibGtfdW5wYWNrZWQpOworCQkJCQkJCS8vIFRoaXMgaXMgbmV3IGNvZGUgLSB0aGUgaW5pdGlhbCByZWxlYXNlIGp1c3QgdXNlZCB0aGUgZW5kcG9pbnRzIGZyb20gdGhlIGZyb250ZW5kLCB3aGljaCBpc24ndCBjb3JyZWN0L2FjY3VyYXRlLgorCQkJCQkJCWNvbnN0IGV0YzFfZW5kcG9pbnRfcGFsZXR0ZV9lbnRyeSYgcSA9IG1fZW5kcG9pbnRfcGFsZXR0ZVttX2VuZHBvaW50X3JlbWFwX3RhYmxlX25ld190b19vbGRbbmV3X2VuZHBvaW50X2luZGV4XV07CisJCQkJCQkJZXRjX2Jsay5zZXRfYmxvY2tfY29sb3I1X2V0YzFzKHEubV9jb2xvcjUpOworCQkJCQkJCWV0Y19ibGsuc2V0X2ludGVuX3RhYmxlc19ldGMxcyhxLm1faW50ZW41KTsKKworCQkJCQkJCWNvbG9yX3JnYmEgYmxvY2tfY29sb3JzWzRdOworCQkJCQkJCWV0Y19ibGsuZ2V0X2Jsb2NrX2NvbG9ycyhibG9ja19jb2xvcnMsIDApOworCisJCQkJCQkJY29uc3QgdWludDhfdCogcEN1cl9zZWxlY3RvcnMgPSAmbV9zZWxlY3Rvcl9wYWxldHRlW20ubV9zZWxlY3Rvcl9pbmRleF1bMF07CiAKIAkJCQkJCQl1aW50NjRfdCBjdXJfZXJyID0gMDsKIAkJCQkJCQlpZiAoci5nZXRfcGFyYW1zKCkubV9wZXJjZXB0dWFsKQogCQkJCQkJCXsKIAkJCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IDE2OyBwKyspCi0JCQkJCQkJCQljdXJfZXJyICs9IGNvbG9yX2Rpc3RhbmNlKHRydWUsIHNyY19waXhlbHMuZ2V0X3B0cigpW3BdLCBldGNfYmxrX3VucGFja2VkW3BdLCBmYWxzZSk7CisJCQkJCQkJCQljdXJfZXJyICs9IGNvbG9yX2Rpc3RhbmNlKHRydWUsIHNyY19waXhlbHMuZ2V0X3B0cigpW3BdLCBibG9ja19jb2xvcnNbcEN1cl9zZWxlY3RvcnNbcF1dLCBmYWxzZSk7CiAJCQkJCQkJfQogCQkJCQkJCWVsc2UKIAkJCQkJCQl7CiAJCQkJCQkJCWZvciAodWludDMyX3QgcCA9IDA7IHAgPCAxNjsgcCsrKQotCQkJCQkJCQkJY3VyX2VyciArPSBjb2xvcl9kaXN0YW5jZShmYWxzZSwgc3JjX3BpeGVscy5nZXRfcHRyKClbcF0sIGV0Y19ibGtfdW5wYWNrZWRbcF0sIGZhbHNlKTsKKwkJCQkJCQkJCWN1cl9lcnIgKz0gY29sb3JfZGlzdGFuY2UoZmFsc2UsIHNyY19waXhlbHMuZ2V0X3B0cigpW3BdLCBibG9ja19jb2xvcnNbcEN1cl9zZWxlY3RvcnNbcF1dLCBmYWxzZSk7CiAJCQkJCQkJfQotCQkJCQkJCQkJCQkJCQkKKwkJCQkJCQkKKwkJCQkJCQljb25zdCB1aW50NjRfdCBsaW1pdF9lcnIgPSAodWludDY0X3QpY2VpbGYoY3VyX2VyciAqIHNlbGVjdG9yX3JlbWFwX3RocmVzaCk7CisKKwkJCQkJCQkvLyBFdmVuIGlmIGN1cl9lcnI9PWxpbWl0X2Vyciwgd2Ugc3RpbGwgd2FudCB0byBzY2FuIHRoZSBoaXN0b3J5IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1heSBiZSBlcXVpdmFsZW50IGVudHJpZXMgdGhhdCBhcmUgY2hlYXBlciB0byBjb2RlLgorCiAJCQkJCQkJdWludDY0X3QgYmVzdF90cmlhbF9lcnIgPSBVSU5UNjRfTUFYOwogCQkJCQkJCWludCBiZXN0X3RyaWFsX2lkeCA9IDA7CiAJCQkJCQkJdWludDMyX3QgYmVzdF90cmlhbF9oaXN0b3J5X2J1Zl9pZHggPSAwOwogCi0JCQkJCQkJY29uc3QgZmxvYXQgc2VsZWN0b3JfcmVtYXBfdGhyZXNoID0gbWF4aW11bSgxLjBmLCBtX3BhcmFtcy5tX3NlbGVjdG9yX3Jkb19xdWFsaXR5X3RocmVzaCk7IC8vMi41ZjsKLQkJCQkJCQljb25zdCBib29sIHVzZV9zdHJpY3Rfc2VhcmNoID0gKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPT0gMCkgJiYgKHNlbGVjdG9yX3JlbWFwX3RocmVzaCA9PSAxLjBmKTsKLQotCQkJCQkJCWNvbnN0IHVpbnQ2NF90IGxpbWl0X2VyciA9ICh1aW50NjRfdCljZWlsZihjdXJfZXJyICogc2VsZWN0b3JfcmVtYXBfdGhyZXNoKTsKLQkJCQkJCQkKIAkJCQkJCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgc2VsZWN0b3JfaGlzdG9yeV9idWYuc2l6ZSgpOyBqKyspCiAJCQkJCQkJewogCQkJCQkJCQljb25zdCBpbnQgdHJpYWxfaWR4ID0gc2VsZWN0b3JfaGlzdG9yeV9idWZbal07CiAKLQkJCQkJCQkJaWYgKHVzZV9zdHJpY3Rfc2VhcmNoKQorCQkJCQkJCQljb25zdCB1aW50OF90KiBwU2VsZWN0b3JzID0gJm1fc2VsZWN0b3JfcGFsZXR0ZVttX3NlbGVjdG9yX3JlbWFwX3RhYmxlX25ld190b19vbGRbdHJpYWxfaWR4XV1bMF07CisKKwkJCQkJCQkJaWYgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPD0gMSkKIAkJCQkJCQkJewotCQkJCQkJCQkJaWYgKHRyaWFsX2lkeCA9PSBuZXdfc2VsZWN0b3JfaW5kZXgpCisJCQkJCQkJCQkvLyBQcmVkaWN0IGlmIGV2YWx1YXRpbmcgdGhlIGZ1bGwgY29sb3IgZXJyb3Igd291bGQgY2F1c2UgYW4gZWFybHkgb3V0LCBieSBzdW1taW5nIHRoZSBhYnMgZXJyIG9mIHRoZSBzZWxlY3RvciBpbmRpY2VzLgorCQkJCQkJCQkJaW50IHNlbF9kaWZmID0gMDsKKwkJCQkJCQkJCWZvciAodWludDMyX3QgcCA9IDA7IHAgPCAxNjsgcCArPSA0KQogCQkJCQkJCQkJewotCQkJCQkJCQkJCWJlc3RfdHJpYWxfZXJyID0gMDsKLQkJCQkJCQkJCQliZXN0X3RyaWFsX2lkeCA9IHRyaWFsX2lkeDsKLQkJCQkJCQkJCQliZXN0X3RyaWFsX2hpc3RvcnlfYnVmX2lkeCA9IGo7Ci0JCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJc2VsX2RpZmYgKz0gaWFicyhwQ3VyX3NlbGVjdG9yc1twICsgMF0gLSBwU2VsZWN0b3JzW3AgKyAwXSk7CisJCQkJCQkJCQkJc2VsX2RpZmYgKz0gaWFicyhwQ3VyX3NlbGVjdG9yc1twICsgMV0gLSBwU2VsZWN0b3JzW3AgKyAxXSk7CisJCQkJCQkJCQkJc2VsX2RpZmYgKz0gaWFicyhwQ3VyX3NlbGVjdG9yc1twICsgMl0gLSBwU2VsZWN0b3JzW3AgKyAyXSk7CisJCQkJCQkJCQkJc2VsX2RpZmYgKz0gaWFicyhwQ3VyX3NlbGVjdG9yc1twICsgM10gLSBwU2VsZWN0b3JzW3AgKyAzXSk7CisJCQkJCQkJCQkJaWYgKHNlbF9kaWZmID49IFNFTF9ESUZGX1RIUkVTSE9MRCkKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZiAoc2VsX2RpZmYgPj0gU0VMX0RJRkZfVEhSRVNIT0xEKQorCQkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQl9CisJCQkJCQkJCQkKKwkJCQkJCQkJY29uc3QgdWludDY0X3QgdGhyZXNoX2VyciA9IG1pbmltdW0obGltaXRfZXJyLCBiZXN0X3RyaWFsX2Vycik7CisJCQkJCQkJCXVpbnQ2NF90IHRyaWFsX2VyciA9IDA7CisKKwkJCQkJCQkJLy8gVGhpcyB0ZW5kcyB0byBlYXJseSBvdXQgcXVpY2tseSwgc28gU1NFIGhhcyBhIGhhcmQgdGltZSBjb21wZXRpbmcuCisJCQkJCQkJCWlmIChyLmdldF9wYXJhbXMoKS5tX3BlcmNlcHR1YWwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWZvciAodWludDMyX3QgcCA9IDA7IHAgPCAxNjsgcCsrKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCXVpbnQzMl90IHNlbCA9IHBTZWxlY3RvcnNbcF07CisJCQkJCQkJCQkJdHJpYWxfZXJyICs9IGNvbG9yX2Rpc3RhbmNlKHRydWUsIHNyY19waXhlbHMuZ2V0X3B0cigpW3BdLCBibG9ja19jb2xvcnNbc2VsXSwgZmFsc2UpOworCQkJCQkJCQkJCWlmICh0cmlhbF9lcnIgPiB0aHJlc2hfZXJyKQorCQkJCQkJCQkJCQlicmVhazsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCQllbHNlCiAJCQkJCQkJCXsKLQkJCQkJCQkJCXVpbnQ2NF90IHRyaWFsX2VyciA9IDA7Ci0JCQkJCQkJCQljb25zdCB1aW50NjRfdCB0aHJlc2hfZXJyID0gbWluaW11bShsaW1pdF9lcnIsIGJlc3RfdHJpYWxfZXJyKTsKLQotCQkJCQkJCQkJY29sb3JfcmdiYSBibG9ja19jb2xvcnNbNF07Ci0JCQkJCQkJCQlldGNfYmxrLmdldF9ibG9ja19jb2xvcnMoYmxvY2tfY29sb3JzLCAwKTsKLQotCQkJCQkJCQkJY29uc3QgdWludDhfdCogcFNlbGVjdG9ycyA9ICZtX3NlbGVjdG9yX3BhbGV0dGVbbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW3RyaWFsX2lkeF1dKDAsIDApOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlpZiAoci5nZXRfcGFyYW1zKCkubV9wZXJjZXB0dWFsKQorCQkJCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IDE2OyBwKyspCiAJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IDE2OyBwKyspCi0JCQkJCQkJCQkJewotCQkJCQkJCQkJCQl1aW50MzJfdCBzZWwgPSBwU2VsZWN0b3JzW3BdOwotCQkJCQkJCQkJCQl0cmlhbF9lcnIgKz0gY29sb3JfZGlzdGFuY2UodHJ1ZSwgc3JjX3BpeGVscy5nZXRfcHRyKClbcF0sIGJsb2NrX2NvbG9yc1tzZWxdLCBmYWxzZSk7Ci0JCQkJCQkJCQkJCWlmICh0cmlhbF9lcnIgPiB0aHJlc2hfZXJyKQotCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJfQorCQkJCQkJCQkJCXVpbnQzMl90IHNlbCA9IHBTZWxlY3RvcnNbcF07CisJCQkJCQkJCQkJdHJpYWxfZXJyICs9IGNvbG9yX2Rpc3RhbmNlKGZhbHNlLCBzcmNfcGl4ZWxzLmdldF9wdHIoKVtwXSwgYmxvY2tfY29sb3JzW3NlbF0sIGZhbHNlKTsKKwkJCQkJCQkJCQlpZiAodHJpYWxfZXJyID4gdGhyZXNoX2VycikKKwkJCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IDE2OyBwKyspCi0JCQkJCQkJCQkJewotCQkJCQkJCQkJCQl1aW50MzJfdCBzZWwgPSBwU2VsZWN0b3JzW3BdOwotCQkJCQkJCQkJCQl0cmlhbF9lcnIgKz0gY29sb3JfZGlzdGFuY2UoZmFsc2UsIHNyY19waXhlbHMuZ2V0X3B0cigpW3BdLCBibG9ja19jb2xvcnNbc2VsXSwgZmFsc2UpOwotCQkJCQkJCQkJCQlpZiAodHJpYWxfZXJyID4gdGhyZXNoX2VycikKLQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KKwkJCQkJCQkJfQogCi0JCQkJCQkJCQlpZiAoKHRyaWFsX2VyciA8IGJlc3RfdHJpYWxfZXJyKSAmJiAodHJpYWxfZXJyIDw9IHRocmVzaF9lcnIpKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCWFzc2VydCh0cmlhbF9lcnIgPD0gbGltaXRfZXJyKTsKLQkJCQkJCQkJCQkKLQkJCQkJCQkJCQliZXN0X3RyaWFsX2VyciA9IHRyaWFsX2VycjsKLQkJCQkJCQkJCQliZXN0X3RyaWFsX2lkeCA9IHRyaWFsX2lkeDsKLQkJCQkJCQkJCQliZXN0X3RyaWFsX2hpc3RvcnlfYnVmX2lkeCA9IGo7Ci0JCQkJCQkJCQl9CisJCQkJCQkJCWlmICgodHJpYWxfZXJyIDwgYmVzdF90cmlhbF9lcnIpICYmICh0cmlhbF9lcnIgPD0gdGhyZXNoX2VycikpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWFzc2VydCh0cmlhbF9lcnIgPD0gbGltaXRfZXJyKTsKKworCQkJCQkJCQkJYmVzdF90cmlhbF9lcnIgPSB0cmlhbF9lcnI7CisJCQkJCQkJCQliZXN0X3RyaWFsX2lkeCA9IHRyaWFsX2lkeDsKKwkJCQkJCQkJCWJlc3RfdHJpYWxfaGlzdG9yeV9idWZfaWR4ID0gajsKIAkJCQkJCQkJfQogCQkJCQkJCX0KIApAQCAtMTA0Myw2ICsxMTQwLDcgQEAKIAogCQkJCQkJCQlzZWxlY3Rvcl9oaXN0b3J5X2J1Zl9oaXN0b2dyYW0uaW5jKGJlc3RfdHJpYWxfaGlzdG9yeV9idWZfaWR4KTsKIAkJCQkJCQl9CisKIAkJCQkJCX0gLy8gaWYgKG1fcGFyYW1zLm1fc2VsZWN0b3JfcmRvX3F1YWxpdHlfdGhyZXNoID4gMC4wZikKIAogCQkJCQkJbS5tX3NlbGVjdG9yX2luZGV4ID0gbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW25ld19zZWxlY3Rvcl9pbmRleF07CkBAIC0xMTY0LDYgKzEyNjIsMTQgQEAKIAogCQl9IC8vIHNsaWNlX2luZGV4CiAKKwkJLy9mb3IgKGludCBpID0gMDsgaSA8PSAyNTUgKiAzOyBpKyspCisJCS8veworCQkvLwlwcmludGYoIiV1LCAldSwgJWZcbiIsIGdfY29sb3JfZGVsdGFfYmFkX2hpc3RbaV0sIGdfY29sb3JfZGVsdGFfaGlzdFtpXSwgZ19jb2xvcl9kZWx0YV9oaXN0W2ldID8gZ19jb2xvcl9kZWx0YV9iYWRfaGlzdFtpXSAvIChmbG9hdClnX2NvbG9yX2RlbHRhX2hpc3RbaV0gOiAwKTsKKwkJLy99CisJCQkJCisJCWRvdWJsZSB0b3RhbF9wcmVwX3RpbWUgPSB0bS5nZXRfZWxhcHNlZF9zZWNzKCk7CisJCWRlYnVnX3ByaW50ZigiYmFzaXN1X2JhY2tlbmQ6OmVuY29kZV9pbWFnZTogVG90YWwgcHJlcCB0aW1lOiAlMy4yZlxuIiwgdG90YWxfcHJlcF90aW1lKTsKKwogCQlkZWJ1Z19wcmludGYoIkVuZHBvaW50IHByZWQgUkRPIHRvdGFsIGVuZHBvaW50IGluZGljZXMgcmVtYXBwZWQ6ICV1ICUzLjJmJSVcbiIsCiAJCQl0b3RhbF9lbmRwb2ludF9pbmRpY2VzX3JlbWFwcGVkLCB0b3RhbF9lbmRwb2ludF9pbmRpY2VzX3JlbWFwcGVkICogMTAwLjBmIC8gZ2V0X3RvdGFsX2Jsb2NrcygpKTsKIApAQCAtMTU1NCwyMTUgKzE2NjAsODIgQEAKIAlib29sIGJhc2lzdV9iYWNrZW5kOjplbmNvZGVfc2VsZWN0b3JfcGFsZXR0ZSgpCiAJewogCQljb25zdCBiYXNpc3VfZnJvbnRlbmQmIHIgPSAqbV9wRnJvbnRfZW5kOworCQkKKwkJaGlzdG9ncmFtIGRlbHRhX3NlbGVjdG9yX3BhbF9oaXN0b2dyYW0oMjU2KTsKIAotCQlpZiAoKG1fcGFyYW1zLm1fdXNlX2dsb2JhbF9zZWxfY29kZWJvb2spICYmICghbV9wYXJhbXMubV91c2VfaHlicmlkX3NlbF9jb2RlYm9va3MpKQorCQlmb3IgKHVpbnQzMl90IHEgPSAwOyBxIDwgci5nZXRfdG90YWxfc2VsZWN0b3JfY2x1c3RlcnMoKTsgcSsrKQogCQl7Ci0JCQloaXN0b2dyYW0gZ2xvYmFsX21vZF9pbmRpY2VzKDEgPDwgbV9wYXJhbXMubV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzKTsKKwkJCWlmICghcSkKKwkJCQljb250aW51ZTsKIAotCQkJZm9yICh1aW50MzJfdCBxID0gMDsgcSA8IHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7IHErKykKLQkJCQlnbG9iYWxfbW9kX2luZGljZXMuaW5jKG1fZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfZGVzY1txXS5tX21vZF9pbmRleCk7CisJCQljb25zdCBldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkmIGN1ciA9IG1fc2VsZWN0b3JfcGFsZXR0ZVttX3NlbGVjdG9yX3JlbWFwX3RhYmxlX25ld190b19vbGRbcV1dOworCQkJY29uc3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHByZWRpY3RvcihtX3NlbGVjdG9yX3BhbGV0dGVbbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW3EgLSAxXV0pOwogCi0JCQlodWZmbWFuX2VuY29kaW5nX3RhYmxlIGdsb2JhbF9wYWxfbW9kZWwsIGdsb2JhbF9tb2RfbW9kZWw7Ci0KLQkJCWlmICghZ2xvYmFsX21vZF9tb2RlbC5pbml0KGdsb2JhbF9tb2RfaW5kaWNlcywgMTYpKQotCQkJewotCQkJCWVycm9yX3ByaW50ZigiZ2xvYmFsX21vZF9tb2RlbC5pbml0KCkgZmFpbGVkISIpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJYml0d2lzZV9jb2RlciBjb2RlcjsKLQkJCWNvZGVyLmluaXQoMTAyNCAqIDEwMjQpOwotCi0JCQljb2Rlci5wdXRfYml0cygxLCAxKTsgLy8gdXNlIGdsb2JhbCBjb2RlYm9vawotCi0JCQljb2Rlci5wdXRfYml0cyhtX3BhcmFtcy5tX2dsb2JhbF9zZWxfY29kZWJvb2tfcGFsX2JpdHMsIDQpOyAvLyBwYWwgYml0cwotCQkJY29kZXIucHV0X2JpdHMobV9wYXJhbXMubV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzLCA0KTsgLy8gbW9kIGJpdHMKLQotCQkJdWludDMyX3QgbW9kX21vZGVsX2JpdHMgPSAwOwotCQkJaWYgKG1fcGFyYW1zLm1fZ2xvYmFsX3NlbF9jb2RlYm9va19tb2RfYml0cykKLQkJCQltb2RfbW9kZWxfYml0cyA9IGNvZGVyLmVtaXRfaHVmZm1hbl90YWJsZShnbG9iYWxfbW9kX21vZGVsKTsKLQotCQkJdWludDMyX3QgdG90YWxfcGFsX2JpdHMgPSAwOwotCQkJdWludDMyX3QgdG90YWxfbW9kX2JpdHMgPSAwOwotCQkJZm9yICh1aW50MzJfdCBxID0gMDsgcSA8IHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7IHErKykKLQkJCXsKLQkJCQljb25zdCB1aW50MzJfdCBpID0gbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW3FdOwotCi0JCQkJaWYgKG1fcGFyYW1zLm1fZ2xvYmFsX3NlbF9jb2RlYm9va19wYWxfYml0cykKLQkJCQl7Ci0JCQkJCWNvZGVyLnB1dF9iaXRzKG1fZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfZGVzY1tpXS5tX3BhbF9pbmRleCwgbV9wYXJhbXMubV9nbG9iYWxfc2VsX2NvZGVib29rX3BhbF9iaXRzKTsKLQkJCQkJdG90YWxfcGFsX2JpdHMgKz0gbV9wYXJhbXMubV9nbG9iYWxfc2VsX2NvZGVib29rX3BhbF9iaXRzOwotCQkJCX0KLQotCQkJCWlmIChtX3BhcmFtcy5tX2dsb2JhbF9zZWxfY29kZWJvb2tfbW9kX2JpdHMpCi0JCQkJCXRvdGFsX21vZF9iaXRzICs9IGNvZGVyLnB1dF9jb2RlKG1fZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfZGVzY1tpXS5tX21vZF9pbmRleCwgZ2xvYmFsX21vZF9tb2RlbCk7Ci0JCQl9Ci0KLQkJCWNvZGVyLmZsdXNoKCk7Ci0KLQkJCW1fb3V0cHV0Lm1fc2VsZWN0b3JfcGFsZXR0ZSA9IGNvZGVyLmdldF9ieXRlcygpOwotCi0JCQlkZWJ1Z19wcmludGYoIk1vZGlmaWVyIG1vZGVsIGJpdHM6ICV1IEF2ZyBwZXIgZW50cnk6ICUzLjNmXG4iLCBtb2RfbW9kZWxfYml0cywgbW9kX21vZGVsX2JpdHMgLyBmbG9hdChyLmdldF90b3RhbF9zZWxlY3Rvcl9jbHVzdGVycygpKSk7Ci0JCQlkZWJ1Z19wcmludGYoIlBhbGV0dGUgYml0czogJXUgQXZnIHBlciBlbnRyeTogJTMuM2YsIE1vZGlmaWVyIGJpdHM6ICV1IEF2ZyBwZXIgZW50cnk6ICUzLjNmXG4iLCB0b3RhbF9wYWxfYml0cywgdG90YWxfcGFsX2JpdHMgLyBmbG9hdChyLmdldF90b3RhbF9zZWxlY3Rvcl9jbHVzdGVycygpKSwgdG90YWxfbW9kX2JpdHMsIHRvdGFsX21vZF9iaXRzIC8gZmxvYXQoci5nZXRfdG90YWxfc2VsZWN0b3JfY2x1c3RlcnMoKSkpOworCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKKwkJCQlkZWx0YV9zZWxlY3Rvcl9wYWxfaGlzdG9ncmFtLmluYyhjdXIuZ2V0X2J5dGUoaikgXiBwcmVkaWN0b3IuZ2V0X2J5dGUoaikpOwogCQl9Ci0JCWVsc2UgaWYgKG1fcGFyYW1zLm1fdXNlX2h5YnJpZF9zZWxfY29kZWJvb2tzKQorCisJCWlmICghZGVsdGFfc2VsZWN0b3JfcGFsX2hpc3RvZ3JhbS5nZXRfdG90YWwoKSkKKwkJCWRlbHRhX3NlbGVjdG9yX3BhbF9oaXN0b2dyYW0uaW5jKDApOworCisJCWh1ZmZtYW5fZW5jb2RpbmdfdGFibGUgZGVsdGFfc2VsZWN0b3JfcGFsX21vZGVsOworCQlpZiAoIWRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbC5pbml0KGRlbHRhX3NlbGVjdG9yX3BhbF9oaXN0b2dyYW0sIDE2KSkKIAkJewotCQkJaHVmZjJEIHVzZWRfZ2xvYmFsX2NiX2JpdGZsYWdfaHVmZjJEKDEsIDgpOwotCi0JCQloaXN0b2dyYW0gZ2xvYmFsX21vZF9pbmRpY2VzKDEgPDwgbV9wYXJhbXMubV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzKTsKLQotCQkJZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7IHMrKykKLQkJCXsKLQkJCQljb25zdCB1aW50MzJfdCBxID0gbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW3NdOwotCi0JCQkJY29uc3QgYm9vbCB1c2VkX2dsb2JhbF9jYl9mbGFnID0gci5nZXRfc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYl92ZWMoKVtxXTsKLQotCQkJCXVzZWRfZ2xvYmFsX2NiX2JpdGZsYWdfaHVmZjJELmVtaXQodXNlZF9nbG9iYWxfY2JfZmxhZyk7Ci0KLQkJCQlnbG9iYWxfbW9kX2luZGljZXMuaW5jKG1fZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfZGVzY1txXS5tX21vZF9pbmRleCk7Ci0JCQl9Ci0KLQkJCWh1ZmZtYW5fZW5jb2RpbmdfdGFibGUgZ2xvYmFsX21vZF9pbmRpY2VzX21vZGVsOwotCQkJaWYgKCFnbG9iYWxfbW9kX2luZGljZXNfbW9kZWwuaW5pdChnbG9iYWxfbW9kX2luZGljZXMsIDE2KSkKLQkJCXsKLQkJCQllcnJvcl9wcmludGYoImdsb2JhbF9tb2RfaW5kaWNlc19tb2RlbC5pbml0KCkgZmFpbGVkISIpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJYml0d2lzZV9jb2RlciBjb2RlcjsKLQkJCWNvZGVyLmluaXQoMTAyNCAqIDEwMjQpOwotCi0JCQljb2Rlci5wdXRfYml0cygwLCAxKTsgLy8gdXNlIGdsb2JhbCBjb2RlYm9vawotCQkJY29kZXIucHV0X2JpdHMoMSwgMSk7IC8vIHVzZXMgaHlicmlkIGNvZGVib29rcwotCi0JCQljb2Rlci5wdXRfYml0cyhtX3BhcmFtcy5tX2dsb2JhbF9zZWxfY29kZWJvb2tfcGFsX2JpdHMsIDQpOyAvLyBwYWwgYml0cwotCQkJY29kZXIucHV0X2JpdHMobV9wYXJhbXMubV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzLCA0KTsgLy8gbW9kIGJpdHMKLQotCQkJdXNlZF9nbG9iYWxfY2JfYml0ZmxhZ19odWZmMkQuc3RhcnRfZW5jb2RpbmcoMTYpOwotCQkJY29kZXIuZW1pdF9odWZmbWFuX3RhYmxlKHVzZWRfZ2xvYmFsX2NiX2JpdGZsYWdfaHVmZjJELmdldF9lbmNvZGluZ190YWJsZSgpKTsKLQotCQkJaWYgKG1fcGFyYW1zLm1fZ2xvYmFsX3NlbF9jb2RlYm9va19tb2RfYml0cykKLQkJCQljb2Rlci5lbWl0X2h1ZmZtYW5fdGFibGUoZ2xvYmFsX21vZF9pbmRpY2VzX21vZGVsKTsKLQotCQkJdWludDMyX3QgdG90YWxfZ2xvYmFsX2NiX2VudHJpZXMgPSAwOwotCQkJdWludDMyX3QgdG90YWxfcGFsX2JpdHMgPSAwOwotCQkJdWludDMyX3QgdG90YWxfbW9kX2JpdHMgPSAwOwotCQkJdWludDMyX3QgdG90YWxfc2VsZWN0b3JzID0gMDsKLQkJCXVpbnQzMl90IHRvdGFsX3NlbGVjdG9yX2JpdHMgPSAwOwotCQkJdWludDMyX3QgdG90YWxfZmxhZ19iaXRzID0gMDsKLQotCQkJZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7IHMrKykKLQkJCXsKLQkJCQljb25zdCB1aW50MzJfdCBxID0gbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW3NdOwotCi0JCQkJdG90YWxfZmxhZ19iaXRzICs9IHVzZWRfZ2xvYmFsX2NiX2JpdGZsYWdfaHVmZjJELmVtaXRfbmV4dF9zeW0oY29kZXIpOwotCi0JCQkJY29uc3QgYm9vbCB1c2VkX2dsb2JhbF9jYl9mbGFnID0gci5nZXRfc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYl92ZWMoKVtxXTsKLQotCQkJCWlmICh1c2VkX2dsb2JhbF9jYl9mbGFnKQotCQkJCXsKLQkJCQkJdG90YWxfZ2xvYmFsX2NiX2VudHJpZXMrKzsKLQotCQkJCQl0b3RhbF9wYWxfYml0cyArPSBjb2Rlci5wdXRfYml0cyhyLmdldF9zZWxlY3Rvcl9jbHVzdGVyX2dsb2JhbF9zZWxlY3Rvcl9lbnRyeV9pZHMoKVtxXS5tX3BhbGV0dGVfaW5kZXgsIG1fcGFyYW1zLm1fZ2xvYmFsX3NlbF9jb2RlYm9va19wYWxfYml0cyk7Ci0JCQkJCXRvdGFsX21vZF9iaXRzICs9IGNvZGVyLnB1dF9jb2RlKHIuZ2V0X3NlbGVjdG9yX2NsdXN0ZXJfZ2xvYmFsX3NlbGVjdG9yX2VudHJ5X2lkcygpW3FdLm1fbW9kaWZpZXIuZ2V0X2luZGV4KCksIGdsb2JhbF9tb2RfaW5kaWNlc19tb2RlbCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXRvdGFsX3NlbGVjdG9ycysrOwotCQkJCQl0b3RhbF9zZWxlY3Rvcl9iaXRzICs9IDMyOwotCi0JCQkJCWZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyBqKyspCi0JCQkJCQljb2Rlci5wdXRfYml0cyhtX3NlbGVjdG9yX3BhbGV0dGVbcV0uZ2V0X2J5dGUoaiksIDgpOwotCQkJCX0KLQkJCX0KLQotCQkJY29kZXIuZmx1c2goKTsKLQotCQkJbV9vdXRwdXQubV9zZWxlY3Rvcl9wYWxldHRlID0gY29kZXIuZ2V0X2J5dGVzKCk7Ci0KLQkJCWRlYnVnX3ByaW50ZigiVG90YWwgZ2xvYmFsIENCIGVudHJpZXM6ICV1ICUzLjJmJSVcbiIsIHRvdGFsX2dsb2JhbF9jYl9lbnRyaWVzLCB0b3RhbF9nbG9iYWxfY2JfZW50cmllcyAqIDEwMC4wZiAvIHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCkpOwotCQkJZGVidWdfcHJpbnRmKCJUb3RhbCBzZWxlY3RvciBlbnRyaWVzOiAldSAlMy4yZiUlXG4iLCB0b3RhbF9zZWxlY3RvcnMsIHRvdGFsX3NlbGVjdG9ycyAqIDEwMC4wZiAvIHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCkpOwotCQkJZGVidWdfcHJpbnRmKCJUb3RhbCBwYWwgYml0czogJXUsIG1vZCBiaXRzOiAldSwgc2VsZWN0b3IgYml0czogJXUsIGZsYWcgYml0czogJXVcbiIsIHRvdGFsX3BhbF9iaXRzLCB0b3RhbF9tb2RfYml0cywgdG90YWxfc2VsZWN0b3JfYml0cywgdG90YWxfZmxhZ19iaXRzKTsKKwkJCWVycm9yX3ByaW50ZigiZGVsdGFfc2VsZWN0b3JfcGFsX21vZGVsLmluaXQoKSBmYWlsZWQhIik7CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJZWxzZQorCisJCWJpdHdpc2VfY29kZXIgY29kZXI7CisJCWNvZGVyLmluaXQoMTAyNCAqIDEwMjQpOworCisJCWNvZGVyLnB1dF9iaXRzKDAsIDEpOyAvLyB1c2UgZ2xvYmFsIGNvZGVib29rCisJCWNvZGVyLnB1dF9iaXRzKDAsIDEpOyAvLyB1c2VzIGh5YnJpZCBjb2RlYm9va3MKKworCQljb2Rlci5wdXRfYml0cygwLCAxKTsgLy8gcmF3IGJ5dGVzCisKKwkJY29kZXIuZW1pdF9odWZmbWFuX3RhYmxlKGRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbCk7CisKKwkJZm9yICh1aW50MzJfdCBxID0gMDsgcSA8IHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7IHErKykKIAkJewotCQkJaGlzdG9ncmFtIGRlbHRhX3NlbGVjdG9yX3BhbF9oaXN0b2dyYW0oMjU2KTsKLQotCQkJZm9yICh1aW50MzJfdCBxID0gMDsgcSA8IHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7IHErKykKKwkJCWlmICghcSkKIAkJCXsKLQkJCQlpZiAoIXEpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJY29uc3QgYmFzaXN0OjpldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkmIGN1ciA9IG1fc2VsZWN0b3JfcGFsZXR0ZVttX3NlbGVjdG9yX3JlbWFwX3RhYmxlX25ld190b19vbGRbcV1dOwotCQkJCWNvbnN0IGJhc2lzdDo6ZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHByZWRpY3RvcihtX3NlbGVjdG9yX3BhbGV0dGVbbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW3EgLSAxXV0pOwotCiAJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKLQkJCQkJZGVsdGFfc2VsZWN0b3JfcGFsX2hpc3RvZ3JhbS5pbmMoY3VyLmdldF9ieXRlKGopIF4gcHJlZGljdG9yLmdldF9ieXRlKGopKTsKKwkJCQkJY29kZXIucHV0X2JpdHMobV9zZWxlY3Rvcl9wYWxldHRlW21fc2VsZWN0b3JfcmVtYXBfdGFibGVfbmV3X3RvX29sZFtxXV0uZ2V0X2J5dGUoaiksIDgpOworCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlpZiAoIWRlbHRhX3NlbGVjdG9yX3BhbF9oaXN0b2dyYW0uZ2V0X3RvdGFsKCkpCi0JCQkJZGVsdGFfc2VsZWN0b3JfcGFsX2hpc3RvZ3JhbS5pbmMoMCk7CisJCQljb25zdCBldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkmIGN1ciA9IG1fc2VsZWN0b3JfcGFsZXR0ZVttX3NlbGVjdG9yX3JlbWFwX3RhYmxlX25ld190b19vbGRbcV1dOworCQkJY29uc3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHByZWRpY3RvcihtX3NlbGVjdG9yX3BhbGV0dGVbbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW3EgLSAxXV0pOwogCi0JCQlodWZmbWFuX2VuY29kaW5nX3RhYmxlIGRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbDsKLQkJCWlmICghZGVsdGFfc2VsZWN0b3JfcGFsX21vZGVsLmluaXQoZGVsdGFfc2VsZWN0b3JfcGFsX2hpc3RvZ3JhbSwgMTYpKQotCQkJewotCQkJCWVycm9yX3ByaW50ZigiZGVsdGFfc2VsZWN0b3JfcGFsX21vZGVsLmluaXQoKSBmYWlsZWQhIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQorCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKKwkJCQljb2Rlci5wdXRfY29kZShjdXIuZ2V0X2J5dGUoaikgXiBwcmVkaWN0b3IuZ2V0X2J5dGUoaiksIGRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbCk7CisJCX0KIAotCQkJYml0d2lzZV9jb2RlciBjb2RlcjsKKwkJY29kZXIuZmx1c2goKTsKKworCQltX291dHB1dC5tX3NlbGVjdG9yX3BhbGV0dGUgPSBjb2Rlci5nZXRfYnl0ZXMoKTsKKworCQlpZiAobV9vdXRwdXQubV9zZWxlY3Rvcl9wYWxldHRlLnNpemUoKSA+PSByLmdldF90b3RhbF9zZWxlY3Rvcl9jbHVzdGVycygpICogNCkKKwkJewogCQkJY29kZXIuaW5pdCgxMDI0ICogMTAyNCk7CiAKIAkJCWNvZGVyLnB1dF9iaXRzKDAsIDEpOyAvLyB1c2UgZ2xvYmFsIGNvZGVib29rCiAJCQljb2Rlci5wdXRfYml0cygwLCAxKTsgLy8gdXNlcyBoeWJyaWQgY29kZWJvb2tzCiAKLQkJCWNvZGVyLnB1dF9iaXRzKDAsIDEpOyAvLyByYXcgYnl0ZXMKLQotCQkJY29kZXIuZW1pdF9odWZmbWFuX3RhYmxlKGRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbCk7CisJCQljb2Rlci5wdXRfYml0cygxLCAxKTsgLy8gcmF3IGJ5dGVzCiAKIAkJCWZvciAodWludDMyX3QgcSA9IDA7IHEgPCByLmdldF90b3RhbF9zZWxlY3Rvcl9jbHVzdGVycygpOyBxKyspCiAJCQl7Ci0JCQkJaWYgKCFxKQotCQkJCXsKLQkJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKLQkJCQkJCWNvZGVyLnB1dF9iaXRzKG1fc2VsZWN0b3JfcGFsZXR0ZVttX3NlbGVjdG9yX3JlbWFwX3RhYmxlX25ld190b19vbGRbcV1dLmdldF9ieXRlKGopLCA4KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJY29uc3QgYmFzaXN0OjpldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkmIGN1ciA9IG1fc2VsZWN0b3JfcGFsZXR0ZVttX3NlbGVjdG9yX3JlbWFwX3RhYmxlX25ld190b19vbGRbcV1dOwotCQkJCWNvbnN0IGJhc2lzdDo6ZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHByZWRpY3RvcihtX3NlbGVjdG9yX3BhbGV0dGVbbV9zZWxlY3Rvcl9yZW1hcF90YWJsZV9uZXdfdG9fb2xkW3EgLSAxXV0pOworCQkJCWNvbnN0IHVpbnQzMl90IGkgPSBtX3NlbGVjdG9yX3JlbWFwX3RhYmxlX25ld190b19vbGRbcV07CiAKIAkJCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgaisrKQotCQkJCQljb2Rlci5wdXRfY29kZShjdXIuZ2V0X2J5dGUoaikgXiBwcmVkaWN0b3IuZ2V0X2J5dGUoaiksIGRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbCk7CisJCQkJCWNvZGVyLnB1dF9iaXRzKG1fc2VsZWN0b3JfcGFsZXR0ZVtpXS5nZXRfYnl0ZShqKSwgOCk7CiAJCQl9CiAKIAkJCWNvZGVyLmZsdXNoKCk7CiAKIAkJCW1fb3V0cHV0Lm1fc2VsZWN0b3JfcGFsZXR0ZSA9IGNvZGVyLmdldF9ieXRlcygpOwotCi0JCQlpZiAobV9vdXRwdXQubV9zZWxlY3Rvcl9wYWxldHRlLnNpemUoKSA+PSByLmdldF90b3RhbF9zZWxlY3Rvcl9jbHVzdGVycygpICogNCkKLQkJCXsKLQkJCQljb2Rlci5pbml0KDEwMjQgKiAxMDI0KTsKLQotCQkJCWNvZGVyLnB1dF9iaXRzKDAsIDEpOyAvLyB1c2UgZ2xvYmFsIGNvZGVib29rCi0JCQkJY29kZXIucHV0X2JpdHMoMCwgMSk7IC8vIHVzZXMgaHlicmlkIGNvZGVib29rcwotCi0JCQkJY29kZXIucHV0X2JpdHMoMSwgMSk7IC8vIHJhdyBieXRlcwotCi0JCQkJZm9yICh1aW50MzJfdCBxID0gMDsgcSA8IHIuZ2V0X3RvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7IHErKykKLQkJCQl7Ci0JCQkJCWNvbnN0IHVpbnQzMl90IGkgPSBtX3NlbGVjdG9yX3JlbWFwX3RhYmxlX25ld190b19vbGRbcV07Ci0KLQkJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKLQkJCQkJCWNvZGVyLnB1dF9iaXRzKG1fc2VsZWN0b3JfcGFsZXR0ZVtpXS5nZXRfYnl0ZShqKSwgOCk7Ci0JCQkJfQotCi0JCQkJY29kZXIuZmx1c2goKTsKLQotCQkJCW1fb3V0cHV0Lm1fc2VsZWN0b3JfcGFsZXR0ZSA9IGNvZGVyLmdldF9ieXRlcygpOwotCQkJfQotCi0JCX0gIC8vIGlmIChtX3BhcmFtcy5tX3VzZV9nbG9iYWxfc2VsX2NvZGVib29rKSAgICAgICAgCisJCX0KIAogCQlkZWJ1Z19wcmludGYoIlNlbGVjdG9yIGNvZGVib29rIGJpdHM6ICV1IGJ5dGVzOiAldSwgQml0cyBwZXIgZW50cnk6ICUzLjFmLCBBdmcgYml0cy90ZXhlbDogJTMuM2ZcbiIsCiAJCQkoaW50KW1fb3V0cHV0Lm1fc2VsZWN0b3JfcGFsZXR0ZS5zaXplKCkgKiA4LCAoaW50KW1fb3V0cHV0Lm1fc2VsZWN0b3JfcGFsZXR0ZS5zaXplKCksCmRpZmYgLS1naXQgYS9lbmNvZGVyL2Jhc2lzdV9iYWNrZW5kLmggYi9lbmNvZGVyL2Jhc2lzdV9iYWNrZW5kLmgKaW5kZXggMzkzZGNjZC4uMDc3NzhhZSAxMDA2NDQKLS0tIGEvZW5jb2Rlci9iYXNpc3VfYmFja2VuZC5oCisrKyBiL2VuY29kZXIvYmFzaXN1X2JhY2tlbmQuaApAQCAtMTcsMTEgKzE3LDg2IEBACiAjaW5jbHVkZSAiLi4vdHJhbnNjb2Rlci9iYXNpc3UuaCIKICNpbmNsdWRlICJiYXNpc3VfZW5jLmgiCiAjaW5jbHVkZSAiLi4vdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL3RyYW5zY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlLmgiCiAjaW5jbHVkZSAiYmFzaXN1X2Zyb250ZW5kLmgiCiAKIG5hbWVzcGFjZSBiYXNpc3UKIHsKKwlzdHJ1Y3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5CisJeworCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkoKQorCQl7CisJCQljbGVhcigpOworCQl9CisKKwkJdm9pZCBjbGVhcigpCisJCXsKKwkJCWJhc2lzdTo6Y2xlYXJfb2JqKCp0aGlzKTsKKwkJfQorCisJCXVpbnQ4X3Qgb3BlcmF0b3JbXSAodWludDMyX3QgaSkgY29uc3QgeyBhc3NlcnQoaSA8IDE2KTsgcmV0dXJuIG1fc2VsZWN0b3JzW2ldOyB9CisJCXVpbnQ4X3QmIG9wZXJhdG9yW10gKHVpbnQzMl90IGkpIHsgYXNzZXJ0KGkgPCAxNik7IHJldHVybiBtX3NlbGVjdG9yc1tpXTsgfQorCisJCXZvaWQgc2V0X3VpbnQzMih1aW50MzJfdCB2KQorCQl7CisJCQlmb3IgKHVpbnQzMl90IGJ5dGVfaW5kZXggPSAwOyBieXRlX2luZGV4IDwgNDsgYnl0ZV9pbmRleCsrKQorCQkJeworCQkJCXVpbnQzMl90IGIgPSAodiA+PiAoYnl0ZV9pbmRleCAqIDgpKSAmIDB4RkY7CisKKwkJCQltX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDBdID0gYiAmIDM7CisJCQkJbV9zZWxlY3RvcnNbYnl0ZV9pbmRleCAqIDQgKyAxXSA9IChiID4+IDIpICYgMzsKKwkJCQltX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDJdID0gKGIgPj4gNCkgJiAzOworCQkJCW1fc2VsZWN0b3JzW2J5dGVfaW5kZXggKiA0ICsgM10gPSAoYiA+PiA2KSAmIDM7CisJCQl9CisJCX0KKworCQl1aW50MzJfdCBnZXRfdWludDMyKCkgY29uc3QKKwkJeworCQkJcmV0dXJuIGdldF9ieXRlKDApIHwgKGdldF9ieXRlKDEpIDw8IDgpIHwgKGdldF9ieXRlKDIpIDw8IDE2KSB8IChnZXRfYnl0ZSgzKSA8PCAyNCk7CisJCX0KKworCQl1aW50MzJfdCBnZXRfYnl0ZSh1aW50MzJfdCBieXRlX2luZGV4KSBjb25zdAorCQl7CisJCQlhc3NlcnQoYnl0ZV9pbmRleCA8IDQpOworCisJCQlyZXR1cm4gbV9zZWxlY3RvcnNbYnl0ZV9pbmRleCAqIDQgKyAwXSB8CisJCQkJKG1fc2VsZWN0b3JzW2J5dGVfaW5kZXggKiA0ICsgMV0gPDwgMikgfAorCQkJCShtX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDJdIDw8IDQpIHwKKwkJCQkobV9zZWxlY3RvcnNbYnl0ZV9pbmRleCAqIDQgKyAzXSA8PCA2KTsKKwkJfQorCisJCXVpbnQ4X3Qgb3BlcmF0b3IoKSh1aW50MzJfdCB4LCB1aW50MzJfdCB5KSBjb25zdCB7IGFzc2VydCgoeCA8IDQpICYmICh5IDwgNCkpOyByZXR1cm4gbV9zZWxlY3RvcnNbeCArIHkgKiA0XTsgfQorCQl1aW50OF90JiBvcGVyYXRvcigpKHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsgYXNzZXJ0KCh4IDwgNCkgJiYgKHkgPCA0KSk7IHJldHVybiBtX3NlbGVjdG9yc1t4ICsgeSAqIDRdOyB9CisKKwkJYm9vbCBvcGVyYXRvcjwgKGNvbnN0IGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSYgb3RoZXIpIGNvbnN0CisJCXsKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJeworCQkJCWlmIChtX3NlbGVjdG9yc1tpXSA8IG90aGVyLm1fc2VsZWN0b3JzW2ldKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQllbHNlIGlmIChtX3NlbGVjdG9yc1tpXSAhPSBvdGhlci5tX3NlbGVjdG9yc1tpXSkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlib29sIG9wZXJhdG9yPT0gKGNvbnN0IGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSYgb3RoZXIpIGNvbnN0CisJCXsKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJeworCQkJCWlmIChtX3NlbGVjdG9yc1tpXSAhPSBvdGhlci5tX3NlbGVjdG9yc1tpXSkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJcHJpdmF0ZToKKwkJdWludDhfdCBtX3NlbGVjdG9yc1sxNl07CisJfTsKKworCXR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8ZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5PiBldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnlfdmVjOworCiAJc3RydWN0IGVuY29kZXJfYmxvY2sKIAl7CiAJCWVuY29kZXJfYmxvY2soKQpAQCAtNzgsMTQgKzE1MywxMSBAQAogCQlmbG9hdCBtX2VuZHBvaW50X3Jkb19xdWFsaXR5X3RocmVzaDsKIAkJZmxvYXQgbV9zZWxlY3Rvcl9yZG9fcXVhbGl0eV90aHJlc2g7CiAJCXVpbnQzMl90IG1fY29tcHJlc3Npb25fbGV2ZWw7Ci0KLQkJYm9vbCBtX3VzZV9nbG9iYWxfc2VsX2NvZGVib29rOwotCQl1aW50MzJfdCBtX2dsb2JhbF9zZWxfY29kZWJvb2tfcGFsX2JpdHM7Ci0JCXVpbnQzMl90IG1fZ2xvYmFsX3NlbF9jb2RlYm9va19tb2RfYml0czsKLQkJYm9vbCBtX3VzZV9oeWJyaWRfc2VsX2NvZGVib29rczsKLQorCQkJCQkJCQkKIAkJYm9vbCBtX3VzZWRfZ2xvYmFsX2NvZGVib29rczsKIAorCQlib29sIG1fdmFsaWRhdGU7CisKIAkJYmFzaXN1X2JhY2tlbmRfcGFyYW1zKCkKIAkJewogCQkJY2xlYXIoKTsKQEAgLTk5LDEyICsxNzEsOCBAQAogCQkJbV9lbmRwb2ludF9yZG9fcXVhbGl0eV90aHJlc2ggPSAwLjBmOwogCQkJbV9zZWxlY3Rvcl9yZG9fcXVhbGl0eV90aHJlc2ggPSAwLjBmOwogCQkJbV9jb21wcmVzc2lvbl9sZXZlbCA9IDA7Ci0KLQkJCW1fdXNlX2dsb2JhbF9zZWxfY29kZWJvb2sgPSBmYWxzZTsKLQkJCW1fZ2xvYmFsX3NlbF9jb2RlYm9va19wYWxfYml0cyA9IEVUQzFfR0xPQkFMX1NFTEVDVE9SX0NPREVCT09LX01BWF9QQUxfQklUUzsKLQkJCW1fZ2xvYmFsX3NlbF9jb2RlYm9va19tb2RfYml0cyA9IGJhc2lzdDo6ZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllcjo6Y1RvdGFsQml0czsKLQkJCW1fdXNlX2h5YnJpZF9zZWxfY29kZWJvb2tzID0gZmFsc2U7CiAJCQltX3VzZWRfZ2xvYmFsX2NvZGVib29rcyA9IGZhbHNlOworCQkJbV92YWxpZGF0ZSA9IHRydWU7CiAJCX0KIAl9OwogCkBAIC0yMDUsNyArMjczLDcgQEAKIAogCQl2b2lkIGNsZWFyKCk7CiAKLQkJdm9pZCBpbml0KGJhc2lzdV9mcm9udGVuZCAqcEZyb250X2VuZCwgYmFzaXN1X2JhY2tlbmRfcGFyYW1zICZwYXJhbXMsIGNvbnN0IGJhc2lzdV9iYWNrZW5kX3NsaWNlX2Rlc2NfdmVjICZzbGljZV9kZXNjLCBjb25zdCBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rICpwR2xvYmFsX3NlbF9jb2RlYm9vayk7CisJCXZvaWQgaW5pdChiYXNpc3VfZnJvbnRlbmQgKnBGcm9udF9lbmQsIGJhc2lzdV9iYWNrZW5kX3BhcmFtcyAmcGFyYW1zLCBjb25zdCBiYXNpc3VfYmFja2VuZF9zbGljZV9kZXNjX3ZlYyAmc2xpY2VfZGVzYyk7CiAKIAkJdWludDMyX3QgZW5jb2RlKCk7CiAKQEAgLTIxNywxMCArMjg1LDkgQEAKIAkJYmFzaXN1X2JhY2tlbmRfcGFyYW1zIG1fcGFyYW1zOwogCQliYXNpc3VfYmFja2VuZF9zbGljZV9kZXNjX3ZlYyBtX3NsaWNlczsKIAkJYmFzaXN1X2JhY2tlbmRfb3V0cHV0IG1fb3V0cHV0OwotCQljb25zdCBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rICptX3BHbG9iYWxfc2VsX2NvZGVib29rOwotCisJCQogCQlldGMxX2VuZHBvaW50X3BhbGV0dGVfZW50cnlfdmVjIG1fZW5kcG9pbnRfcGFsZXR0ZTsKLQkJYmFzaXN0OjpldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnlfdmVjIG1fc2VsZWN0b3JfcGFsZXR0ZTsKKwkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5X3ZlYyBtX3NlbGVjdG9yX3BhbGV0dGU7CiAKIAkJc3RydWN0IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NiX2VudHJ5X2Rlc2MKIAkJewpkaWZmIC0tZ2l0IGEvZW5jb2Rlci9iYXNpc3VfY29tcC5jcHAgYi9lbmNvZGVyL2Jhc2lzdV9jb21wLmNwcAppbmRleCAxMGY5NmNlLi4xNjZhMWM0IDEwMDY0NAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9jb21wLmNwcAorKysgYi9lbmNvZGVyL2Jhc2lzdV9jb21wLmNwcApAQCAtMjEsNiArMjEsOCBAQAogI2RlZmluZSBNSU5JWl9OT19aTElCX0NPTVBBVElCTEVfTkFNRVMKICNpbmNsdWRlICJiYXNpc3VfbWluaXouaCIKIAorI2luY2x1ZGUgImJhc2lzdV9vcGVuY2wuaCIKKwogI2lmICFCQVNJU0RfU1VQUE9SVF9LVFgyCiAjZXJyb3IgQkFTSVNEX1NVUFBPUlRfS1RYMiBtdXN0IGJlIGVuYWJsZWQgKHNldCB0byAxKS4KICNlbmRpZgpAQCAtNDUsMjEgKzQ3LDQ1IEBACiBuYW1lc3BhY2UgYmFzaXN1CiB7CiAgICBiYXNpc19jb21wcmVzc29yOjpiYXNpc19jb21wcmVzc29yKCkgOgorCSAgIG1fcE9wZW5DTF9jb250ZXh0KG51bGxwdHIpLAogCQltX2Jhc2lzX2ZpbGVfc2l6ZSgwKSwKIAkJbV9iYXNpc19iaXRzX3Blcl90ZXhlbCgwLjBmKSwKIAkJbV90b3RhbF9ibG9ja3MoMCksCi0JCW1fYXV0b19nbG9iYWxfc2VsX3BhbChmYWxzZSksCi0JCW1fYW55X3NvdXJjZV9pbWFnZV9oYXNfYWxwaGEoZmFsc2UpCisJCW1fYW55X3NvdXJjZV9pbWFnZV9oYXNfYWxwaGEoZmFsc2UpLAorCSAgIG1fb3BlbmNsX2ZhaWxlZChmYWxzZSkKIAl7CiAJCWRlYnVnX3ByaW50ZigiYmFzaXNfY29tcHJlc3Nvcjo6YmFzaXNfY29tcHJlc3NvclxuIik7CisJCQorCQlhc3NlcnQoZ19saWJyYXJ5X2luaXRpYWxpemVkKTsKIAl9CiAKKyAgIGJhc2lzX2NvbXByZXNzb3I6On5iYXNpc19jb21wcmVzc29yKCkKKyAgIHsKKwkgICBpZiAobV9wT3BlbkNMX2NvbnRleHQpCisJICAgeworCQkgICBvcGVuY2xfZGVzdHJveV9jb250ZXh0KG1fcE9wZW5DTF9jb250ZXh0KTsKKwkJICAgbV9wT3BlbkNMX2NvbnRleHQgPSBudWxscHRyOworCSAgIH0KKyAgIH0KKwogCWJvb2wgYmFzaXNfY29tcHJlc3Nvcjo6aW5pdChjb25zdCBiYXNpc19jb21wcmVzc29yX3BhcmFtcyAmcGFyYW1zKQogCXsKIAkJZGVidWdfcHJpbnRmKCJiYXNpc19jb21wcmVzc29yOjppbml0XG4iKTsKKwkJCQkKKwkJaWYgKCFnX2xpYnJhcnlfaW5pdGlhbGl6ZWQpCisJCXsKKwkJCWVycm9yX3ByaW50ZigiYmFzaXNfY29tcHJlc3Nvcjo6aW5pdDogYmFzaXN1X2VuY29kZXJfaW5pdCgpIE1VU1QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBhbnkgZW5jb2RlciBmdW5jdGlvbmFsaXR5IVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KIAorCQlpZiAoIXBhcmFtcy5tX3BKb2JfcG9vbCkKKwkJeworCQkJZXJyb3JfcHJpbnRmKCJiYXNpc19jb21wcmVzc29yOjppbml0OiBBIG5vbi1udWxsIGpvYl9wb29sIHBvaW50ZXIgbXVzdCBiZSBzcGVjaWZpZWRcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQkJCiAJCW1fcGFyYW1zID0gcGFyYW1zOwotCisJCQkJCiAJCWlmIChtX3BhcmFtcy5tX2RlYnVnKQogCQl7CiAJCQlkZWJ1Z19wcmludGYoImJhc2lzX2NvbXByZXNzb3I6OmluaXQ6XG4iKTsKQEAgLTY4LDkgKzk0LDcgQEAKICNkZWZpbmUgUFJJTlRfSU5UX1ZBTFVFKHYpIGRlYnVnX3ByaW50ZigiJXM6ICVpICV1XG4iLCBCQVNJU1VfU1RSSU5HSVpFMih2KSwgc3RhdGljX2Nhc3Q8aW50PihtX3BhcmFtcy52KSwgbV9wYXJhbXMudi53YXNfY2hhbmdlZCgpKTsKICNkZWZpbmUgUFJJTlRfVUlOVF9WQUxVRSh2KSBkZWJ1Z19wcmludGYoIiVzOiAldSAldVxuIiwgQkFTSVNVX1NUUklOR0laRTIodiksIHN0YXRpY19jYXN0PHVpbnQzMl90PihtX3BhcmFtcy52KSwgbV9wYXJhbXMudi53YXNfY2hhbmdlZCgpKTsKICNkZWZpbmUgUFJJTlRfRkxPQVRfVkFMVUUodikgZGVidWdfcHJpbnRmKCIlczogJWYgJXVcbiIsIEJBU0lTVV9TVFJJTkdJWkUyKHYpLCBzdGF0aWNfY2FzdDxmbG9hdD4obV9wYXJhbXMudiksIG1fcGFyYW1zLnYud2FzX2NoYW5nZWQoKSk7Ci0KLQkJCWRlYnVnX3ByaW50ZigiSGFzIGdsb2JhbCBzZWxlY3RvciBjb2RlYm9vazogJWlcbiIsIG1fcGFyYW1zLm1fcFNlbF9jb2RlYm9vayAhPSBudWxscHRyKTsKLQorCQkJCQkJCiAJCQlkZWJ1Z19wcmludGYoIlNvdXJjZSBpbWFnZXM6ICV1LCBzb3VyY2UgZmlsZW5hbWVzOiAldSwgc291cmNlIGFscGhhIGZpbGVuYW1lczogJWksIFNvdXJjZSBtaXBtYXAgaW1hZ2VzOiAldVxuIiwKIAkJCQltX3BhcmFtcy5tX3NvdXJjZV9pbWFnZXMuc2l6ZSgpLCBtX3BhcmFtcy5tX3NvdXJjZV9maWxlbmFtZXMuc2l6ZSgpLCBtX3BhcmFtcy5tX3NvdXJjZV9hbHBoYV9maWxlbmFtZXMuc2l6ZSgpLCBtX3BhcmFtcy5tX3NvdXJjZV9taXBtYXBfaW1hZ2VzLnNpemUoKSk7CiAKQEAgLTgzLDE0ICsxMDcsMTIgQEAKIAkJCX0KIAogCQkJUFJJTlRfQk9PTF9WQUxVRShtX3Vhc3RjKTsKKwkJCVBSSU5UX0JPT0xfVkFMVUUobV91c2Vfb3BlbmNsKTsKIAkJCVBSSU5UX0JPT0xfVkFMVUUobV95X2ZsaXApOwogCQkJUFJJTlRfQk9PTF9WQUxVRShtX2RlYnVnKTsKLQkJCVBSSU5UX0JPT0xfVkFMVUUobV92YWxpZGF0ZSk7CisJCQlQUklOVF9CT09MX1ZBTFVFKG1fdmFsaWRhdGVfZXRjMXMpOwogCQkJUFJJTlRfQk9PTF9WQUxVRShtX2RlYnVnX2ltYWdlcyk7Ci0JCQlQUklOVF9CT09MX1ZBTFVFKG1fZ2xvYmFsX3NlbF9wYWwpOwotCQkJUFJJTlRfQk9PTF9WQUxVRShtX2F1dG9fZ2xvYmFsX3NlbF9wYWwpOwogCQkJUFJJTlRfSU5UX1ZBTFVFKG1fY29tcHJlc3Npb25fbGV2ZWwpOwotCQkJUFJJTlRfQk9PTF9WQUxVRShtX25vX2h5YnJpZF9zZWxfY2IpOwogCQkJUFJJTlRfQk9PTF9WQUxVRShtX3BlcmNlcHR1YWwpOwogCQkJUFJJTlRfQk9PTF9WQUxVRShtX25vX2VuZHBvaW50X3Jkbyk7CiAJCQlQUklOVF9CT09MX1ZBTFVFKG1fbm9fc2VsZWN0b3JfcmRvKTsKQEAgLTEwNywxMiArMTI5LDcgQEAKIAkJCVBSSU5UX0JPT0xfVkFMVUUobV9yZW5vcm1hbGl6ZSk7CiAJCQlQUklOVF9CT09MX1ZBTFVFKG1fbXVsdGl0aHJlYWRpbmcpOwogCQkJUFJJTlRfQk9PTF9WQUxVRShtX2Rpc2FibGVfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rcyk7Ci0JCQkKLQkJCVBSSU5UX0ZMT0FUX1ZBTFVFKG1faHlicmlkX3NlbF9jYl9xdWFsaXR5X3RocmVzaCk7Ci0JCQkKLQkJCVBSSU5UX0lOVF9WQUxVRShtX2dsb2JhbF9wYWxfYml0cyk7Ci0JCQlQUklOVF9JTlRfVkFMVUUobV9nbG9iYWxfbW9kX2JpdHMpOwotCisJCQkJCQkJCQkJCQkKIAkJCVBSSU5UX0ZMT0FUX1ZBTFVFKG1fZW5kcG9pbnRfcmRvX3RocmVzaCk7CiAJCQlQUklOVF9GTE9BVF9WQUxVRShtX3NlbGVjdG9yX3Jkb190aHJlc2gpOwogCQkJCkBAIC0xNDgsNiArMTY1LDcgQEAKIAkJCVBSSU5UX0lOVF9WQUxVRShtX3Jlc2FtcGxlX3dpZHRoKTsKIAkJCVBSSU5UX0lOVF9WQUxVRShtX3Jlc2FtcGxlX2hlaWdodCk7CiAJCQlQUklOVF9GTE9BVF9WQUxVRShtX3Jlc2FtcGxlX2ZhY3Rvcik7CisJCQkKIAkJCWRlYnVnX3ByaW50ZigiSGFzIGdsb2JhbCBjb2RlYm9va3M6ICV1XG4iLCBtX3BhcmFtcy5tX3BHbG9iYWxfY29kZWJvb2tzID8gMSA6IDApOwogCQkJaWYgKG1fcGFyYW1zLm1fcEdsb2JhbF9jb2RlYm9va3MpCiAJCQl7CkBAIC0xNjUsNiArMTgzLDggQEAKIAkJCQlkZWJ1Z19wcmludGYoIktleTogXCIlc1wiXG4iLCBtX3BhcmFtcy5tX2t0eDJfa2V5X3ZhbHVlc1tpXS5tX2tleS5kYXRhKCkpOwogCQkJCWRlYnVnX3ByaW50ZigiVmFsdWUgc2l6ZTogJXVcbiIsIG1fcGFyYW1zLm1fa3R4Ml9rZXlfdmFsdWVzW2ldLm1fdmFsdWUuc2l6ZSgpKTsKIAkJCX0KKworCQkJUFJJTlRfQk9PTF9WQUxVRShtX3ZhbGlkYXRlX291dHB1dF9kYXRhKTsKIAkJCQkJCQogI3VuZGVmIFBSSU5UX0JPT0xfVkFMVUUKICN1bmRlZiBQUklOVF9JTlRfVkFMVUUKQEAgLTE3OCw2ICsxOTgsMjAgQEAKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCisJCWlmICgobV9wYXJhbXMubV9jb21wdXRlX3N0YXRzKSAmJiAoIW1fcGFyYW1zLm1fdmFsaWRhdGVfb3V0cHV0X2RhdGEpKQorCQl7CisJCQltX3BhcmFtcy5tX3ZhbGlkYXRlX291dHB1dF9kYXRhID0gdHJ1ZTsKKwkJCQorCQkJZGVidWdfcHJpbnRmKCJOb3RlOiBtX2NvbXB1dGVfc3RhdHMgaXMgdHJ1ZSwgc28gZm9yY2luZyBtX3ZhbGlkYXRlX291dHB1dF9kYXRhIHRvIHRydWUgYXMgd2VsbFxuIik7CisJCX0KKworCQlpZiAoKG1fcGFyYW1zLm1fdXNlX29wZW5jbCkgJiYgb3BlbmNsX2lzX2F2YWlsYWJsZSgpICYmICFtX3BPcGVuQ0xfY29udGV4dCAmJiAhbV9vcGVuY2xfZmFpbGVkKQorCQl7CisJCQltX3BPcGVuQ0xfY29udGV4dCA9IG9wZW5jbF9jcmVhdGVfY29udGV4dCgpOworCQkJaWYgKCFtX3BPcGVuQ0xfY29udGV4dCkKKwkJCQltX29wZW5jbF9mYWlsZWQgPSB0cnVlOworCQl9CisKIAkJcmV0dXJuIHRydWU7CiAJfQogCQkKQEAgLTQyNCw3ICs0NTgsNyBAQAogI2VuZGlmCiAKIAkJaWYgKG1fcGFyYW1zLm1fZGVidWcpCi0JCQlkZWJ1Z19wcmludGYoIlRvdGFsIG1pcG1hcCBnZW5lcmF0aW9uIHRpbWU6ICVmIHNlY3NcbiIsIHRtLmdldF9lbGFwc2VkX3NlY3MoKSk7CisJCQlkZWJ1Z19wcmludGYoIlRvdGFsIG1pcG1hcCBnZW5lcmF0aW9uIHRpbWU6ICUzLjNmIHNlY3NcbiIsIHRtLmdldF9lbGFwc2VkX3NlY3MoKSk7CiAKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtNTc5LDExICs2MTMsMTEgQEAKIAogCQkJaWYgKChmaWxlX2ltYWdlLmdldF93aWR0aCgpID4gQkFTSVNVX01BWF9TVVBQT1JURURfVEVYVFVSRV9ESU1FTlNJT04pIHx8IChmaWxlX2ltYWdlLmdldF9oZWlnaHQoKSA+IEJBU0lTVV9NQVhfU1VQUE9SVEVEX1RFWFRVUkVfRElNRU5TSU9OKSkKIAkJCXsKLQkJCQllcnJvcl9wcmludGYoImJhc2lzX2NvbXByZXNzb3I6OnJlYWRfc291cmNlX2ltYWdlczogU291cmNlIGltYWdlIGlzIHRvbyBsYXJnZSFcbiIpOworCQkJCWVycm9yX3ByaW50ZigiYmFzaXNfY29tcHJlc3Nvcjo6cmVhZF9zb3VyY2VfaW1hZ2VzOiBTb3VyY2UgaW1hZ2UgXCIlc1wiIGlzIHRvbyBsYXJnZSFcbiIsIHBTb3VyY2VfZmlsZW5hbWUpOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAotCQkJc291cmNlX2ltYWdlcy5wdXNoX2JhY2soZmlsZV9pbWFnZSk7CisJCQlzb3VyY2VfaW1hZ2VzLmVubGFyZ2UoMSktPnN3YXAoZmlsZV9pbWFnZSk7CiAJCQlzb3VyY2VfZmlsZW5hbWVzLnB1c2hfYmFjayhwU291cmNlX2ZpbGVuYW1lKTsKIAkJfQogCkBAIC02MjQsMTcgKzY1OCwxOSBAQAogCiAJCWZvciAodWludDMyX3Qgc291cmNlX2ZpbGVfaW5kZXggPSAwOyBzb3VyY2VfZmlsZV9pbmRleCA8IHRvdGFsX3NvdXJjZV9maWxlczsgc291cmNlX2ZpbGVfaW5kZXgrKykKIAkJewotCQkJaW1hZ2UgJmZpbGVfaW1hZ2UgPSBzb3VyY2VfaW1hZ2VzW3NvdXJjZV9maWxlX2luZGV4XTsKIAkJCWNvbnN0IHN0ZDo6c3RyaW5nICZzb3VyY2VfZmlsZW5hbWUgPSBzb3VyY2VfZmlsZW5hbWVzW3NvdXJjZV9maWxlX2luZGV4XTsKIAogCQkJLy8gTm93LCBmb3IgZWFjaCBzb3VyY2UgaW1hZ2UsIGNyZWF0ZSB0aGUgc2xpY2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBpbWFnZS4KIAkJCWJhc2lzdTo6dmVjdG9yPGltYWdlPiBzbGljZXM7CiAJCQkKIAkJCXNsaWNlcy5yZXNlcnZlKDMyKTsKLQkJCQorCQkJCQkJCiAJCQkvLyBUaGUgZmlyc3QgKGxhcmdlc3QpIG1pcG1hcCBsZXZlbC4KLQkJCXNsaWNlcy5wdXNoX2JhY2soZmlsZV9pbWFnZSk7Ci0JCQkKKwkJCWltYWdlJiBmaWxlX2ltYWdlID0gc291cmNlX2ltYWdlc1tzb3VyY2VfZmlsZV9pbmRleF07CisJCQkJCQkKKwkJCS8vIFJlc2VydmUgYSBzbG90IGZvciBtaXAwLgorCQkJc2xpY2VzLnJlc2l6ZSgxKTsKKwkJCQkJCQkJCQkJCQogCQkJaWYgKG1fcGFyYW1zLm1fc291cmNlX21pcG1hcF9pbWFnZXMuc2l6ZSgpKQogCQkJewogCQkJCS8vIFVzZXItcHJvdmlkZWQgbWlwbWFwcyBmb3IgZWFjaCBsYXllciBvciBpbWFnZSBpbiB0aGUgdGV4dHVyZSBhcnJheS4KQEAgLTY2Niw2ICs3MDIsMTAgQEAKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCisJCQkvLyBTd2FwIGluIHRoZSBsYXJnZXN0IG1pcG1hcCBsZXZlbCBoZXJlIHRvIGF2b2lkIGNvcHlpbmcgaXQsIGJlY2F1c2UgZ2VuZXJhdGVfbWlwcygpIHdpbGwgY2hhbmdlIHRoZSBhcnJheS4KKwkJCS8vIE5PVEU6IGZpbGVfaW1hZ2UgaXMgbm93IGJsYW5rLgorCQkJc2xpY2VzWzBdLnN3YXAoZmlsZV9pbWFnZSk7CisKIAkJCXVpbnRfdmVjIG1pcF9pbmRpY2VzKHNsaWNlcy5zaXplKCkpOwogCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNsaWNlcy5zaXplKCk7IGkrKykKIAkJCQltaXBfaW5kaWNlc1tpXSA9IGk7CkBAIC03MzQsMTggKzc3NCwxNiBAQAogCQkJCQlzYXZlX3BuZyhzdHJpbmdfZm9ybWF0KCJiYXNpc19kZWJ1Z19zb3VyY2VfaW1hZ2VfJXVfc2xpY2VfJXUucG5nIiwgc291cmNlX2ZpbGVfaW5kZXgsIHNsaWNlX2luZGV4KS5jX3N0cigpLCBzbGljZV9pbWFnZSk7CiAJCQkJfQogCisJCQkJY29uc3QgdWludDMyX3QgZGVzdF9pbWFnZV9pbmRleCA9IG1fc2xpY2VfaW1hZ2VzLnNpemUoKTsKKwogCQkJCWVubGFyZ2VfdmVjdG9yKG1fc3RhdHMsIDEpOwogCQkJCWVubGFyZ2VfdmVjdG9yKG1fc2xpY2VfaW1hZ2VzLCAxKTsKIAkJCQllbmxhcmdlX3ZlY3RvcihtX3NsaWNlX2Rlc2NzLCAxKTsKLQotCQkJCWNvbnN0IHVpbnQzMl90IGRlc3RfaW1hZ2VfaW5kZXggPSAodWludDMyX3QpbV9zdGF0cy5zaXplKCkgLSAxOwotCisJCQkJCQkJCQogCQkJCW1fc3RhdHNbZGVzdF9pbWFnZV9pbmRleF0ubV9maWxlbmFtZSA9IHNvdXJjZV9maWxlbmFtZS5jX3N0cigpOwogCQkJCW1fc3RhdHNbZGVzdF9pbWFnZV9pbmRleF0ubV93aWR0aCA9IG9yaWdfd2lkdGg7CiAJCQkJbV9zdGF0c1tkZXN0X2ltYWdlX2luZGV4XS5tX2hlaWdodCA9IG9yaWdfaGVpZ2h0OwotCi0JCQkJbV9zbGljZV9pbWFnZXNbZGVzdF9pbWFnZV9pbmRleF0gPSBzbGljZV9pbWFnZTsKLQorCQkJCQkJCQkKIAkJCQlkZWJ1Z19wcmludGYoIioqKioqKiBTbGljZSAldTogbWlwICV1LCBhbHBoYV9zbGljZTogJXUsIGZpbGVuYW1lOiBcIiVzXCIsIG9yaWdpbmFsOiAldXgldSBhY3R1YWw6ICV1eCV1XG4iLCBtX3NsaWNlX2Rlc2NzLnNpemUoKSAtIDEsIG1pcF9pbmRpY2VzW3NsaWNlX2luZGV4XSwgaXNfYWxwaGFfc2xpY2UsIHNvdXJjZV9maWxlbmFtZS5jX3N0cigpLCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwgc2xpY2VfaW1hZ2UuZ2V0X3dpZHRoKCksIHNsaWNlX2ltYWdlLmdldF9oZWlnaHQoKSk7CiAKIAkJCQliYXNpc3VfYmFja2VuZF9zbGljZV9kZXNjICZzbGljZV9kZXNjID0gbV9zbGljZV9kZXNjc1tkZXN0X2ltYWdlX2luZGV4XTsKQEAgLTc3Nyw2ICs4MTUsMTAgQEAKIAogCQkJCW1fdG90YWxfYmxvY2tzICs9IHNsaWNlX2Rlc2MubV9udW1fYmxvY2tzX3ggKiBzbGljZV9kZXNjLm1fbnVtX2Jsb2Nrc195OwogCQkJCXRvdGFsX21hY3JvYmxvY2tzICs9IHNsaWNlX2Rlc2MubV9udW1fbWFjcm9ibG9ja3NfeCAqIHNsaWNlX2Rlc2MubV9udW1fbWFjcm9ibG9ja3NfeTsKKworCQkJCS8vIEZpbmFsbHksIHN3YXAgaW4gdGhlIHNsaWNlJ3MgaW1hZ2UgdG8gYXZvaWQgY29weWluZyBpdC4KKwkJCQkvLyBOT1RFOiBzbGljZV9pbWFnZSBpcyBub3cgYmxhbmsuCisJCQkJbV9zbGljZV9pbWFnZXNbZGVzdF9pbWFnZV9pbmRleF0uc3dhcChzbGljZV9pbWFnZSk7CiAJCQkKIAkJCX0gLy8gc2xpY2VfaW5kZXgKIApAQCAtMTA1NSw3ICsxMDk3LDcgQEAKIAkJCQllbmRwb2ludF9jbHVzdGVycyA9IGNsYW1wPHVpbnQzMl90PigodWludDMyX3QpKC41ZiArIGxlcnA8ZmxvYXQ+KEVORFBPSU5UX0NPREVCT09LX01JRF9RVUFMSVRZX0NPREVCT09LX1NJWkUsIHN0YXRpY19jYXN0PGZsb2F0PihtYXhfZW5kcG9pbnRzKSwgY29sb3JfZW5kcG9pbnRfcXVhbGl0eSkpLCAzMiwgYmFzaXN1X2Zyb250ZW5kOjpjTWF4RW5kcG9pbnRDbHVzdGVycyk7CiAJCQl9CiAJCQkJCQkKLQkJCWZsb2F0IGJpdHNfcGVyX3NlbGVjdG9yX2NsdXN0ZXIgPSBtX3BhcmFtcy5tX2dsb2JhbF9zZWxfcGFsID8gMjEuMGYgOiAxNC4wZjsKKwkJCWZsb2F0IGJpdHNfcGVyX3NlbGVjdG9yX2NsdXN0ZXIgPSAxNC4wZjsKIAogCQkJY29uc3QgZmxvYXQgbWF4X2Rlc2lyZWRfc2VsZWN0b3JfY2x1c3Rlcl9iaXRzX3Blcl90ZXhlbCA9IDEuMGY7IC8vIC4xNWYKIAkJCWludCBtYXhfc2VsZWN0b3JzID0gc3RhdGljX2Nhc3Q8aW50PigobWF4X2Rlc2lyZWRfc2VsZWN0b3JfY2x1c3Rlcl9iaXRzX3Blcl90ZXhlbCAqIHRvdGFsX3RleGVscykgLyBiaXRzX3Blcl9zZWxlY3Rvcl9jbHVzdGVyKTsKQEAgLTExMTAsMjEgKzExNTIsNyBAQAogCQkJCQltX3BhcmFtcy5tX3NlbGVjdG9yX3Jkb190aHJlc2ggKj0gbGVycDxmbG9hdD4oMS4wZiwgLjc1ZiwgbCk7CiAJCQl9CiAJCX0KLQotCQltX2F1dG9fZ2xvYmFsX3NlbF9wYWwgPSBmYWxzZTsKLQkJaWYgKCFtX3BhcmFtcy5tX2dsb2JhbF9zZWxfcGFsICYmIG1fcGFyYW1zLm1fYXV0b19nbG9iYWxfc2VsX3BhbCkKLQkJewotCQkJY29uc3QgZmxvYXQgYml0c19wZXJfc2VsZWN0b3JfY2x1c3RlciA9IDMxLjBmOwotCQkJZG91YmxlIHNlbGVjdG9yX2NvZGVib29rX2JwcF9lc3QgPSAoYml0c19wZXJfc2VsZWN0b3JfY2x1c3RlciAqIHNlbGVjdG9yX2NsdXN0ZXJzKSAvIHRvdGFsX3RleGVsczsKLQkJCWRlYnVnX3ByaW50Zigic2VsZWN0b3JfY29kZWJvb2tfYnBwX2VzdDogJWZcbiIsIHNlbGVjdG9yX2NvZGVib29rX2JwcF9lc3QpOwotCQkJY29uc3QgZmxvYXQgZm9yY2VfZ2xvYmFsX3NlbF9wYWxfYnBwX3RocmVzaG9sZCA9IC4xNWY7Ci0JCQlpZiAoKHRvdGFsX3RleGVscyA8PSAxMjguMGYqMTI4LjBmKSAmJiAoc2VsZWN0b3JfY29kZWJvb2tfYnBwX2VzdCA+IGZvcmNlX2dsb2JhbF9zZWxfcGFsX2JwcF90aHJlc2hvbGQpKQotCQkJewotCQkJCW1fYXV0b19nbG9iYWxfc2VsX3BhbCA9IHRydWU7Ci0JCQkJZGVidWdfcHJpbnRmKCJBdXRvIGdsb2JhbCBzZWxlY3RvciBwYWxldHRlIGVuYWJsZWRcbiIpOwotCQkJfQotCQl9Ci0KKwkJCQkKIAkJYmFzaXN1X2Zyb250ZW5kOjpwYXJhbXMgcDsKIAkJcC5tX251bV9zb3VyY2VfYmxvY2tzID0gbV90b3RhbF9ibG9ja3M7CiAJCXAubV9wU291cmNlX2Jsb2NrcyA9ICZtX3NvdXJjZV9ibG9ja3NbMF07CkBAIC0xMTM3LDI3ICsxMTY1LDI0IEBACiAJCXAubV90ZXhfdHlwZSA9IG1fcGFyYW1zLm1fdGV4X3R5cGU7CiAJCXAubV9tdWx0aXRocmVhZGVkID0gbV9wYXJhbXMubV9tdWx0aXRocmVhZGluZzsKIAkJcC5tX2Rpc2FibGVfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rcyA9IG1fcGFyYW1zLm1fZGlzYWJsZV9oaWVyYXJjaGljYWxfZW5kcG9pbnRfY29kZWJvb2tzOwotCQlwLm1fdmFsaWRhdGUgPSBtX3BhcmFtcy5tX3ZhbGlkYXRlOworCQlwLm1fdmFsaWRhdGUgPSBtX3BhcmFtcy5tX3ZhbGlkYXRlX2V0YzFzOwogCQlwLm1fcEpvYl9wb29sID0gbV9wYXJhbXMubV9wSm9iX3Bvb2w7CiAJCXAubV9wR2xvYmFsX2NvZGVib29rcyA9IG1fcGFyYW1zLm1fcEdsb2JhbF9jb2RlYm9va3M7Ci0KLQkJaWYgKChtX3BhcmFtcy5tX2dsb2JhbF9zZWxfcGFsKSB8fCAobV9hdXRvX2dsb2JhbF9zZWxfcGFsKSkKLQkJewotCQkJcC5tX3BHbG9iYWxfc2VsX2NvZGVib29rID0gbV9wYXJhbXMubV9wU2VsX2NvZGVib29rOwotCQkJcC5tX251bV9nbG9iYWxfc2VsX2NvZGVib29rX3BhbF9iaXRzID0gbV9wYXJhbXMubV9nbG9iYWxfcGFsX2JpdHM7Ci0JCQlwLm1fbnVtX2dsb2JhbF9zZWxfY29kZWJvb2tfbW9kX2JpdHMgPSBtX3BhcmFtcy5tX2dsb2JhbF9tb2RfYml0czsKLQkJCXAubV91c2VfaHlicmlkX3NlbGVjdG9yX2NvZGVib29rcyA9ICFtX3BhcmFtcy5tX25vX2h5YnJpZF9zZWxfY2I7Ci0JCQlwLm1faHlicmlkX2NvZGVib29rX3F1YWxpdHlfdGhyZXNoID0gbV9wYXJhbXMubV9oeWJyaWRfc2VsX2NiX3F1YWxpdHlfdGhyZXNoOwotCQl9CisJCQorCQkvLyBEb24ndCBrZWVwIHRyeWluZyB0byB1c2UgT3BlbkNMIGlmIGl0IGV2ZXIgZmFpbHMuCisJCXAubV9wT3BlbkNMX2NvbnRleHQgPSAhbV9vcGVuY2xfZmFpbGVkID8gbV9wT3BlbkNMX2NvbnRleHQgOiBudWxscHRyOwogCiAJCWlmICghbV9mcm9udGVuZC5pbml0KHApKQogCQl7CiAJCQllcnJvcl9wcmludGYoImJhc2lzdV9mcm9udGVuZDo6aW5pdCgpIGZhaWxlZCFcbiIpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0KKwkJCQkKIAkJbV9mcm9udGVuZC5jb21wcmVzcygpOwogCisJCWlmIChtX2Zyb250ZW5kLmdldF9vcGVuY2xfZmFpbGVkKCkpCisJCQltX29wZW5jbF9mYWlsZWQgPSB0cnVlOworCiAJCWlmIChtX3BhcmFtcy5tX2RlYnVnX2ltYWdlcykKIAkJewogCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fc2xpY2VfZGVzY3Muc2l6ZSgpOyBpKyspCkBAIC0xMTg0LDYgKzEyMDksOSBAQAogCiAJYm9vbCBiYXNpc19jb21wcmVzc29yOjpleHRyYWN0X2Zyb250ZW5kX3RleHR1cmVfZGF0YSgpCiAJeworCQlpZiAoIW1fcGFyYW1zLm1fY29tcHV0ZV9zdGF0cykKKwkJCXJldHVybiB0cnVlOworCiAJCWRlYnVnX3ByaW50ZigiYmFzaXNfY29tcHJlc3Nvcjo6ZXh0cmFjdF9mcm9udGVuZF90ZXh0dXJlX2RhdGFcbiIpOwogCiAJCW1fZnJvbnRlbmRfb3V0cHV0X3RleHR1cmVzLnJlc2l6ZShtX3NsaWNlX2Rlc2NzLnNpemUoKSk7CkBAIC0xMjQyLDEzICsxMjcwLDEwIEBACiAJCWlmICghbV9wYXJhbXMubV9ub19zZWxlY3Rvcl9yZG8pCiAJCQliYWNrZW5kX3BhcmFtcy5tX3NlbGVjdG9yX3Jkb19xdWFsaXR5X3RocmVzaCA9IG1fcGFyYW1zLm1fc2VsZWN0b3JfcmRvX3RocmVzaDsKIAkJCQkKLQkJYmFja2VuZF9wYXJhbXMubV91c2VfZ2xvYmFsX3NlbF9jb2RlYm9vayA9IChtX2Zyb250ZW5kLmdldF9wYXJhbXMoKS5tX3BHbG9iYWxfc2VsX2NvZGVib29rICE9IE5VTEwpOwotCQliYWNrZW5kX3BhcmFtcy5tX2dsb2JhbF9zZWxfY29kZWJvb2tfcGFsX2JpdHMgPSBtX2Zyb250ZW5kLmdldF9wYXJhbXMoKS5tX251bV9nbG9iYWxfc2VsX2NvZGVib29rX3BhbF9iaXRzOwotCQliYWNrZW5kX3BhcmFtcy5tX2dsb2JhbF9zZWxfY29kZWJvb2tfbW9kX2JpdHMgPSBtX2Zyb250ZW5kLmdldF9wYXJhbXMoKS5tX251bV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzOwotCQliYWNrZW5kX3BhcmFtcy5tX3VzZV9oeWJyaWRfc2VsX2NvZGVib29rcyA9IG1fZnJvbnRlbmQuZ2V0X3BhcmFtcygpLm1fdXNlX2h5YnJpZF9zZWxlY3Rvcl9jb2RlYm9va3M7CiAJCWJhY2tlbmRfcGFyYW1zLm1fdXNlZF9nbG9iYWxfY29kZWJvb2tzID0gbV9mcm9udGVuZC5nZXRfcGFyYW1zKCkubV9wR2xvYmFsX2NvZGVib29rcyAhPSBudWxscHRyOworCQliYWNrZW5kX3BhcmFtcy5tX3ZhbGlkYXRlID0gbV9wYXJhbXMubV92YWxpZGF0ZV9vdXRwdXRfZGF0YTsKIAotCQltX2JhY2tlbmQuaW5pdCgmbV9mcm9udGVuZCwgYmFja2VuZF9wYXJhbXMsIG1fc2xpY2VfZGVzY3MsIG1fcGFyYW1zLm1fcFNlbF9jb2RlYm9vayk7CisJCW1fYmFja2VuZC5pbml0KCZtX2Zyb250ZW5kLCBiYWNrZW5kX3BhcmFtcywgbV9zbGljZV9kZXNjcyk7CiAJCXVpbnQzMl90IHRvdGFsX3BhY2tlZF9ieXRlcyA9IG1fYmFja2VuZC5lbmNvZGUoKTsKIAogCQlpZiAoIXRvdGFsX3BhY2tlZF9ieXRlcykKQEAgLTEyNzgsMTQwICsxMzAzLDE0MyBAQAogCiAJCW1fb3V0cHV0X2Jhc2lzX2ZpbGUgPSBjb21wX2RhdGE7CiAKLQkJaW50ZXJ2YWxfdGltZXIgdG07Ci0JCXRtLnN0YXJ0KCk7Ci0KLQkJYmFzaXN0OjpiYXNpc3VfdHJhbnNjb2Rlcl9pbml0KCk7Ci0KLQkJZGVidWdfcHJpbnRmKCJiYXNpc3Q6OmJhc2lzdV90cmFuc2NvZGVyX2luaXQ6IFRvb2sgJWYgbXNcbiIsIHRtLmdldF9lbGFwc2VkX21zKCkpOwotCi0JCS8vIFZlcmlmeSB0aGUgY29tcHJlc3NlZCBkYXRhIGJ5IHRyYW5zY29kaW5nIGl0IHRvIEFTVEMgKG9yIEVUQzEpL0JDNyBhbmQgdmFsaWRhdGluZyB0aGUgQ1JDJ3MuCi0JCWJhc2lzdDo6YmFzaXN1X3RyYW5zY29kZXIgZGVjb2RlcihtX3BhcmFtcy5tX3BTZWxfY29kZWJvb2spOwotCQlpZiAoIWRlY29kZXIudmFsaWRhdGVfZmlsZV9jaGVja3N1bXMoJmNvbXBfZGF0YVswXSwgKHVpbnQzMl90KWNvbXBfZGF0YS5zaXplKCksIHRydWUpKQotCQl7Ci0JCQllcnJvcl9wcmludGYoImRlY29kZXIudmFsaWRhdGVfZmlsZV9jaGVja3N1bXMoKSBmYWlsZWQhXG4iKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCW1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXMucmVzaXplKG1fc2xpY2VfZGVzY3Muc2l6ZSgpKTsKLQkJbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZC5yZXNpemUobV9zbGljZV9kZXNjcy5zaXplKCkpOwotCi0JCW1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfYmM3LnJlc2l6ZShtX3NsaWNlX2Rlc2NzLnNpemUoKSk7Ci0JCW1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3LnJlc2l6ZShtX3NsaWNlX2Rlc2NzLnNpemUoKSk7Ci0JCQkJCQkJCQotCQl0bS5zdGFydCgpOwotCQlpZiAobV9wYXJhbXMubV9wR2xvYmFsX2NvZGVib29rcykKLQkJewotCQkJZGVjb2Rlci5zZXRfZ2xvYmFsX2NvZGVib29rcyhtX3BhcmFtcy5tX3BHbG9iYWxfY29kZWJvb2tzKTsKLQkJfQotCi0JCWlmICghZGVjb2Rlci5zdGFydF90cmFuc2NvZGluZygmY29tcF9kYXRhWzBdLCAodWludDMyX3QpY29tcF9kYXRhLnNpemUoKSkpCi0JCXsKLQkJCWVycm9yX3ByaW50ZigiZGVjb2Rlci5zdGFydF90cmFuc2NvZGluZygpIGZhaWxlZCFcbiIpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZG91YmxlIHN0YXJ0X3RyYW5zY29kaW5nX3RpbWUgPSB0bS5nZXRfZWxhcHNlZF9zZWNzKCk7Ci0KLQkJZGVidWdfcHJpbnRmKCJiYXNpc3VfY29tcHJlc3Nvcjo6c3RhcnRfdHJhbnNjb2RpbmcoKSB0b29rICUzLjNmbXNcbiIsIHN0YXJ0X3RyYW5zY29kaW5nX3RpbWUgKiAxMDAwLjBmKTsKLQotCQl1aW50MzJfdCB0b3RhbF9vcmlnX3BpeGVscyA9IDA7Ci0JCXVpbnQzMl90IHRvdGFsX3RleGVscyA9IDA7Ci0KLQkJZG91YmxlIHRvdGFsX3RpbWVfZXRjMXNfb3JfYXN0YyA9IDA7Ci0KKwkJdWludDMyX3QgdG90YWxfb3JpZ19waXhlbHMgPSAwLCB0b3RhbF90ZXhlbHMgPSAwLCB0b3RhbF9vcmlnX3RleGVscyA9IDA7CiAJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3NsaWNlX2Rlc2NzLnNpemUoKTsgaSsrKQogCQl7Ci0JCQlncHVfaW1hZ2UgZGVjb2RlZF90ZXh0dXJlOwotCQkJZGVjb2RlZF90ZXh0dXJlLmluaXQobV9wYXJhbXMubV91YXN0YyA/IHRleHR1cmVfZm9ybWF0OjpjQVNUQzR4NCA6IHRleHR1cmVfZm9ybWF0OjpjRVRDMSwgbV9zbGljZV9kZXNjc1tpXS5tX3dpZHRoLCBtX3NsaWNlX2Rlc2NzW2ldLm1faGVpZ2h0KTsKLQkJCQkJCQotCQkJdG0uc3RhcnQoKTsKKwkJCWNvbnN0IGJhc2lzdV9iYWNrZW5kX3NsaWNlX2Rlc2MmIHNsaWNlX2Rlc2MgPSBtX3NsaWNlX2Rlc2NzW2ldOwogCi0JCQliYXNpc3Q6OmJsb2NrX2Zvcm1hdCBmb3JtYXQgPSBtX3BhcmFtcy5tX3Vhc3RjID8gYmFzaXN0OjpibG9ja19mb3JtYXQ6OmNBU1RDXzR4NCA6IGJhc2lzdDo6YmxvY2tfZm9ybWF0OjpjRVRDMTsKLQkJCXVpbnQzMl90IGJ5dGVzX3Blcl9ibG9jayA9IG1fcGFyYW1zLm1fdWFzdGMgPyAxNiA6IDg7Ci0JCQkJCQkKLQkJCWlmICghZGVjb2Rlci50cmFuc2NvZGVfc2xpY2UoJmNvbXBfZGF0YVswXSwgKHVpbnQzMl90KWNvbXBfZGF0YS5zaXplKCksIGksCi0JCQkJcmVpbnRlcnByZXRfY2FzdDxldGNfYmxvY2sgKj4oZGVjb2RlZF90ZXh0dXJlLmdldF9wdHIoKSksIG1fc2xpY2VfZGVzY3NbaV0ubV9udW1fYmxvY2tzX3ggKiBtX3NsaWNlX2Rlc2NzW2ldLm1fbnVtX2Jsb2Nrc195LCBmb3JtYXQsIGJ5dGVzX3Blcl9ibG9jaykpCi0JCQl7Ci0JCQkJZXJyb3JfcHJpbnRmKCJUcmFuc2NvZGluZyBmYWlsZWQgb24gc2xpY2UgJXUhXG4iLCBpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXRvdGFsX3RpbWVfZXRjMXNfb3JfYXN0YyArPSB0bS5nZXRfZWxhcHNlZF9zZWNzKCk7Ci0KLQkJCWlmIChlbmNvZGVkX291dHB1dC5tX3RleF9mb3JtYXQgPT0gYmFzaXN0OjpiYXNpc190ZXhfZm9ybWF0OjpjRVRDMVMpCi0JCQl7Ci0JCQkJdWludDMyX3QgaW1hZ2VfY3JjMTYgPSBiYXNpc3Q6OmNyYzE2KGRlY29kZWRfdGV4dHVyZS5nZXRfcHRyKCksIGRlY29kZWRfdGV4dHVyZS5nZXRfc2l6ZV9pbl9ieXRlcygpLCAwKTsKLQkJCQlpZiAoaW1hZ2VfY3JjMTYgIT0gZW5jb2RlZF9vdXRwdXQubV9zbGljZV9pbWFnZV9jcmNzW2ldKQotCQkJCXsKLQkJCQkJZXJyb3JfcHJpbnRmKCJEZWNvZGVkIGltYWdlIGRhdGEgQ1JDIGNoZWNrIGZhaWxlZCBvbiBzbGljZSAldSFcbiIsIGkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWRlYnVnX3ByaW50ZigiRGVjb2RlZCBpbWFnZSBkYXRhIENSQyBjaGVjayBzdWNjZWVkZWQgb24gc2xpY2UgJWlcbiIsIGkpOwotCQkJfQotCi0JCQltX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzW2ldID0gZGVjb2RlZF90ZXh0dXJlOwotCi0JCQl0b3RhbF9vcmlnX3BpeGVscyArPSBtX3NsaWNlX2Rlc2NzW2ldLm1fb3JpZ193aWR0aCAqIG1fc2xpY2VfZGVzY3NbaV0ubV9vcmlnX2hlaWdodDsKLQkJCXRvdGFsX3RleGVscyArPSBtX3NsaWNlX2Rlc2NzW2ldLm1fd2lkdGggKiBtX3NsaWNlX2Rlc2NzW2ldLm1faGVpZ2h0OwotCQl9Ci0JCQkJCQkJCQkJCQkKLQkJZG91YmxlIHRvdGFsX3RpbWVfYmM3ID0gMDsKLQotCQlpZiAoYmFzaXN0OjpiYXNpc19pc19mb3JtYXRfc3VwcG9ydGVkKGJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM3X1JHQkEsIGJhc2lzdDo6YmFzaXNfdGV4X2Zvcm1hdDo6Y1VBU1RDNHg0KSAmJgotCQkJYmFzaXN0OjpiYXNpc19pc19mb3JtYXRfc3VwcG9ydGVkKGJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM3X1JHQkEsIGJhc2lzdDo6YmFzaXNfdGV4X2Zvcm1hdDo6Y0VUQzFTKSkKLQkJewotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fc2xpY2VfZGVzY3Muc2l6ZSgpOyBpKyspCi0JCQl7Ci0JCQkJZ3B1X2ltYWdlIGRlY29kZWRfdGV4dHVyZTsKLQkJCQlkZWNvZGVkX3RleHR1cmUuaW5pdCh0ZXh0dXJlX2Zvcm1hdDo6Y0JDNywgbV9zbGljZV9kZXNjc1tpXS5tX3dpZHRoLCBtX3NsaWNlX2Rlc2NzW2ldLm1faGVpZ2h0KTsKLQotCQkJCXRtLnN0YXJ0KCk7Ci0KLQkJCQlpZiAoIWRlY29kZXIudHJhbnNjb2RlX3NsaWNlKCZjb21wX2RhdGFbMF0sICh1aW50MzJfdCljb21wX2RhdGEuc2l6ZSgpLCBpLAotCQkJCQlyZWludGVycHJldF9jYXN0PGV0Y19ibG9jayo+KGRlY29kZWRfdGV4dHVyZS5nZXRfcHRyKCkpLCBtX3NsaWNlX2Rlc2NzW2ldLm1fbnVtX2Jsb2Nrc194ICogbV9zbGljZV9kZXNjc1tpXS5tX251bV9ibG9ja3NfeSwgYmFzaXN0OjpibG9ja19mb3JtYXQ6OmNCQzcsIDE2KSkKLQkJCQl7Ci0JCQkJCWVycm9yX3ByaW50ZigiVHJhbnNjb2RpbmcgZmFpbGVkIHRvIEJDNyBvbiBzbGljZSAldSFcbiIsIGkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJdG90YWxfdGltZV9iYzcgKz0gdG0uZ2V0X2VsYXBzZWRfc2VjcygpOwotCi0JCQkJbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc19iYzdbaV0gPSBkZWNvZGVkX3RleHR1cmU7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9zbGljZV9kZXNjcy5zaXplKCk7IGkrKykKLQkJewotCQkJbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc1tpXS51bnBhY2sobV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZFtpXSk7Ci0KLQkJCWlmIChtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX2JjN1tpXS5nZXRfcGl4ZWxfd2lkdGgoKSkKLQkJCQltX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX2JjN1tpXS51bnBhY2sobV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZF9iYzdbaV0pOwotCQl9Ci0KLQkJZGVidWdfcHJpbnRmKCJUcmFuc2NvZGVkIHRvICVzIGluICUzLjNmbXMsICVmIHRleGVscy9zZWNcbiIsIG1fcGFyYW1zLm1fdWFzdGMgPyAiQVNUQyIgOiAiRVRDMSIsIHRvdGFsX3RpbWVfZXRjMXNfb3JfYXN0YyAqIDEwMDAuMGYsIHRvdGFsX29yaWdfcGl4ZWxzIC8gdG90YWxfdGltZV9ldGMxc19vcl9hc3RjKTsKLQotCQlpZiAodG90YWxfdGltZV9iYzcgIT0gMCkKLQkJCWRlYnVnX3ByaW50ZigiVHJhbnNjb2RlZCB0byBCQzcgaW4gJTMuM2ZtcywgJWYgdGV4ZWxzL3NlY1xuIiwgdG90YWxfdGltZV9iYzcgKiAxMDAwLjBmLCB0b3RhbF9vcmlnX3BpeGVscyAvIHRvdGFsX3RpbWVfYmM3KTsKLQotCQlkZWJ1Z19wcmludGYoIlRvdGFsIC5iYXNpcyBvdXRwdXQgZmlsZSBzaXplOiAldSwgJTMuM2YgYml0cy90ZXhlbFxuIiwgY29tcF9kYXRhLnNpemUoKSwgY29tcF9kYXRhLnNpemUoKSAqIDguMGYgLyB0b3RhbF9vcmlnX3BpeGVscyk7Ci0JCQkJCi0JCXVpbnQzMl90IHRvdGFsX29yaWdfdGV4ZWxzID0gMDsKLQkJZm9yICh1aW50MzJfdCBzbGljZV9pbmRleCA9IDA7IHNsaWNlX2luZGV4IDwgbV9zbGljZV9kZXNjcy5zaXplKCk7IHNsaWNlX2luZGV4KyspCi0JCXsKLQkJCWNvbnN0IGJhc2lzdV9iYWNrZW5kX3NsaWNlX2Rlc2MgJnNsaWNlX2Rlc2MgPSBtX3NsaWNlX2Rlc2NzW3NsaWNlX2luZGV4XTsKLQotCQkJdG90YWxfb3JpZ190ZXhlbHMgKz0gc2xpY2VfZGVzYy5tX29yaWdfd2lkdGggKiBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQ7Ci0KLQkJCWNvbnN0IHVpbnQzMl90IHRvdGFsX2Jsb2NrcyA9IHNsaWNlX2Rlc2MubV9udW1fYmxvY2tzX3ggKiBzbGljZV9kZXNjLm1fbnVtX2Jsb2Nrc195OwotCQkJQkFTSVNVX05PVEVfVU5VU0VEKHRvdGFsX2Jsb2Nrcyk7Ci0KLQkJCWFzc2VydChtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzW3NsaWNlX2luZGV4XS5nZXRfdG90YWxfYmxvY2tzKCkgPT0gdG90YWxfYmxvY2tzKTsKKwkJCXRvdGFsX29yaWdfcGl4ZWxzICs9IHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoICogc2xpY2VfZGVzYy5tX29yaWdfaGVpZ2h0OworCQkJdG90YWxfdGV4ZWxzICs9IHNsaWNlX2Rlc2MubV93aWR0aCAqIHNsaWNlX2Rlc2MubV9oZWlnaHQ7CiAJCX0KIAogCQltX2Jhc2lzX2ZpbGVfc2l6ZSA9ICh1aW50MzJfdCljb21wX2RhdGEuc2l6ZSgpOwotCQltX2Jhc2lzX2JpdHNfcGVyX3RleGVsID0gKGNvbXBfZGF0YS5zaXplKCkgKiA4LjBmKSAvIHRvdGFsX29yaWdfdGV4ZWxzOworCQltX2Jhc2lzX2JpdHNfcGVyX3RleGVsID0gdG90YWxfb3JpZ190ZXhlbHMgPyAoY29tcF9kYXRhLnNpemUoKSAqIDguMGYpIC8gdG90YWxfb3JpZ190ZXhlbHMgOiAwOwogCisJCWRlYnVnX3ByaW50ZigiVG90YWwgLmJhc2lzIG91dHB1dCBmaWxlIHNpemU6ICV1LCAlMy4zZiBiaXRzL3RleGVsXG4iLCBjb21wX2RhdGEuc2l6ZSgpLCBjb21wX2RhdGEuc2l6ZSgpICogOC4wZiAvIHRvdGFsX29yaWdfcGl4ZWxzKTsKKworCQlpZiAobV9wYXJhbXMubV92YWxpZGF0ZV9vdXRwdXRfZGF0YSkKKwkJeworCQkJaW50ZXJ2YWxfdGltZXIgdG07CisJCQl0bS5zdGFydCgpOworCisJCQliYXNpc3Q6OmJhc2lzdV90cmFuc2NvZGVyX2luaXQoKTsKKworCQkJZGVidWdfcHJpbnRmKCJiYXNpc3Q6OmJhc2lzdV90cmFuc2NvZGVyX2luaXQ6IFRvb2sgJWYgbXNcbiIsIHRtLmdldF9lbGFwc2VkX21zKCkpOworCisJCQkvLyBWZXJpZnkgdGhlIGNvbXByZXNzZWQgZGF0YSBieSB0cmFuc2NvZGluZyBpdCB0byBBU1RDIChvciBFVEMxKS9CQzcgYW5kIHZhbGlkYXRpbmcgdGhlIENSQydzLgorCQkJYmFzaXN0OjpiYXNpc3VfdHJhbnNjb2RlciBkZWNvZGVyOworCQkJaWYgKCFkZWNvZGVyLnZhbGlkYXRlX2ZpbGVfY2hlY2tzdW1zKCZjb21wX2RhdGFbMF0sICh1aW50MzJfdCljb21wX2RhdGEuc2l6ZSgpLCB0cnVlKSkKKwkJCXsKKwkJCQllcnJvcl9wcmludGYoImRlY29kZXIudmFsaWRhdGVfZmlsZV9jaGVja3N1bXMoKSBmYWlsZWQhXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCW1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXMucmVzaXplKG1fc2xpY2VfZGVzY3Muc2l6ZSgpKTsKKwkJCW1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWQucmVzaXplKG1fc2xpY2VfZGVzY3Muc2l6ZSgpKTsKKworCQkJbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc19iYzcucmVzaXplKG1fc2xpY2VfZGVzY3Muc2l6ZSgpKTsKKwkJCW1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3LnJlc2l6ZShtX3NsaWNlX2Rlc2NzLnNpemUoKSk7CisKKwkJCXRtLnN0YXJ0KCk7CisJCQlpZiAobV9wYXJhbXMubV9wR2xvYmFsX2NvZGVib29rcykKKwkJCXsKKwkJCQlkZWNvZGVyLnNldF9nbG9iYWxfY29kZWJvb2tzKG1fcGFyYW1zLm1fcEdsb2JhbF9jb2RlYm9va3MpOworCQkJfQorCisJCQlpZiAoIWRlY29kZXIuc3RhcnRfdHJhbnNjb2RpbmcoJmNvbXBfZGF0YVswXSwgKHVpbnQzMl90KWNvbXBfZGF0YS5zaXplKCkpKQorCQkJeworCQkJCWVycm9yX3ByaW50ZigiZGVjb2Rlci5zdGFydF90cmFuc2NvZGluZygpIGZhaWxlZCFcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJZG91YmxlIHN0YXJ0X3RyYW5zY29kaW5nX3RpbWUgPSB0bS5nZXRfZWxhcHNlZF9zZWNzKCk7CisKKwkJCWRlYnVnX3ByaW50ZigiYmFzaXN1X2NvbXByZXNzb3I6OnN0YXJ0X3RyYW5zY29kaW5nKCkgdG9vayAlMy4zZm1zXG4iLCBzdGFydF90cmFuc2NvZGluZ190aW1lICogMTAwMC4wZik7CisKKwkJCWRvdWJsZSB0b3RhbF90aW1lX2V0YzFzX29yX2FzdGMgPSAwOworCisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9zbGljZV9kZXNjcy5zaXplKCk7IGkrKykKKwkJCXsKKwkJCQlncHVfaW1hZ2UgZGVjb2RlZF90ZXh0dXJlOworCQkJCWRlY29kZWRfdGV4dHVyZS5pbml0KG1fcGFyYW1zLm1fdWFzdGMgPyB0ZXh0dXJlX2Zvcm1hdDo6Y1VBU1RDNHg0IDogdGV4dHVyZV9mb3JtYXQ6OmNFVEMxLCBtX3NsaWNlX2Rlc2NzW2ldLm1fd2lkdGgsIG1fc2xpY2VfZGVzY3NbaV0ubV9oZWlnaHQpOworCisJCQkJdG0uc3RhcnQoKTsKKworCQkJCWJhc2lzdDo6YmxvY2tfZm9ybWF0IGZvcm1hdCA9IG1fcGFyYW1zLm1fdWFzdGMgPyBiYXNpc3Q6OmJsb2NrX2Zvcm1hdDo6Y1VBU1RDXzR4NCA6IGJhc2lzdDo6YmxvY2tfZm9ybWF0OjpjRVRDMTsKKwkJCQl1aW50MzJfdCBieXRlc19wZXJfYmxvY2sgPSBtX3BhcmFtcy5tX3Vhc3RjID8gMTYgOiA4OworCisJCQkJaWYgKCFkZWNvZGVyLnRyYW5zY29kZV9zbGljZSgmY29tcF9kYXRhWzBdLCAodWludDMyX3QpY29tcF9kYXRhLnNpemUoKSwgaSwKKwkJCQkJcmVpbnRlcnByZXRfY2FzdDxldGNfYmxvY2sqPihkZWNvZGVkX3RleHR1cmUuZ2V0X3B0cigpKSwgbV9zbGljZV9kZXNjc1tpXS5tX251bV9ibG9ja3NfeCAqIG1fc2xpY2VfZGVzY3NbaV0ubV9udW1fYmxvY2tzX3ksIGZvcm1hdCwgYnl0ZXNfcGVyX2Jsb2NrKSkKKwkJCQl7CisJCQkJCWVycm9yX3ByaW50ZigiVHJhbnNjb2RpbmcgZmFpbGVkIG9uIHNsaWNlICV1IVxuIiwgaSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCQl0b3RhbF90aW1lX2V0YzFzX29yX2FzdGMgKz0gdG0uZ2V0X2VsYXBzZWRfc2VjcygpOworCisJCQkJaWYgKGVuY29kZWRfb3V0cHV0Lm1fdGV4X2Zvcm1hdCA9PSBiYXNpc3Q6OmJhc2lzX3RleF9mb3JtYXQ6OmNFVEMxUykKKwkJCQl7CisJCQkJCXVpbnQzMl90IGltYWdlX2NyYzE2ID0gYmFzaXN0OjpjcmMxNihkZWNvZGVkX3RleHR1cmUuZ2V0X3B0cigpLCBkZWNvZGVkX3RleHR1cmUuZ2V0X3NpemVfaW5fYnl0ZXMoKSwgMCk7CisJCQkJCWlmIChpbWFnZV9jcmMxNiAhPSBlbmNvZGVkX291dHB1dC5tX3NsaWNlX2ltYWdlX2NyY3NbaV0pCisJCQkJCXsKKwkJCQkJCWVycm9yX3ByaW50ZigiRGVjb2RlZCBpbWFnZSBkYXRhIENSQyBjaGVjayBmYWlsZWQgb24gc2xpY2UgJXUhXG4iLCBpKTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlkZWJ1Z19wcmludGYoIkRlY29kZWQgaW1hZ2UgZGF0YSBDUkMgY2hlY2sgc3VjY2VlZGVkIG9uIHNsaWNlICVpXG4iLCBpKTsKKwkJCQl9CisKKwkJCQltX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzW2ldID0gZGVjb2RlZF90ZXh0dXJlOworCQkJfQorCisJCQlkb3VibGUgdG90YWxfdGltZV9iYzcgPSAwOworCisJCQlpZiAoYmFzaXN0OjpiYXNpc19pc19mb3JtYXRfc3VwcG9ydGVkKGJhc2lzdDo6dHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdDo6Y1RGQkM3X1JHQkEsIGJhc2lzdDo6YmFzaXNfdGV4X2Zvcm1hdDo6Y1VBU1RDNHg0KSAmJgorCQkJCWJhc2lzdDo6YmFzaXNfaXNfZm9ybWF0X3N1cHBvcnRlZChiYXNpc3Q6OnRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ6OmNURkJDN19SR0JBLCBiYXNpc3Q6OmJhc2lzX3RleF9mb3JtYXQ6OmNFVEMxUykpCisJCQl7CisJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fc2xpY2VfZGVzY3Muc2l6ZSgpOyBpKyspCisJCQkJeworCQkJCQlncHVfaW1hZ2UgZGVjb2RlZF90ZXh0dXJlOworCQkJCQlkZWNvZGVkX3RleHR1cmUuaW5pdCh0ZXh0dXJlX2Zvcm1hdDo6Y0JDNywgbV9zbGljZV9kZXNjc1tpXS5tX3dpZHRoLCBtX3NsaWNlX2Rlc2NzW2ldLm1faGVpZ2h0KTsKKworCQkJCQl0bS5zdGFydCgpOworCisJCQkJCWlmICghZGVjb2Rlci50cmFuc2NvZGVfc2xpY2UoJmNvbXBfZGF0YVswXSwgKHVpbnQzMl90KWNvbXBfZGF0YS5zaXplKCksIGksCisJCQkJCQlyZWludGVycHJldF9jYXN0PGV0Y19ibG9jayo+KGRlY29kZWRfdGV4dHVyZS5nZXRfcHRyKCkpLCBtX3NsaWNlX2Rlc2NzW2ldLm1fbnVtX2Jsb2Nrc194ICogbV9zbGljZV9kZXNjc1tpXS5tX251bV9ibG9ja3NfeSwgYmFzaXN0OjpibG9ja19mb3JtYXQ6OmNCQzcsIDE2KSkKKwkJCQkJeworCQkJCQkJZXJyb3JfcHJpbnRmKCJUcmFuc2NvZGluZyBmYWlsZWQgdG8gQkM3IG9uIHNsaWNlICV1IVxuIiwgaSk7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKworCQkJCQl0b3RhbF90aW1lX2JjNyArPSB0bS5nZXRfZWxhcHNlZF9zZWNzKCk7CisKKwkJCQkJbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc19iYzdbaV0gPSBkZWNvZGVkX3RleHR1cmU7CisJCQkJfQorCQkJfQorCisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9zbGljZV9kZXNjcy5zaXplKCk7IGkrKykKKwkJCXsKKwkJCQltX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzW2ldLnVucGFjayhtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW2ldKTsKKworCQkJCWlmIChtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX2JjN1tpXS5nZXRfcGl4ZWxfd2lkdGgoKSkKKwkJCQkJbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc19iYzdbaV0udW5wYWNrKG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W2ldKTsKKwkJCX0KKworCQkJZGVidWdfcHJpbnRmKCJUcmFuc2NvZGVkIHRvICVzIGluICUzLjNmbXMsICVmIHRleGVscy9zZWNcbiIsIG1fcGFyYW1zLm1fdWFzdGMgPyAiQVNUQyIgOiAiRVRDMSIsIHRvdGFsX3RpbWVfZXRjMXNfb3JfYXN0YyAqIDEwMDAuMGYsIHRvdGFsX29yaWdfcGl4ZWxzIC8gdG90YWxfdGltZV9ldGMxc19vcl9hc3RjKTsKKworCQkJaWYgKHRvdGFsX3RpbWVfYmM3ICE9IDApCisJCQkJZGVidWdfcHJpbnRmKCJUcmFuc2NvZGVkIHRvIEJDNyBpbiAlMy4zZm1zLCAlZiB0ZXhlbHMvc2VjXG4iLCB0b3RhbF90aW1lX2JjNyAqIDEwMDAuMGYsIHRvdGFsX29yaWdfcGl4ZWxzIC8gdG90YWxfdGltZV9iYzcpOworCisJCQlmb3IgKHVpbnQzMl90IHNsaWNlX2luZGV4ID0gMDsgc2xpY2VfaW5kZXggPCBtX3NsaWNlX2Rlc2NzLnNpemUoKTsgc2xpY2VfaW5kZXgrKykKKwkJCXsKKwkJCQljb25zdCBiYXNpc3VfYmFja2VuZF9zbGljZV9kZXNjJiBzbGljZV9kZXNjID0gbV9zbGljZV9kZXNjc1tzbGljZV9pbmRleF07CisKKwkJCQljb25zdCB1aW50MzJfdCB0b3RhbF9ibG9ja3MgPSBzbGljZV9kZXNjLm1fbnVtX2Jsb2Nrc194ICogc2xpY2VfZGVzYy5tX251bV9ibG9ja3NfeTsKKwkJCQlCQVNJU1VfTk9URV9VTlVTRUQodG90YWxfYmxvY2tzKTsKKworCQkJCWFzc2VydChtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzW3NsaWNlX2luZGV4XS5nZXRfdG90YWxfYmxvY2tzKCkgPT0gdG90YWxfYmxvY2tzKTsKKwkJCX0KKwkJfSAvLyBpZiAobV9wYXJhbXMubV92YWxpZGF0ZV9vdXRwdXRfZGF0YSkKKwkJCQkKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC0xNDY1LDE3NSArMTQ5MywxNzEgQEAKIAogCQltX3N0YXRzLnJlc2l6ZShtX3NsaWNlX2Rlc2NzLnNpemUoKSk7CiAJCQotCQl1aW50MzJfdCB0b3RhbF9vcmlnX3RleGVscyA9IDA7Ci0KLQkJZm9yICh1aW50MzJfdCBzbGljZV9pbmRleCA9IDA7IHNsaWNlX2luZGV4IDwgbV9zbGljZV9kZXNjcy5zaXplKCk7IHNsaWNlX2luZGV4KyspCisJCWlmIChtX3BhcmFtcy5tX3ZhbGlkYXRlX291dHB1dF9kYXRhKQogCQl7Ci0JCQljb25zdCBiYXNpc3VfYmFja2VuZF9zbGljZV9kZXNjICZzbGljZV9kZXNjID0gbV9zbGljZV9kZXNjc1tzbGljZV9pbmRleF07Ci0JCQkJCQkKLQkJCXRvdGFsX29yaWdfdGV4ZWxzICs9IHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoICogc2xpY2VfZGVzYy5tX29yaWdfaGVpZ2h0OwotCi0JCQlpZiAobV9wYXJhbXMubV9jb21wdXRlX3N0YXRzKQorCQkJZm9yICh1aW50MzJfdCBzbGljZV9pbmRleCA9IDA7IHNsaWNlX2luZGV4IDwgbV9zbGljZV9kZXNjcy5zaXplKCk7IHNsaWNlX2luZGV4KyspCiAJCQl7Ci0JCQkJcHJpbnRmKCJTbGljZTogJXVcbiIsIHNsaWNlX2luZGV4KTsKKwkJCQljb25zdCBiYXNpc3VfYmFja2VuZF9zbGljZV9kZXNjJiBzbGljZV9kZXNjID0gbV9zbGljZV9kZXNjc1tzbGljZV9pbmRleF07CiAKLQkJCQlpbWFnZV9zdGF0cyAmcyA9IG1fc3RhdHNbc2xpY2VfaW5kZXhdOwotCi0JCQkJLy8gVE9ETzogV2UgdXNlZCB0byBvdXRwdXQgU1NJTSAoZHVyaW5nIGhlYXZ5IGVuY29kZXIgZGV2ZWxvcG1lbnQpLCBidXQgdGhpcyBzbG93ZWQgZG93biBjb21wcmVzc2lvbiB0b28gbXVjaC4gV2UnbGwgYmUgYWRkaW5nIGl0IGJhY2suCi0KLQkJCQlpbWFnZV9tZXRyaWNzIGVtOwotCQkJCQkJCQkKLQkJCQkvLyAtLS0tIC5iYXNpcyBzdGF0cwotCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMCwgMyk7Ci0JCQkJZW0ucHJpbnQoIi5iYXNpcyBSR0IgQXZnOiAgICAgICAgICAiKTsKLQkJCQlzLm1fYmFzaXNfcmdiX2F2Z19wc25yID0gZW0ubV9wc25yOwotCi0JCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRbc2xpY2VfaW5kZXhdLCAwLCA0KTsKLQkJCQllbS5wcmludCgiLmJhc2lzIFJHQkEgQXZnOiAgICAgICAgICIpOwotCQkJCXMubV9iYXNpc19yZ2JhX2F2Z19wc25yID0gZW0ubV9wc25yOwotCi0JCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRbc2xpY2VfaW5kZXhdLCAwLCAxKTsKLQkJCQllbS5wcmludCgiLmJhc2lzIFIgICBBdmc6ICAgICAgICAgICIpOwotCQkJCQotCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMSwgMSk7Ci0JCQkJZW0ucHJpbnQoIi5iYXNpcyBHICAgQXZnOiAgICAgICAgICAiKTsKLQkJCQkKLQkJCQllbS5jYWxjKG1fc2xpY2VfaW1hZ2VzW3NsaWNlX2luZGV4XSwgbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZFtzbGljZV9pbmRleF0sIDIsIDEpOwotCQkJCWVtLnByaW50KCIuYmFzaXMgQiAgIEF2ZzogICAgICAgICAgIik7Ci0KLQkJCQlpZiAobV9wYXJhbXMubV91YXN0YykKKwkJCQlpZiAobV9wYXJhbXMubV9jb21wdXRlX3N0YXRzKQogCQkJCXsKLQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRbc2xpY2VfaW5kZXhdLCAzLCAxKTsKLQkJCQkJZW0ucHJpbnQoIi5iYXNpcyBBICAgQXZnOiAgICAgICAgICAiKTsKKwkJCQkJcHJpbnRmKCJTbGljZTogJXVcbiIsIHNsaWNlX2luZGV4KTsKIAotCQkJCQlzLm1fYmFzaXNfYV9hdmdfcHNuciA9IGVtLm1fcHNucjsKLQkJCQl9CisJCQkJCWltYWdlX3N0YXRzJiBzID0gbV9zdGF0c1tzbGljZV9pbmRleF07CiAKLQkJCQllbS5jYWxjKG1fc2xpY2VfaW1hZ2VzW3NsaWNlX2luZGV4XSwgbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZFtzbGljZV9pbmRleF0sIDAsIDApOwotCQkJCWVtLnByaW50KCIuYmFzaXMgNzA5IEx1bWE6ICAgICAgICAgIik7Ci0JCQkJcy5tX2Jhc2lzX2x1bWFfNzA5X3BzbnIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZW0ubV9wc25yKTsKLQkJCQlzLm1fYmFzaXNfbHVtYV83MDlfc3NpbSA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3NzaW0pOworCQkJCQkvLyBUT0RPOiBXZSB1c2VkIHRvIG91dHB1dCBTU0lNIChkdXJpbmcgaGVhdnkgZW5jb2RlciBkZXZlbG9wbWVudCksIGJ1dCB0aGlzIHNsb3dlZCBkb3duIGNvbXByZXNzaW9uIHRvbyBtdWNoLiBXZSdsbCBiZSBhZGRpbmcgaXQgYmFjay4KIAotCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMCwgMCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJZW0ucHJpbnQoIi5iYXNpcyA2MDEgTHVtYTogICAgICAgICAiKTsKLQkJCQlzLm1fYmFzaXNfbHVtYV82MDFfcHNuciA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3BzbnIpOwotCQkJCQkJCQkKLQkJCQlpZiAobV9zbGljZV9kZXNjcy5zaXplKCkgPT0gMSkKLQkJCQl7Ci0JCQkJCWNvbnN0IHVpbnQzMl90IG91dHB1dF9zaXplID0gY29tcF9zaXplID8gKHVpbnQzMl90KWNvbXBfc2l6ZSA6ICh1aW50MzJfdCljb21wX2RhdGEuc2l6ZSgpOwotCQkJCQlkZWJ1Z19wcmludGYoIi5iYXNpcyBSR0IgUFNOUiBwZXIgYml0L3RleGVsKjEwMDAwOiAlMy4zZlxuIiwgMTAwMDAuMGYgKiBzLm1fYmFzaXNfcmdiX2F2Z19wc25yIC8gKChvdXRwdXRfc2l6ZSAqIDguMGYpIC8gKHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoICogc2xpY2VfZGVzYy5tX29yaWdfaGVpZ2h0KSkpOwotCQkJCQlkZWJ1Z19wcmludGYoIi5iYXNpcyBMdW1hIDcwOSBQU05SIHBlciBiaXQvdGV4ZWwqMTAwMDA6ICUzLjNmXG4iLCAxMDAwMC4wZiAqIHMubV9iYXNpc19sdW1hXzcwOV9wc25yIC8gKChvdXRwdXRfc2l6ZSAqIDguMGYpIC8gKHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoICogc2xpY2VfZGVzYy5tX29yaWdfaGVpZ2h0KSkpOwotCQkJCX0KKwkJCQkJaW1hZ2VfbWV0cmljcyBlbTsKIAotCQkJCWlmIChtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkX2JjN1tzbGljZV9pbmRleF0uZ2V0X3dpZHRoKCkpCi0JCQkJewotCQkJCQkvLyAtLS0tIEJDNyBzdGF0cwotCQkJCQllbS5jYWxjKG1fc2xpY2VfaW1hZ2VzW3NsaWNlX2luZGV4XSwgbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZF9iYzdbc2xpY2VfaW5kZXhdLCAwLCAzKTsKLQkJCQkJZW0ucHJpbnQoIkJDNyBSR0IgQXZnOiAgICAgICAgICAgICAiKTsKLQkJCQkJcy5tX2JjN19yZ2JfYXZnX3BzbnIgPSBlbS5tX3BzbnI7CisJCQkJCS8vIC0tLS0gLmJhc2lzIHN0YXRzCisJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMCwgMyk7CisJCQkJCWVtLnByaW50KCIuYmFzaXMgUkdCIEF2ZzogICAgICAgICAgIik7CisJCQkJCXMubV9iYXNpc19yZ2JfYXZnX3BzbnIgPSBlbS5tX3BzbnI7CiAKLQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XSwgMCwgNCk7Ci0JCQkJCWVtLnByaW50KCJCQzcgUkdCQSBBdmc6ICAgICAgICAgICAgIik7Ci0JCQkJCXMubV9iYzdfcmdiYV9hdmdfcHNuciA9IGVtLm1fcHNucjsKKwkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRbc2xpY2VfaW5kZXhdLCAwLCA0KTsKKwkJCQkJZW0ucHJpbnQoIi5iYXNpcyBSR0JBIEF2ZzogICAgICAgICAiKTsKKwkJCQkJcy5tX2Jhc2lzX3JnYmFfYXZnX3BzbnIgPSBlbS5tX3BzbnI7CiAKLQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XSwgMCwgMSk7Ci0JCQkJCWVtLnByaW50KCJCQzcgUiAgIEF2ZzogICAgICAgICAgICAgIik7CisJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMCwgMSk7CisJCQkJCWVtLnByaW50KCIuYmFzaXMgUiAgIEF2ZzogICAgICAgICAgIik7CiAKLQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XSwgMSwgMSk7Ci0JCQkJCWVtLnByaW50KCJCQzcgRyAgIEF2ZzogICAgICAgICAgICAgIik7CisJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMSwgMSk7CisJCQkJCWVtLnByaW50KCIuYmFzaXMgRyAgIEF2ZzogICAgICAgICAgIik7CiAKLQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XSwgMiwgMSk7Ci0JCQkJCWVtLnByaW50KCJCQzcgQiAgIEF2ZzogICAgICAgICAgICAgIik7CisJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMiwgMSk7CisJCQkJCWVtLnByaW50KCIuYmFzaXMgQiAgIEF2ZzogICAgICAgICAgIik7CiAKIAkJCQkJaWYgKG1fcGFyYW1zLm1fdWFzdGMpCiAJCQkJCXsKLQkJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkX2JjN1tzbGljZV9pbmRleF0sIDMsIDEpOwotCQkJCQkJZW0ucHJpbnQoIkJDNyBBICAgQXZnOiAgICAgICAgICAgICAiKTsKKwkJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMywgMSk7CisJCQkJCQllbS5wcmludCgiLmJhc2lzIEEgICBBdmc6ICAgICAgICAgICIpOwogCi0JCQkJCQlzLm1fYmM3X2FfYXZnX3BzbnIgPSBlbS5tX3BzbnI7CisJCQkJCQlzLm1fYmFzaXNfYV9hdmdfcHNuciA9IGVtLm1fcHNucjsKIAkJCQkJfQogCi0JCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkX2JjN1tzbGljZV9pbmRleF0sIDAsIDApOwotCQkJCQllbS5wcmludCgiQkM3IDcwOSBMdW1hOiAgICAgICAgICAgICIpOwotCQkJCQlzLm1fYmM3X2x1bWFfNzA5X3BzbnIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZW0ubV9wc25yKTsKLQkJCQkJcy5tX2JjN19sdW1hXzcwOV9zc2ltID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGVtLm1fc3NpbSk7CisJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMCwgMCk7CisJCQkJCWVtLnByaW50KCIuYmFzaXMgNzA5IEx1bWE6ICAgICAgICAgIik7CisJCQkJCXMubV9iYXNpc19sdW1hXzcwOV9wc25yID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGVtLm1fcHNucik7CisJCQkJCXMubV9iYXNpc19sdW1hXzcwOV9zc2ltID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGVtLm1fc3NpbSk7CiAKLQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XSwgMCwgMCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCWVtLnByaW50KCJCQzcgNjAxIEx1bWE6ICAgICAgICAgICAgIik7Ci0JCQkJCXMubV9iYzdfbHVtYV82MDFfcHNuciA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3BzbnIpOworCQkJCQllbS5jYWxjKG1fc2xpY2VfaW1hZ2VzW3NsaWNlX2luZGV4XSwgbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZFtzbGljZV9pbmRleF0sIDAsIDAsIHRydWUsIHRydWUpOworCQkJCQllbS5wcmludCgiLmJhc2lzIDYwMSBMdW1hOiAgICAgICAgICIpOworCQkJCQlzLm1fYmFzaXNfbHVtYV82MDFfcHNuciA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3BzbnIpOworCisJCQkJCWlmIChtX3NsaWNlX2Rlc2NzLnNpemUoKSA9PSAxKQorCQkJCQl7CisJCQkJCQljb25zdCB1aW50MzJfdCBvdXRwdXRfc2l6ZSA9IGNvbXBfc2l6ZSA/ICh1aW50MzJfdCljb21wX3NpemUgOiAodWludDMyX3QpY29tcF9kYXRhLnNpemUoKTsKKwkJCQkJCWRlYnVnX3ByaW50ZigiLmJhc2lzIFJHQiBQU05SIHBlciBiaXQvdGV4ZWwqMTAwMDA6ICUzLjNmXG4iLCAxMDAwMC4wZiAqIHMubV9iYXNpc19yZ2JfYXZnX3BzbnIgLyAoKG91dHB1dF9zaXplICogOC4wZikgLyAoc2xpY2VfZGVzYy5tX29yaWdfd2lkdGggKiBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQpKSk7CisJCQkJCQlkZWJ1Z19wcmludGYoIi5iYXNpcyBMdW1hIDcwOSBQU05SIHBlciBiaXQvdGV4ZWwqMTAwMDA6ICUzLjNmXG4iLCAxMDAwMC4wZiAqIHMubV9iYXNpc19sdW1hXzcwOV9wc25yIC8gKChvdXRwdXRfc2l6ZSAqIDguMGYpIC8gKHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoICogc2xpY2VfZGVzYy5tX29yaWdfaGVpZ2h0KSkpOworCQkJCQl9CisKKwkJCQkJaWYgKG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XS5nZXRfd2lkdGgoKSkKKwkJCQkJeworCQkJCQkJLy8gLS0tLSBCQzcgc3RhdHMKKwkJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkX2JjN1tzbGljZV9pbmRleF0sIDAsIDMpOworCQkJCQkJZW0ucHJpbnQoIkJDNyBSR0IgQXZnOiAgICAgICAgICAgICAiKTsKKwkJCQkJCXMubV9iYzdfcmdiX2F2Z19wc25yID0gZW0ubV9wc25yOworCisJCQkJCQllbS5jYWxjKG1fc2xpY2VfaW1hZ2VzW3NsaWNlX2luZGV4XSwgbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZF9iYzdbc2xpY2VfaW5kZXhdLCAwLCA0KTsKKwkJCQkJCWVtLnByaW50KCJCQzcgUkdCQSBBdmc6ICAgICAgICAgICAgIik7CisJCQkJCQlzLm1fYmM3X3JnYmFfYXZnX3BzbnIgPSBlbS5tX3BzbnI7CisKKwkJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkX2JjN1tzbGljZV9pbmRleF0sIDAsIDEpOworCQkJCQkJZW0ucHJpbnQoIkJDNyBSICAgQXZnOiAgICAgICAgICAgICAiKTsKKworCQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XSwgMSwgMSk7CisJCQkJCQllbS5wcmludCgiQkM3IEcgICBBdmc6ICAgICAgICAgICAgICIpOworCisJCQkJCQllbS5jYWxjKG1fc2xpY2VfaW1hZ2VzW3NsaWNlX2luZGV4XSwgbV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc191bnBhY2tlZF9iYzdbc2xpY2VfaW5kZXhdLCAyLCAxKTsKKwkJCQkJCWVtLnByaW50KCJCQzcgQiAgIEF2ZzogICAgICAgICAgICAgIik7CisKKwkJCQkJCWlmIChtX3BhcmFtcy5tX3Vhc3RjKQorCQkJCQkJeworCQkJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkX2JjN1tzbGljZV9pbmRleF0sIDMsIDEpOworCQkJCQkJCWVtLnByaW50KCJCQzcgQSAgIEF2ZzogICAgICAgICAgICAgIik7CisKKwkJCQkJCQlzLm1fYmM3X2FfYXZnX3BzbnIgPSBlbS5tX3BzbnI7CisJCQkJCQl9CisKKwkJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkX2JjN1tzbGljZV9pbmRleF0sIDAsIDApOworCQkJCQkJZW0ucHJpbnQoIkJDNyA3MDkgTHVtYTogICAgICAgICAgICAiKTsKKwkJCQkJCXMubV9iYzdfbHVtYV83MDlfcHNuciA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3BzbnIpOworCQkJCQkJcy5tX2JjN19sdW1hXzcwOV9zc2ltID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGVtLm1fc3NpbSk7CisKKwkJCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkX2JjN1tzbGljZV9pbmRleF0sIDAsIDAsIHRydWUsIHRydWUpOworCQkJCQkJZW0ucHJpbnQoIkJDNyA2MDEgTHVtYTogICAgICAgICAgICAiKTsKKwkJCQkJCXMubV9iYzdfbHVtYV82MDFfcHNuciA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3BzbnIpOworCQkJCQl9CisKKwkJCQkJaWYgKCFtX3BhcmFtcy5tX3Vhc3RjKQorCQkJCQl7CisJCQkJCQkvLyAtLS0tIE5lYXJseSBiZXN0IHBvc3NpYmxlIEVUQzFTIHN0YXRzCisJCQkJCQllbS5jYWxjKG1fc2xpY2VfaW1hZ2VzW3NsaWNlX2luZGV4XSwgbV9iZXN0X2V0YzFzX2ltYWdlc191bnBhY2tlZFtzbGljZV9pbmRleF0sIDAsIDMpOworCQkJCQkJZW0ucHJpbnQoIlVucXVhbnRpemVkIEVUQzFTIFJHQiBBdmc6ICAgICAiKTsKKwkJCQkJCXMubV9iZXN0X2V0YzFzX3JnYl9hdmdfcHNuciA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3BzbnIpOworCisJCQkJCQllbS5jYWxjKG1fc2xpY2VfaW1hZ2VzW3NsaWNlX2luZGV4XSwgbV9iZXN0X2V0YzFzX2ltYWdlc191bnBhY2tlZFtzbGljZV9pbmRleF0sIDAsIDApOworCQkJCQkJZW0ucHJpbnQoIlVucXVhbnRpemVkIEVUQzFTIDcwOSBMdW1hOiAgICAiKTsKKwkJCQkJCXMubV9iZXN0X2V0YzFzX2x1bWFfNzA5X3BzbnIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZW0ubV9wc25yKTsKKwkJCQkJCXMubV9iZXN0X2V0YzFzX2x1bWFfNzA5X3NzaW0gPSBzdGF0aWNfY2FzdDxmbG9hdD4oZW0ubV9zc2ltKTsKKworCQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fYmVzdF9ldGMxc19pbWFnZXNfdW5wYWNrZWRbc2xpY2VfaW5kZXhdLCAwLCAwLCB0cnVlLCB0cnVlKTsKKwkJCQkJCWVtLnByaW50KCJVbnF1YW50aXplZCBFVEMxUyA2MDEgTHVtYTogICAgIik7CisJCQkJCQlzLm1fYmVzdF9ldGMxc19sdW1hXzYwMV9wc25yID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGVtLm1fcHNucik7CisJCQkJCX0KIAkJCQl9CiAKLQkJCQlpZiAoIW1fcGFyYW1zLm1fdWFzdGMpCisJCQkJc3RkOjpzdHJpbmcgb3V0X2Jhc2VuYW1lOworCQkJCWlmIChtX3BhcmFtcy5tX291dF9maWxlbmFtZS5zaXplKCkpCisJCQkJCXN0cmluZ19nZXRfZmlsZW5hbWUobV9wYXJhbXMubV9vdXRfZmlsZW5hbWUuY19zdHIoKSwgb3V0X2Jhc2VuYW1lKTsKKwkJCQllbHNlIGlmIChtX3BhcmFtcy5tX3NvdXJjZV9maWxlbmFtZXMuc2l6ZSgpKQorCQkJCQlzdHJpbmdfZ2V0X2ZpbGVuYW1lKG1fcGFyYW1zLm1fc291cmNlX2ZpbGVuYW1lc1tzbGljZV9kZXNjLm1fc291cmNlX2ZpbGVfaW5kZXhdLmNfc3RyKCksIG91dF9iYXNlbmFtZSk7CisKKwkJCQlzdHJpbmdfcmVtb3ZlX2V4dGVuc2lvbihvdXRfYmFzZW5hbWUpOworCQkJCW91dF9iYXNlbmFtZSA9ICJiYXNpc19kZWJ1Z18iICsgb3V0X2Jhc2VuYW1lICsgc3RyaW5nX2Zvcm1hdCgiX3NsaWNlXyV1Iiwgc2xpY2VfaW5kZXgpOworCisJCQkJaWYgKCghbV9wYXJhbXMubV91YXN0YykgJiYgKG1fZnJvbnRlbmQuZ2V0X3BhcmFtcygpLm1fZGVidWdfaW1hZ2VzKSkKIAkJCQl7Ci0JCQkJCS8vIC0tLS0gTmVhcmx5IGJlc3QgcG9zc2libGUgRVRDMVMgc3RhdHMKLQkJCQkJZW0uY2FsYyhtX3NsaWNlX2ltYWdlc1tzbGljZV9pbmRleF0sIG1fYmVzdF9ldGMxc19pbWFnZXNfdW5wYWNrZWRbc2xpY2VfaW5kZXhdLCAwLCAwKTsKLQkJCQkJZW0ucHJpbnQoIlVucXVhbnRpemVkIEVUQzFTIDcwOSBMdW1hOiAgICAiKTsKKwkJCQkJLy8gV3JpdGUgImJlc3QiIEVUQzFTIGRlYnVnIGltYWdlcworCQkJCQlpZiAoIW1fcGFyYW1zLm1fdWFzdGMpCisJCQkJCXsKKwkJCQkJCWdwdV9pbWFnZSBiZXN0X2V0YzFzX2dwdV9pbWFnZShtX2Jlc3RfZXRjMXNfaW1hZ2VzW3NsaWNlX2luZGV4XSk7CisJCQkJCQliZXN0X2V0YzFzX2dwdV9pbWFnZS5vdmVycmlkZV9kaW1lbnNpb25zKHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoLCBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQpOworCQkJCQkJd3JpdGVfY29tcHJlc3NlZF90ZXh0dXJlX2ZpbGUoKG91dF9iYXNlbmFtZSArICJfYmVzdF9ldGMxcy5rdHgiKS5jX3N0cigpLCBiZXN0X2V0YzFzX2dwdV9pbWFnZSk7CiAKLQkJCQkJcy5tX2Jlc3RfZXRjMXNfbHVtYV83MDlfcHNuciA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3BzbnIpOwotCQkJCQlzLm1fYmVzdF9ldGMxc19sdW1hXzcwOV9zc2ltID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGVtLm1fc3NpbSk7CisJCQkJCQlpbWFnZSBiZXN0X2V0YzFzX3VucGFja2VkOworCQkJCQkJYmVzdF9ldGMxc19ncHVfaW1hZ2UudW5wYWNrKGJlc3RfZXRjMXNfdW5wYWNrZWQpOworCQkJCQkJc2F2ZV9wbmcob3V0X2Jhc2VuYW1lICsgIl9iZXN0X2V0YzFzLnBuZyIsIGJlc3RfZXRjMXNfdW5wYWNrZWQpOworCQkJCQl9CisJCQkJfQogCi0JCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2Jlc3RfZXRjMXNfaW1hZ2VzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMCwgMCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCWVtLnByaW50KCJVbnF1YW50aXplZCBFVEMxUyA2MDEgTHVtYTogICAgIik7CisJCQkJaWYgKG1fcGFyYW1zLm1fZGVidWdfaW1hZ2VzKQorCQkJCXsKKwkJCQkJLy8gV3JpdGUgZGVjb2RlZCBFVEMxUy9BU1RDIGRlYnVnIGltYWdlcworCQkJCQl7CisJCQkJCQlncHVfaW1hZ2UgZGVjb2RlZF9ldGMxc19vcl9hc3RjKG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNbc2xpY2VfaW5kZXhdKTsKKwkJCQkJCWRlY29kZWRfZXRjMXNfb3JfYXN0Yy5vdmVycmlkZV9kaW1lbnNpb25zKHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoLCBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQpOworCQkJCQkJd3JpdGVfY29tcHJlc3NlZF90ZXh0dXJlX2ZpbGUoKG91dF9iYXNlbmFtZSArICJfdHJhbnNjb2RlZF9ldGMxc19vcl9hc3RjLmt0eCIpLmNfc3RyKCksIGRlY29kZWRfZXRjMXNfb3JfYXN0Yyk7CiAKLQkJCQkJcy5tX2Jlc3RfZXRjMXNfbHVtYV82MDFfcHNuciA9IHN0YXRpY19jYXN0PGZsb2F0PihlbS5tX3BzbnIpOworCQkJCQkJaW1hZ2UgdGVtcChtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzX3VucGFja2VkW3NsaWNlX2luZGV4XSk7CisJCQkJCQl0ZW1wLmNyb3Aoc2xpY2VfZGVzYy5tX29yaWdfd2lkdGgsIHNsaWNlX2Rlc2MubV9vcmlnX2hlaWdodCk7CisJCQkJCQlzYXZlX3BuZyhvdXRfYmFzZW5hbWUgKyAiX3RyYW5zY29kZWRfZXRjMXNfb3JfYXN0Yy5wbmciLCB0ZW1wKTsKKwkJCQkJfQogCi0JCQkJCWVtLmNhbGMobV9zbGljZV9pbWFnZXNbc2xpY2VfaW5kZXhdLCBtX2Jlc3RfZXRjMXNfaW1hZ2VzX3VucGFja2VkW3NsaWNlX2luZGV4XSwgMCwgMyk7Ci0JCQkJCWVtLnByaW50KCJVbnF1YW50aXplZCBFVEMxUyBSR0IgQXZnOiAgICAgIik7CisJCQkJCS8vIFdyaXRlIGRlY29kZWQgQkM3IGRlYnVnIGltYWdlcworCQkJCQlpZiAobV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc19iYzdbc2xpY2VfaW5kZXhdLmdldF9waXhlbF93aWR0aCgpKQorCQkJCQl7CisJCQkJCQlncHVfaW1hZ2UgZGVjb2RlZF9iYzcobV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc19iYzdbc2xpY2VfaW5kZXhdKTsKKwkJCQkJCWRlY29kZWRfYmM3Lm92ZXJyaWRlX2RpbWVuc2lvbnMoc2xpY2VfZGVzYy5tX29yaWdfd2lkdGgsIHNsaWNlX2Rlc2MubV9vcmlnX2hlaWdodCk7CisJCQkJCQl3cml0ZV9jb21wcmVzc2VkX3RleHR1cmVfZmlsZSgob3V0X2Jhc2VuYW1lICsgIl90cmFuc2NvZGVkX2JjNy5rdHgiKS5jX3N0cigpLCBkZWNvZGVkX2JjNyk7CiAKLQkJCQkJcy5tX2Jlc3RfZXRjMXNfcmdiX2F2Z19wc25yID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGVtLm1fcHNucik7CisJCQkJCQlpbWFnZSB0ZW1wKG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XSk7CisJCQkJCQl0ZW1wLmNyb3Aoc2xpY2VfZGVzYy5tX29yaWdfd2lkdGgsIHNsaWNlX2Rlc2MubV9vcmlnX2hlaWdodCk7CisJCQkJCQlzYXZlX3BuZyhvdXRfYmFzZW5hbWUgKyAiX3RyYW5zY29kZWRfYmM3LnBuZyIsIHRlbXApOworCQkJCQl9CiAJCQkJfQogCQkJfQotCQkKLQkJCXN0ZDo6c3RyaW5nIG91dF9iYXNlbmFtZTsKLQkJCWlmIChtX3BhcmFtcy5tX291dF9maWxlbmFtZS5zaXplKCkpCi0JCQkJc3RyaW5nX2dldF9maWxlbmFtZShtX3BhcmFtcy5tX291dF9maWxlbmFtZS5jX3N0cigpLCBvdXRfYmFzZW5hbWUpOwotCQkJZWxzZSBpZiAobV9wYXJhbXMubV9zb3VyY2VfZmlsZW5hbWVzLnNpemUoKSkKLQkJCQlzdHJpbmdfZ2V0X2ZpbGVuYW1lKG1fcGFyYW1zLm1fc291cmNlX2ZpbGVuYW1lc1tzbGljZV9kZXNjLm1fc291cmNlX2ZpbGVfaW5kZXhdLmNfc3RyKCksIG91dF9iYXNlbmFtZSk7Ci0KLQkJCXN0cmluZ19yZW1vdmVfZXh0ZW5zaW9uKG91dF9iYXNlbmFtZSk7Ci0JCQlvdXRfYmFzZW5hbWUgPSAiYmFzaXNfZGVidWdfIiArIG91dF9iYXNlbmFtZSArIHN0cmluZ19mb3JtYXQoIl9zbGljZV8ldSIsIHNsaWNlX2luZGV4KTsKLQotCQkJaWYgKCghbV9wYXJhbXMubV91YXN0YykgJiYgKG1fZnJvbnRlbmQuZ2V0X3BhcmFtcygpLm1fZGVidWdfaW1hZ2VzKSkKLQkJCXsKLQkJCQkvLyBXcml0ZSAiYmVzdCIgRVRDMVMgZGVidWcgaW1hZ2VzCi0JCQkJaWYgKCFtX3BhcmFtcy5tX3Vhc3RjKQotCQkJCXsKLQkJCQkJZ3B1X2ltYWdlIGJlc3RfZXRjMXNfZ3B1X2ltYWdlKG1fYmVzdF9ldGMxc19pbWFnZXNbc2xpY2VfaW5kZXhdKTsKLQkJCQkJYmVzdF9ldGMxc19ncHVfaW1hZ2Uub3ZlcnJpZGVfZGltZW5zaW9ucyhzbGljZV9kZXNjLm1fb3JpZ193aWR0aCwgc2xpY2VfZGVzYy5tX29yaWdfaGVpZ2h0KTsKLQkJCQkJd3JpdGVfY29tcHJlc3NlZF90ZXh0dXJlX2ZpbGUoKG91dF9iYXNlbmFtZSArICJfYmVzdF9ldGMxcy5rdHgiKS5jX3N0cigpLCBiZXN0X2V0YzFzX2dwdV9pbWFnZSk7Ci0KLQkJCQkJaW1hZ2UgYmVzdF9ldGMxc191bnBhY2tlZDsKLQkJCQkJYmVzdF9ldGMxc19ncHVfaW1hZ2UudW5wYWNrKGJlc3RfZXRjMXNfdW5wYWNrZWQpOwotCQkJCQlzYXZlX3BuZyhvdXRfYmFzZW5hbWUgKyAiX2Jlc3RfZXRjMXMucG5nIiwgYmVzdF9ldGMxc191bnBhY2tlZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobV9wYXJhbXMubV9kZWJ1Z19pbWFnZXMpCi0JCQl7Ci0JCQkJLy8gV3JpdGUgZGVjb2RlZCBFVEMxUy9BU1RDIGRlYnVnIGltYWdlcwotCQkJCXsKLQkJCQkJZ3B1X2ltYWdlIGRlY29kZWRfZXRjMXNfb3JfYXN0YyhtX2RlY29kZWRfb3V0cHV0X3RleHR1cmVzW3NsaWNlX2luZGV4XSk7Ci0JCQkJCWRlY29kZWRfZXRjMXNfb3JfYXN0Yy5vdmVycmlkZV9kaW1lbnNpb25zKHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoLCBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQpOwotCQkJCQl3cml0ZV9jb21wcmVzc2VkX3RleHR1cmVfZmlsZSgob3V0X2Jhc2VuYW1lICsgIl90cmFuc2NvZGVkX2V0YzFzX29yX2FzdGMua3R4IikuY19zdHIoKSwgZGVjb2RlZF9ldGMxc19vcl9hc3RjKTsKLQotCQkJCQlpbWFnZSB0ZW1wKG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRbc2xpY2VfaW5kZXhdKTsKLQkJCQkJdGVtcC5jcm9wKHNsaWNlX2Rlc2MubV9vcmlnX3dpZHRoLCBzbGljZV9kZXNjLm1fb3JpZ19oZWlnaHQpOwotCQkJCQlzYXZlX3BuZyhvdXRfYmFzZW5hbWUgKyAiX3RyYW5zY29kZWRfZXRjMXNfb3JfYXN0Yy5wbmciLCB0ZW1wKTsKLQkJCQl9Ci0KLQkJCQkvLyBXcml0ZSBkZWNvZGVkIEJDNyBkZWJ1ZyBpbWFnZXMKLQkJCQlpZiAobV9kZWNvZGVkX291dHB1dF90ZXh0dXJlc19iYzdbc2xpY2VfaW5kZXhdLmdldF9waXhlbF93aWR0aCgpKQotCQkJCXsKLQkJCQkJZ3B1X2ltYWdlIGRlY29kZWRfYmM3KG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfYmM3W3NsaWNlX2luZGV4XSk7Ci0JCQkJCWRlY29kZWRfYmM3Lm92ZXJyaWRlX2RpbWVuc2lvbnMoc2xpY2VfZGVzYy5tX29yaWdfd2lkdGgsIHNsaWNlX2Rlc2MubV9vcmlnX2hlaWdodCk7Ci0JCQkJCXdyaXRlX2NvbXByZXNzZWRfdGV4dHVyZV9maWxlKChvdXRfYmFzZW5hbWUgKyAiX3RyYW5zY29kZWRfYmM3Lmt0eCIpLmNfc3RyKCksIGRlY29kZWRfYmM3KTsKLQotCQkJCQlpbWFnZSB0ZW1wKG1fZGVjb2RlZF9vdXRwdXRfdGV4dHVyZXNfdW5wYWNrZWRfYmM3W3NsaWNlX2luZGV4XSk7Ci0JCQkJCXRlbXAuY3JvcChzbGljZV9kZXNjLm1fb3JpZ193aWR0aCwgc2xpY2VfZGVzYy5tX29yaWdfaGVpZ2h0KTsKLQkJCQkJc2F2ZV9wbmcob3V0X2Jhc2VuYW1lICsgIl90cmFuc2NvZGVkX2JjNy5wbmciLCB0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKwkJfSAvLyBpZiAobV9wYXJhbXMubV92YWxpZGF0ZV9vdXRwdXRfZGF0YSkKIAkJCQkKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtMjExNiw0ICsyMTQwLDI1MiBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKKwlib29sIGJhc2lzX3BhcmFsbGVsX2NvbXByZXNzKAorCQl1aW50MzJfdCB0b3RhbF90aHJlYWRzLAorCQljb25zdCBiYXNpc3U6OnZlY3RvcjxiYXNpc19jb21wcmVzc29yX3BhcmFtcz4mIHBhcmFtc192ZWMsCisJCWJhc2lzdTo6dmVjdG9yPCBwYXJhbGxlbF9yZXN1bHRzID4mIHJlc3VsdHNfdmVjKQorCXsKKwkJYXNzZXJ0KGdfbGlicmFyeV9pbml0aWFsaXplZCk7CisJCWlmICghZ19saWJyYXJ5X2luaXRpYWxpemVkKQorCQl7CisJCQllcnJvcl9wcmludGYoImJhc2lzX3BhcmFsbGVsX2NvbXByZXNzOiBiYXNpc3VfZW5jb2Rlcl9pbml0KCkgTVVTVCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIGFueSBlbmNvZGVyIGZ1bmN0aW9uYWxpdHkhXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWFzc2VydCh0b3RhbF90aHJlYWRzID49IDEpOworCQl0b3RhbF90aHJlYWRzID0gYmFzaXN1OjptYXhpbXVtPHVpbnQzMl90Pih0b3RhbF90aHJlYWRzLCAxKTsKKworCQlqb2JfcG9vbCBqcG9vbCh0b3RhbF90aHJlYWRzKTsKKworCQlyZXN1bHRzX3ZlYy5yZXNpemUoMCk7CisJCXJlc3VsdHNfdmVjLnJlc2l6ZShwYXJhbXNfdmVjLnNpemUoKSk7CisKKwkJc3RkOjphdG9taWM8Ym9vbD4gcmVzdWx0OworCQlyZXN1bHQgPSB0cnVlOworCQkKKwkJc3RkOjphdG9taWM8Ym9vbD4gb3BlbmNsX2ZhaWxlZDsKKwkJb3BlbmNsX2ZhaWxlZCA9IGZhbHNlOworCisJCWZvciAodWludDMyX3QgcGluZGV4ID0gMDsgcGluZGV4IDwgcGFyYW1zX3ZlYy5zaXplKCk7IHBpbmRleCsrKQorCQl7CisJCQlqcG9vbC5hZGRfam9iKFtwaW5kZXgsICZwYXJhbXNfdmVjLCAmcmVzdWx0c192ZWMsICZyZXN1bHQsICZvcGVuY2xfZmFpbGVkXSB7CisKKwkJCQliYXNpc19jb21wcmVzc29yX3BhcmFtcyBwYXJhbXMgPSBwYXJhbXNfdmVjW3BpbmRleF07CisJCQkJcGFyYWxsZWxfcmVzdWx0cyYgcmVzdWx0cyA9IHJlc3VsdHNfdmVjW3BpbmRleF07CisKKwkJCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJCQl0bS5zdGFydCgpOworCisJCQkJYmFzaXNfY29tcHJlc3NvciBjOworCQkJCQorCQkJCS8vIER1bW15IGpvYiBwb29sCisJCQkJam9iX3Bvb2wgdGFza19qcG9vbCgxKTsKKwkJCQlwYXJhbXMubV9wSm9iX3Bvb2wgPSAmdGFza19qcG9vbDsKKwkJCQkvLyBUT0RPOiBSZW1vdmUgdGhpcyBmbGFnIGVudGlyZWx5CisJCQkJcGFyYW1zLm1fbXVsdGl0aHJlYWRpbmcgPSB0cnVlOyAKKwkJCQkKKwkJCQkvLyBTdG9wIHVzaW5nIE9wZW5DTCBpZiBhIGZhaWx1cmUgZXZlciBvY2N1cnMuCisJCQkJaWYgKG9wZW5jbF9mYWlsZWQpCisJCQkJCXBhcmFtcy5tX3VzZV9vcGVuY2wgPSBmYWxzZTsKKworCQkJCWJvb2wgc3RhdHVzID0gYy5pbml0KHBhcmFtcyk7CisJCQkJCisJCQkJaWYgKGMuZ2V0X29wZW5jbF9mYWlsZWQoKSkKKwkJCQkJb3BlbmNsX2ZhaWxlZCA9IHRydWU7CisKKwkJCQlpZiAoc3RhdHVzKQorCQkJCXsKKwkJCQkJYmFzaXNfY29tcHJlc3Nvcjo6ZXJyb3JfY29kZSBlYyA9IGMucHJvY2VzcygpOworCisJCQkJCWlmIChjLmdldF9vcGVuY2xfZmFpbGVkKCkpCisJCQkJCQlvcGVuY2xfZmFpbGVkID0gdHJ1ZTsKKworCQkJCQlyZXN1bHRzLm1fZXJyb3JfY29kZSA9IGVjOworCisJCQkJCWlmIChlYyA9PSBiYXNpc19jb21wcmVzc29yOjpjRUNTdWNjZXNzKQorCQkJCQl7CisJCQkJCQlyZXN1bHRzLm1fYmFzaXNfZmlsZSA9IGMuZ2V0X291dHB1dF9iYXNpc19maWxlKCk7CisJCQkJCQlyZXN1bHRzLm1fa3R4Ml9maWxlID0gYy5nZXRfb3V0cHV0X2t0eDJfZmlsZSgpOworCQkJCQkJcmVzdWx0cy5tX3N0YXRzID0gYy5nZXRfc3RhdHMoKTsKKwkJCQkJCXJlc3VsdHMubV9iYXNpc19iaXRzX3Blcl90ZXhlbCA9IGMuZ2V0X2Jhc2lzX2JpdHNfcGVyX3RleGVsKCk7CisJCQkJCQlyZXN1bHRzLm1fYW55X3NvdXJjZV9pbWFnZV9oYXNfYWxwaGEgPSBjLmdldF9hbnlfc291cmNlX2ltYWdlX2hhc19hbHBoYSgpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmVzdWx0cy5tX2Vycm9yX2NvZGUgPSBiYXNpc19jb21wcmVzc29yOjpjRUNGYWlsZWRJbml0aWFsaXppbmc7CisJCQkJCQorCQkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQl9CisKKwkJCQlyZXN1bHRzLm1fdG90YWxfdGltZSA9IHRtLmdldF9lbGFwc2VkX3NlY3MoKTsKKwkJCX0gKTsKKworCQl9IC8vIHBpbmRleAorCisJCWpwb29sLndhaXRfZm9yX2FsbCgpOworCisJCWlmIChvcGVuY2xfZmFpbGVkKQorCQkJZXJyb3JfcHJpbnRmKCJBbiBPcGVuQ0wgZXJyb3Igb2NjdXJlZCBzb21ldGltZSBkdXJpbmcgY29tcHJlc3Npb24uIFRoZSBjb21wcmVzc29yIGZlbGwgYmFjayB0byBDUFUgcHJvY2Vzc2luZyBhZnRlciB0aGUgZmFpbHVyZS5cbiIpOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJdm9pZCogYmFzaXNfY29tcHJlc3MoCisJCWNvbnN0IGJhc2lzdTo6dmVjdG9yPGltYWdlPiYgc291cmNlX2ltYWdlcywKKwkJdWludDMyX3QgZmxhZ3NfYW5kX3F1YWxpdHksIGZsb2F0IHVhc3RjX3Jkb19xdWFsaXR5LAorCQlzaXplX3QqIHBTaXplLAorCQlpbWFnZV9zdGF0cyogcFN0YXRzKQorCXsKKwkJLy8gQ2hlY2sgaW5wdXQgcGFyYW1ldGVycworCQlpZiAoKCFzb3VyY2VfaW1hZ2VzLnNpemUoKSkgfHwgKCFwU2l6ZSkpCisJCXsKKwkJCWVycm9yX3ByaW50ZigiYmFzaXNfY29tcHJlc3M6IEludmFsaWQgcGFyYW1ldGVyXG4iKTsKKwkJCWFzc2VydCgwKTsKKwkJCXJldHVybiBudWxscHRyOworCQl9CisKKwkJKnBTaXplID0gMDsKKworCQkvLyBJbml0aWFsaXplIGEgam9iIHBvb2wKKwkJdWludDMyX3QgbnVtX3RocmVhZHMgPSAxOworCQlpZiAoZmxhZ3NfYW5kX3F1YWxpdHkgJiBjRmxhZ1RocmVhZGVkKQorCQkJbnVtX3RocmVhZHMgPSBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KDEsIHN0ZDo6dGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpKTsKKworCQlqb2JfcG9vbCBqcChudW1fdGhyZWFkcyk7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY29tcHJlc3NvciBwYXJhbWV0ZXIgc3RydWN0CisJCWJhc2lzX2NvbXByZXNzb3JfcGFyYW1zIGNvbXBfcGFyYW1zOworCQljb21wX3BhcmFtcy5tX3BKb2JfcG9vbCA9ICZqcDsKKworCQljb21wX3BhcmFtcy5tX3lfZmxpcCA9IChmbGFnc19hbmRfcXVhbGl0eSAmIGNGbGFnWUZsaXApICE9IDA7CisJCWNvbXBfcGFyYW1zLm1fZGVidWcgPSAoZmxhZ3NfYW5kX3F1YWxpdHkgJiBjRmxhZ0RlYnVnKSAhPSAwOworCisJCS8vIENvcHkgdGhlIGxhcmdlc3QgbWlwbWFwIGxldmVsCisJCWNvbXBfcGFyYW1zLm1fc291cmNlX2ltYWdlcy5yZXNpemUoMSk7CisJCWNvbXBfcGFyYW1zLm1fc291cmNlX2ltYWdlc1swXSA9IHNvdXJjZV9pbWFnZXNbMF07CisKKwkJLy8gQ29weSB0aGUgc21hbGxlciBtaXBtYXAgbGV2ZWxzLCBpZiBhbnkKKwkJaWYgKHNvdXJjZV9pbWFnZXMuc2l6ZSgpID4gMSkKKwkJeworCQkJY29tcF9wYXJhbXMubV9zb3VyY2VfbWlwbWFwX2ltYWdlcy5yZXNpemUoMSk7CisJCQljb21wX3BhcmFtcy5tX3NvdXJjZV9taXBtYXBfaW1hZ2VzWzBdLnJlc2l6ZShzb3VyY2VfaW1hZ2VzLnNpemUoKSAtIDEpOworCisJCQlmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgc291cmNlX2ltYWdlcy5zaXplKCk7IGkrKykKKwkJCQljb21wX3BhcmFtcy5tX3NvdXJjZV9taXBtYXBfaW1hZ2VzWzBdW2kgLSAxXSA9IHNvdXJjZV9pbWFnZXNbaV07CisJCX0KKwkJCQkKKwkJY29tcF9wYXJhbXMubV9tdWx0aXRocmVhZGluZyA9IChmbGFnc19hbmRfcXVhbGl0eSAmIGNGbGFnVGhyZWFkZWQpICE9IDA7CisJCWNvbXBfcGFyYW1zLm1fdXNlX29wZW5jbCA9IChmbGFnc19hbmRfcXVhbGl0eSAmIGNGbGFnVXNlT3BlbkNMKSAhPSAwOworCisJCWNvbXBfcGFyYW1zLm1fd3JpdGVfb3V0cHV0X2Jhc2lzX2ZpbGVzID0gZmFsc2U7CisKKwkJY29tcF9wYXJhbXMubV9wZXJjZXB0dWFsID0gKGZsYWdzX2FuZF9xdWFsaXR5ICYgY0ZsYWdTUkdCKSAhPSAwOworCQljb21wX3BhcmFtcy5tX21pcF9zcmdiID0gY29tcF9wYXJhbXMubV9wZXJjZXB0dWFsOworCQljb21wX3BhcmFtcy5tX21pcF9nZW4gPSAoZmxhZ3NfYW5kX3F1YWxpdHkgJiAoY0ZsYWdHZW5NaXBzV3JhcCB8IGNGbGFnR2VuTWlwc0NsYW1wKSkgIT0gMDsKKwkJY29tcF9wYXJhbXMubV9taXBfd3JhcHBpbmcgPSAoZmxhZ3NfYW5kX3F1YWxpdHkgJiBjRmxhZ0dlbk1pcHNXcmFwKSAhPSAwOworCisJCWNvbXBfcGFyYW1zLm1fdWFzdGMgPSAoZmxhZ3NfYW5kX3F1YWxpdHkgJiBjRmxhZ1VBU1RDKSAhPSAwOworCQlpZiAoY29tcF9wYXJhbXMubV91YXN0YykKKwkJeworCQkJY29tcF9wYXJhbXMubV9wYWNrX3Vhc3RjX2ZsYWdzID0gZmxhZ3NfYW5kX3F1YWxpdHkgJiBjUGFja1VBU1RDTGV2ZWxNYXNrOworCQkJY29tcF9wYXJhbXMubV9yZG9fdWFzdGMgPSAoZmxhZ3NfYW5kX3F1YWxpdHkgJiBjRmxhZ1VBU1RDUkRPKSAhPSAwOworCQkJY29tcF9wYXJhbXMubV9yZG9fdWFzdGNfcXVhbGl0eV9zY2FsYXIgPSB1YXN0Y19yZG9fcXVhbGl0eTsKKwkJfQorCQllbHNlCisJCQljb21wX3BhcmFtcy5tX3F1YWxpdHlfbGV2ZWwgPSBiYXNpc3U6Om1heGltdW08dWludDMyX3Q+KDEsIGZsYWdzX2FuZF9xdWFsaXR5ICYgMjU1KTsKKwkJCQkKKwkJY29tcF9wYXJhbXMubV9jcmVhdGVfa3R4Ml9maWxlID0gKGZsYWdzX2FuZF9xdWFsaXR5ICYgY0ZsYWdLVFgyKSAhPSAwOworCQkJCQkJCisJCWlmIChjb21wX3BhcmFtcy5tX2NyZWF0ZV9rdHgyX2ZpbGUpCisJCXsKKwkJCS8vIFNldCBLVFgyIHNwZWNpZmljIHBhcmFtZXRlcnMuCisJCQlpZiAoKGZsYWdzX2FuZF9xdWFsaXR5ICYgY0ZsYWdLVFgyVUFTVENTdXBlckNvbXByZXNzaW9uKSAmJiAoY29tcF9wYXJhbXMubV91YXN0YykpCisJCQkJY29tcF9wYXJhbXMubV9rdHgyX3Vhc3RjX3N1cGVyY29tcHJlc3Npb24gPSBiYXNpc3Q6OktUWDJfU1NfWlNUQU5EQVJEOworCisJCQljb21wX3BhcmFtcy5tX2t0eDJfc3JnYl90cmFuc2Zlcl9mdW5jID0gY29tcF9wYXJhbXMubV9wZXJjZXB0dWFsOworCQl9CisKKwkJY29tcF9wYXJhbXMubV9jb21wdXRlX3N0YXRzID0gKHBTdGF0cyAhPSBudWxscHRyKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbXByZXNzb3IsIGluaXRpYWxpemUgaXQsIGFuZCBwcm9jZXNzIHRoZSBpbnB1dAorCQliYXNpc19jb21wcmVzc29yIGNvbXA7CisJCWlmICghY29tcC5pbml0KGNvbXBfcGFyYW1zKSkKKwkJeworCQkJZXJyb3JfcHJpbnRmKCJiYXNpc19jb21wcmVzczogYmFzaXNfY29tcHJlc3Nvcjo6aW5pdCgpIGZhaWxlZCFcbiIpOworCQkJcmV0dXJuIG51bGxwdHI7CisJCX0KKworCQliYXNpc19jb21wcmVzc29yOjplcnJvcl9jb2RlIGVjID0gY29tcC5wcm9jZXNzKCk7CisKKwkJaWYgKGVjICE9IGJhc2lzX2NvbXByZXNzb3I6OmNFQ1N1Y2Nlc3MpCisJCXsKKwkJCWVycm9yX3ByaW50ZigiYmFzaXNfY29tcHJlc3M6IGJhc2lzX2NvbXByZXNzb3I6OnByb2Nlc3MoKSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICV1XG4iLCAodWludDMyX3QpZWMpOworCQkJcmV0dXJuIG51bGxwdHI7CisJCX0KKworCQkvLyBHZXQgdGhlIG91dHB1dCBmaWxlIGRhdGEgYW5kIHJldHVybiBpdCB0byB0aGUgY2FsbGVyCisJCXZvaWQqIHBGaWxlX2RhdGEgPSBudWxscHRyOworCQljb25zdCB1aW50OF92ZWMqIHBGaWxlX2RhdGFfdmVjID0gY29tcF9wYXJhbXMubV9jcmVhdGVfa3R4Ml9maWxlID8gJmNvbXAuZ2V0X291dHB1dF9rdHgyX2ZpbGUoKSA6ICZjb21wLmdldF9vdXRwdXRfYmFzaXNfZmlsZSgpOworCisJCXBGaWxlX2RhdGEgPSBtYWxsb2MocEZpbGVfZGF0YV92ZWMtPnNpemUoKSk7CisJCWlmICghcEZpbGVfZGF0YSkKKwkJeworCQkJZXJyb3JfcHJpbnRmKCJiYXNpc19jb21wcmVzczogT3V0IG9mIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gbnVsbHB0cjsKKwkJfQorCQltZW1jcHkocEZpbGVfZGF0YSwgcEZpbGVfZGF0YV92ZWMtPmdldF9wdHIoKSwgcEZpbGVfZGF0YV92ZWMtPnNpemUoKSk7CisKKwkJKnBTaXplID0gcEZpbGVfZGF0YV92ZWMtPnNpemUoKTsKKworCQlpZiAoKHBTdGF0cykgJiYgKGNvbXAuZ2V0X3N0YXRzKCkuc2l6ZSgpKSkKKwkJeworCQkJKnBTdGF0cyA9IGNvbXAuZ2V0X3N0YXRzKClbMF07CisJCX0KKworCQlyZXR1cm4gcEZpbGVfZGF0YTsKKwl9CisKKwl2b2lkKiBiYXNpc19jb21wcmVzcygKKwkJY29uc3QgdWludDhfdCogcEltYWdlUkdCQSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgcGl0Y2hfaW5fcGl4ZWxzLAorCQl1aW50MzJfdCBmbGFnc19hbmRfcXVhbGl0eSwgZmxvYXQgdWFzdGNfcmRvX3F1YWxpdHksCisJCXNpemVfdCogcFNpemUsCisJCWltYWdlX3N0YXRzKiBwU3RhdHMpCisJeworCQlpZiAoIXBpdGNoX2luX3BpeGVscykKKwkJCXBpdGNoX2luX3BpeGVscyA9IHdpZHRoOworCisJCWlmICgoIXBJbWFnZVJHQkEpIHx8ICghd2lkdGgpIHx8ICghaGVpZ2h0KSB8fCAocGl0Y2hfaW5fcGl4ZWxzIDwgd2lkdGgpIHx8ICghcFNpemUpKQorCQl7CisJCQllcnJvcl9wcmludGYoImJhc2lzX2NvbXByZXNzOiBJbnZhbGlkIHBhcmFtZXRlclxuIik7CisJCQlhc3NlcnQoMCk7CisJCQlyZXR1cm4gbnVsbHB0cjsKKwkJfQorCisJCSpwU2l6ZSA9IDA7CisKKwkJaWYgKCh3aWR0aCA+IEJBU0lTVV9NQVhfU1VQUE9SVEVEX1RFWFRVUkVfRElNRU5TSU9OKSB8fCAoaGVpZ2h0ID4gQkFTSVNVX01BWF9TVVBQT1JURURfVEVYVFVSRV9ESU1FTlNJT04pKQorCQl7CisJCQllcnJvcl9wcmludGYoImJhc2lzX2NvbXByZXNzOiBJbWFnZSB0b28gbGFyZ2VcbiIpOworCQkJcmV0dXJuIG51bGxwdHI7CisJCX0KKworCQkvLyBDb3B5IHRoZSBzb3VyY2UgaW1hZ2UKKwkJYmFzaXN1Ojp2ZWN0b3I8aW1hZ2U+IHNvdXJjZV9pbWFnZSgxKTsKKwkJc291cmNlX2ltYWdlWzBdLmNyb3Aod2lkdGgsIGhlaWdodCwgd2lkdGgsIGdfYmxhY2tfY29sb3IsIGZhbHNlKTsKKwkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorCQkJbWVtY3B5KHNvdXJjZV9pbWFnZVswXS5nZXRfcHRyKCkgKyB5ICogd2lkdGgsIChjb25zdCBjb2xvcl9yZ2JhKilwSW1hZ2VSR0JBICsgeSAqIHBpdGNoX2luX3BpeGVscywgd2lkdGggKiBzaXplb2YoY29sb3JfcmdiYSkpOworCisJCXJldHVybiBiYXNpc19jb21wcmVzcyhzb3VyY2VfaW1hZ2UsIGZsYWdzX2FuZF9xdWFsaXR5LCB1YXN0Y19yZG9fcXVhbGl0eSwgcFNpemUsIHBTdGF0cyk7CisJfQorCisJdm9pZCBiYXNpc19mcmVlX2RhdGEodm9pZCogcCkKKwl7CisJCWZyZWUocCk7CisJfQorCiB9IC8vIG5hbWVzcGFjZSBiYXNpc3UKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X2NvbXAuaCBiL2VuY29kZXIvYmFzaXN1X2NvbXAuaAppbmRleCAyYzNhZjk2Li5hYTVlYTZmIDEwMDY0NAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9jb21wLmgKKysrIGIvZW5jb2Rlci9iYXNpc3VfY29tcC5oCkBAIC0xNiwxMiArMTYsMTEgQEAKICNpbmNsdWRlICJiYXNpc3VfZnJvbnRlbmQuaCIKICNpbmNsdWRlICJiYXNpc3VfYmFja2VuZC5oIgogI2luY2x1ZGUgImJhc2lzdV9iYXNpc19maWxlLmgiCi0jaW5jbHVkZSAiLi4vdHJhbnNjb2Rlci9iYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGUuaCIKICNpbmNsdWRlICIuLi90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmgiCiAjaW5jbHVkZSAiYmFzaXN1X3Vhc3RjX2VuYy5oIgogCi0jZGVmaW5lIEJBU0lTVV9MSUJfVkVSU0lPTiAxMTUKLSNkZWZpbmUgQkFTSVNVX0xJQl9WRVJTSU9OX1NUUklORyAiMS4xNSIKKyNkZWZpbmUgQkFTSVNVX0xJQl9WRVJTSU9OIDExNgorI2RlZmluZSBCQVNJU1VfTElCX1ZFUlNJT05fU1RSSU5HICIxLjE2IgogCiAjaWZuZGVmIEJBU0lTRF9TVVBQT1JUX0tUWDIKIAkjZXJyb3IgQkFTSVNEX1NVUFBPUlRfS1RYMiBpcyB1bmRlZmluZWQKQEAgLTM2LDYgKzM1LDkgQEAKIAogbmFtZXNwYWNlIGJhc2lzdQogeworCXN0cnVjdCBvcGVuY2xfY29udGV4dDsKKwl0eXBlZGVmIG9wZW5jbF9jb250ZXh0KiBvcGVuY2xfY29udGV4dF9wdHI7CisKIAljb25zdCB1aW50MzJfdCBCQVNJU1VfTUFYX1NVUFBPUlRFRF9URVhUVVJFX0RJTUVOU0lPTiA9IDE2Mzg0OwogCiAJLy8gQWxsb3cgYmxvY2sncyBjb2xvciBkaXN0YW5jZSB0byBpbmNyZWFzZSBieSAxLjUgd2hpbGUgc2VhcmNoaW5nIGZvciBhbiBhbHRlcm5hdGl2ZSBuZWFyYnkgZW5kcG9pbnQuCkBAIC0yMDMsMTMgKzIwNSw5IEBACiAJc3RydWN0IGJhc2lzX2NvbXByZXNzb3JfcGFyYW1zCiAJewogCQliYXNpc19jb21wcmVzc29yX3BhcmFtcygpIDoKLQkJCW1fcFNlbF9jb2RlYm9vayhOVUxMKSwKIAkJCW1fY29tcHJlc3Npb25fbGV2ZWwoKGludClCQVNJU1VfREVGQVVMVF9DT01QUkVTU0lPTl9MRVZFTCwgMCwgKGludClCQVNJU1VfTUFYX0NPTVBSRVNTSU9OX0xFVkVMKSwKIAkJCW1fc2VsZWN0b3JfcmRvX3RocmVzaChCQVNJU1VfREVGQVVMVF9TRUxFQ1RPUl9SRE9fVEhSRVNILCAwLjBmLCAxZSsxMGYpLAogCQkJbV9lbmRwb2ludF9yZG9fdGhyZXNoKEJBU0lTVV9ERUZBVUxUX0VORFBPSU5UX1JET19USFJFU0gsIDAuMGYsIDFlKzEwZiksCi0JCQltX2h5YnJpZF9zZWxfY2JfcXVhbGl0eV90aHJlc2goQkFTSVNVX0RFRkFVTFRfSFlCUklEX1NFTF9DQl9RVUFMSVRZX1RIUkVTSCwgMC4wZiwgMWUrMTBmKSwKLQkJCW1fZ2xvYmFsX3BhbF9iaXRzKDgsIDAsIEVUQzFfR0xPQkFMX1NFTEVDVE9SX0NPREVCT09LX01BWF9QQUxfQklUUyksCi0JCQltX2dsb2JhbF9tb2RfYml0cyg4LCAwLCBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXI6OmNUb3RhbEJpdHMpLAogCQkJbV9taXBfc2NhbGUoMS4wZiwgLjAwMDEyNWYsIDQuMGYpLAogCQkJbV9taXBfc21hbGxlc3RfZGltZW5zaW9uKDEsIDEsIDE2Mzg0KSwKIAkJCW1fbWF4X2VuZHBvaW50X2NsdXN0ZXJzKDUxMiksCkBAIC0yMzQsOSArMjMyLDggQEAKIAogCQl2b2lkIGNsZWFyKCkKIAkJewotCQkJbV9wU2VsX2NvZGVib29rID0gTlVMTDsKLQogCQkJbV91YXN0Yy5jbGVhcigpOworCQkJbV91c2Vfb3BlbmNsLmNsZWFyKCk7CiAJCQltX3N0YXR1c19vdXRwdXQuY2xlYXIoKTsKIAogCQkJbV9zb3VyY2VfZmlsZW5hbWVzLmNsZWFyKCk7CkBAIC0yNDksMTEgKzI0Niw4IEBACiAKIAkJCW1feV9mbGlwLmNsZWFyKCk7CiAJCQltX2RlYnVnLmNsZWFyKCk7Ci0JCQltX3ZhbGlkYXRlLmNsZWFyKCk7CisJCQltX3ZhbGlkYXRlX2V0YzFzLmNsZWFyKCk7CiAJCQltX2RlYnVnX2ltYWdlcy5jbGVhcigpOwotCQkJbV9nbG9iYWxfc2VsX3BhbC5jbGVhcigpOwotCQkJbV9hdXRvX2dsb2JhbF9zZWxfcGFsLmNsZWFyKCk7Ci0JCQltX25vX2h5YnJpZF9zZWxfY2IuY2xlYXIoKTsKIAkJCW1fcGVyY2VwdHVhbC5jbGVhcigpOwogCQkJbV9ub19zZWxlY3Rvcl9yZG8uY2xlYXIoKTsKIAkJCW1fc2VsZWN0b3JfcmRvX3RocmVzaC5jbGVhcigpOwpAQCAtMjY5LDkgKzI2Myw2IEBACiAJCQltX3N3aXp6bGVbMl0gPSAyOwogCQkJbV9zd2l6emxlWzNdID0gMzsKIAkJCW1fcmVub3JtYWxpemUuY2xlYXIoKTsKLQkJCW1faHlicmlkX3NlbF9jYl9xdWFsaXR5X3RocmVzaC5jbGVhcigpOwotCQkJbV9nbG9iYWxfcGFsX2JpdHMuY2xlYXIoKTsKLQkJCW1fZ2xvYmFsX21vZF9iaXRzLmNsZWFyKCk7CiAJCQltX2Rpc2FibGVfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rcy5jbGVhcigpOwogCiAJCQltX25vX2VuZHBvaW50X3Jkby5jbGVhcigpOwpAQCAtMzE5LDE1ICszMTAsMTYgQEAKIAkJCW1fa3R4Ml96c3RkX3N1cGVyY29tcHJlc3Npb25fbGV2ZWwuY2xlYXIoKTsKIAkJCW1fa3R4Ml9zcmdiX3RyYW5zZmVyX2Z1bmMuY2xlYXIoKTsKIAorCQkJbV92YWxpZGF0ZV9vdXRwdXRfZGF0YS5jbGVhcigpOworCiAJCQltX3BKb2JfcG9vbCA9IG51bGxwdHI7CiAJCX0KLQkJCQkKLQkJLy8gUG9pbnRlciB0byB0aGUgZ2xvYmFsIHNlbGVjdG9yIGNvZGVib29rLCBvciBudWxscHRyIHRvIG5vdCB1c2UgYSBnbG9iYWwgc2VsZWN0b3IgY29kZWJvb2sKLQkJY29uc3QgYmFzaXN0OjpldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayAqbV9wU2VsX2NvZGVib29rOwotCisJCQkJCQkKIAkJLy8gVHJ1ZSB0byBnZW5lcmF0ZSBVQVNUQyAuYmFzaXMgZmlsZSBkYXRhLCBvdGhlcndpc2UgRVRDMVMuCiAJCWJvb2xfcGFyYW08ZmFsc2U+IG1fdWFzdGM7CiAKKwkJYm9vbF9wYXJhbTxmYWxzZT4gbV91c2Vfb3BlbmNsOworCiAJCS8vIElmIG1fcmVhZF9zb3VyY2VfaW1hZ2VzIGlzIHRydWUsIG1fc291cmNlX2ZpbGVuYW1lcyAoYW5kIG9wdGlvbmFsbHkgbV9zb3VyY2VfYWxwaGFfZmlsZW5hbWVzKSBjb250YWlucyB0aGUgZmlsZW5hbWVzIG9mIFBORyBpbWFnZXMgdG8gcmVhZC4gCiAJCS8vIE90aGVyd2lzZSwgdGhlIGNvbXByZXNzb3IgcHJvY2Vzc2VzIHRoZSBpbWFnZXMgaW4gbV9zb3VyY2VfaW1hZ2VzLgogCQliYXNpc3U6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9zb3VyY2VfZmlsZW5hbWVzOwpAQCAtMzUzLDIwICszNDUsMTYgQEAKIAkJCiAJCS8vIE91dHB1dCBkZWJ1ZyBpbmZvcm1hdGlvbiBkdXJpbmcgY29tcHJlc3Npb24KIAkJYm9vbF9wYXJhbTxmYWxzZT4gbV9kZWJ1ZzsKLQkJYm9vbF9wYXJhbTxmYWxzZT4gbV92YWxpZGF0ZTsKKwkJYm9vbF9wYXJhbTxmYWxzZT4gbV92YWxpZGF0ZV9ldGMxczsKIAkJCiAJCS8vIG1fZGVidWdfaW1hZ2VzIGlzIHByZXR0eSBzbG93CiAJCWJvb2xfcGFyYW08ZmFsc2U+IG1fZGVidWdfaW1hZ2VzOwogCi0JCS8vIENvbXByZXNzaW9uIGxldmVsLCBmcm9tIDAgdG8gQkFTSVNVX01BWF9DT01QUkVTU0lPTl9MRVZFTCAoaGlnaGVyIGlzIHNsb3dlcikKKwkJLy8gRVRDMVMgY29tcHJlc3Npb24gbGV2ZWwsIGZyb20gMCB0byBCQVNJU1VfTUFYX0NPTVBSRVNTSU9OX0xFVkVMIChoaWdoZXIgaXMgc2xvd2VyKS4gCisJCS8vIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIG51bWVyb3VzIGludGVybmFsIGVuY29kaW5nIHNwZWVkIHZzLiBjb21wcmVzc2lvbiBlZmZpY2llbmN5L3BlcmZvcm1hbmNlIHRyYWRlb2Zmcy4KKwkJLy8gTm90ZSB0aGlzIGlzIE5PVCB0aGUgc2FtZSBhcyB0aGUgRVRDMVMgcXVhbGl0eSBsZXZlbCwgYW5kIG1vc3QgdXNlcnMgc2hvdWxkbid0IGNoYW5nZSB0aGlzLgogCQlwYXJhbTxpbnQ+IG1fY29tcHJlc3Npb25fbGV2ZWw7Ci0KLQkJYm9vbF9wYXJhbTxmYWxzZT4gbV9nbG9iYWxfc2VsX3BhbDsKLQkJYm9vbF9wYXJhbTxmYWxzZT4gbV9hdXRvX2dsb2JhbF9zZWxfcGFsOwotCi0JCS8vIEZyb250ZW5kL2JhY2tlbmQgY29kZWMgcGFyYW1ldGVycwotCQlib29sX3BhcmFtPGZhbHNlPiBtX25vX2h5YnJpZF9zZWxfY2I7Ci0JCQorCQkJCQkJCiAJCS8vIFVzZSBwZXJjZXB0dWFsIHNSR0IgY29sb3JzcGFjZSBtZXRyaWNzIGluc3RlYWQgb2YgbGluZWFyCiAJCWJvb2xfcGFyYW08dHJ1ZT4gbV9wZXJjZXB0dWFsOwogCkBAIC0zOTgsMTMgKzM4NiwxMCBAQAogCiAJCWJvb2xfcGFyYW08ZmFsc2U+IG1fcmVub3JtYWxpemU7CiAKKwkJLy8gSWYgdHJ1ZSB0aGUgZnJvbnQgZW5kIHdpbGwgbm90IHVzZSAyIGxldmVsIGVuZHBvaW50IGNvZGVib29rIHNlYXJjaGluZywgZm9yIHNsaWdodGx5IGhpZ2hlciBxdWFsaXR5IGJ1dCBtdWNoIHNsb3dlciBleGVjdXRpb24uCisJCS8vIE5vdGUgc29tZSBtX2NvbXByZXNzaW9uX2xldmVsJ3MgZGlzYWJsZSB0aGlzIGF1dG9tYXRpY2FsbHkuCiAJCWJvb2xfcGFyYW08ZmFsc2U+IG1fZGlzYWJsZV9oaWVyYXJjaGljYWxfZW5kcG9pbnRfY29kZWJvb2tzOwotCi0JCS8vIEdsb2JhbC9oeWJyaWQgc2VsZWN0b3IgY29kZWJvb2sgcGFyYW1ldGVycwotCQlwYXJhbTxmbG9hdD4gbV9oeWJyaWRfc2VsX2NiX3F1YWxpdHlfdGhyZXNoOwotCQlwYXJhbTxpbnQ+IG1fZ2xvYmFsX3BhbF9iaXRzOwotCQlwYXJhbTxpbnQ+IG1fZ2xvYmFsX21vZF9iaXRzOwotCQkKKwkJCQkJCQogCQkvLyBtaXBtYXAgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzCiAJCWJvb2xfcGFyYW08ZmFsc2U+IG1fbWlwX2dlbjsKIAkJcGFyYW08ZmxvYXQ+IG1fbWlwX3NjYWxlOwpAQCAtNDE1LDkgKzQwMCw5IEBACiAJCWJvb2xfcGFyYW08dHJ1ZT4gbV9taXBfd3JhcHBpbmc7CiAJCWJvb2xfcGFyYW08dHJ1ZT4gbV9taXBfZmFzdDsKIAkJcGFyYW08aW50PiBtX21pcF9zbWFsbGVzdF9kaW1lbnNpb247Ci0JCQkJCisJCQkJCQkKIAkJLy8gQ29kZWJvb2sgc2l6ZSAocXVhbGl0eSkgY29udHJvbC4gCi0JCS8vIElmIG1fcXVhbGl0eV9sZXZlbCAhPSAtMSwgaXQgY29udHJvbHMgdGhlIHF1YWxpdHkgbGV2ZWwuIEl0IHJhbmdlcyBmcm9tIFswLDI1NV0gb3IgW0JBU0lTVV9RVUFMSVRZX01JTiwgQkFTSVNVX1FVQUxJVFlfTUFYXS4KKwkJLy8gSWYgbV9xdWFsaXR5X2xldmVsICE9IC0xLCBpdCBjb250cm9scyB0aGUgcXVhbGl0eSBsZXZlbC4gSXQgcmFuZ2VzIGZyb20gWzEsMjU1XSBvciBbQkFTSVNVX1FVQUxJVFlfTUlOLCBCQVNJU1VfUVVBTElUWV9NQVhdLgogCQkvLyBPdGhlcndpc2UgbV9tYXhfZW5kcG9pbnRfY2x1c3RlcnMvbV9tYXhfc2VsZWN0b3JfY2x1c3RlcnMgY29udHJvbHMgdGhlIGNvZGVib29rIHNpemVzIGRpcmVjdGx5LgogCQl1aW50MzJfdCBtX21heF9lbmRwb2ludF9jbHVzdGVyczsKIAkJdWludDMyX3QgbV9tYXhfc2VsZWN0b3JfY2x1c3RlcnM7CkBAIC00NDQsNiArNDI5LDcgQEAKIAkJcGFyYW08aW50PiBtX3Jlc2FtcGxlX3dpZHRoOwogCQlwYXJhbTxpbnQ+IG1fcmVzYW1wbGVfaGVpZ2h0OwogCQlwYXJhbTxmbG9hdD4gbV9yZXNhbXBsZV9mYWN0b3I7CisKIAkJY29uc3QgYmFzaXN0OjpiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlciAqbV9wR2xvYmFsX2NvZGVib29rczsKIAogCQkvLyBLVFgyIHNwZWNpZmljIHBhcmFtZXRlcnMuCkBAIC00NTQsMjEgKzQ0MCwyNyBAQAogCQlwYXJhbTxpbnQ+IG1fa3R4Ml96c3RkX3N1cGVyY29tcHJlc3Npb25fbGV2ZWw7CiAJCWJvb2xfcGFyYW08ZmFsc2U+IG1fa3R4Ml9zcmdiX3RyYW5zZmVyX2Z1bmM7CiAKKwkJYm9vbF9wYXJhbTxmYWxzZT4gbV92YWxpZGF0ZV9vdXRwdXRfZGF0YTsKKwogCQlqb2JfcG9vbCAqbV9wSm9iX3Bvb2w7CiAJfTsKLQkKKworCS8vIEltcG9ydGFudDogYmFzaXN1X2VuY29kZXJfaW5pdCgpIE1VU1QgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSB1c2luZyB0aGlzIGNsYXNzLgogCWNsYXNzIGJhc2lzX2NvbXByZXNzb3IKIAl7CiAJCUJBU0lTVV9OT19FUVVBTFNfT1JfQ09QWV9DT05TVFJVQ1QoYmFzaXNfY29tcHJlc3Nvcik7CiAKIAlwdWJsaWM6CiAJCWJhc2lzX2NvbXByZXNzb3IoKTsKKwkJfmJhc2lzX2NvbXByZXNzb3IoKTsKIAorCQkvLyBOb3RlIGl0ICpzaG91bGQqIGJlIHBvc3NpYmxlIHRvIGNhbGwgaW5pdCgpIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGlucHV0cywgYnV0IHRoaXMgc2NlbmFyaW8gaXNuJ3Qgd2VsbCB0ZXN0ZWQuIElkZWFsbHksIGNyZWF0ZSAxIG9iamVjdCwgY29tcHJlc3MsIHRoZW4gZGVsZXRlIGl0LgogCQlib29sIGluaXQoY29uc3QgYmFzaXNfY29tcHJlc3Nvcl9wYXJhbXMgJnBhcmFtcyk7CiAJCQogCQllbnVtIGVycm9yX2NvZGUKIAkJewogCQkJY0VDU3VjY2VzcyA9IDAsCisJCQljRUNGYWlsZWRJbml0aWFsaXppbmcsCiAJCQljRUNGYWlsZWRSZWFkaW5nU291cmNlSW1hZ2VzLAogCQkJY0VDRmFpbGVkVmFsaWRhdGluZywKIAkJCWNFQ0ZhaWxlZEVuY29kZVVBU1RDLApAQCAtNDk1LDkgKzQ4NywxMyBAQAogCQlkb3VibGUgZ2V0X2Jhc2lzX2JpdHNfcGVyX3RleGVsKCkgY29uc3QgeyByZXR1cm4gbV9iYXNpc19iaXRzX3Blcl90ZXhlbDsgfQogCQkKIAkJYm9vbCBnZXRfYW55X3NvdXJjZV9pbWFnZV9oYXNfYWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2FueV9zb3VyY2VfaW1hZ2VfaGFzX2FscGhhOyB9CisKKwkJYm9vbCBnZXRfb3BlbmNsX2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fb3BlbmNsX2ZhaWxlZDsgfQogCQkJCQkJCQkKIAlwcml2YXRlOgogCQliYXNpc19jb21wcmVzc29yX3BhcmFtcyBtX3BhcmFtczsKKworCQlvcGVuY2xfY29udGV4dF9wdHIgbV9wT3BlbkNMX2NvbnRleHQ7CiAJCQogCQliYXNpc3U6OnZlY3RvcjxpbWFnZT4gbV9zbGljZV9pbWFnZXM7CiAKQEAgLTUwOSw4ICs1MDUsNyBAQAogCQliYXNpc3VfYmFja2VuZF9zbGljZV9kZXNjX3ZlYyBtX3NsaWNlX2Rlc2NzOwogCiAJCXVpbnQzMl90IG1fdG90YWxfYmxvY2tzOwotCQlib29sIG1fYXV0b19nbG9iYWxfc2VsX3BhbDsKLQorCQkKIAkJYmFzaXN1X2Zyb250ZW5kIG1fZnJvbnRlbmQ7CiAJCXBpeGVsX2Jsb2NrX3ZlYyBtX3NvdXJjZV9ibG9ja3M7CiAKQEAgLTUzNiw2ICs1MzEsOCBAQAogCiAJCWJvb2wgbV9hbnlfc291cmNlX2ltYWdlX2hhc19hbHBoYTsKIAorCQlib29sIG1fb3BlbmNsX2ZhaWxlZDsKKwogCQlib29sIHJlYWRfc291cmNlX2ltYWdlcygpOwogCQlib29sIGV4dHJhY3Rfc291cmNlX2Jsb2NrcygpOwogCQlib29sIHByb2Nlc3NfZnJvbnRlbmQoKTsKQEAgLTU1MCw2ICs1NDcsOTggQEAKIAkJdm9pZCBnZXRfZGZkKHVpbnQ4X3ZlYyYgZGZkLCBjb25zdCBiYXNpc3Q6Omt0eDJfaGVhZGVyJiBoZHIpOwogCQlib29sIGNyZWF0ZV9rdHgyX2ZpbGUoKTsKIAl9OworCQkJCQorCS8vIEFsdGVybmF0aXZlIHNpbXBsZSBDLXN0eWxlIHdyYXBwZXIgQVBJIGFyb3VuZCB0aGUgYmFzaXNfY29tcHJlc3NvciBjbGFzcy4gCisJLy8gVGhpcyBkb2Vzbid0IGV4cG9zZSBldmVyeSBlbmNvZGVyIGZlYXR1cmUsIGJ1dCBpdCdzIGVub3VnaCB0byBnZXQgZ29pbmcuCisJLy8gSW1wb3J0YW50OiBiYXNpc3VfZW5jb2Rlcl9pbml0KCkgTVVTVCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIGNhbGxpbmcgdGhlc2UgZnVuY3Rpb25zLgorCS8vCisJLy8gSW5wdXQgcGFyYW1ldGVyczoKKwkvLyAgIHNvdXJjZV9pbWFnZXM6IEFycmF5IG9mICJpbWFnZSIgb2JqZWN0cywgb25lIHBlciBtaXBtYXAgbGV2ZWwsIGxhcmdlc3QgbWlwbWFwIGxldmVsIGZpcnN0LgorCS8vIE9SCisJLy8gICBwSW1hZ2VSR0JBOiBwb2ludGVyIHRvIGEgMzItYnBwIFJHQnggb3IgUkdCQSByYXN0ZXIgaW1hZ2UsIFIgZmlyc3QgaW4gbWVtb3J5LCBBIGxhc3QuIFRvcCBzY2FubGluZSBmaXJzdCBpbiBtZW1vcnkuCisJLy8gICB3aWR0aC9oZWlnaHQvcGl0Y2hfaW5fcGl4ZWxzOiBkaW1lbnNpb25zIG9mIHBJbWFnZVJHQkEKKwkvLyAgIAorCS8vIGZsYWdzX2FuZF9xdWFsaXR5OiBDb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgZmxhZ3MgbG9naWNhbGx5IE9SJ2Qgd2l0aCB0aGUgRVRDMVMgb3IgVUFTVEMgbGV2ZWwsIGkuZS4gImNGbGFnU1JHQiB8IGNGbGFnR2VuTWlwc0NsYW1wIHwgY0ZsYWdUaHJlYWRlZCB8IDEyOCIgb3IgImNGbGFnU1JHQiB8IGNGbGFnR2VuTWlwc0NsYW1wIHwgY0ZsYWdVQVNUQyB8IGNGbGFnVGhyZWFkZWQgfCBjUGFja1VBU1RDTGV2ZWxEZWZhdWx0Ii4KKwkvLwkgIEluIEVUQzFTIG1vZGUsIHRoZSBsb3dlciA4LWJpdHMgYXJlIHRoZSBFVEMxUyBxdWFsaXR5IGxldmVsIHdoaWNoIHJhbmdlcyBmcm9tIFsxLDI1NV0gKGhpZ2hlcj1iZXR0ZXIgcXVhbGl0eS9sYXJnZXIgZmlsZXMpCisJLy8JICBJbiBVQVNUQyBtb2RlLCB0aGUgbG93ZXIgOC1iaXRzIGFyZSB0aGUgVUFTVEMgcGFjayBsZXZlbCAoc2VlIGNQYWNrVUFTVENMZXZlbEZhc3Rlc3QsIGV0Yy4pLiBGYXN0ZXN0L2xvd2VzdCBxdWFsaXR5IGlzIDAsIHNvIGJlIHN1cmUgdG8gc2V0IGl0IGNvcnJlY3RseS4gCisJLy8gCisJLy8gdWFzdGNfcmRvX3F1YWxpdHk6IEZsb2F0IFVBU1RDIFJETyBxdWFsaXR5IGxldmVsICgwPW5vIGNoYW5nZSwgaGlnaGVyIHZhbHVlcyBsb3dlciBxdWFsaXR5IGJ1dCBpbmNyZWFzZSBjb21wcmVzc2liaWxpdHksIGluaXRpYWxseSB0cnkgLjUtMS41KQorCS8vIAorCS8vIHBTaXplOiBSZXR1cm5zIHRoZSBvdXRwdXQgZGF0YSdzIGNvbXByZXNzZWQgc2l6ZSBpbiBieXRlcworCS8vIAorCS8vIFJldHVybiB2YWx1ZSBpcyB0aGUgY29tcHJlc3NlZCAuYmFzaXMgb3IgLmt0eDIgZmlsZSBkYXRhLCBvciBudWxscHRyIG9uIGZhaWx1cmUuIE11c3QgY2FsbCBiYXNpc19mcmVlKCkgdG8gZnJlZSBpdC4KKwllbnVtCisJeworCQljRmxhZ1VzZU9wZW5DTCA9IDEgPDwgOCwJCS8vIHVzZSBPcGVuQ0wgaWYgYXZhaWxhYmxlCisJCWNGbGFnVGhyZWFkZWQgPSAxIDw8IDksCQkJLy8gdXNlIG11bHRpcGxlIHRocmVhZHMgZm9yIGNvbXByZXNzaW9uCisJCWNGbGFnRGVidWcgPSAxIDw8IDEwLAkJCS8vIGVuYWJsZSBkZWJ1ZyBvdXRwdXQKIAorCQljRmxhZ0tUWDIgPSAxIDw8IDExLAkJCS8vIGdlbmVyYXRlIGEgS1RYMiBmaWxlCisJCWNGbGFnS1RYMlVBU1RDU3VwZXJDb21wcmVzc2lvbiA9IDEgPDwgMTIsIC8vIHVzZSBLVFgyIFpzdGQgc3VwZXJjb21wcmVzc2lvbiBvbiBVQVNUQyBmaWxlcworCisJCWNGbGFnU1JHQiA9IDEgPDwgMTMsCQkJLy8gaW5wdXQgdGV4dHVyZSBpcyBzUkdCLCB1c2UgcGVyY2VwdHVhbCBjb2xvcnNwYWNlIG1ldHJpY3MsIGFsc28gdXNlIHNSR0IgZmlsdGVyaW5nIGR1cmluZyBtaXBtYXAgZ2VuLCBhbmQgYWxzbyBzZXRzIEtUWDIgb3V0cHV0IHRyYW5zZmVyIGZ1bmMgdG8gc1JHQgorCQljRmxhZ0dlbk1pcHNDbGFtcCA9IDEgPDwgMTQsICAvLyBnZW5lcmF0ZSBtaXBtYXBzIHdpdGggY2xhbXAgYWRkcmVzc2luZworCQljRmxhZ0dlbk1pcHNXcmFwID0gMSA8PCAxNSwgIC8vIGdlbmVyYXRlIG1pcG1hcHMgd2l0aCB3cmFwIGFkZHJlc3NpbmcKKwkJCisJCWNGbGFnWUZsaXAgPSAxIDw8IDE2LAkJLy8gZmxpcCBzb3VyY2UgaW1hZ2Ugb24gWSBheGlzIGJlZm9yZSBjb21wcmVzc2lvbgorCQkKKwkJY0ZsYWdVQVNUQyA9IDEgPDwgMTcsCQkvLyB1c2UgVUFTVEMgY29tcHJlc3Npb24gdnMuIEVUQzFTCisJCWNGbGFnVUFTVENSRE8gPSAxIDw8IDE4CQkvLyB1c2UgUkRPIHBvc3Rwcm9jZXNzaW5nIHdoZW4gZ2VuZXJhdGluZyBVQVNUQyBmaWxlcyAobXVzdCBzZXQgdWFzdGNfcmRvX3F1YWxpdHkgdG8gdGhlIHF1YWxpdHkgc2NhbGFyKQorCX07CisKKwkvLyBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW4gYXJyYXkgb2Ygc291cmNlIGltYWdlcy4gCisJLy8gSWYgbW9yZSB0aGFuIG9uZSBpbWFnZSBpcyBwcm92aWRlZCwgaXQncyBhc3N1bWVkIHRoZSBpbWFnZXMgZm9ybSBhIG1pcG1hcCBweXJhbWlkIGFuZCBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24gaXMgZGlzYWJsZWQuCisJdm9pZCogYmFzaXNfY29tcHJlc3MoCisJCWNvbnN0IGJhc2lzdTo6dmVjdG9yPGltYWdlPiAmc291cmNlX2ltYWdlcywKKwkJdWludDMyX3QgZmxhZ3NfYW5kX3F1YWxpdHksIGZsb2F0IHVhc3RjX3Jkb19xdWFsaXR5LAorCQlzaXplX3QqIHBTaXplLAorCQlpbWFnZV9zdGF0cyogcFN0YXRzID0gbnVsbHB0cik7CisKKwkvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgYWNjZXB0cyBhIHNpbmdsZSBzb3VyY2UgaW1hZ2UuCisJdm9pZCogYmFzaXNfY29tcHJlc3MoCisJCWNvbnN0IHVpbnQ4X3QqIHBJbWFnZVJHQkEsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHBpdGNoX2luX3BpeGVscywKKwkJdWludDMyX3QgZmxhZ3NfYW5kX3F1YWxpdHksIGZsb2F0IHVhc3RjX3Jkb19xdWFsaXR5LAorCQlzaXplX3QqIHBTaXplLAorCQlpbWFnZV9zdGF0cyogcFN0YXRzID0gbnVsbHB0cik7CisKKwkvLyBGcmVlcyB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGZpbGUgZGF0YSByZXR1cm5lZCBieSBiYXNpc19jb21wcmVzcygpLgorCXZvaWQgYmFzaXNfZnJlZV9kYXRhKHZvaWQqIHApOworCisJLy8gUGFyYWxsZWwgY29tcHJlc3Npb24gQVBJCisJc3RydWN0IHBhcmFsbGVsX3Jlc3VsdHMKKwl7CisJCWRvdWJsZSBtX3RvdGFsX3RpbWU7CisJCWJhc2lzX2NvbXByZXNzb3I6OmVycm9yX2NvZGUgbV9lcnJvcl9jb2RlOworCQl1aW50OF92ZWMgbV9iYXNpc19maWxlOworCQl1aW50OF92ZWMgbV9rdHgyX2ZpbGU7CisJCWJhc2lzdTo6dmVjdG9yPGltYWdlX3N0YXRzPiBtX3N0YXRzOworCQlkb3VibGUgbV9iYXNpc19iaXRzX3Blcl90ZXhlbDsKKwkJYm9vbCBtX2FueV9zb3VyY2VfaW1hZ2VfaGFzX2FscGhhOworCisJCXBhcmFsbGVsX3Jlc3VsdHMoKSAKKwkJeworCQkJY2xlYXIoKTsKKwkJfQorCisJCXZvaWQgY2xlYXIoKQorCQl7CisJCQltX3RvdGFsX3RpbWUgPSAwLjBmOworCQkJbV9lcnJvcl9jb2RlID0gYmFzaXNfY29tcHJlc3Nvcjo6Y0VDRmFpbGVkSW5pdGlhbGl6aW5nOworCQkJbV9iYXNpc19maWxlLmNsZWFyKCk7CisJCQltX2t0eDJfZmlsZS5jbGVhcigpOworCQkJbV9zdGF0cy5jbGVhcigpOworCQkJbV9iYXNpc19iaXRzX3Blcl90ZXhlbCA9IDAuMGY7CisJCQltX2FueV9zb3VyY2VfaW1hZ2VfaGFzX2FscGhhID0gZmFsc2U7CisJCX0KKwl9OworCQkKKwkvLyBDb21wcmVzc2VzIGFuIGFycmF5IG9mIGlucHV0IHRleHR1cmVzIGFjcm9zcyB0b3RhbF90aHJlYWRzIHRocmVhZHMgdXNpbmcgdGhlIGJhc2lzX2NvbXByZXNzb3IgY2xhc3MuCisJLy8gQ29tcHJlc3NpbmcgbXVsdGlwbGUgdGV4dHVyZXMgYXQgYSB0aW1lIGlzIHN1YnN0YW50aWFsbHkgbW9yZSBlZmZpY2llbnQgdGhhbiBqdXN0IGNvbXByZXNzaW5nIG9uZSBhdCBhIHRpbWUuCisJLy8gdG90YWxfdGhyZWFkcyBtdXN0IGJlID49IDEuCisJYm9vbCBiYXNpc19wYXJhbGxlbF9jb21wcmVzcygKKwkJdWludDMyX3QgdG90YWxfdGhyZWFkcywKKwkJY29uc3QgYmFzaXN1Ojp2ZWN0b3I8YmFzaXNfY29tcHJlc3Nvcl9wYXJhbXM+ICZwYXJhbXNfdmVjLAorCQliYXNpc3U6OnZlY3RvcjwgcGFyYWxsZWxfcmVzdWx0cyA+ICZyZXN1bHRzX3ZlYyk7CisJCQogfSAvLyBuYW1lc3BhY2UgYmFzaXN1CiAKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X2VuYy5jcHAgYi9lbmNvZGVyL2Jhc2lzdV9lbmMuY3BwCmluZGV4IGE3MjYyMDguLmI0MjcyMTUgMTAwNjQ0Ci0tLSBhL2VuY29kZXIvYmFzaXN1X2VuYy5jcHAKKysrIGIvZW5jb2Rlci9iYXNpc3VfZW5jLmNwcApAQCAtMTMsMTYgKzEzLDIwIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpbmNsdWRlICJiYXNpc3VfZW5jLmgiCi0jaW5jbHVkZSAibG9kZXBuZy5oIgogI2luY2x1ZGUgImJhc2lzdV9yZXNhbXBsZXIuaCIKICNpbmNsdWRlICJiYXNpc3VfcmVzYW1wbGVyX2ZpbHRlcnMuaCIKICNpbmNsdWRlICJiYXNpc3VfZXRjLmgiCiAjaW5jbHVkZSAiLi4vdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlci5oIgogI2luY2x1ZGUgImJhc2lzdV9iYzdlbmMuaCIKLSNpbmNsdWRlICJhcGdfYm1wLmgiCiAjaW5jbHVkZSAianBnZC5oIgorI2luY2x1ZGUgInB2cG5ncmVhZGVyLmgiCisjaW5jbHVkZSAiYmFzaXN1X29wZW5jbC5oIgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2RlZmluZSBNSU5JWl9IRUFERVJfRklMRV9PTkxZCisjZGVmaW5lIE1JTklaX05PX1pMSUJfQ09NUEFUSUJMRV9OQU1FUworI2luY2x1ZGUgImJhc2lzdV9taW5pei5oIgorCiAjaWYgZGVmaW5lZChfV0lOMzIpCiAvLyBGb3IgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIvUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeQogI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCkBAIC0xNTgsMzQgKzE2Miw2MiBAQAogCSB7IDB4NkUsIDB4M0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAgIC8vIFUrMDA3RSAofikKIAkgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSAgICAvLyBVKzAwN0YKIAl9OwotCQkJCisKKwlib29sIGdfbGlicmFyeV9pbml0aWFsaXplZDsKKwlzdGQ6Om11dGV4IGdfZW5jb2Rlcl9pbml0X211dGV4OworCiAJLy8gRW5jb2RlciBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIChqdXN0IGNhbGwgb25jZSBhdCBzdGFydHVwKQotCXZvaWQgYmFzaXN1X2VuY29kZXJfaW5pdCgpCisJdm9pZCBiYXNpc3VfZW5jb2Rlcl9pbml0KGJvb2wgdXNlX29wZW5jbCwgYm9vbCBvcGVuY2xfZm9yY2Vfc2VyaWFsaXphdGlvbikKIAl7CisJCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdfZW5jb2Rlcl9pbml0X211dGV4KTsKKworCQlpZiAoZ19saWJyYXJ5X2luaXRpYWxpemVkKQorCQkJcmV0dXJuOworCiAJCWRldGVjdF9zc2U0MSgpOwogCiAJCWJhc2lzdDo6YmFzaXN1X3RyYW5zY29kZXJfaW5pdCgpOwogCQlwYWNrX2V0YzFfc29saWRfY29sb3JfaW5pdCgpOwogCQkvL3Vhc3RjX2luaXQoKTsKIAkJYmM3ZW5jX2NvbXByZXNzX2Jsb2NrX2luaXQoKTsgLy8gbXVzdCBiZSBhZnRlciB1YXN0Y19pbml0KCkKKworCQkvLyBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nIHRoZSBPcGVuQ0wgbW9kdWxlIGF0IGFsbCBpZiBpdCdzIGJlZW4gY29tcGxldGVseSBkaXNhYmxlZC4KKwkJaWYgKHVzZV9vcGVuY2wpCisJCXsKKwkJCW9wZW5jbF9pbml0KG9wZW5jbF9mb3JjZV9zZXJpYWxpemF0aW9uKTsKKwkJfQorCisJCWdfbGlicmFyeV9pbml0aWFsaXplZCA9IHRydWU7CiAJfQogCi0Jdm9pZCBlcnJvcl9wcmludGYoY29uc3QgY2hhciAqcEZtdCwgLi4uKQorCXZvaWQgYmFzaXN1X2VuY29kZXJfZGVpbml0KCkKIAl7Ci0JCWNoYXIgYnVmWzIwNDhdOworCQlvcGVuY2xfZGVpbml0KCk7CiAKLQkJdmFfbGlzdCBhcmdzOwotCQl2YV9zdGFydChhcmdzLCBwRm10KTsKKwkJZ19saWJyYXJ5X2luaXRpYWxpemVkID0gZmFsc2U7CisJfQorCisJdm9pZCBlcnJvcl92cHJpbnRmKGNvbnN0IGNoYXIqIHBGbXQsIHZhX2xpc3QgYXJncykKKwl7CisJCWNoYXIgYnVmWzgxOTJdOworCiAjaWZkZWYgX1dJTjMyCQkKIAkJdnNwcmludGZfcyhidWYsIHNpemVvZihidWYpLCBwRm10LCBhcmdzKTsKICNlbHNlCiAJCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBwRm10LCBhcmdzKTsKICNlbmRpZgotCQl2YV9lbmQoYXJncyk7CiAKIAkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogJXMiLCBidWYpOwogCX0KIAorCXZvaWQgZXJyb3JfcHJpbnRmKGNvbnN0IGNoYXIgKnBGbXQsIC4uLikKKwl7CisJCXZhX2xpc3QgYXJnczsKKwkJdmFfc3RhcnQoYXJncywgcEZtdCk7CisJCWVycm9yX3ZwcmludGYocEZtdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKwl9CisKICNpZiBkZWZpbmVkKF9XSU4zMikKIAlpbmxpbmUgdm9pZCBxdWVyeV9jb3VudGVyKHRpbWVyX3RpY2tzKiBwVGlja3MpCiAJewpAQCAtMjg0LDU5ICszMTYsNiBAQAogCX0KIAkJCiAJY29uc3QgdWludDMyX3QgTUFYXzMyQklUX0FMTE9DX1NJWkUgPSAyNTAwMDAwMDA7Ci0KLQlib29sIGxvYWRfYm1wKGNvbnN0IGNoYXIqIHBGaWxlbmFtZSwgaW1hZ2UmIGltZykKLQl7Ci0JCWludCB3ID0gMCwgaCA9IDA7Ci0JCXVuc2lnbmVkIGludCBuX2NoYW5zID0gMDsKLQkJdW5zaWduZWQgY2hhciogcEltYWdlX2RhdGEgPSBhcGdfYm1wX3JlYWQocEZpbGVuYW1lLCAmdywgJmgsICZuX2NoYW5zKTsKLQkJCQkKLQkJaWYgKCghcEltYWdlX2RhdGEpIHx8ICghdykgfHwgKCFoKSB8fCAoKG5fY2hhbnMgIT0gMykgJiYgKG5fY2hhbnMgIT0gNCkpKQotCQl7Ci0JCQllcnJvcl9wcmludGYoIkZhaWxlZCBsb2FkaW5nIC5CTVAgaW1hZ2UgXCIlc1wiIVxuIiwgcEZpbGVuYW1lKTsKLQotCQkJaWYgKHBJbWFnZV9kYXRhKQotCQkJCWFwZ19ibXBfZnJlZShwSW1hZ2VfZGF0YSk7Ci0JCQkJCQkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChzaXplb2Yodm9pZCAqKSA9PSBzaXplb2YodWludDMyX3QpKQotCQl7Ci0JCQlpZiAoKHcgKiBoICogbl9jaGFucykgPiBNQVhfMzJCSVRfQUxMT0NfU0laRSkKLQkJCXsKLQkJCQllcnJvcl9wcmludGYoIkltYWdlIFwiJXNcIiBpcyB0b28gbGFyZ2UgKCV1eCV1KSB0byBwcm9jZXNzIGluIGEgMzItYml0IGJ1aWxkIVxuIiwgcEZpbGVuYW1lLCB3LCBoKTsKLQotCQkJCWlmIChwSW1hZ2VfZGF0YSkKLQkJCQkJYXBnX2JtcF9mcmVlKHBJbWFnZV9kYXRhKTsKLQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJaW1nLnJlc2l6ZSh3LCBoKTsKLQotCQljb25zdCB1aW50OF90ICpwU3JjID0gcEltYWdlX2RhdGE7Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKQotCQl7Ci0JCQljb2xvcl9yZ2JhICpwRHN0ID0gJmltZygwLCB5KTsKLQotCQkJZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspCi0JCQl7Ci0JCQkJcERzdC0+ciA9IHBTcmNbMF07Ci0JCQkJcERzdC0+ZyA9IHBTcmNbMV07Ci0JCQkJcERzdC0+YiA9IHBTcmNbMl07Ci0JCQkJcERzdC0+YSA9IChuX2NoYW5zID09IDMpID8gMjU1IDogcFNyY1szXTsKLQotCQkJCXBTcmMgKz0gbl9jaGFuczsKLQkJCQkrK3BEc3Q7Ci0JCQl9Ci0JCX0KLQotCQlhcGdfYm1wX2ZyZWUocEltYWdlX2RhdGEpOwotCi0JCXJldHVybiB0cnVlOwotCX0KIAkJCiAJYm9vbCBsb2FkX3RnYShjb25zdCBjaGFyKiBwRmlsZW5hbWUsIGltYWdlJiBpbWcpCiAJewpAQCAtMzkyLDUzICszNzEsMzUgQEAKIAogCWJvb2wgbG9hZF9wbmcoY29uc3QgdWludDhfdCAqcEJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLCBpbWFnZSAmaW1nLCBjb25zdCBjaGFyICpwRmlsZW5hbWUpCiAJeworCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJdG0uc3RhcnQoKTsKKwkJCiAJCWlmICghYnVmX3NpemUpCiAJCQlyZXR1cm4gZmFsc2U7CiAKLQkJdW5zaWduZWQgZXJyID0gMCwgdyA9IDAsIGggPSAwOwotCi0JCWlmIChzaXplb2Yodm9pZCopID09IHNpemVvZih1aW50MzJfdCkpCisJCXVpbnQzMl90IHdpZHRoID0gMCwgaGVpZ2h0ID0gMCwgbnVtX2NoYW5zID0gMDsKKwkJdm9pZCogcEltYWdlID0gcHZfcG5nOjpsb2FkX3BuZyhwQnVmLCBidWZfc2l6ZSwgNCwgd2lkdGgsIGhlaWdodCwgbnVtX2NoYW5zKTsKKwkJaWYgKCFwQnVmKQogCQl7Ci0JCQkvLyBJbnNwZWN0IHRoZSBpbWFnZSBmaXJzdCBvbiAzMi1iaXQgYnVpbGRzLCB0byBzZWUgaWYgdGhlIGltYWdlIHdvdWxkIHJlcXVpcmUgdG9vIG11Y2ggbWVtb3J5LgotCQkJbG9kZXBuZzo6U3RhdGUgc3RhdGU7Ci0JCQllcnIgPSBsb2RlcG5nX2luc3BlY3QoJncsICZoLCAmc3RhdGUsIHBCdWYsIGJ1Zl9zaXplKTsKLQkJCWlmICgoZXJyICE9IDApIHx8ICghdykgfHwgKCFoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWNvbnN0IHVpbnQzMl90IGV4ZXBlY3RlZF9hbGxvY19zaXplID0gdyAqIGggKiBzaXplb2YodWludDMyX3QpOwotCi0JCQkvLyBJZiB0aGUgZmlsZSBpcyB0b28gbGFyZ2Ugb24gMzItYml0IGJ1aWxkcyB0aGVuIGp1c3QgYmFpbCBub3csIHRvIHByZXZlbnQgY2F1c2luZyBhIG1lbW9yeSBleGNlcHRpb24uCi0JCQlpZiAoZXhlcGVjdGVkX2FsbG9jX3NpemUgPj0gTUFYXzMyQklUX0FMTE9DX1NJWkUpCi0JCQl7Ci0JCQkJZXJyb3JfcHJpbnRmKCJJbWFnZSBcIiVzXCIgaXMgdG9vIGxhcmdlICgldXgldSkgdG8gcHJvY2VzcyBpbiBhIDMyLWJpdCBidWlsZCFcbiIsIChwRmlsZW5hbWUgIT0gbnVsbHB0cikgPyBwRmlsZW5hbWUgOiAiPG1lbW9yeT4iLCB3LCBoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXcgPSBoID0gMDsKKwkJCWVycm9yX3ByaW50ZigicHZfcG5nOjpsb2FkX3BuZyBmYWlsZWQgd2hpbGUgbG9hZGluZyBpbWFnZSBcIiVzXCJcbiIsIHBGaWxlbmFtZSk7CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAotCQlzdGQ6OnZlY3Rvcjx1aW50OF90PiBvdXQ7Ci0JCWVyciA9IGxvZGVwbmc6OmRlY29kZShvdXQsIHcsIGgsIHBCdWYsIGJ1Zl9zaXplKTsKLQkJaWYgKChlcnIgIT0gMCkgfHwgKCF3KSB8fCAoIWgpKQotCQkJcmV0dXJuIGZhbHNlOworCQlpbWcuZ3JhbnRfb3duZXJzaGlwKHJlaW50ZXJwcmV0X2Nhc3Q8Y29sb3JfcmdiYSo+KHBJbWFnZSksIHdpZHRoLCBoZWlnaHQpOwogCi0JCWlmIChvdXQuc2l6ZSgpICE9ICh3ICogaCAqIDQpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWltZy5yZXNpemUodywgaCk7Ci0KLQkJbWVtY3B5KGltZy5nZXRfcHRyKCksICZvdXRbMF0sIG91dC5zaXplKCkpOworCQkvL2RlYnVnX3ByaW50ZigiVG90YWwgbG9hZF9wbmcoKSB0aW1lOiAlMy4zZiBzZWNzXG4iLCB0bS5nZXRfZWxhcHNlZF9zZWNzKCkpOwogCiAJCXJldHVybiB0cnVlOwogCX0KIAkJCiAJYm9vbCBsb2FkX3BuZyhjb25zdCBjaGFyKiBwRmlsZW5hbWUsIGltYWdlJiBpbWcpCiAJewotCQlzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7Ci0JCXVuc2lnbmVkIGVyciA9IGxvZGVwbmc6OmxvYWRfZmlsZShidWZmZXIsIHN0ZDo6c3RyaW5nKHBGaWxlbmFtZSkpOwotCQlpZiAoZXJyKQorCQl1aW50OF92ZWMgYnVmZmVyOworCQlpZiAoIXJlYWRfZmlsZV90b192ZWMocEZpbGVuYW1lLCBidWZmZXIpKQorCQl7CisJCQllcnJvcl9wcmludGYoImxvYWRfcG5nOiBGYWlsZWQgcmVhZGluZyBmaWxlIFwiJXNcIiFcbiIsIHBGaWxlbmFtZSk7CiAJCQlyZXR1cm4gZmFsc2U7Ci0KKwkJfQogCiAJCXJldHVybiBsb2FkX3BuZyhidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpLCBpbWcsIHBGaWxlbmFtZSk7CiAJfQpAQCAtNDY4LDggKzQyOSw2IEBACiAKIAkJaWYgKHN0cmNhc2VjbXAocEV4dCwgInBuZyIpID09IDApCiAJCQlyZXR1cm4gbG9hZF9wbmcocEZpbGVuYW1lLCBpbWcpOwotCQlpZiAoc3RyY2FzZWNtcChwRXh0LCAiYm1wIikgPT0gMCkKLQkJCXJldHVybiBsb2FkX2JtcChwRmlsZW5hbWUsIGltZyk7CiAJCWlmIChzdHJjYXNlY21wKHBFeHQsICJ0Z2EiKSA9PSAwKQogCQkJcmV0dXJuIGxvYWRfdGdhKHBGaWxlbmFtZSwgaW1nKTsKIAkJaWYgKCAoc3RyY2FzZWNtcChwRXh0LCAianBnIikgPT0gMCkgfHwgKHN0cmNhc2VjbXAocEV4dCwgImpmaWYiKSA9PSAwKSB8fCAoc3RyY2FzZWNtcChwRXh0LCAianBlZyIpID09IDApICkKQEAgLTQ4Miw2MSArNDQxLDY3IEBACiAJewogCQlpZiAoIWltZy5nZXRfdG90YWxfcGl4ZWxzKCkpCiAJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJY29uc3QgdWludDMyX3QgTUFYX1BOR19JTUFHRV9ESU0gPSAzMjc2ODsKLQkJaWYgKChpbWcuZ2V0X3dpZHRoKCkgPiBNQVhfUE5HX0lNQUdFX0RJTSkgfHwgKGltZy5nZXRfaGVpZ2h0KCkgPiBNQVhfUE5HX0lNQUdFX0RJTSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJc3RkOjp2ZWN0b3I8dWludDhfdD4gb3V0OwotCQl1bnNpZ25lZCBlcnIgPSAwOwogCQkJCQorCQl2b2lkKiBwUE5HX2RhdGEgPSBudWxscHRyOworCQlzaXplX3QgUE5HX2RhdGFfc2l6ZSA9IDA7CisKIAkJaWYgKGltYWdlX3NhdmVfZmxhZ3MgJiBjSW1hZ2VTYXZlR3JheXNjYWxlKQogCQl7Ci0JCQl1aW50OF92ZWMgZ19waXhlbHMoaW1nLmdldF93aWR0aCgpICogaW1nLmdldF9oZWlnaHQoKSk7Ci0JCQl1aW50OF90ICpwRHN0ID0gJmdfcGl4ZWxzWzBdOworCQkJdWludDhfdmVjIGdfcGl4ZWxzKGltZy5nZXRfdG90YWxfcGl4ZWxzKCkpOworCQkJdWludDhfdCogcERzdCA9ICZnX3BpeGVsc1swXTsKIAogCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGltZy5nZXRfaGVpZ2h0KCk7IHkrKykKIAkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgaW1nLmdldF93aWR0aCgpOyB4KyspCiAJCQkJCSpwRHN0KysgPSBpbWcoeCwgeSlbZ3JheXNjYWxlX2NvbXBdOwogCi0JCQllcnIgPSBsb2RlcG5nOjplbmNvZGUob3V0LCAoY29uc3QgdWludDhfdCopJmdfcGl4ZWxzWzBdLCBpbWcuZ2V0X3dpZHRoKCksIGltZy5nZXRfaGVpZ2h0KCksIExDVF9HUkVZLCA4KTsKKwkJCXBQTkdfZGF0YSA9IGJ1bWluaXo6OnRkZWZsX3dyaXRlX2ltYWdlX3RvX3BuZ19maWxlX2luX21lbW9yeV9leChnX3BpeGVscy5kYXRhKCksIGltZy5nZXRfd2lkdGgoKSwgaW1nLmdldF9oZWlnaHQoKSwgMSwgJlBOR19kYXRhX3NpemUsIDEsIGZhbHNlKTsKIAkJfQogCQllbHNlCiAJCXsKLQkJCWJvb2wgaGFzX2FscGhhID0gaW1nLmhhc19hbHBoYSgpOwotCQkJaWYgKCghaGFzX2FscGhhKSB8fCAoKGltYWdlX3NhdmVfZmxhZ3MgJiBjSW1hZ2VTYXZlSWdub3JlQWxwaGEpICE9IDApKQorCQkJYm9vbCBoYXNfYWxwaGEgPSBmYWxzZTsKKwkJCQorCQkJaWYgKChpbWFnZV9zYXZlX2ZsYWdzICYgY0ltYWdlU2F2ZUlnbm9yZUFscGhhKSA9PSAwKQorCQkJCWhhc19hbHBoYSA9IGltZy5oYXNfYWxwaGEoKTsKKworCQkJaWYgKCFoYXNfYWxwaGEpCiAJCQl7Ci0JCQkJY29uc3QgdWludDY0X3QgdG90YWxfYnl0ZXMgPSAodWludDY0X3QpaW1nLmdldF93aWR0aCgpICogM1UgKiAodWludDY0X3QpaW1nLmdldF9oZWlnaHQoKTsKLQkJCQlpZiAodG90YWxfYnl0ZXMgPiBJTlRfTUFYKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJdWludDhfdmVjIHJnYl9waXhlbHMoc3RhdGljX2Nhc3Q8c2l6ZV90Pih0b3RhbF9ieXRlcykpOwotCQkJCXVpbnQ4X3QgKnBEc3QgPSAmcmdiX3BpeGVsc1swXTsKLQkJCQkJCQkJCisJCQkJdWludDhfdmVjIHJnYl9waXhlbHMoaW1nLmdldF90b3RhbF9waXhlbHMoKSAqIDMpOworCQkJCXVpbnQ4X3QqIHBEc3QgPSAmcmdiX3BpeGVsc1swXTsKKwogCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCBpbWcuZ2V0X2hlaWdodCgpOyB5KyspCiAJCQkJeworCQkJCQljb25zdCBjb2xvcl9yZ2JhKiBwU3JjID0gJmltZygwLCB5KTsKIAkJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGltZy5nZXRfd2lkdGgoKTsgeCsrKQogCQkJCQl7Ci0JCQkJCQljb25zdCBjb2xvcl9yZ2JhJiBjID0gaW1nKHgsIHkpOwotCQkJCQkJcERzdFswXSA9IGMucjsKLQkJCQkJCXBEc3RbMV0gPSBjLmc7Ci0JCQkJCQlwRHN0WzJdID0gYy5iOworCQkJCQkJcERzdFswXSA9IHBTcmMtPnI7CisJCQkJCQlwRHN0WzFdID0gcFNyYy0+ZzsKKwkJCQkJCXBEc3RbMl0gPSBwU3JjLT5iOworCQkJCQkJCisJCQkJCQlwU3JjKys7CiAJCQkJCQlwRHN0ICs9IDM7CiAJCQkJCX0KIAkJCQl9CiAKLQkJCQllcnIgPSBsb2RlcG5nOjplbmNvZGUob3V0LCAoY29uc3QgdWludDhfdCopJiByZ2JfcGl4ZWxzWzBdLCBpbWcuZ2V0X3dpZHRoKCksIGltZy5nZXRfaGVpZ2h0KCksIExDVF9SR0IsIDgpOworCQkJCXBQTkdfZGF0YSA9IGJ1bWluaXo6OnRkZWZsX3dyaXRlX2ltYWdlX3RvX3BuZ19maWxlX2luX21lbW9yeV9leChyZ2JfcGl4ZWxzLmRhdGEoKSwgaW1nLmdldF93aWR0aCgpLCBpbWcuZ2V0X2hlaWdodCgpLCAzLCAmUE5HX2RhdGFfc2l6ZSwgMSwgZmFsc2UpOwogCQkJfQogCQkJZWxzZQogCQkJewotCQkJCWVyciA9IGxvZGVwbmc6OmVuY29kZShvdXQsIChjb25zdCB1aW50OF90KilpbWcuZ2V0X3B0cigpLCBpbWcuZ2V0X3dpZHRoKCksIGltZy5nZXRfaGVpZ2h0KCksIExDVF9SR0JBLCA4KTsKKwkJCQlwUE5HX2RhdGEgPSBidW1pbml6Ojp0ZGVmbF93cml0ZV9pbWFnZV90b19wbmdfZmlsZV9pbl9tZW1vcnlfZXgoaW1nLmdldF9wdHIoKSwgaW1nLmdldF93aWR0aCgpLCBpbWcuZ2V0X2hlaWdodCgpLCA0LCAmUE5HX2RhdGFfc2l6ZSwgMSwgZmFsc2UpOwogCQkJfQogCQl9CiAKLQkJZXJyID0gbG9kZXBuZzo6c2F2ZV9maWxlKG91dCwgc3RkOjpzdHJpbmcocEZpbGVuYW1lKSk7Ci0JCWlmIChlcnIpCisJCWlmICghcFBOR19kYXRhKQogCQkJcmV0dXJuIGZhbHNlOwogCi0JCXJldHVybiB0cnVlOworCQlib29sIHN0YXR1cyA9IHdyaXRlX2RhdGFfdG9fZmlsZShwRmlsZW5hbWUsIHBQTkdfZGF0YSwgUE5HX2RhdGFfc2l6ZSk7CisJCWlmICghc3RhdHVzKQorCQl7CisJCQllcnJvcl9wcmludGYoInNhdmVfcG5nOiBGYWlsZWQgd3JpdGluZyB0byBmaWxlbmFtZSBcIiVzXCIhXG4iLCBwRmlsZW5hbWUpOworCQl9CisKKwkJZnJlZShwUE5HX2RhdGEpOworCQkJCQkJCisJCXJldHVybiBzdGF0dXM7CiAJfQogCQkKIAlib29sIHJlYWRfZmlsZV90b192ZWMoY29uc3QgY2hhciogcEZpbGVuYW1lLCB1aW50OF92ZWMmIGRhdGEpCkBAIC0xNjIwLDcgKzE1ODUsOCBAQAogCiAJdm9pZCBqb2JfcG9vbDo6am9iX3RocmVhZCh1aW50MzJfdCBpbmRleCkKIAl7Ci0JCWRlYnVnX3ByaW50Zigiam9iX3Bvb2w6OmpvYl90aHJlYWQ6IHN0YXJ0aW5nICV1XG4iLCBpbmRleCk7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChpbmRleCk7CisJCS8vZGVidWdfcHJpbnRmKCJqb2JfcG9vbDo6am9iX3RocmVhZDogc3RhcnRpbmcgJXVcbiIsIGluZGV4KTsKIAkJCiAJCXdoaWxlICh0cnVlKQogCQl7CkBAIC0xNjU2LDcgKzE2MjIsNyBAQAogCQkJCW1fbm9fbW9yZV9qb2JzLm5vdGlmeV9hbGwoKTsKIAkJfQogCi0JCWRlYnVnX3ByaW50Zigiam9iX3Bvb2w6OmpvYl90aHJlYWQ6IGV4aXRpbmdcbiIpOworCQkvL2RlYnVnX3ByaW50Zigiam9iX3Bvb2w6OmpvYl90aHJlYWQ6IGV4aXRpbmdcbiIpOwogCX0KIAogCS8vIC5UR0EgaW1hZ2UgbG9hZGluZwpAQCAtMTc3OSw2ICsxNzQ1LDggQEAKIAkJCXJldHVybiBudWxscHRyOwogCQl9CiAKKwkJLy9jb25zdCB1aW50MzJfdCBieXRlc19wZXJfbGluZSA9IGhkci5tX3dpZHRoICogdGdhX2J5dGVzX3Blcl9waXhlbDsKKwogCQljb25zdCB1aW50OF90ICpwU3JjID0gcEJ1ZiArIHNpemVvZih0Z2FfaGVhZGVyKTsKIAkJdWludDMyX3QgYnl0ZXNfcmVtYWluaW5nID0gYnVmX3NpemUgLSBzaXplb2YodGdhX2hlYWRlcik7CiAKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X2VuYy5oIGIvZW5jb2Rlci9iYXNpc3VfZW5jLmgKaW5kZXggMGNlMDExNC4uMGVmZWFhNCAxMDA2NDQKLS0tIGEvZW5jb2Rlci9iYXNpc3VfZW5jLmgKKysrIGIvZW5jb2Rlci9iYXNpc3VfZW5jLmgKQEAgLTMzLDE0ICszMywyMyBAQAogLy8gSWYgQkFTSVNVX1VTRV9ISUdIX1BSRUNJU0lPTl9DT0xPUl9ESVNUQU5DRSBpcyAxLCBxdWFsaXR5IGluIHBlcmNlcHR1YWwgbW9kZSB3aWxsIGJlIHNsaWdodGx5IGdyZWF0ZXIsIGJ1dCBhdCBhIGxhcmdlIGluY3JlYXNlIGluIGVuY29kaW5nIENQVSB0aW1lLgogI2RlZmluZSBCQVNJU1VfVVNFX0hJR0hfUFJFQ0lTSU9OX0NPTE9SX0RJU1RBTkNFICgwKQogCisjaWYgQkFTSVNVX1NVUFBPUlRfU1NFCisvLyBEZWNsYXJlZCBpbiBiYXNpc3Vfa2VybmVsc19pbXAuaCwgYnV0IHdlIGNhbid0IGluY2x1ZGUgdGhhdCBoZXJlIG90aGVyd2lzZSBpdCB3b3VsZCBsZWFkIHRvIGNpcmN1bGFyIHR5cGUgZXJyb3JzLgorZXh0ZXJuIHZvaWQgdXBkYXRlX2NvdmFyX21hdHJpeF8xNngxNl9zc2U0MSh1aW50MzJfdCBudW1fdmVjcywgY29uc3Qgdm9pZCogcFdlaWdodGVkX3ZlY3MsIGNvbnN0IHZvaWQqIHBPcmlnaW4sIGNvbnN0IHVpbnQzMl90ICpwVmVjX2luZGljZXMsIHZvaWQqIHBNYXRyaXgxNngxNik7CisjZW5kaWYKKwogbmFtZXNwYWNlIGJhc2lzdQogewogCWV4dGVybiB1aW50OF90IGdfaGFtbWluZ19kaXN0WzI1Nl07CiAJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19kZWJ1Z19mb250OHg4X2Jhc2ljWzEyNyAtIDMyICsgMV1bOF07CiAKKwkvLyB0cnVlIGlmIGJhc2lzdV9lbmNvZGVyX2luaXQoKSBoYXMgYmVlbiBjYWxsZWQgYW5kIHJldHVybmVkLgorCWV4dGVybiBib29sIGdfbGlicmFyeV9pbml0aWFsaXplZDsKKwogCS8vIEVuY29kZXIgbGlicmFyeSBpbml0aWFsaXphdGlvbi4KIAkvLyBUaGlzIGZ1bmN0aW9uIE1VU1QgYmUgY2FsbGVkIGJlZm9yZSBlbmNvZGluZyBhbnl0aGluZyEKLQl2b2lkIGJhc2lzdV9lbmNvZGVyX2luaXQoKTsKKwl2b2lkIGJhc2lzdV9lbmNvZGVyX2luaXQoYm9vbCB1c2Vfb3BlbmNsID0gZmFsc2UsIGJvb2wgb3BlbmNsX2ZvcmNlX3NlcmlhbGl6YXRpb24gPSBmYWxzZSk7CisJdm9pZCBiYXNpc3VfZW5jb2Rlcl9kZWluaXQoKTsKIAogCS8vIGJhc2lzdV9rZXJuZWxzX3NzZS5jcHAgLSB3aWxsIGJlIGEgbm8tb3AgYW5kIGdfY3B1X3N1cHBvcnRzX3NzZTQxIHdpbGwgYWx3YXlzIGJlIGZhbHNlIHVubGVzcyBjb21waWxlZCB3aXRoIEJBU0lTVV9TVVBQT1JUX1NTRT0xCiAJZXh0ZXJuIHZvaWQgZGV0ZWN0X3NzZTQxKCk7CkBAIC01MSw4ICs2MCw5IEBACiAJY29uc3QgYm9vbCBnX2NwdV9zdXBwb3J0c19zc2U0MSA9IGZhbHNlOwogI2VuZGlmCiAKKwl2b2lkIGVycm9yX3ZwcmludGYoY29uc3QgY2hhciogcEZtdCwgdmFfbGlzdCBhcmdzKTsKIAl2b2lkIGVycm9yX3ByaW50Zihjb25zdCBjaGFyICpwRm10LCAuLi4pOwotCisJCiAJLy8gSGVscGVycwogCiAJaW5saW5lIHVpbnQ4X3QgY2xhbXAyNTUoaW50MzJfdCBpKQpAQCAtMTcwLDE4ICsxODAsMjQgQEAKIAljbGFzcyBydW5uaW5nX3N0YXQKIAl7CiAJcHVibGljOgotCQlydW5uaW5nX3N0YXQoKSA6Ci0JCQltX24oMCksCi0JCQltX29sZF9tKDApLCBtX25ld19tKDApLCBtX29sZF9zKDApLCBtX25ld19zKDApCi0JCXsKLQkJfQorCQlydW5uaW5nX3N0YXQoKSB7IGNsZWFyKCk7IH0KKwogCQl2b2lkIGNsZWFyKCkKIAkJewogCQkJbV9uID0gMDsKKwkJCW1fdG90YWwgPSAwOworCQkJbV9vbGRfbSA9IDA7CisJCQltX25ld19tID0gMDsKKwkJCW1fb2xkX3MgPSAwOworCQkJbV9uZXdfcyA9IDA7CisJCQltX21pbiA9IDA7CisJCQltX21heCA9IDA7CiAJCX0KKwogCQl2b2lkIHB1c2goZG91YmxlIHgpCiAJCXsKIAkJCW1fbisrOworCQkJbV90b3RhbCArPSB4OwogCQkJaWYgKG1fbiA9PSAxKQogCQkJewogCQkJCW1fb2xkX20gPSBtX25ld19tID0geDsKQEAgLTE5MSw2ICsyMDcsNyBAQAogCQkJfQogCQkJZWxzZQogCQkJeworCQkJCS8vIFNlZSBLbnV0aCBUQU9DUCB2b2wgMiwgM3JkIGVkaXRpb24sIHBhZ2UgMjMyCiAJCQkJbV9uZXdfbSA9IG1fb2xkX20gKyAoeCAtIG1fb2xkX20pIC8gbV9uOwogCQkJCW1fbmV3X3MgPSBtX29sZF9zICsgKHggLSBtX29sZF9tKSAqICh4IC0gbV9uZXdfbSk7CiAJCQkJbV9vbGRfbSA9IG1fbmV3X207CkBAIC0xOTksMTUgKzIxNiwyMyBAQAogCQkJCW1fbWF4ID0gYmFzaXN1OjptYXhpbXVtKHgsIG1fbWF4KTsKIAkJCX0KIAkJfQorCiAJCXVpbnQzMl90IGdldF9udW0oKSBjb25zdAogCQl7CiAJCQlyZXR1cm4gbV9uOwogCQl9CisKKwkJZG91YmxlIGdldF90b3RhbCgpIGNvbnN0CisJCXsKKwkJCXJldHVybiBtX3RvdGFsOworCQl9CisKIAkJZG91YmxlIGdldF9tZWFuKCkgY29uc3QKIAkJewogCQkJcmV0dXJuIChtX24gPiAwKSA/IG1fbmV3X20gOiAwLjA7CiAJCX0KIAorCQkvLyBSZXR1cm5zIHNhbXBsZSB2YXJpYW5jZQogCQlkb3VibGUgZ2V0X3ZhcmlhbmNlKCkgY29uc3QKIAkJewogCQkJcmV0dXJuICgobV9uID4gMSkgPyBtX25ld19zIC8gKG1fbiAtIDEpIDogMC4wKTsKQEAgLTIzMCw3ICsyNTUsNyBAQAogCiAJcHJpdmF0ZToKIAkJdWludDMyX3QgbV9uOwotCQlkb3VibGUgbV9vbGRfbSwgbV9uZXdfbSwgbV9vbGRfcywgbV9uZXdfcywgbV9taW4sIG1fbWF4OworCQlkb3VibGUgbV90b3RhbCwgbV9vbGRfbSwgbV9uZXdfbSwgbV9vbGRfcywgbV9uZXdfcywgbV9taW4sIG1fbWF4OwogCX07CiAKIAkvLyBMaW5lYXIgYWxnZWJyYQpAQCAtNDAxLDYgKzQyNiw4IEBACiAJdHlwZWRlZiB2ZWM8MywgZmxvYXQ+IHZlYzNGOwogCXR5cGVkZWYgdmVjPDIsIGZsb2F0PiB2ZWMyRjsKIAl0eXBlZGVmIHZlYzwxLCBmbG9hdD4gdmVjMUY7CisKKwl0eXBlZGVmIHZlYzwxNiwgZmxvYXQ+IHZlYzE2RjsKIAkJCiAJdGVtcGxhdGUgPHVpbnQzMl90IFJvd3MsIHVpbnQzMl90IENvbHMsIHR5cGVuYW1lIFQ+CiAJY2xhc3MgbWF0cml4CkBAIC01MDQsNiArNTMxLDE2NCBAQAogCQkJW3BLZXlzXSh1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7IHJldHVybiBwS2V5c1thXSA8IHBLZXlzW2JdOyB9CiAJCSk7CiAJfQorCisJLy8gMS00IGJ5dGUgZGlyZWN0IFJhZGl4IHNvcnQuCisJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisJVCogcmFkaXhfc29ydCh1aW50MzJfdCBudW1fdmFscywgVCogcEJ1ZjAsIFQqIHBCdWYxLCB1aW50MzJfdCBrZXlfb2ZzLCB1aW50MzJfdCBrZXlfc2l6ZSkKKwl7CisJCWFzc2VydChrZXlfb2ZzIDwgc2l6ZW9mKFQpKTsKKwkJYXNzZXJ0KChrZXlfc2l6ZSA+PSAxKSAmJiAoa2V5X3NpemUgPD0gNCkpOworCisJCXVpbnQzMl90IGhpc3RbMjU2ICogNF07CisKKwkJbWVtc2V0KGhpc3QsIDAsIHNpemVvZihoaXN0WzBdKSAqIDI1NiAqIGtleV9zaXplKTsKKworI2RlZmluZSBCQVNJU1VfR0VUX0tFWShwKSAoKih1aW50MzJfdCAqKSgodWludDhfdCAqKShwKSArIGtleV9vZnMpKQorCisJCWlmIChrZXlfc2l6ZSA9PSA0KQorCQl7CisJCQlUKiBwID0gcEJ1ZjA7CisJCQlUKiBxID0gcEJ1ZjAgKyBudW1fdmFsczsKKwkJCWZvciAoOyBwICE9IHE7IHArKykKKwkJCXsKKwkJCQljb25zdCB1aW50MzJfdCBrZXkgPSBCQVNJU1VfR0VUX0tFWShwKTsKKworCQkJCWhpc3Rba2V5ICYgMHhGRl0rKzsKKwkJCQloaXN0WzI1NiArICgoa2V5ID4+IDgpICYgMHhGRildKys7CisJCQkJaGlzdFs1MTIgKyAoKGtleSA+PiAxNikgJiAweEZGKV0rKzsKKwkJCQloaXN0Wzc2OCArICgoa2V5ID4+IDI0KSAmIDB4RkYpXSsrOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGtleV9zaXplID09IDMpCisJCXsKKwkJCVQqIHAgPSBwQnVmMDsKKwkJCVQqIHEgPSBwQnVmMCArIG51bV92YWxzOworCQkJZm9yICg7IHAgIT0gcTsgcCsrKQorCQkJeworCQkJCWNvbnN0IHVpbnQzMl90IGtleSA9IEJBU0lTVV9HRVRfS0VZKHApOworCisJCQkJaGlzdFtrZXkgJiAweEZGXSsrOworCQkJCWhpc3RbMjU2ICsgKChrZXkgPj4gOCkgJiAweEZGKV0rKzsKKwkJCQloaXN0WzUxMiArICgoa2V5ID4+IDE2KSAmIDB4RkYpXSsrOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGtleV9zaXplID09IDIpCisJCXsKKwkJCVQqIHAgPSBwQnVmMDsKKwkJCVQqIHEgPSBwQnVmMCArIChudW1fdmFscyA+PiAxKSAqIDI7CisKKwkJCWZvciAoOyBwICE9IHE7IHAgKz0gMikKKwkJCXsKKwkJCQljb25zdCB1aW50MzJfdCBrZXkwID0gQkFTSVNVX0dFVF9LRVkocCk7CisJCQkJY29uc3QgdWludDMyX3Qga2V5MSA9IEJBU0lTVV9HRVRfS0VZKHAgKyAxKTsKKworCQkJCWhpc3Rba2V5MCAmIDB4RkZdKys7CisJCQkJaGlzdFsyNTYgKyAoKGtleTAgPj4gOCkgJiAweEZGKV0rKzsKKworCQkJCWhpc3Rba2V5MSAmIDB4RkZdKys7CisJCQkJaGlzdFsyNTYgKyAoKGtleTEgPj4gOCkgJiAweEZGKV0rKzsKKwkJCX0KKworCQkJaWYgKG51bV92YWxzICYgMSkKKwkJCXsKKwkJCQljb25zdCB1aW50MzJfdCBrZXkgPSBCQVNJU1VfR0VUX0tFWShwKTsKKworCQkJCWhpc3Rba2V5ICYgMHhGRl0rKzsKKwkJCQloaXN0WzI1NiArICgoa2V5ID4+IDgpICYgMHhGRildKys7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlhc3NlcnQoa2V5X3NpemUgPT0gMSk7CisJCQlpZiAoa2V5X3NpemUgIT0gMSkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJVCogcCA9IHBCdWYwOworCQkJVCogcSA9IHBCdWYwICsgKG51bV92YWxzID4+IDEpICogMjsKKworCQkJZm9yICg7IHAgIT0gcTsgcCArPSAyKQorCQkJeworCQkJCWNvbnN0IHVpbnQzMl90IGtleTAgPSBCQVNJU1VfR0VUX0tFWShwKTsKKwkJCQljb25zdCB1aW50MzJfdCBrZXkxID0gQkFTSVNVX0dFVF9LRVkocCArIDEpOworCisJCQkJaGlzdFtrZXkwICYgMHhGRl0rKzsKKwkJCQloaXN0W2tleTEgJiAweEZGXSsrOworCQkJfQorCisJCQlpZiAobnVtX3ZhbHMgJiAxKQorCQkJeworCQkJCWNvbnN0IHVpbnQzMl90IGtleSA9IEJBU0lTVV9HRVRfS0VZKHApOworCQkJCWhpc3Rba2V5ICYgMHhGRl0rKzsKKwkJCX0KKwkJfQorCisJCVQqIHBDdXIgPSBwQnVmMDsKKwkJVCogcE5ldyA9IHBCdWYxOworCisJCWZvciAodWludDMyX3QgcGFzcyA9IDA7IHBhc3MgPCBrZXlfc2l6ZTsgcGFzcysrKQorCQl7CisJCQljb25zdCB1aW50MzJfdCogcEhpc3QgPSAmaGlzdFtwYXNzIDw8IDhdOworCisJCQl1aW50MzJfdCBvZmZzZXRzWzI1Nl07CisKKwkJCXVpbnQzMl90IGN1cl9vZnMgPSAwOworCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDI1NjsgaSArPSAyKQorCQkJeworCQkJCW9mZnNldHNbaV0gPSBjdXJfb2ZzOworCQkJCWN1cl9vZnMgKz0gcEhpc3RbaV07CisKKwkJCQlvZmZzZXRzW2kgKyAxXSA9IGN1cl9vZnM7CisJCQkJY3VyX29mcyArPSBwSGlzdFtpICsgMV07CisJCQl9CisKKwkJCWNvbnN0IHVpbnQzMl90IHBhc3Nfc2hpZnQgPSBwYXNzIDw8IDM7CisKKwkJCVQqIHAgPSBwQ3VyOworCQkJVCogcSA9IHBDdXIgKyAobnVtX3ZhbHMgPj4gMSkgKiAyOworCisJCQlmb3IgKDsgcCAhPSBxOyBwICs9IDIpCisJCQl7CisJCQkJdWludDMyX3QgYzAgPSAoQkFTSVNVX0dFVF9LRVkocCkgPj4gcGFzc19zaGlmdCkgJiAweEZGOworCQkJCXVpbnQzMl90IGMxID0gKEJBU0lTVV9HRVRfS0VZKHAgKyAxKSA+PiBwYXNzX3NoaWZ0KSAmIDB4RkY7CisKKwkJCQlpZiAoYzAgPT0gYzEpCisJCQkJeworCQkJCQl1aW50MzJfdCBkc3Rfb2Zmc2V0MCA9IG9mZnNldHNbYzBdOworCisJCQkJCW9mZnNldHNbYzBdID0gZHN0X29mZnNldDAgKyAyOworCisJCQkJCXBOZXdbZHN0X29mZnNldDBdID0gcFswXTsKKwkJCQkJcE5ld1tkc3Rfb2Zmc2V0MCArIDFdID0gcFsxXTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdWludDMyX3QgZHN0X29mZnNldDAgPSBvZmZzZXRzW2MwXSsrOworCQkJCQl1aW50MzJfdCBkc3Rfb2Zmc2V0MSA9IG9mZnNldHNbYzFdKys7CisKKwkJCQkJcE5ld1tkc3Rfb2Zmc2V0MF0gPSBwWzBdOworCQkJCQlwTmV3W2RzdF9vZmZzZXQxXSA9IHBbMV07CisJCQkJfQorCQkJfQorCisJCQlpZiAobnVtX3ZhbHMgJiAxKQorCQkJeworCQkJCXVpbnQzMl90IGMgPSAoQkFTSVNVX0dFVF9LRVkocCkgPj4gcGFzc19zaGlmdCkgJiAweEZGOworCisJCQkJdWludDMyX3QgZHN0X29mZnNldCA9IG9mZnNldHNbY107CisJCQkJb2Zmc2V0c1tjXSA9IGRzdF9vZmZzZXQgKyAxOworCisJCQkJcE5ld1tkc3Rfb2Zmc2V0XSA9ICpwOworCQkJfQorCisJCQlUKiB0ID0gcEN1cjsKKwkJCXBDdXIgPSBwTmV3OworCQkJcE5ldyA9IHQ7CisJCX0KKworCQlyZXR1cm4gcEN1cjsKKwl9CisKKyN1bmRlZiBCQVNJU1VfR0VUX0tFWQogCQogCS8vIFZlcnkgc2ltcGxlIGpvYiBwb29sIHdpdGggbm8gZGVwZW5kZW5jaWVzLgogCWNsYXNzIGpvYl9wb29sCkBAIC04MDUsMTcgKzk5MCwyOCBAQAogCQkJaW50IGRnID0gZTEuZyAtIGUyLmc7CiAJCQlpbnQgZGIgPSBlMS5iIC0gZTIuYjsKIAorI2lmIDAKIAkJCWludCBkZWx0YV9sID0gZHIgKiAyNyArIGRnICogOTIgKyBkYiAqIDk7CiAJCQlpbnQgZGVsdGFfY3IgPSBkciAqIDEyOCAtIGRlbHRhX2w7CiAJCQlpbnQgZGVsdGFfY2IgPSBkYiAqIDEyOCAtIGRlbHRhX2w7Ci0KKwkJCQkJCQkJCQkJCQkJCQogCQkJdWludDMyX3QgaWQgPSAoKHVpbnQzMl90KShkZWx0YV9sICogZGVsdGFfbCkgPj4gN1UpICsKIAkJCQkoKCgodWludDMyX3QpKGRlbHRhX2NyICogZGVsdGFfY3IpID4+IDdVKSAqIDI2VSkgPj4gN1UpICsKIAkJCQkoKCgodWludDMyX3QpKGRlbHRhX2NiICogZGVsdGFfY2IpID4+IDdVKSAqIDNVKSA+PiA3VSk7CisjZWxzZQorCQkJaW50NjRfdCBkZWx0YV9sID0gZHIgKiAyNyArIGRnICogOTIgKyBkYiAqIDk7CisJCQlpbnQ2NF90IGRlbHRhX2NyID0gZHIgKiAxMjggLSBkZWx0YV9sOworCQkJaW50NjRfdCBkZWx0YV9jYiA9IGRiICogMTI4IC0gZGVsdGFfbDsKKworCQkJdWludDMyX3QgaWQgPSAoKHVpbnQzMl90KSgoZGVsdGFfbCAqIGRlbHRhX2wpID4+IDdVKSkgKworCQkJCSgoKCh1aW50MzJfdCkoKGRlbHRhX2NyICogZGVsdGFfY3IpID4+IDdVKSkgKiAyNlUpID4+IDdVKSArCisJCQkJKCgoKHVpbnQzMl90KSgoZGVsdGFfY2IgKiBkZWx0YV9jYikgPj4gN1UpKSAqIDNVKSA+PiA3VSk7CisjZW5kaWYKIAogCQkJaWYgKGFscGhhKQogCQkJewogCQkJCWludCBkYSA9IChlMS5hIC0gZTIuYSkgPDwgNzsKKwkJCQkvLyBUaGlzIHNob3VsZG4ndCBvdmVyZmxvdyBpZiBkYSBpcyAyNTUgb3IgLTI1NTogMjkuOTkgYml0cyBhZnRlciBzcXVhcmluZy4KIAkJCQlpZCArPSAoKHVpbnQzMl90KShkYSAqIGRhKSA+PiA3VSk7CiAJCQl9CiAKQEAgLTEyNTgsNyArMTQ1NCw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb2RlYm9vay5yZXNpemUoY29kZWJvb2suc2l6ZSgpICsgMSk7CiAgICAgICAgICAgICAgICBjb2RlYm9vay5iYWNrKCkgPSBjdXIubV90cmFpbmluZ192ZWNzOwotCisJCQkJCQkJCQkJCiAgICAgICAgICAgICAgICBpZiAobm9kZV9zdGFjay5lbXB0eSgpKQogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTEyOTUsNiArMTQ5MSw5IEBACiAKIAkJCXVpbnQzMl90IHRvdGFsX2xlYWZfbm9kZXMgPSAxOwogCisJCQkvL2ludGVydmFsX3RpbWVyIHRtOworCQkJLy90bS5zdGFydCgpOworCiAJCQl3aGlsZSAoKHZhcl9oZWFwLnNpemUoKSkgJiYgKHRvdGFsX2xlYWZfbm9kZXMgPCBtYXhfc2l6ZSkpCiAJCQl7CiAJCQkJY29uc3QgdWludDMyX3Qgbm9kZV9pbmRleCA9IHZhcl9oZWFwLmdldF90b3BfaW5kZXgoKTsKQEAgLTEzMTUsNiArMTUxNCw4IEBACiAJCQkJfQogCQkJfQogCisJCQkvL2RlYnVnX3ByaW50ZigidHJlZV92ZWN0b3JfcXVhbnQ6OmdlbmVyYXRlICV1OiAlMy4zZiBzZWNzXG4iLCBUcmFpbmluZ1ZlY3RvclR5cGU6Om51bV9lbGVtZW50cywgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIApAQCAtMTQ0MywxNyArMTY0NCwzMiBAQAogCQl7CiAJCQljb25zdCB1aW50MzJfdCBOID0gVHJhaW5pbmdWZWN0b3JUeXBlOjpudW1fZWxlbWVudHM7CiAKLQkJCW1hdHJpeDxOLCBOLCBmbG9hdD4gY21hdHJpeChjWmVybyk7CisJCQltYXRyaXg8TiwgTiwgZmxvYXQ+IGNtYXRyaXg7CiAKLQkJCS8vIENvbXB1dGUgY292YXJpYW5jZSBtYXRyaXggZnJvbSB3ZWlnaHRlZCBpbnB1dCB2ZWN0b3JzCi0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbm9kZS5tX3RyYWluaW5nX3ZlY3Muc2l6ZSgpOyBpKyspCisJCQlpZiAoKE4gIT0gMTYpIHx8ICghZ19jcHVfc3VwcG9ydHNfc3NlNDEpKQogCQkJewotCQkJCWNvbnN0IFRyYWluaW5nVmVjdG9yVHlwZSB2KG1fdHJhaW5pbmdfdmVjc1tub2RlLm1fdHJhaW5pbmdfdmVjc1tpXV0uZmlyc3QgLSBub2RlLm1fb3JpZ2luKTsKLQkJCQljb25zdCBUcmFpbmluZ1ZlY3RvclR5cGUgdyhzdGF0aWNfY2FzdDxmbG9hdD4obV90cmFpbmluZ192ZWNzW25vZGUubV90cmFpbmluZ192ZWNzW2ldXS5zZWNvbmQpICogdik7CisJCQkJY21hdHJpeC5zZXRfemVybygpOwogCi0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IE47IHgrKykKLQkJCQkJZm9yICh1aW50MzJfdCB5ID0geDsgeSA8IE47IHkrKykKLQkJCQkJCWNtYXRyaXhbeF1beV0gPSBjbWF0cml4W3hdW3ldICsgdlt4XSAqIHdbeV07CisJCQkJLy8gQ29tcHV0ZSBjb3ZhcmlhbmNlIG1hdHJpeCBmcm9tIHdlaWdodGVkIGlucHV0IHZlY3RvcnMKKwkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbm9kZS5tX3RyYWluaW5nX3ZlY3Muc2l6ZSgpOyBpKyspCisJCQkJeworCQkJCQljb25zdCBUcmFpbmluZ1ZlY3RvclR5cGUgdihtX3RyYWluaW5nX3ZlY3Nbbm9kZS5tX3RyYWluaW5nX3ZlY3NbaV1dLmZpcnN0IC0gbm9kZS5tX29yaWdpbik7CisJCQkJCWNvbnN0IFRyYWluaW5nVmVjdG9yVHlwZSB3KHN0YXRpY19jYXN0PGZsb2F0PihtX3RyYWluaW5nX3ZlY3Nbbm9kZS5tX3RyYWluaW5nX3ZlY3NbaV1dLnNlY29uZCkgKiB2KTsKKworCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgTjsgeCsrKQorCQkJCQkJZm9yICh1aW50MzJfdCB5ID0geDsgeSA8IE47IHkrKykKKwkJCQkJCQljbWF0cml4W3hdW3ldID0gY21hdHJpeFt4XVt5XSArIHZbeF0gKiB3W3ldOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZiBCQVNJU1VfU1VQUE9SVF9TU0UKKwkJCQkvLyBTcGVjaWFsaXplIHRoZSBjYXNlIHdpdGggMTZ4MTYgbWF0cmljZXMsIHdoaWNoIGFyZSBxdWl0ZSBleHBlbnNpdmUgd2l0aG91dCBTSU1ELgorCQkJCS8vIFRoaXMgU1NFIGZ1bmN0aW9uIHRha2VzIHBvaW50ZXJzIHRvIHZvaWQgdHlwZXMsIHNvIGRvIHNvbWUgc2FuaXR5IGNoZWNrcy4KKwkJCQlhc3NlcnQoc2l6ZW9mKFRyYWluaW5nVmVjdG9yVHlwZSkgPT0gc2l6ZW9mKGZsb2F0KSAqIDE2KTsKKwkJCQlhc3NlcnQoc2l6ZW9mKHRyYWluaW5nX3ZlY193aXRoX3dlaWdodCkgPT0gc2l6ZW9mKHN0ZDo6cGFpcjx2ZWMxNkYsIHVpbnQ2NF90PikpOworCQkJCXVwZGF0ZV9jb3Zhcl9tYXRyaXhfMTZ4MTZfc3NlNDEobm9kZS5tX3RyYWluaW5nX3ZlY3Muc2l6ZSgpLCBtX3RyYWluaW5nX3ZlY3MuZGF0YSgpLCAmbm9kZS5tX29yaWdpbiwgbm9kZS5tX3RyYWluaW5nX3ZlY3MuZGF0YSgpLCAmY21hdHJpeCk7CisjZW5kaWYKIAkJCX0KIAogCQkJY29uc3QgZmxvYXQgcmVub3JtX3NjYWxlID0gMS4wZiAvIG5vZGUubV93ZWlnaHQ7CkBAIC0xNjMyLDE2ICsxODQ4LDE5IEBACiAJCQkJCX0KIAkJCQl9CiAKKwkJCQkvLyBOb2RlIGlzIHVuc3BsaXR0YWJsZSB1c2luZyB0aGUgYWJvdmUgYWxnb3JpdGhtIC0gdHJ5IHNvbWV0aGluZyBlbHNlIHRvIHNwbGl0IGl0IHVwLgogCQkJCWlmICgoIWxfd2VpZ2h0KSB8fCAoIXJfd2VpZ2h0KSkKIAkJCQl7CiAJCQkJCWxfY2hpbGRyZW4ucmVzaXplKDApOwogCQkJCQluZXdfbF9jaGlsZC5zZXQoMC4wZik7CiAJCQkJCWxfdHRzdW0gPSAwLjBmOwogCQkJCQlsX3dlaWdodCA9IDA7CisKIAkJCQkJcl9jaGlsZHJlbi5yZXNpemUoMCk7CiAJCQkJCW5ld19yX2NoaWxkLnNldCgwLjBmKTsKIAkJCQkJcl90dHN1bSA9IDAuMGY7CiAJCQkJCXJfd2VpZ2h0ID0gMDsKKwogCQkJCQlUcmFpbmluZ1ZlY3RvclR5cGUgZmlyc3RWZWM7CiAJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBub2RlLm1fdHJhaW5pbmdfdmVjcy5zaXplKCk7IGkrKykKIAkJCQkJewpAQCAtMTg0NywzMSArMjA2Niw2NyBAQAogCQl1aW50MzJfdCBtYXhfY29kZWJvb2tfc2l6ZSwgdWludDMyX3QgbWF4X3BhcmVudF9jb2RlYm9va19zaXplLAogCQliYXNpc3U6OnZlY3Rvcjx1aW50X3ZlYz4mIGNvZGVib29rLAogCQliYXNpc3U6OnZlY3Rvcjx1aW50X3ZlYz4mIHBhcmVudF9jb2RlYm9vaywKLQkJdWludDMyX3QgbWF4X3RocmVhZHMsIGpvYl9wb29sICpwSm9iX3Bvb2wpCisJCXVpbnQzMl90IG1heF90aHJlYWRzLCBqb2JfcG9vbCAqcEpvYl9wb29sLAorCQlib29sIGV2ZW5fb2RkX2lucHV0X3BhaXJzX2VxdWFsKQogCXsKIAkJdHlwZWRlZiBiaXRfaGFzaGVyPHR5cGVuYW1lIFF1YW50aXplcjo6dHJhaW5pbmdfdmVjX3R5cGU+IHRyYWluaW5nX3ZlY19iaXRfaGFzaGVyOworCQkKIAkJdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXAgPCB0eXBlbmFtZSBRdWFudGl6ZXI6OnRyYWluaW5nX3ZlY190eXBlLCB3ZWlnaHRlZF9ibG9ja19ncm91cCwgCiAJCQl0cmFpbmluZ192ZWNfYml0X2hhc2hlcj4gZ3JvdXBfaGFzaDsKIAkJCisJCS8vaW50ZXJ2YWxfdGltZXIgdG07CisJCS8vdG0uc3RhcnQoKTsKKwogCQlncm91cF9oYXNoIHVuaXF1ZV92ZWNzOwogCisJCXVuaXF1ZV92ZWNzLnJlc2VydmUoMjAwMDApOworCiAJCXdlaWdodGVkX2Jsb2NrX2dyb3VwIGc7Ci0JCWcubV9pbmRpY2VzLnJlc2l6ZSgxKTsKLQotCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcS5nZXRfdHJhaW5pbmdfdmVjcygpLnNpemUoKTsgaSsrKQorCQkKKwkJaWYgKGV2ZW5fb2RkX2lucHV0X3BhaXJzX2VxdWFsKQogCQl7Ci0JCQlnLm1fdG90YWxfd2VpZ2h0ID0gcS5nZXRfdHJhaW5pbmdfdmVjcygpW2ldLnNlY29uZDsKLQkJCWcubV9pbmRpY2VzWzBdID0gaTsKKwkJCWcubV9pbmRpY2VzLnJlc2l6ZSgyKTsKIAotCQkJYXV0byBpbnNfcmVzID0gdW5pcXVlX3ZlY3MuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHEuZ2V0X3RyYWluaW5nX3ZlY3MoKVtpXS5maXJzdCwgZykpOworCQkJYXNzZXJ0KHEuZ2V0X3RyYWluaW5nX3ZlY3MoKS5zaXplKCkgPj0gMiAmJiAocS5nZXRfdHJhaW5pbmdfdmVjcygpLnNpemUoKSAmIDEpID09IDApOwogCi0JCQlpZiAoIWluc19yZXMuc2Vjb25kKQorCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHEuZ2V0X3RyYWluaW5nX3ZlY3MoKS5zaXplKCk7IGkgKz0gMikKIAkJCXsKLQkJCQkoaW5zX3Jlcy5maXJzdCktPnNlY29uZC5tX3RvdGFsX3dlaWdodCArPSBnLm1fdG90YWxfd2VpZ2h0OwotCQkJCShpbnNfcmVzLmZpcnN0KS0+c2Vjb25kLm1faW5kaWNlcy5wdXNoX2JhY2soaSk7CisJCQkJYXNzZXJ0KHEuZ2V0X3RyYWluaW5nX3ZlY3MoKVtpXS5maXJzdCA9PSBxLmdldF90cmFpbmluZ192ZWNzKClbaSArIDFdLmZpcnN0KTsKKworCQkJCWcubV90b3RhbF93ZWlnaHQgPSBxLmdldF90cmFpbmluZ192ZWNzKClbaV0uc2Vjb25kICsgcS5nZXRfdHJhaW5pbmdfdmVjcygpW2kgKyAxXS5zZWNvbmQ7CisJCQkJZy5tX2luZGljZXNbMF0gPSBpOworCQkJCWcubV9pbmRpY2VzWzFdID0gaSArIDE7CisKKwkJCQlhdXRvIGluc19yZXMgPSB1bmlxdWVfdmVjcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIocS5nZXRfdHJhaW5pbmdfdmVjcygpW2ldLmZpcnN0LCBnKSk7CisKKwkJCQlpZiAoIWluc19yZXMuc2Vjb25kKQorCQkJCXsKKwkJCQkJKGluc19yZXMuZmlyc3QpLT5zZWNvbmQubV90b3RhbF93ZWlnaHQgKz0gZy5tX3RvdGFsX3dlaWdodDsKKwkJCQkJKGluc19yZXMuZmlyc3QpLT5zZWNvbmQubV9pbmRpY2VzLnB1c2hfYmFjayhpKTsKKwkJCQkJKGluc19yZXMuZmlyc3QpLT5zZWNvbmQubV9pbmRpY2VzLnB1c2hfYmFjayhpICsgMSk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZy5tX2luZGljZXMucmVzaXplKDEpOworCisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcS5nZXRfdHJhaW5pbmdfdmVjcygpLnNpemUoKTsgaSsrKQorCQkJeworCQkJCWcubV90b3RhbF93ZWlnaHQgPSBxLmdldF90cmFpbmluZ192ZWNzKClbaV0uc2Vjb25kOworCQkJCWcubV9pbmRpY2VzWzBdID0gaTsKKworCQkJCWF1dG8gaW5zX3JlcyA9IHVuaXF1ZV92ZWNzLmluc2VydChzdGQ6Om1ha2VfcGFpcihxLmdldF90cmFpbmluZ192ZWNzKClbaV0uZmlyc3QsIGcpKTsKKworCQkJCWlmICghaW5zX3Jlcy5zZWNvbmQpCisJCQkJeworCQkJCQkoaW5zX3Jlcy5maXJzdCktPnNlY29uZC5tX3RvdGFsX3dlaWdodCArPSBnLm1fdG90YWxfd2VpZ2h0OworCQkJCQkoaW5zX3Jlcy5maXJzdCktPnNlY29uZC5tX2luZGljZXMucHVzaF9iYWNrKGkpOworCQkJCX0KIAkJCX0KIAkJfQogCisJCS8vZGVidWdfcHJpbnRmKCJnZW5lcmF0ZV9oaWVyYXJjaGljYWxfY29kZWJvb2tfdGhyZWFkZWQ6ICV1IHRyYWluaW5nIHZlY3RvcnMsICV1IHVuaXF1ZSB0cmFpbmluZyB2ZWN0b3JzLCAlMy4zZiBzZWNzXG4iLCBxLmdldF90b3RhbF90cmFpbmluZ192ZWNzKCksICh1aW50MzJfdCl1bmlxdWVfdmVjcy5zaXplKCksIHRtLmdldF9lbGFwc2VkX3NlY3MoKSk7CiAJCWRlYnVnX3ByaW50ZigiZ2VuZXJhdGVfaGllcmFyY2hpY2FsX2NvZGVib29rX3RocmVhZGVkOiAldSB0cmFpbmluZyB2ZWN0b3JzLCAldSB1bmlxdWUgdHJhaW5pbmcgdmVjdG9yc1xuIiwgcS5nZXRfdG90YWxfdHJhaW5pbmdfdmVjcygpLCAodWludDMyX3QpdW5pcXVlX3ZlY3Muc2l6ZSgpKTsKIAogCQlRdWFudGl6ZXIgZ3JvdXBfcXVhbnQ7CkBAIC0yNDkxLDcgKzI3NDYsMjcgQEAKIAkJCXJldHVybiAqdGhpczsKIAkJfQogCi0JCWltYWdlICZjcm9wKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IHAgPSBVSU5UMzJfTUFYLCBjb25zdCBjb2xvcl9yZ2JhICZiYWNrZ3JvdW5kID0gZ19ibGFja19jb2xvcikKKwkJLy8gcFBpeGVscyBNVVNUIGhhdmUgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgbWFsbG9jKCkgKGJhc2lzdTo6dmVjdG9yIHdpbGwgZXZlbnR1YWxseSB1c2UgZnJlZSgpIG9uIHRoZSBwb2ludGVyKS4KKwkJaW1hZ2UmIGdyYW50X293bmVyc2hpcChjb2xvcl9yZ2JhKiBwUGl4ZWxzLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBwID0gVUlOVDMyX01BWCkKKwkJeworCQkJaWYgKHAgPT0gVUlOVDMyX01BWCkKKwkJCQlwID0gdzsKKworCQkJY2xlYXIoKTsKKwkJCQorCQkJaWYgKCghcCkgfHwgKCF3KSB8fCAoIWgpKQorCQkJCXJldHVybiAqdGhpczsKKworCQkJbV9waXhlbHMuZ3JhbnRfb3duZXJzaGlwKHBQaXhlbHMsIHAgKiBoLCBwICogaCk7CisKKwkJCW1fd2lkdGggPSB3OworCQkJbV9oZWlnaHQgPSBoOworCQkJbV9waXRjaCA9IHA7CisKKwkJCXJldHVybiAqdGhpczsKKwkJfQorCisJCWltYWdlICZjcm9wKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IHAgPSBVSU5UMzJfTUFYLCBjb25zdCBjb2xvcl9yZ2JhICZiYWNrZ3JvdW5kID0gZ19ibGFja19jb2xvciwgYm9vbCBpbml0X2ltYWdlID0gdHJ1ZSkKIAkJewogCQkJaWYgKHAgPT0gVUlOVDMyX01BWCkKIAkJCQlwID0gdzsKQEAgLTI1MDksMTUgKzI3ODQsMjUgQEAKIAkJCWN1cl9zdGF0ZS5zd2FwKG1fcGl4ZWxzKTsKIAogCQkJbV9waXhlbHMucmVzaXplKHAgKiBoKTsKLQkJCQotCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGg7IHkrKykKKworCQkJaWYgKGluaXRfaW1hZ2UpCiAJCQl7Ci0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHc7IHgrKykKKwkJCQlpZiAobV93aWR0aCB8fCBtX2hlaWdodCkKIAkJCQl7Ci0JCQkJCWlmICgoeCA8IG1fd2lkdGgpICYmICh5IDwgbV9oZWlnaHQpKQotCQkJCQkJbV9waXhlbHNbeCArIHkgKiBwXSA9IGN1cl9zdGF0ZVt4ICsgeSAqIG1fcGl0Y2hdOwotCQkJCQllbHNlCi0JCQkJCQltX3BpeGVsc1t4ICsgeSAqIHBdID0gYmFja2dyb3VuZDsKKwkJCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGg7IHkrKykKKwkJCQkJeworCQkJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHc7IHgrKykKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKHggPCBtX3dpZHRoKSAmJiAoeSA8IG1faGVpZ2h0KSkKKwkJCQkJCQkJbV9waXhlbHNbeCArIHkgKiBwXSA9IGN1cl9zdGF0ZVt4ICsgeSAqIG1fcGl0Y2hdOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJbV9waXhlbHNbeCArIHkgKiBwXSA9IGJhY2tncm91bmQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbV9waXhlbHMuc2V0X2FsbChiYWNrZ3JvdW5kKTsKIAkJCQl9CiAJCQl9CiAKQEAgLTI1OTAsOSArMjg3NSwyNSBAQAogCiAJCWNvbnN0IGltYWdlICZleHRyYWN0X2Jsb2NrX2NsYW1wZWQoY29sb3JfcmdiYSAqcERzdCwgdWludDMyX3Qgc3JjX3gsIHVpbnQzMl90IHNyY195LCB1aW50MzJfdCB3LCB1aW50MzJfdCBoKSBjb25zdAogCQl7Ci0JCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgaDsgeSsrKQotCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCB3OyB4KyspCi0JCQkJCSpwRHN0KysgPSBnZXRfY2xhbXBlZChzcmNfeCArIHgsIHNyY195ICsgeSk7CisJCQlpZiAoKChzcmNfeCArIHcpID4gbV93aWR0aCkgfHwgKChzcmNfeSArIGgpID4gbV9oZWlnaHQpKQorCQkJeworCQkJCS8vIFNsb3dlciBjbGFtcGluZyBjYXNlCisJCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGg7IHkrKykKKwkJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHc7IHgrKykKKwkJCQkJCSpwRHN0KysgPSBnZXRfY2xhbXBlZChzcmNfeCArIHgsIHNyY195ICsgeSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJY29uc3QgY29sb3JfcmdiYSogcFNyYyA9ICZtX3BpeGVsc1tzcmNfeCArIHNyY195ICogbV9waXRjaF07CisKKwkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgaDsgeSsrKQorCQkJCXsKKwkJCQkJbWVtY3B5KHBEc3QsIHBTcmMsIHcgKiBzaXplb2YoY29sb3JfcmdiYSkpOworCQkJCQlwU3JjICs9IG1fcGl0Y2g7CisJCQkJCXBEc3QgKz0gdzsKKwkJCQl9CisJCQl9CisKIAkJCXJldHVybiAqdGhpczsKIAkJfQogCkBAIC0yOTQ3LDIxICszMjQ4LDE4IEBACiAJfTsKIAogCS8vIEltYWdlIHNhdmluZy9sb2FkaW5nL3Jlc2FtcGxpbmcKLQkKKwogCWJvb2wgbG9hZF9wbmcoY29uc3QgdWludDhfdCogcEJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLCBpbWFnZSYgaW1nLCBjb25zdCBjaGFyKiBwRmlsZW5hbWUgPSBudWxscHRyKTsKIAlib29sIGxvYWRfcG5nKGNvbnN0IGNoYXIqIHBGaWxlbmFtZSwgaW1hZ2UmIGltZyk7CiAJaW5saW5lIGJvb2wgbG9hZF9wbmcoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lLCBpbWFnZSAmaW1nKSB7IHJldHVybiBsb2FkX3BuZyhmaWxlbmFtZS5jX3N0cigpLCBpbWcpOyB9CiAKLQlib29sIGxvYWRfYm1wKGNvbnN0IGNoYXIqIHBGaWxlbmFtZSwgaW1hZ2UmIGltZyk7Ci0JaW5saW5lIGJvb2wgbG9hZF9ibXAoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lLCBpbWFnZSAmaW1nKSB7IHJldHVybiBsb2FkX2JtcChmaWxlbmFtZS5jX3N0cigpLCBpbWcpOyB9Ci0JCQogCWJvb2wgbG9hZF90Z2EoY29uc3QgY2hhciogcEZpbGVuYW1lLCBpbWFnZSYgaW1nKTsKIAlpbmxpbmUgYm9vbCBsb2FkX3RnYShjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUsIGltYWdlICZpbWcpIHsgcmV0dXJuIGxvYWRfdGdhKGZpbGVuYW1lLmNfc3RyKCksIGltZyk7IH0KIAogCWJvb2wgbG9hZF9qcGcoY29uc3QgY2hhciAqcEZpbGVuYW1lLCBpbWFnZSYgaW1nKTsKIAlpbmxpbmUgYm9vbCBsb2FkX2pwZyhjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUsIGltYWdlICZpbWcpIHsgcmV0dXJuIGxvYWRfanBnKGZpbGVuYW1lLmNfc3RyKCksIGltZyk7IH0KIAkKLQkvLyBDdXJyZW50bHkgbG9hZHMgLkJNUCwgLlBORywgb3IgLlRHQS4KKwkvLyBDdXJyZW50bHkgbG9hZHMgLlBORywgLlRHQSwgb3IgLkpQRwogCWJvb2wgbG9hZF9pbWFnZShjb25zdCBjaGFyKiBwRmlsZW5hbWUsIGltYWdlJiBpbWcpOwogCWlubGluZSBib29sIGxvYWRfaW1hZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lLCBpbWFnZSAmaW1nKSB7IHJldHVybiBsb2FkX2ltYWdlKGZpbGVuYW1lLmNfc3RyKCksIGltZyk7IH0KIApAQCAtMzEyOSw2ICszNDI3LDI5IEBACiAJfQogCiAJdm9pZCBmaWxsX2J1ZmZlcl93aXRoX3JhbmRvbV9ieXRlcyh2b2lkICpwQnVmLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc2VlZCA9IDEpOworCisJY29uc3QgdWludDMyX3QgY1BpeGVsQmxvY2tXaWR0aCA9IDQ7CisJY29uc3QgdWludDMyX3QgY1BpeGVsQmxvY2tIZWlnaHQgPSA0OworCWNvbnN0IHVpbnQzMl90IGNQaXhlbEJsb2NrVG90YWxQaXhlbHMgPSBjUGl4ZWxCbG9ja1dpZHRoICogY1BpeGVsQmxvY2tIZWlnaHQ7CisKKwlzdHJ1Y3QgcGl4ZWxfYmxvY2sKKwl7CisJCWNvbG9yX3JnYmEgbV9waXhlbHNbY1BpeGVsQmxvY2tIZWlnaHRdW2NQaXhlbEJsb2NrV2lkdGhdOyAvLyBbeV1beF0KKworCQlpbmxpbmUgY29uc3QgY29sb3JfcmdiYSYgb3BlcmF0b3IoKSAodWludDMyX3QgeCwgdWludDMyX3QgeSkgY29uc3QgeyBhc3NlcnQoKHggPCBjUGl4ZWxCbG9ja1dpZHRoKSAmJiAoeSA8IGNQaXhlbEJsb2NrSGVpZ2h0KSk7IHJldHVybiBtX3BpeGVsc1t5XVt4XTsgfQorCQlpbmxpbmUgY29sb3JfcmdiYSYgb3BlcmF0b3IoKSAodWludDMyX3QgeCwgdWludDMyX3QgeSkgeyBhc3NlcnQoKHggPCBjUGl4ZWxCbG9ja1dpZHRoKSAmJiAoeSA8IGNQaXhlbEJsb2NrSGVpZ2h0KSk7IHJldHVybiBtX3BpeGVsc1t5XVt4XTsgfQorCisJCWlubGluZSBjb25zdCBjb2xvcl9yZ2JhKiBnZXRfcHRyKCkgY29uc3QgeyByZXR1cm4gJm1fcGl4ZWxzWzBdWzBdOyB9CisJCWlubGluZSBjb2xvcl9yZ2JhKiBnZXRfcHRyKCkgeyByZXR1cm4gJm1fcGl4ZWxzWzBdWzBdOyB9CisKKwkJaW5saW5lIHZvaWQgY2xlYXIoKSB7IGNsZWFyX29iaigqdGhpcyk7IH0KKworCQlpbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCBwaXhlbF9ibG9jayYgcmhzKSBjb25zdAorCQl7CisJCQlyZXR1cm4gbWVtY21wKG1fcGl4ZWxzLCByaHMubV9waXhlbHMsIHNpemVvZihtX3BpeGVscykpID09IDA7CisJCX0KKwl9OworCXR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8cGl4ZWxfYmxvY2s+IHBpeGVsX2Jsb2NrX3ZlYzsKIAkJCiB9IC8vIG5hbWVzcGFjZSBiYXNpc3UKIApkaWZmIC0tZ2l0IGEvZW5jb2Rlci9iYXNpc3VfZXRjLmNwcCBiL2VuY29kZXIvYmFzaXN1X2V0Yy5jcHAKaW5kZXggMjMyZTg5Ni4uZjhiZDBmMSAxMDA2NDQKLS0tIGEvZW5jb2Rlci9iYXNpc3VfZXRjLmNwcAorKysgYi9lbmNvZGVyL2Jhc2lzdV9ldGMuY3BwCkBAIC0xNTgsNiArMTU4LDIyIEBACiAJCQkJfQogCQkJfQogCQl9CisKKyNpZiAwCisJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA2NDsgeSsrKQorCQl7CisJCQlwcmludGYoInsiKTsKKwkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCAyNTY7IHgrKykKKwkJCXsKKwkJCQlwcmludGYoIjB4JVgiLCBnX2V0YzFfaW52ZXJzZV9sb29rdXBbeV1beF0pOworCQkJCWlmICh4ICE9IDI1NSkKKwkJCQkJcHJpbnRmKCIsIik7CisJCQkJaWYgKCgoeCAmIDYzKSA9PSA2MykgJiYgKHggIT0gMjU1KSkKKwkJCQkJcHJpbnRmKCJcbiIpOworCQkJfQorCQkJcHJpbnRmKCJ9LFxuIik7CisJCX0KKyNlbmRpZgogCX0KIAogCS8vIFBhY2tzIHNvbGlkIGNvbG9yIGJsb2NrcyBlZmZpY2llbnRseSB1c2luZyBhIHNldCBvZiBzbWFsbCBwcmVjb21wdXRlZCB0YWJsZXMuCkBAIC0xMTI2LDYgKzExNDIsNyBAQAogCQkJCWlmICghZ19ldmFsX2Rpc3RfdGFibGVzW2ludGVuX3RhYmxlXVttX21heF9jb21wX3NwcmVhZF0pCiAJCQkJCWNvbnRpbnVlOwogCQkJfQorCiAjaWYgMAogCQkJaWYgKG1fcFBhcmFtcy0+bV9xdWFsaXR5IDw9IGNFVENRdWFsaXR5TWVkaXVtKQogCQkJewpkaWZmIC0tZ2l0IGEvZW5jb2Rlci9iYXNpc3VfZXRjLmggYi9lbmNvZGVyL2Jhc2lzdV9ldGMuaAppbmRleCAxZTNlY2U0Li4yMDhmMmFhIDEwMDY0NAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9ldGMuaAorKysgYi9lbmNvZGVyL2Jhc2lzdV9ldGMuaApAQCAtNDkwLDYgKzQ5MCwzNSBAQAogCQkJcmV0dXJuIGRjOwogCQl9CiAKKwkJdm9pZCBnZXRfYmxvY2tfY29sb3JzX2V0YzFzKGNvbG9yX3JnYmEqIHBCbG9ja19jb2xvcnMpIGNvbnN0CisJCXsKKwkJCWNvbG9yX3JnYmEgYjsKKworCQkJdW5wYWNrX2NvbG9yNShiLCBnZXRfYmFzZTVfY29sb3IoKSwgdHJ1ZSk7CisKKwkJCWNvbnN0IGludCogcEludGVuX3RhYmxlID0gZ19ldGMxX2ludGVuX3RhYmxlc1tnZXRfaW50ZW5fdGFibGUoMCldOworCisJCQlwQmxvY2tfY29sb3JzWzBdLnNldChjbGFtcDI1NShiLnIgKyBwSW50ZW5fdGFibGVbMF0pLCBjbGFtcDI1NShiLmcgKyBwSW50ZW5fdGFibGVbMF0pLCBjbGFtcDI1NShiLmIgKyBwSW50ZW5fdGFibGVbMF0pLCAyNTUpOworCQkJcEJsb2NrX2NvbG9yc1sxXS5zZXQoY2xhbXAyNTUoYi5yICsgcEludGVuX3RhYmxlWzFdKSwgY2xhbXAyNTUoYi5nICsgcEludGVuX3RhYmxlWzFdKSwgY2xhbXAyNTUoYi5iICsgcEludGVuX3RhYmxlWzFdKSwgMjU1KTsKKwkJCXBCbG9ja19jb2xvcnNbMl0uc2V0KGNsYW1wMjU1KGIuciArIHBJbnRlbl90YWJsZVsyXSksIGNsYW1wMjU1KGIuZyArIHBJbnRlbl90YWJsZVsyXSksIGNsYW1wMjU1KGIuYiArIHBJbnRlbl90YWJsZVsyXSksIDI1NSk7CisJCQlwQmxvY2tfY29sb3JzWzNdLnNldChjbGFtcDI1NShiLnIgKyBwSW50ZW5fdGFibGVbM10pLCBjbGFtcDI1NShiLmcgKyBwSW50ZW5fdGFibGVbM10pLCBjbGFtcDI1NShiLmIgKyBwSW50ZW5fdGFibGVbM10pLCAyNTUpOworCQl9CisKKwkJc3RhdGljIHZvaWQgZ2V0X2Jsb2NrX2NvbG9yc19ldGMxcyhjb2xvcl9yZ2JhKiBwQmxvY2tfY29sb3JzLCBjb25zdCBjb2xvcl9yZ2JhICZiYXNlNV9jb2xvciwgdWludDMyX3QgaW50ZW5fdGFibGUpCisJCXsKKwkJCWNvbG9yX3JnYmEgYjsKKwkJCWIuciA9IChiYXNlNV9jb2xvci5yIDw8IDNVKSB8IChiYXNlNV9jb2xvci5yID4+IDJVKTsKKwkJCWIuZyA9IChiYXNlNV9jb2xvci5nIDw8IDNVKSB8IChiYXNlNV9jb2xvci5nID4+IDJVKTsKKwkJCWIuYiA9IChiYXNlNV9jb2xvci5iIDw8IDNVKSB8IChiYXNlNV9jb2xvci5iID4+IDJVKTsKKwkJCQkJCQorCQkJY29uc3QgaW50KiBwSW50ZW5fdGFibGUgPSBnX2V0YzFfaW50ZW5fdGFibGVzW2ludGVuX3RhYmxlXTsKKworCQkJcEJsb2NrX2NvbG9yc1swXS5zZXQoY2xhbXAyNTUoYi5yICsgcEludGVuX3RhYmxlWzBdKSwgY2xhbXAyNTUoYi5nICsgcEludGVuX3RhYmxlWzBdKSwgY2xhbXAyNTUoYi5iICsgcEludGVuX3RhYmxlWzBdKSwgMjU1KTsKKwkJCXBCbG9ja19jb2xvcnNbMV0uc2V0KGNsYW1wMjU1KGIuciArIHBJbnRlbl90YWJsZVsxXSksIGNsYW1wMjU1KGIuZyArIHBJbnRlbl90YWJsZVsxXSksIGNsYW1wMjU1KGIuYiArIHBJbnRlbl90YWJsZVsxXSksIDI1NSk7CisJCQlwQmxvY2tfY29sb3JzWzJdLnNldChjbGFtcDI1NShiLnIgKyBwSW50ZW5fdGFibGVbMl0pLCBjbGFtcDI1NShiLmcgKyBwSW50ZW5fdGFibGVbMl0pLCBjbGFtcDI1NShiLmIgKyBwSW50ZW5fdGFibGVbMl0pLCAyNTUpOworCQkJcEJsb2NrX2NvbG9yc1szXS5zZXQoY2xhbXAyNTUoYi5yICsgcEludGVuX3RhYmxlWzNdKSwgY2xhbXAyNTUoYi5nICsgcEludGVuX3RhYmxlWzNdKSwgY2xhbXAyNTUoYi5iICsgcEludGVuX3RhYmxlWzNdKSwgMjU1KTsKKwkJfQorCiAJCXZvaWQgZ2V0X2Jsb2NrX2NvbG9yKGNvbG9yX3JnYmEmIGNvbG9yLCB1aW50MzJfdCBzdWJibG9ja19pbmRleCwgdWludDMyX3Qgc2VsZWN0b3JfaW5kZXgpIGNvbnN0CiAJCXsKIAkJCWNvbG9yX3JnYmEgYjsKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X2Zyb250ZW5kLmNwcCBiL2VuY29kZXIvYmFzaXN1X2Zyb250ZW5kLmNwcAppbmRleCAzMjRmYzhlLi4xZjMwYTMzIDEwMDY0NAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9mcm9udGVuZC5jcHAKKysrIGIvZW5jb2Rlci9iYXNpc3VfZnJvbnRlbmQuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAvLwogI2luY2x1ZGUgIi4uL3RyYW5zY29kZXIvYmFzaXN1LmgiCiAjaW5jbHVkZSAiYmFzaXN1X2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiYmFzaXN1X29wZW5jbC5oIgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIApAQCAtNDMsNjEgKzQ0LDE1IEBACiAJLy8gVE9ETyAtIEhvdyB0byBoYW5kbGUgaW50ZXJuYWwgdmVyaWZpZXMgaW4gdGhlIGJhc2lzdSBsaWIKIAlzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX3ZlcmlmeV9mYWlsdXJlKGludCBsaW5lKQogCXsKLQkJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IGJhc2lzdV9mcm9udGVuZDogdmVyaWZ5IGNoZWNrIGZhaWxlZCBhdCBsaW5lICVpIVxuIiwgbGluZSk7CisJCQllcnJvcl9wcmludGYoImJhc2lzdV9mcm9udGVuZDogdmVyaWZ5IGNoZWNrIGZhaWxlZCBhdCBsaW5lICVpIVxuIiwgbGluZSk7CiAJCQlhYm9ydCgpOwogCX0KIAkJCQogCWJvb2wgYmFzaXN1X2Zyb250ZW5kOjppbml0KGNvbnN0IHBhcmFtcyAmcCkKIAl7Ci0jaWYgMAotCQkvLyBIQUNLIEhBQ0sKLQkJRklMRSogcEZpbGU7Ci0JCWZvcGVuX3MoJnBGaWxlLCAidHYuYmluIiwgInJiIik7Ci0JCWlmIChwRmlsZSkKLQkJewotCQkJZGVidWdfcHJpbnRmKCJVc2luZyB0di5iaW5cbiIpOwotCi0JCQlmc2VlayhwRmlsZSwgMCwgU0VFS19FTkQpOwotCQkJdWludDMyX3Qgc2l6ZSA9IGZ0ZWxsKHBGaWxlKTsKLQkJCWZzZWVrKHBGaWxlLCAwLCBTRUVLX1NFVCk7Ci0KLQkJCXVpbnQzMl90IHR2ID0gc2l6ZSAvIHNpemVvZih2ZWM2Rl9xdWFudGl6ZXI6OnRyYWluaW5nX3ZlY193aXRoX3dlaWdodCk7Ci0KLQkJCWJhc2lzdTo6dmVjdG9yPHZlYzZGX3F1YW50aXplcjo6dHJhaW5pbmdfdmVjX3dpdGhfd2VpZ2h0PiB2KHR2KTsKLQkJCWZyZWFkKCZ2WzBdLCAxLCBzaXplb2YodlswXSkgKiB0diwgcEZpbGUpOwotCi0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdHY7IGkrKykKLQkJCQltX2VuZHBvaW50X2NsdXN0ZXJpemVyLmFkZF90cmFpbmluZ192ZWModltpXS5maXJzdCwgdltpXS5zZWNvbmQpOwotCi0JCQltX2VuZHBvaW50X2NsdXN0ZXJpemVyLmdlbmVyYXRlKDE2MTI4KTsKLQkJCWJhc2lzdTo6dmVjdG9yPHVpbnRfdmVjPiBjb2RlYm9vazsKLQkJCW1fZW5kcG9pbnRfY2x1c3Rlcml6ZXIucmV0cmlldmUoY29kZWJvb2spOwotCi0JCQlwcmludGYoIkdlbmVyYXRlZCAldSBlbnRyaWVzXG4iLCAodWludDMyX3QpY29kZWJvb2suc2l6ZSgpKTsKLQotCQkJZmNsb3NlKHBGaWxlKTsKLQkJCWV4aXQoMCk7Ci0JCX0KLSNlbmRpZgotCi0JCWlmIChwLm1fdXNlX2h5YnJpZF9zZWxlY3Rvcl9jb2RlYm9va3MpCi0JCXsKLQkJCWlmICghcC5tX3BHbG9iYWxfc2VsX2NvZGVib29rKQotCQkJewotCQkJCWRlYnVnX3ByaW50ZigiYmFzaXN1X2Zyb250ZW5kOjppbml0OiBObyBnbG9iYWwgc2VsIGNvZGVib29rIVxuIik7Ci0JCQkJYXNzZXJ0KDApOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWRlYnVnX3ByaW50ZigiYmFzaXN1X2Zyb250ZW5kOjppbml0OiBNdWx0aXRocmVhZGVkOiAldSwgTnVtRW5kcG9pbnRDbHVzdGVyczogJXUsIE51bVNlbGVjdG9yQ2x1c3RlcnM6ICV1LCBQZXJjZXB0dWFsOiAldSwgQ29tcHJlc3Npb25MZXZlbDogJXVcbiIsCi0JCQlwLm1fbXVsdGl0aHJlYWRlZCwgcC5tX21heF9lbmRwb2ludF9jbHVzdGVycywgcC5tX21heF9zZWxlY3Rvcl9jbHVzdGVycywgcC5tX3BlcmNlcHR1YWwsIHAubV9jb21wcmVzc2lvbl9sZXZlbCk7Ci0KLQkJZGVidWdfcHJpbnRmKCJHbG9iYWwgc2VsIGNvZGVib29rIHBhbCBiaXRzOiAldSwgR2xvYmFsIHNlbCBjb2RlYm9vayBtb2QgYml0czogJXUsIFVzZSBoeWJyaWQgc2VsZWN0b3IgY29kZWJvb2s6ICV1LCBIeWJyaWQgY29kZWJvb2sgcXVhbGl0eSB0aHJlc2g6ICVmXG4iLAotCQkJcC5tX251bV9nbG9iYWxfc2VsX2NvZGVib29rX3BhbF9iaXRzLAotCQkJcC5tX251bV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzLAotCQkJcC5tX3VzZV9oeWJyaWRfc2VsZWN0b3JfY29kZWJvb2tzLAotCQkJcC5tX2h5YnJpZF9jb2RlYm9va19xdWFsaXR5X3RocmVzaCk7CisJCWRlYnVnX3ByaW50ZigiYmFzaXN1X2Zyb250ZW5kOjppbml0OiBNdWx0aXRocmVhZGVkOiAldSwgSm9iIHBvb2wgdG90YWwgdGhyZWFkczogJXUsIE51bUVuZHBvaW50Q2x1c3RlcnM6ICV1LCBOdW1TZWxlY3RvckNsdXN0ZXJzOiAldSwgUGVyY2VwdHVhbDogJXUsIENvbXByZXNzaW9uTGV2ZWw6ICV1XG4iLAorCQkJcC5tX211bHRpdGhyZWFkZWQsIHAubV9wSm9iX3Bvb2wgPyBwLm1fcEpvYl9wb29sLT5nZXRfdG90YWxfdGhyZWFkcygpIDogMCwKKwkJCXAubV9tYXhfZW5kcG9pbnRfY2x1c3RlcnMsIHAubV9tYXhfc2VsZWN0b3JfY2x1c3RlcnMsIHAubV9wZXJjZXB0dWFsLCBwLm1fY29tcHJlc3Npb25fbGV2ZWwpOwogCQkJCQogCQlpZiAoKHAubV9tYXhfZW5kcG9pbnRfY2x1c3RlcnMgPCAxKSB8fCAocC5tX21heF9lbmRwb2ludF9jbHVzdGVycyA+IGNNYXhFbmRwb2ludENsdXN0ZXJzKSkKIAkJCXJldHVybiBmYWxzZTsKQEAgLTEwNiw4ICs2MSwyMiBAQAogCiAJCW1fc291cmNlX2Jsb2Nrcy5yZXNpemUoMCk7CiAJCWFwcGVuZF92ZWN0b3IobV9zb3VyY2VfYmxvY2tzLCBwLm1fcFNvdXJjZV9ibG9ja3MsIHAubV9udW1fc291cmNlX2Jsb2Nrcyk7Ci0KKwkJCQkKIAkJbV9wYXJhbXMgPSBwOworCQkKKwkJaWYgKG1fcGFyYW1zLm1fcE9wZW5DTF9jb250ZXh0KQorCQl7CisJCQlCQVNJU1VfQVNTVU1FKHNpemVvZihjbF9waXhlbF9ibG9jaykgPT0gc2l6ZW9mKHBpeGVsX2Jsb2NrKSk7CisKKwkJCS8vIFVwbG9hZCB0aGUgUkdCQSBwaXhlbCBibG9ja3MgYSBzaW5nbGUgdGltZS4KKwkJCWlmICghb3BlbmNsX3NldF9waXhlbF9ibG9ja3MobV9wYXJhbXMubV9wT3BlbkNMX2NvbnRleHQsIG1fc291cmNlX2Jsb2Nrcy5zaXplKCksIChjbF9waXhlbF9ibG9jayopbV9zb3VyY2VfYmxvY2tzLmRhdGEoKSkpCisJCQl7CisJCQkJLy8gVGhpcyBpcyBub3QgZmF0YWwsIHdlIGp1c3Qgd29uJ3QgdXNlIE9wZW5DTC4KKwkJCQllcnJvcl9wcmludGYoImJhc2lzdV9mcm9udGVuZDo6aW5pdDogb3BlbmNsX3NldF9waXhlbF9ibG9ja3MoKSBmYWlsZWRcbiIpOworCQkJCW1fcGFyYW1zLm1fcE9wZW5DTF9jb250ZXh0ID0gbnVsbHB0cjsKKwkJCQltX29wZW5jbF9mYWlsZWQgPSB0cnVlOworCQkJfQorCQl9CiAKIAkJbV9lbmNvZGVkX2Jsb2Nrcy5yZXNpemUobV9wYXJhbXMubV9udW1fc291cmNlX2Jsb2Nrcyk7CiAJCW1lbXNldCgmbV9lbmNvZGVkX2Jsb2Nrc1swXSwgMCwgbV9lbmNvZGVkX2Jsb2Nrcy5zaXplKCkgKiBzaXplb2YobV9lbmNvZGVkX2Jsb2Nrc1swXSkpOwpAQCAtMTk0LDggKzE2MywxMiBAQAogCQltX3RvdGFsX2Jsb2NrcyA9IG1fcGFyYW1zLm1fbnVtX3NvdXJjZV9ibG9ja3M7CiAJCW1fdG90YWxfcGl4ZWxzID0gbV90b3RhbF9ibG9ja3MgKiBjUGl4ZWxCbG9ja1RvdGFsUGl4ZWxzOwogCisJCS8vIEVuY29kZSB0aGUgaW5pdGlhbCBoaWdoIHF1YWxpdHkgRVRDMVMgdGV4dHVyZQorCiAJCWluaXRfZXRjMV9pbWFnZXMoKTsKIAorCQkvLyBGaXJzdCBxdWFudGl6ZSB0aGUgRVRDMVMgZW5kcG9pbnRzCisKIAkJaWYgKG1fcGFyYW1zLm1fcEdsb2JhbF9jb2RlYm9va3MpCiAJCXsKIAkJCWluaXRfZ2xvYmFsX2NvZGVib29rcygpOwpAQCAtMjA1LDE2ICsxNzgsMjYgQEAKIAkJCWluaXRfZW5kcG9pbnRfdHJhaW5pbmdfdmVjdG9ycygpOwogCiAJCQlnZW5lcmF0ZV9lbmRwb2ludF9jbHVzdGVycygpOwotCQkJCQorCiAJCQlmb3IgKHVpbnQzMl90IHJlZmluZV9lbmRwb2ludF9zdGVwID0gMDsgcmVmaW5lX2VuZHBvaW50X3N0ZXAgPCBtX251bV9lbmRwb2ludF9jb2RlYm9va19pdGVyYXRpb25zOyByZWZpbmVfZW5kcG9pbnRfc3RlcCsrKQogCQkJewotCQkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkoY2hlY2tfZXRjMXNfY29uc3RyYWludHMoKSk7CisJCQkJaWYgKG1fcGFyYW1zLm1fdmFsaWRhdGUpCisJCQkJeworCQkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKGNoZWNrX2V0YzFzX2NvbnN0cmFpbnRzKCkpOworCisJCQkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkodmFsaWRhdGVfZW5kcG9pbnRfY2x1c3Rlcl9oaWVyYXJjaHkoZmFsc2UpKTsKKwkJCQl9CiAKIAkJCQlpZiAocmVmaW5lX2VuZHBvaW50X3N0ZXApCiAJCQkJewogCQkJCQlpbnRyb2R1Y2VfbmV3X2VuZHBvaW50X2NsdXN0ZXJzKCk7CiAJCQkJfQogCisJCQkJaWYgKG1fcGFyYW1zLm1fdmFsaWRhdGUpCisJCQkJeworCQkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKHZhbGlkYXRlX2VuZHBvaW50X2NsdXN0ZXJfaGllcmFyY2h5KGZhbHNlKSk7CisJCQkJfQorCiAJCQkJZ2VuZXJhdGVfZW5kcG9pbnRfY29kZWJvb2socmVmaW5lX2VuZHBvaW50X3N0ZXApOwogCiAJCQkJaWYgKChtX3BhcmFtcy5tX2RlYnVnX2ltYWdlcykgJiYgKG1fcGFyYW1zLm1fZHVtcF9lbmRwb2ludF9jbHVzdGVyaXphdGlvbikpCkBAIC0yMzYsNyArMjE5LDcgQEAKIAkJCQkJaWYgKChtX3BhcmFtcy5tX3RleF90eXBlID09IGJhc2lzdDo6Y0JBU0lTVGV4VHlwZVZpZGVvRnJhbWVzKSAmJiAoIXJlZmluZV9lbmRwb2ludF9zdGVwKSAmJiAobV9udW1fZW5kcG9pbnRfY29kZWJvb2tfaXRlcmF0aW9ucyA9PSAxKSkKIAkJCQkJewogCQkJCQkJZWxpbWluYXRlX3JlZHVuZGFudF9vcl9lbXB0eV9lbmRwb2ludF9jbHVzdGVycygpOwotCQkJCQkJZ2VuZXJhdGVfZW5kcG9pbnRfY29kZWJvb2socmVmaW5lX2VuZHBvaW50X3N0ZXApOworCQkJCQkJZ2VuZXJhdGVfZW5kcG9pbnRfY29kZWJvb2soYmFzaXN1OjptYXhpbXVtKDFVLCByZWZpbmVfZW5kcG9pbnRfc3RlcCkpOwogCQkJCQl9CiAKIAkJCQkJaWYgKChtX3BhcmFtcy5tX2RlYnVnX2ltYWdlcykgJiYgKG1fcGFyYW1zLm1fZHVtcF9lbmRwb2ludF9jbHVzdGVyaXphdGlvbikpCkBAIC0yNTAsMjIgKzIzMywzNyBAQAogCQkJCQkJZHVtcF9lbmRwb2ludF9jbHVzdGVyaXphdGlvbl92aXN1YWxpemF0aW9uKGJ1ZiwgdHJ1ZSk7CiAJCQkJCX0KIAkJCQl9CisKKwkJCQlpZiAobV9wYXJhbXMubV92YWxpZGF0ZSkKKwkJCQl7CisJCQkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkodmFsaWRhdGVfZW5kcG9pbnRfY2x1c3Rlcl9oaWVyYXJjaHkoZmFsc2UpKTsKKwkJCQl9CiAJCQkJCQkKIAkJCQllbGltaW5hdGVfcmVkdW5kYW50X29yX2VtcHR5X2VuZHBvaW50X2NsdXN0ZXJzKCk7CiAKKwkJCQlpZiAobV9wYXJhbXMubV92YWxpZGF0ZSkKKwkJCQl7CisJCQkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkodmFsaWRhdGVfZW5kcG9pbnRfY2x1c3Rlcl9oaWVyYXJjaHkoZmFsc2UpKTsKKwkJCQl9CisKIAkJCQlpZiAobV9wYXJhbXMubV9kZWJ1Z19zdGF0cykKIAkJCQkJZGVidWdfcHJpbnRmKCJUb3RhbCBlbmRwb2ludCBjbHVzdGVyczogJXVcbiIsICh1aW50MzJfdCltX2VuZHBvaW50X2NsdXN0ZXJzLnNpemUoKSk7CiAKIAkJCQlpZiAoZWFybHlfb3V0KQogCQkJCQlicmVhazsKIAkJCX0KLQotCQkJQkFTSVNVX0ZST05URU5EX1ZFUklGWShjaGVja19ldGMxc19jb25zdHJhaW50cygpKTsKKwkJCQorCQkJaWYgKG1fcGFyYW1zLm1fdmFsaWRhdGUpCisJCQl7CisJCQkJQkFTSVNVX0ZST05URU5EX1ZFUklGWShjaGVja19ldGMxc19jb25zdHJhaW50cygpKTsKKwkJCX0KIAogCQkJZ2VuZXJhdGVfYmxvY2tfZW5kcG9pbnRfY2x1c3RlcnMoKTsKIAogCQkJY3JlYXRlX2luaXRpYWxfcGFja2VkX3RleHR1cmUoKTsKIAorCQkJLy8gTm93IHF1YW50aXplIHRoZSBFVEMxUyBzZWxlY3RvcnMKKwogCQkJZ2VuZXJhdGVfc2VsZWN0b3JfY2x1c3RlcnMoKTsKIAogCQkJaWYgKG1fdXNlX2hpZXJhcmNoaWNhbF9zZWxlY3Rvcl9jb2RlYm9va3MpCkBAIC0yNzYsMTIgKzI3NCwxMiBAQAogCQkJCWNyZWF0ZV9vcHRpbWl6ZWRfc2VsZWN0b3JfY29kZWJvb2soMCk7CiAKIAkJCQlmaW5kX29wdGltYWxfc2VsZWN0b3JfY2x1c3RlcnNfZm9yX2VhY2hfYmxvY2soKTsKLQkJCQorCQkJCQkJCQogCQkJCWludHJvZHVjZV9zcGVjaWFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7CiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJY29uc3QgdWludDMyX3QgbnVtX3JlZmluZV9zZWxlY3Rvcl9zdGVwcyA9IG1fcGFyYW1zLm1fcEdsb2JhbF9zZWxfY29kZWJvb2sgPyAxIDogbV9udW1fc2VsZWN0b3JfY29kZWJvb2tfaXRlcmF0aW9uczsKKwkJCQljb25zdCB1aW50MzJfdCBudW1fcmVmaW5lX3NlbGVjdG9yX3N0ZXBzID0gbV9udW1fc2VsZWN0b3JfY29kZWJvb2tfaXRlcmF0aW9uczsKIAkJCQlmb3IgKHVpbnQzMl90IHJlZmluZV9zZWxlY3Rvcl9zdGVwcyA9IDA7IHJlZmluZV9zZWxlY3Rvcl9zdGVwcyA8IG51bV9yZWZpbmVfc2VsZWN0b3Jfc3RlcHM7IHJlZmluZV9zZWxlY3Rvcl9zdGVwcysrKQogCQkJCXsKIAkJCQkJY3JlYXRlX29wdGltaXplZF9zZWxlY3Rvcl9jb2RlYm9vayhyZWZpbmVfc2VsZWN0b3Jfc3RlcHMpOwpAQCAtMjg5LDcgKzI4Nyw3IEBACiAJCQkJCWZpbmRfb3B0aW1hbF9zZWxlY3Rvcl9jbHVzdGVyc19mb3JfZWFjaF9ibG9jaygpOwogCiAJCQkJCWludHJvZHVjZV9zcGVjaWFsX3NlbGVjdG9yX2NsdXN0ZXJzKCk7Ci0JCQkJCisKIAkJCQkJaWYgKChtX3BhcmFtcy5tX2NvbXByZXNzaW9uX2xldmVsID49IDQpIHx8IChtX3BhcmFtcy5tX3RleF90eXBlID09IGJhc2lzdDo6Y0JBU0lTVGV4VHlwZVZpZGVvRnJhbWVzKSkKIAkJCQkJewogCQkJCQkJaWYgKCFyZWZpbmVfYmxvY2tfZW5kcG9pbnRzX2dpdmVuX3NlbGVjdG9ycygpKQpAQCAtMjk3LDcgKzI5NSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQkJCQkKKwkJCQkKIAkJCW9wdGltaXplX3NlbGVjdG9yX2NvZGVib29rKCk7CiAKIAkJCWlmIChtX3BhcmFtcy5tX2RlYnVnX3N0YXRzKQpAQCAtNTc0LDkgKzU3Miw2IEBACiAJewogCQlkZWJ1Z19wcmludGYoImludHJvZHVjZV9zcGVjaWFsX3NlbGVjdG9yX2NsdXN0ZXJzXG4iKTsKIAotCQlpZiAobV9wYXJhbXMubV9wR2xvYmFsX3NlbF9jb2RlYm9vaykKLQkJCXJldHVybjsKLQogCQl1aW50MzJfdCB0b3RhbF9ibG9ja3NfcmVsb2NhdGVkID0gMDsKIAkJY29uc3QgdWludDMyX3QgaW5pdGlhbF9zZWxlY3Rvcl9jbHVzdGVycyA9ICh1aW50MzJfdCltX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCk7CiAKQEAgLTcyMiwyMyArNzE3LDE1IEBACiAJCX0KIAogCQliYXNpc3U6OnZlY3RvcjxldGNfYmxvY2s+IG5ld19vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnMobV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnMuc2l6ZSgpID8gdG90YWxfbmV3X2VudHJpZXMgOiAwKTsKLQkJYmFzaXN0OjpldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9va19lbnRyeV9pZF92ZWMgbmV3X29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yX2dsb2JhbF9jYl9pZHMobV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3Rvcl9nbG9iYWxfY2JfaWRzLnNpemUoKSA/IHRvdGFsX25ld19lbnRyaWVzIDogMCk7CiAJCWJhc2lzdTo6dmVjdG9yPHVpbnRfdmVjPiBuZXdfc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzKG1fc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzLnNpemUoKSA/IHRvdGFsX25ld19lbnRyaWVzIDogMCk7Ci0JCWJvb2xfdmVjIG5ld19zZWxlY3Rvcl9jbHVzdGVyX3VzZXNfZ2xvYmFsX2NiKG1fc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYi5zaXplKCkgPyB0b3RhbF9uZXdfZW50cmllcyA6IDApOwogCiAJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0b3RhbF9uZXdfZW50cmllczsgaSsrKQogCQl7CiAJCQlpZiAobV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnMuc2l6ZSgpKQogCQkJCW5ld19vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnNbaV0gPSBtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tuZXdfdG9fb2xkW2ldXTsKIAotCQkJaWYgKG1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JfZ2xvYmFsX2NiX2lkcy5zaXplKCkpCi0JCQkJbmV3X29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yX2dsb2JhbF9jYl9pZHNbaV0gPSBtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yX2dsb2JhbF9jYl9pZHNbbmV3X3RvX29sZFtpXV07Ci0KIAkJCS8vaWYgKG1fc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzLnNpemUoKSkKIAkJCS8vCW5ld19zZWxlY3Rvcl9jbHVzdGVyX2luZGljZXNbaV0gPSBtX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlc1tuZXdfdG9fb2xkW2ldXTsKLQotCQkJaWYgKG1fc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYi5zaXplKCkpCi0JCQkJbmV3X3NlbGVjdG9yX2NsdXN0ZXJfdXNlc19nbG9iYWxfY2JbaV0gPSBtX3NlbGVjdG9yX2NsdXN0ZXJfdXNlc19nbG9iYWxfY2JbbmV3X3RvX29sZFtpXV07CiAJCX0KIAogCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9ibG9ja19zZWxlY3Rvcl9jbHVzdGVyX2luZGV4LnNpemUoKTsgaSsrKQpAQCAtNzQ3LDkgKzczNCw3IEBACiAJCX0KIAkJCQkKIAkJbV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnMuc3dhcChuZXdfb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzKTsKLQkJbV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3Rvcl9nbG9iYWxfY2JfaWRzLnN3YXAobmV3X29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yX2dsb2JhbF9jYl9pZHMpOwogCQltX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zd2FwKG5ld19zZWxlY3Rvcl9jbHVzdGVyX2luZGljZXMpOwotCQltX3NlbGVjdG9yX2NsdXN0ZXJfdXNlc19nbG9iYWxfY2Iuc3dhcChuZXdfc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYik7CiAKIAkJLy8gVGhpcyBpc24ndCBzdHJpY3RseSBuZWNlc3NhcnkgLSBkb2luZyBpdCBmb3IgY29tcGxldGVuZXNzL2Z1dHVyZSBzYW5pdHkuCiAJCWlmIChtX3NlbGVjdG9yX2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyLnNpemUoKSkKQEAgLTc3MSw2NiArNzU2LDkzIEBACiAJCQkJCiAJCW1fZXRjMV9ibG9ja3NfZXRjMXMucmVzaXplKG1fdG90YWxfYmxvY2tzKTsKIAotCQljb25zdCB1aW50MzJfdCBOID0gNDA5NjsKLQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleF9pdGVyID0gMDsgYmxvY2tfaW5kZXhfaXRlciA8IG1fdG90YWxfYmxvY2tzOyBibG9ja19pbmRleF9pdGVyICs9IE4pCisJCWJvb2wgdXNlX2NwdSA9IHRydWU7CisJCQkJCQkJCQorCQlpZiAobV9wYXJhbXMubV9wT3BlbkNMX2NvbnRleHQpCiAJCXsKLQkJCWNvbnN0IHVpbnQzMl90IGZpcnN0X2luZGV4ID0gYmxvY2tfaW5kZXhfaXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQljb25zdCB1aW50MzJfdCBsYXN0X2luZGV4ID0gbWluaW11bTx1aW50MzJfdD4obV90b3RhbF9ibG9ja3MsIGZpcnN0X2luZGV4ICsgTik7ICAgICAgIAotCi0jaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCi0JCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+YWRkX2pvYiggW3RoaXMsIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4XSB7Ci0jZW5kaWYKLQotCQkJCWZvciAodWludDMyX3QgYmxvY2tfaW5kZXggPSBmaXJzdF9pbmRleDsgYmxvY2tfaW5kZXggPCBsYXN0X2luZGV4OyBibG9ja19pbmRleCsrKSAKLQkJCQl7Ci0JCQkJCWNvbnN0IHBpeGVsX2Jsb2NrICZzb3VyY2VfYmxrID0gZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCk7Ci0KLQkJCQkJZXRjMV9vcHRpbWl6ZXIgb3B0aW1pemVyOwotCQkJCQlldGMxX29wdGltaXplcjo6cGFyYW1zIG9wdGltaXplcl9wYXJhbXM7Ci0JCQkJCWV0YzFfb3B0aW1pemVyOjpyZXN1bHRzIG9wdGltaXplcl9yZXN1bHRzOwotCQkJCi0JCQkJCWlmIChtX3BhcmFtcy5tX2NvbXByZXNzaW9uX2xldmVsID09IDApCi0JCQkJCQlvcHRpbWl6ZXJfcGFyYW1zLm1fcXVhbGl0eSA9IGNFVENRdWFsaXR5RmFzdDsKLQkJCQkJZWxzZSBpZiAobV9wYXJhbXMubV9jb21wcmVzc2lvbl9sZXZlbCA9PSAxKQotCQkJCQkJb3B0aW1pemVyX3BhcmFtcy5tX3F1YWxpdHkgPSBjRVRDUXVhbGl0eU1lZGl1bTsKLQkJCQkJZWxzZSBpZiAobV9wYXJhbXMubV9jb21wcmVzc2lvbl9sZXZlbCA9PSBCQVNJU1VfTUFYX0NPTVBSRVNTSU9OX0xFVkVMKQotCQkJCQkJb3B0aW1pemVyX3BhcmFtcy5tX3F1YWxpdHkgPSBjRVRDUXVhbGl0eVViZXI7CisJCQl1aW50MzJfdCB0b3RhbF9wZXJtcyA9IDY0OworCQkJaWYgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPT0gMCkKKwkJCQl0b3RhbF9wZXJtcyA9IDQ7CisJCQllbHNlIGlmIChtX3BhcmFtcy5tX2NvbXByZXNzaW9uX2xldmVsID09IDEpCisJCQkJdG90YWxfcGVybXMgPSAxNjsKKwkJCWVsc2UgaWYgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPT0gQkFTSVNVX01BWF9DT01QUkVTU0lPTl9MRVZFTCkKKwkJCQl0b3RhbF9wZXJtcyA9IE9QRU5DTF9FTkNPREVfRVRDMVNfTUFYX1BFUk1TOwogCQkJCQkJCi0JCQkJCW9wdGltaXplcl9wYXJhbXMubV9udW1fc3JjX3BpeGVscyA9IDE2OwotCQkJCQlvcHRpbWl6ZXJfcGFyYW1zLm1fcFNyY19waXhlbHMgPSBzb3VyY2VfYmxrLmdldF9wdHIoKTsKLQkJCQkJb3B0aW1pemVyX3BhcmFtcy5tX3BlcmNlcHR1YWwgPSBtX3BhcmFtcy5tX3BlcmNlcHR1YWw7Ci0KLQkJCQkJdWludDhfdCBzZWxlY3RvcnNbMTZdOwotCQkJCQlvcHRpbWl6ZXJfcmVzdWx0cy5tX3BTZWxlY3RvcnMgPSBzZWxlY3RvcnM7Ci0JCQkJCW9wdGltaXplcl9yZXN1bHRzLm1fbiA9IDE2OwotCi0JCQkJCW9wdGltaXplci5pbml0KG9wdGltaXplcl9wYXJhbXMsIG9wdGltaXplcl9yZXN1bHRzKTsKLQkJCQkJaWYgKCFvcHRpbWl6ZXIuY29tcHV0ZSgpKQotCQkJCQkJQkFTSVNVX0ZST05URU5EX1ZFUklGWShmYWxzZSk7Ci0KLQkJCQkJZXRjX2Jsb2NrICZibGsgPSBtX2V0YzFfYmxvY2tzX2V0YzFzW2Jsb2NrX2luZGV4XTsKLQotCQkJCQltZW1zZXQoJmJsaywgMCwgc2l6ZW9mKGJsaykpOwotCQkJCQlibGsuc2V0X2Jsb2NrX2NvbG9yNV9ldGMxcyhvcHRpbWl6ZXJfcmVzdWx0cy5tX2Jsb2NrX2NvbG9yX3Vuc2NhbGVkKTsKLQkJCQkJYmxrLnNldF9pbnRlbl90YWJsZXNfZXRjMXMob3B0aW1pemVyX3Jlc3VsdHMubV9ibG9ja19pbnRlbl90YWJsZSk7Ci0JCQkJCWJsay5zZXRfZmxpcF9iaXQodHJ1ZSk7Ci0KLQkJCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJCQkJYmxrLnNldF9zZWxlY3Rvcih4LCB5LCBzZWxlY3RvcnNbeCArIHkgKiA0XSk7Ci0JCQkJfQotCi0jaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCi0JCQl9ICk7Ci0jZW5kaWYKLQorCQkJYm9vbCBzdGF0dXMgPSBvcGVuY2xfZW5jb2RlX2V0YzFzX2Jsb2NrcyhtX3BhcmFtcy5tX3BPcGVuQ0xfY29udGV4dCwgbV9ldGMxX2Jsb2Nrc19ldGMxcy5kYXRhKCksIG1fcGFyYW1zLm1fcGVyY2VwdHVhbCwgdG90YWxfcGVybXMpOworCQkJaWYgKHN0YXR1cykKKwkJCQl1c2VfY3B1ID0gZmFsc2U7CisJCQllbHNlCisJCQl7CisJCQkJZXJyb3JfcHJpbnRmKCJiYXNpc3VfZnJvbnRlbmQ6OmluaXRfZXRjMV9pbWFnZXM6IG9wZW5jbF9lbmNvZGVfZXRjMXNfYmxvY2tzKCkgZmFpbGVkISBVc2luZyBDUFUuXG4iKTsKKwkJCQltX3BhcmFtcy5tX3BPcGVuQ0xfY29udGV4dCA9IG51bGxwdHI7CisJCQkJbV9vcGVuY2xfZmFpbGVkID0gdHJ1ZTsKKwkJCX0KIAkJfQorCQkKKwkJaWYgKHVzZV9jcHUpCisJCXsKKwkJCWNvbnN0IHVpbnQzMl90IE4gPSA0MDk2OworCQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleF9pdGVyID0gMDsgYmxvY2tfaW5kZXhfaXRlciA8IG1fdG90YWxfYmxvY2tzOyBibG9ja19pbmRleF9pdGVyICs9IE4pCisJCQl7CisJCQkJY29uc3QgdWludDMyX3QgZmlyc3RfaW5kZXggPSBibG9ja19pbmRleF9pdGVyOworCQkJCWNvbnN0IHVpbnQzMl90IGxhc3RfaW5kZXggPSBtaW5pbXVtPHVpbnQzMl90PihtX3RvdGFsX2Jsb2NrcywgZmlyc3RfaW5kZXggKyBOKTsKIAogI2lmbmRlZiBfX0VNU0NSSVBURU5fXwotCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+d2FpdF9mb3JfYWxsKCk7CisJCQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPmFkZF9qb2IoW3RoaXMsIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4XSB7CiAjZW5kaWYKIAotCQlkZWJ1Z19wcmludGYoIkVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKwkJCQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleCA9IGZpcnN0X2luZGV4OyBibG9ja19pbmRleCA8IGxhc3RfaW5kZXg7IGJsb2NrX2luZGV4KyspCisJCQkJCXsKKwkJCQkJCWNvbnN0IHBpeGVsX2Jsb2NrJiBzb3VyY2VfYmxrID0gZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCk7CisKKwkJCQkJCWV0YzFfb3B0aW1pemVyIG9wdGltaXplcjsKKwkJCQkJCWV0YzFfb3B0aW1pemVyOjpwYXJhbXMgb3B0aW1pemVyX3BhcmFtczsKKwkJCQkJCWV0YzFfb3B0aW1pemVyOjpyZXN1bHRzIG9wdGltaXplcl9yZXN1bHRzOworCisJCQkJCQlpZiAobV9wYXJhbXMubV9jb21wcmVzc2lvbl9sZXZlbCA9PSAwKQorCQkJCQkJCW9wdGltaXplcl9wYXJhbXMubV9xdWFsaXR5ID0gY0VUQ1F1YWxpdHlGYXN0OworCQkJCQkJZWxzZSBpZiAobV9wYXJhbXMubV9jb21wcmVzc2lvbl9sZXZlbCA9PSAxKQorCQkJCQkJCW9wdGltaXplcl9wYXJhbXMubV9xdWFsaXR5ID0gY0VUQ1F1YWxpdHlNZWRpdW07CisJCQkJCQllbHNlIGlmIChtX3BhcmFtcy5tX2NvbXByZXNzaW9uX2xldmVsID09IEJBU0lTVV9NQVhfQ09NUFJFU1NJT05fTEVWRUwpCisJCQkJCQkJb3B0aW1pemVyX3BhcmFtcy5tX3F1YWxpdHkgPSBjRVRDUXVhbGl0eVViZXI7CisKKwkJCQkJCW9wdGltaXplcl9wYXJhbXMubV9udW1fc3JjX3BpeGVscyA9IDE2OworCQkJCQkJb3B0aW1pemVyX3BhcmFtcy5tX3BTcmNfcGl4ZWxzID0gc291cmNlX2Jsay5nZXRfcHRyKCk7CisJCQkJCQlvcHRpbWl6ZXJfcGFyYW1zLm1fcGVyY2VwdHVhbCA9IG1fcGFyYW1zLm1fcGVyY2VwdHVhbDsKKworCQkJCQkJdWludDhfdCBzZWxlY3RvcnNbMTZdOworCQkJCQkJb3B0aW1pemVyX3Jlc3VsdHMubV9wU2VsZWN0b3JzID0gc2VsZWN0b3JzOworCQkJCQkJb3B0aW1pemVyX3Jlc3VsdHMubV9uID0gMTY7CisKKwkJCQkJCW9wdGltaXplci5pbml0KG9wdGltaXplcl9wYXJhbXMsIG9wdGltaXplcl9yZXN1bHRzKTsKKwkJCQkJCWlmICghb3B0aW1pemVyLmNvbXB1dGUoKSkKKwkJCQkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKGZhbHNlKTsKKworCQkJCQkJZXRjX2Jsb2NrJiBibGsgPSBtX2V0YzFfYmxvY2tzX2V0YzFzW2Jsb2NrX2luZGV4XTsKKworCQkJCQkJbWVtc2V0KCZibGssIDAsIHNpemVvZihibGspKTsKKwkJCQkJCWJsay5zZXRfYmxvY2tfY29sb3I1X2V0YzFzKG9wdGltaXplcl9yZXN1bHRzLm1fYmxvY2tfY29sb3JfdW5zY2FsZWQpOworCQkJCQkJYmxrLnNldF9pbnRlbl90YWJsZXNfZXRjMXMob3B0aW1pemVyX3Jlc3VsdHMubV9ibG9ja19pbnRlbl90YWJsZSk7CisJCQkJCQlibGsuc2V0X2ZsaXBfYml0KHRydWUpOworCisJCQkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQorCQkJCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCisJCQkJCQkJCWJsay5zZXRfc2VsZWN0b3IoeCwgeSwgc2VsZWN0b3JzW3ggKyB5ICogNF0pOworCQkJCQl9CisKKyNpZm5kZWYgX19FTVNDUklQVEVOX18KKwkJCQkJfSk7CisjZW5kaWYKKworCQkJfQorCisjaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCisJCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+d2FpdF9mb3JfYWxsKCk7CisjZW5kaWYKKworCQl9IC8vIHVzZV9jcHUKKwkJIAorCQlkZWJ1Z19wcmludGYoImluaXRfZXRjMV9pbWFnZXM6IEVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKIAl9CiAKIAl2b2lkIGJhc2lzdV9mcm9udGVuZDo6aW5pdF9lbmRwb2ludF90cmFpbmluZ192ZWN0b3JzKCkKQEAgLTg4OSwxMyArOTAxLDE1IEBACiAJCWNvbnN0IHVpbnQzMl90IHBhcmVudF9jb2RlYm9va19zaXplID0gKG1fcGFyYW1zLm1fbWF4X2VuZHBvaW50X2NsdXN0ZXJzID49IDI1NikgPyBCQVNJU1VfRU5EUE9JTlRfUEFSRU5UX0NPREVCT09LX1NJWkUgOiAwOwogCQl1aW50MzJfdCBtYXhfdGhyZWFkcyA9IDA7CiAJCW1heF90aHJlYWRzID0gbV9wYXJhbXMubV9tdWx0aXRocmVhZGVkID8gbWluaW11bTxpbnQ+KHN0ZDo6dGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpLCBjTWF4Q29kZWJvb2tDcmVhdGlvblRocmVhZHMpIDogMDsKKwkJaWYgKG1fcGFyYW1zLm1fcEpvYl9wb29sKQorCQkJbWF4X3RocmVhZHMgPSBtaW5pbXVtPGludD4oKGludCltX3BhcmFtcy5tX3BKb2JfcG9vbC0+Z2V0X3RvdGFsX3RocmVhZHMoKSwgbWF4X3RocmVhZHMpOwogCi0JCWRlYnVnX3ByaW50ZigiVXNpbmcgJXUgdGhyZWFkcyB0byBjcmVhdGUgY29kZWJvb2tcbiIsIG1heF90aHJlYWRzKTsKKwkJZGVidWdfcHJpbnRmKCJtYXhfdGhyZWFkczogJXVcbiIsIG1heF90aHJlYWRzKTsKIAkJYm9vbCBzdGF0dXMgPSBnZW5lcmF0ZV9oaWVyYXJjaGljYWxfY29kZWJvb2tfdGhyZWFkZWQobV9lbmRwb2ludF9jbHVzdGVyaXplciwKIAkJCW1fcGFyYW1zLm1fbWF4X2VuZHBvaW50X2NsdXN0ZXJzLCBtX3VzZV9oaWVyYXJjaGljYWxfZW5kcG9pbnRfY29kZWJvb2tzID8gcGFyZW50X2NvZGVib29rX3NpemUgOiAwLAogCQkJbV9lbmRwb2ludF9jbHVzdGVycywKIAkJCW1fZW5kcG9pbnRfcGFyZW50X2NsdXN0ZXJzLAotCQkJbWF4X3RocmVhZHMsIG1fcGFyYW1zLm1fcEpvYl9wb29sKTsKKwkJCW1heF90aHJlYWRzLCBtX3BhcmFtcy5tX3BKb2JfcG9vbCwgdHJ1ZSk7CiAJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkoc3RhdHVzKTsKIAogCQlpZiAobV91c2VfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rcykKQEAgLTk0MCw2ICs5NTQsOSBAQAogCQkJCWZvciAodWludDMyX3QgaiA9IDA7IGogPCBjbHVzdGVyLnNpemUoKTsgaisrKQogCQkJCXsKIAkJCQkJY29uc3QgdWludDMyX3QgYmxvY2tfaW5kZXggPSBjbHVzdGVyW2pdID4+IDE7CisJCQkJCQorCQkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKGJsb2NrX2luZGV4IDwgbV9ibG9ja19wYXJlbnRfZW5kcG9pbnRfY2x1c3Rlci5zaXplKCkpOworCiAJCQkJCWlmICghaikKIAkJCQkJewogCQkJCQkJcGFyZW50X2NsdXN0ZXJfaW5kZXggPSBtX2Jsb2NrX3BhcmVudF9lbmRwb2ludF9jbHVzdGVyW2Jsb2NrX2luZGV4XTsKQEAgLTk1Niw2ICs5NzMsNyBAQAogCQkJZGVidWdfcHJpbnRmKCJUb3RhbCBlbmRwb2ludCBjbHVzdGVyczogJXUsIHBhcmVudCBjbHVzdGVyczogJXVcbiIsICh1aW50MzJfdCltX2VuZHBvaW50X2NsdXN0ZXJzLnNpemUoKSwgKHVpbnQzMl90KW1fZW5kcG9pbnRfcGFyZW50X2NsdXN0ZXJzLnNpemUoKSk7CiAJfQogCisJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggYXJyYXkgb2YgZW5kcG9pbnQgY2x1c3RlciBibG9jayBpbmRpY2VzIGFuZCBzZXQgdGhlIG1fYmxvY2tfZW5kcG9pbnRfY2x1c3RlcnNfaW5kaWNlc1tdW10gYXJyYXkgdG8gaW5kaWNhc3RlIHdoaWNoIGNsdXN0ZXIgaW5kZXggZWFjaCBibG9jayB1c2VzLgogCXZvaWQgYmFzaXN1X2Zyb250ZW5kOjpnZW5lcmF0ZV9ibG9ja19lbmRwb2ludF9jbHVzdGVycygpCiAJewogCQltX2Jsb2NrX2VuZHBvaW50X2NsdXN0ZXJzX2luZGljZXMucmVzaXplKG1fdG90YWxfYmxvY2tzKTsKQEAgLTk3NCwxMSArOTkyLDE0IEBACiAJCQl9IC8vIGNsdXN0ZXJfaW5kaWNlc19pdGVyCiAJCX0KIAotCQlmb3IgKHVpbnQzMl90IGJsb2NrX2luZGV4ID0gMDsgYmxvY2tfaW5kZXggPCBtX3RvdGFsX2Jsb2NrczsgYmxvY2tfaW5kZXgrKykKKwkJaWYgKG1fcGFyYW1zLm1fdmFsaWRhdGUpCiAJCXsKLQkJCXVpbnQzMl90IGNsdXN0ZXJfMCA9IG1fYmxvY2tfZW5kcG9pbnRfY2x1c3RlcnNfaW5kaWNlc1tibG9ja19pbmRleF1bMF07Ci0JCQl1aW50MzJfdCBjbHVzdGVyXzEgPSBtX2Jsb2NrX2VuZHBvaW50X2NsdXN0ZXJzX2luZGljZXNbYmxvY2tfaW5kZXhdWzFdOwotCQkJQkFTSVNVX0ZST05URU5EX1ZFUklGWShjbHVzdGVyXzAgPT0gY2x1c3Rlcl8xKTsKKwkJCWZvciAodWludDMyX3QgYmxvY2tfaW5kZXggPSAwOyBibG9ja19pbmRleCA8IG1fdG90YWxfYmxvY2tzOyBibG9ja19pbmRleCsrKQorCQkJeworCQkJCXVpbnQzMl90IGNsdXN0ZXJfMCA9IG1fYmxvY2tfZW5kcG9pbnRfY2x1c3RlcnNfaW5kaWNlc1tibG9ja19pbmRleF1bMF07CisJCQkJdWludDMyX3QgY2x1c3Rlcl8xID0gbV9ibG9ja19lbmRwb2ludF9jbHVzdGVyc19pbmRpY2VzW2Jsb2NrX2luZGV4XVsxXTsKKwkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKGNsdXN0ZXJfMCA9PSBjbHVzdGVyXzEpOworCQkJfQogCQl9CiAJfQogCkBAIC05ODksNiArMTAxMCw3IEBACiAJCW1fZW5kcG9pbnRfY2x1c3RlcnNfd2l0aGluX2VhY2hfcGFyZW50X2NsdXN0ZXIucmVzaXplKDApOwogCQltX2VuZHBvaW50X2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyLnJlc2l6ZShtX2VuZHBvaW50X3BhcmVudF9jbHVzdGVycy5zaXplKCkpOwogCisJCS8vIE5vdGU6IEl0J3MgcG9zc2libGUgdGhhdCBzb21lIGJsb2NrcyBnb3QgbW92ZWQgaW50byB0aGUgc2FtZSBjbHVzdGVyLCBidXQgbGl2ZSBpbiBkaWZmZXJlbnQgcGFyZW50IGNsdXN0ZXJzLgogCQlmb3IgKHVpbnQzMl90IGJsb2NrX2luZGV4ID0gMDsgYmxvY2tfaW5kZXggPCBtX3RvdGFsX2Jsb2NrczsgYmxvY2tfaW5kZXgrKykKIAkJewogCQkJY29uc3QgdWludDMyX3QgY2x1c3Rlcl9pbmRleCA9IG1fYmxvY2tfZW5kcG9pbnRfY2x1c3RlcnNfaW5kaWNlc1tibG9ja19pbmRleF1bMF07CkBAIC0xMTI1LDYgKzExNDcsOCBAQAogCiAJCXN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gaWdub3JlX2NsdXN0ZXI7CiAKKwkJdWludDMyX3QgdG90YWxfbmV3X2NsdXN0ZXJzID0gMDsKKwogCQl3aGlsZSAobnVtX25ld19lbmRwb2ludF9jbHVzdGVycykKIAkJewogCQkJaWYgKG1fc3ViYmxvY2tfZW5kcG9pbnRfcXVhbnRfZXJyX3ZlYy5zaXplKCkgPT0gMCkKQEAgLTExNzMsMTAgKzExOTcsMTQgQEAKIAkJCWNsdXN0ZXJfc2l6ZXNbc3ViYmxvY2tfdG9fbW92ZS5tX2NsdXN0ZXJfaW5kZXhdIC09IDI7CiAJCQkJCQkKIAkJCWlnbm9yZV9jbHVzdGVyLmluc2VydChzdWJibG9ja190b19tb3ZlLm1fY2x1c3Rlcl9pbmRleCk7CisJCQkJCQkKKwkJCXRvdGFsX25ld19jbHVzdGVycysrOwogCiAJCQludW1fbmV3X2VuZHBvaW50X2NsdXN0ZXJzLS07CiAJCX0KIAorCQlkZWJ1Z19wcmludGYoIkludHJvZHVjZWQgJWkgbmV3IGVuZHBvaW50IGNsdXN0ZXJzXG4iLCB0b3RhbF9uZXdfY2x1c3RlcnMpOworCiAJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fb3JpZ19lbmRwb2ludF9jbHVzdGVyczsgaSsrKQogCQl7CiAJCQl1aW50X3ZlYyAmY2x1c3Rlcl9pbmRpY2VzID0gbV9lbmRwb2ludF9jbHVzdGVyc1tpXTsKQEAgLTEyMDAsMTUwICsxMjI4LDQzMyBAQAogCQlnZW5lcmF0ZV9ibG9ja19lbmRwb2ludF9jbHVzdGVycygpOwogCX0KIAorCXN0cnVjdCBjb2xvcl9yZ2JhX2hhc2hlcgorCXsKKwkJaW5saW5lIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgY29sb3JfcmdiYSYgaykgY29uc3QKKwkJeworCQkJdWludDMyX3QgdiA9ICooY29uc3QgdWludDMyX3QqKSZrOworCQkJCisJCQkvL3JldHVybiBiaXRtaXgzMih2KTsKKwkJCQorCQkJLy92IF49ICh2IDw8IDEwKTsKKwkJCS8vdiBePSAodiA+PiAxMik7CisJCQkKKwkJCXJldHVybiB2OworCQl9CisJfTsKKwkJCiAJLy8gR2l2ZW4gZWFjaCBlbmRwb2ludCBjbHVzdGVyLCBnYXRoZXIgYWxsIHRoZSBibG9jayBwaXhlbHMgd2hpY2ggYXJlIGluIHRoYXQgY2x1c3RlciBhbmQgY29tcHV0ZSBvcHRpbWl6ZWQgRVRDMVMgZW5kcG9pbnRzIGZvciB0aGVtLgogCS8vIFRPRE86IERvbid0IG9wdGltaXplIGVuZHBvaW50IGNsdXN0ZXJzIHdoaWNoIGhhdmVuJ3QgY2hhbmdlZC4KKwkvLyBJZiBzdGVwPj0xLCB3ZSBjaGVjayB0byBlbnN1cmUgdGhlIG5ldyBlbmRwb2ludCB2YWx1ZXMgYWN0dWFsbHkgZGVjcmVhc2UgcXVhbnRpemF0aW9uIGVycm9yLgogCXZvaWQgYmFzaXN1X2Zyb250ZW5kOjpnZW5lcmF0ZV9lbmRwb2ludF9jb2RlYm9vayh1aW50MzJfdCBzdGVwKQogCXsKIAkJZGVidWdfcHJpbnRmKCJnZW5lcmF0ZV9lbmRwb2ludF9jb2RlYm9va1xuIik7CisJCQorCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJdG0uc3RhcnQoKTsKIAogCQltX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtcy5yZXNpemUobV9lbmRwb2ludF9jbHVzdGVycy5zaXplKCkpOwogCi0JCWNvbnN0IHVpbnQzMl90IE4gPSAxMjg7Ci0JCWZvciAodWludDMyX3QgY2x1c3Rlcl9pbmRleF9pdGVyID0gMDsgY2x1c3Rlcl9pbmRleF9pdGVyIDwgbV9lbmRwb2ludF9jbHVzdGVycy5zaXplKCk7IGNsdXN0ZXJfaW5kZXhfaXRlciArPSBOKQorCQlib29sIHVzZV9jcHUgPSB0cnVlOworCQkvLyBUT0RPOiBHZXQgdGhpcyB3b3JraW5nIHdoZW4gc3RlcD4wCisJCWlmIChtX3BhcmFtcy5tX3BPcGVuQ0xfY29udGV4dCAmJiAhc3RlcCkKIAkJewotCQkJY29uc3QgdWludDMyX3QgZmlyc3RfaW5kZXggPSBjbHVzdGVyX2luZGV4X2l0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQljb25zdCB1aW50MzJfdCBsYXN0X2luZGV4ID0gbWluaW11bTx1aW50MzJfdD4oKHVpbnQzMl90KW1fZW5kcG9pbnRfY2x1c3RlcnMuc2l6ZSgpLCBjbHVzdGVyX2luZGV4X2l0ZXIgKyBOKTsgICAKKwkJCWNvbnN0IHVpbnQzMl90IHRvdGFsX2NsdXN0ZXJzID0gbV9lbmRwb2ludF9jbHVzdGVycy5zaXplKCk7CiAKLSNpZm5kZWYgX19FTVNDUklQVEVOX18KLQkJCW1fcGFyYW1zLm1fcEpvYl9wb29sLT5hZGRfam9iKCBbdGhpcywgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXgsIHN0ZXAgXSB7Ci0jZW5kaWYKKwkJCWJhc2lzdTo6dmVjdG9yPGNsX3BpeGVsX2NsdXN0ZXI+IHBpeGVsX2NsdXN0ZXJzKHRvdGFsX2NsdXN0ZXJzKTsKKwkJCQorCQkJc3RkOjp2ZWN0b3I8Y29sb3JfcmdiYT4gaW5wdXRfcGl4ZWxzOworCQkJaW5wdXRfcGl4ZWxzLnJlc2VydmUobV90b3RhbF9ibG9ja3MgKiAxNik7CiAKLQkJCQlmb3IgKHVpbnQzMl90IGNsdXN0ZXJfaW5kZXggPSBmaXJzdF9pbmRleDsgY2x1c3Rlcl9pbmRleCA8IGxhc3RfaW5kZXg7IGNsdXN0ZXJfaW5kZXgrKykKKwkJCXN0ZDo6dmVjdG9yPHVpbnQzMl90PiBwaXhlbF93ZWlnaHRzOworCQkJcGl4ZWxfd2VpZ2h0cy5yZXNlcnZlKG1fdG90YWxfYmxvY2tzICogMTYpOworCisJCQl1aW50X3ZlYyBjbHVzdGVyX3NpemVzKHRvdGFsX2NsdXN0ZXJzKTsKKworCQkJLy90eXBlZGVmIGJhc2lzdTo6aGFzaF9tYXA8Y29sb3JfcmdiYSwgdWludDMyX3QsIGNvbG9yX3JnYmFfaGFzaGVyPiBjb2xvcl9oYXNoZXJfdHlwZTsKKwkJCS8vY29sb3JfaGFzaGVyX3R5cGUgY29sb3JfaGFzaGVyOworCQkJLy9jb2xvcl9oYXNoZXIucmVzZXJ2ZSgyMDQ4KTsKKworCQkJaW50ZXJ2YWxfdGltZXIgaGFzaF90bTsKKwkJCWhhc2hfdG0uc3RhcnQoKTsKKworCQkJYmFzaXN1Ojp2ZWN0b3I8dWludDMyX3Q+IGNvbG9ycywgY29sb3JzMjsKKwkJCWNvbG9ycy5yZXNlcnZlKDY1NTM2KTsKKwkJCWNvbG9yczIucmVzZXJ2ZSg2NTUzNik7CisKKwkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pbmRleCA9IDA7IGNsdXN0ZXJfaW5kZXggPCBtX2VuZHBvaW50X2NsdXN0ZXJzLnNpemUoKTsgY2x1c3Rlcl9pbmRleCsrKQorCQkJeworCQkJCWNvbnN0IGJhc2lzdTo6dmVjdG9yPHVpbnQzMl90PiYgY2x1c3Rlcl9pbmRpY2VzID0gbV9lbmRwb2ludF9jbHVzdGVyc1tjbHVzdGVyX2luZGV4XTsKKwkJCQlhc3NlcnQoKGNsdXN0ZXJfaW5kaWNlcy5zaXplKCkgJiAxKSA9PSAwKTsKKworI2lmIDAKKwkJCQl1aW50NjRfdCBmaXJzdF9waXhlbF9pbmRleCA9IGlucHV0X3BpeGVscy5zaXplKCk7CisJCQkJY29uc3QgdWludDMyX3QgdG90YWxfcGl4ZWxzID0gMTYgKiAoY2x1c3Rlcl9pbmRpY2VzLnNpemUoKSAvIDIpOworCisJCQkJaW5wdXRfcGl4ZWxzLnJlc2l6ZShpbnB1dF9waXhlbHMuc2l6ZSgpICsgdG90YWxfcGl4ZWxzKTsKKwkJCQlwaXhlbF93ZWlnaHRzLnJlc2l6ZShwaXhlbF93ZWlnaHRzLnNpemUoKSArIHRvdGFsX3BpeGVscyk7CisKKwkJCQl1aW50NjRfdCBkc3Rfb2ZzID0gZmlyc3RfcGl4ZWxfaW5kZXg7CisJCQkJCisJCQkJdWludDY0X3QgdG90YWxfciA9IDAsIHRvdGFsX2cgPSAwLCB0b3RhbF9iID0gMDsKKwkJCQlmb3IgKHVpbnQzMl90IGNsdXN0ZXJfaW5kaWNlc19pdGVyID0gMDsgY2x1c3Rlcl9pbmRpY2VzX2l0ZXIgPCBjbHVzdGVyX2luZGljZXMuc2l6ZSgpOyBjbHVzdGVyX2luZGljZXNfaXRlcisrKQogCQkJCXsKLQkJCQkJY29uc3QgYmFzaXN1Ojp2ZWN0b3I8dWludDMyX3Q+JiBjbHVzdGVyX2luZGljZXMgPSBtX2VuZHBvaW50X2NsdXN0ZXJzW2NsdXN0ZXJfaW5kZXhdOworCQkJCQljb25zdCB1aW50MzJfdCBzdWJibG9ja19pbmRleCA9IGNsdXN0ZXJfaW5kaWNlc1tjbHVzdGVyX2luZGljZXNfaXRlcl0gJiAxOworCQkJCQlpZiAoc3ViYmxvY2tfaW5kZXgpCisJCQkJCQljb250aW51ZTsKIAotCQkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKGNsdXN0ZXJfaW5kaWNlcy5zaXplKCkpOworCQkJCQljb25zdCB1aW50MzJfdCBibG9ja19pbmRleCA9IGNsdXN0ZXJfaW5kaWNlc1tjbHVzdGVyX2luZGljZXNfaXRlcl0gPj4gMTsKKwkJCQkJY29uc3QgY29sb3JfcmdiYSogcEJsb2NrX3BpeGVscyA9IGdldF9zb3VyY2VfcGl4ZWxfYmxvY2soYmxvY2tfaW5kZXgpLmdldF9wdHIoKTsKIAotCQkJCQljb25zdCB1aW50MzJfdCB0b3RhbF9waXhlbHMgPSAodWludDMyX3QpY2x1c3Rlcl9pbmRpY2VzLnNpemUoKSAqIDg7Ci0KLQkJCQkJYmFzaXN1Ojp2ZWN0b3I8Y29sb3JfcmdiYT4gY2x1c3Rlcl9waXhlbHModG90YWxfcGl4ZWxzKTsKLQotCQkJCQlmb3IgKHVpbnQzMl90IGNsdXN0ZXJfaW5kaWNlc19pdGVyID0gMDsgY2x1c3Rlcl9pbmRpY2VzX2l0ZXIgPCBjbHVzdGVyX2luZGljZXMuc2l6ZSgpOyBjbHVzdGVyX2luZGljZXNfaXRlcisrKQorCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJCQkJewotCQkJCQkJY29uc3QgdWludDMyX3QgYmxvY2tfaW5kZXggPSBjbHVzdGVyX2luZGljZXNbY2x1c3Rlcl9pbmRpY2VzX2l0ZXJdID4+IDE7Ci0JCQkJCQljb25zdCB1aW50MzJfdCBzdWJibG9ja19pbmRleCA9IGNsdXN0ZXJfaW5kaWNlc1tjbHVzdGVyX2luZGljZXNfaXRlcl0gJiAxOworCQkJCQkJaW5wdXRfcGl4ZWxzW2RzdF9vZnNdID0gcEJsb2NrX3BpeGVsc1tpXTsKKwkJCQkJCXBpeGVsX3dlaWdodHNbZHN0X29mc10gPSAxOworCQkJCQkJZHN0X29mcysrOwogCi0JCQkJCQljb25zdCBib29sIGZsaXBwZWQgPSB0cnVlOwotCi0JCQkJCQljb25zdCBjb2xvcl9yZ2JhICpwQmxvY2tfcGl4ZWxzID0gZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCkuZ2V0X3B0cigpOwotCi0JCQkJCQlmb3IgKHVpbnQzMl90IHBpeGVsX2luZGV4ID0gMDsgcGl4ZWxfaW5kZXggPCA4OyBwaXhlbF9pbmRleCsrKQotCQkJCQkJewotCQkJCQkJCWNvbnN0IGNvbG9yX3JnYmEgJmMgPSBwQmxvY2tfcGl4ZWxzW2dfZXRjMV9waXhlbF9pbmRpY2VzW2ZsaXBwZWRdW3N1YmJsb2NrX2luZGV4XVtwaXhlbF9pbmRleF1dOwotCQkJCQkJCWNsdXN0ZXJfcGl4ZWxzW2NsdXN0ZXJfaW5kaWNlc19pdGVyICogOCArIHBpeGVsX2luZGV4XSA9IGM7Ci0JCQkJCQl9CisJCQkJCQl0b3RhbF9yICs9IHBCbG9ja19waXhlbHNbaV0ucjsKKwkJCQkJCXRvdGFsX2cgKz0gcEJsb2NrX3BpeGVsc1tpXS5nOworCQkJCQkJdG90YWxfYiArPSBwQmxvY2tfcGl4ZWxzW2ldLmI7CiAJCQkJCX0KKwkJCQl9CiAKLQkJCQkJZW5kcG9pbnRfY2x1c3Rlcl9ldGNfcGFyYW1zIG5ld19zdWJibG9ja19wYXJhbXM7Ci0JCQkJCQkKKwkJCQkvL3ByaW50ZigiJWkgJWYgJWYgJWZcbiIsIGNsdXN0ZXJfaW5kZXgsIHRvdGFsX3IgLyAoZmxvYXQpdG90YWxfcGl4ZWxzLCB0b3RhbF9nIC8gKGZsb2F0KXRvdGFsX3BpeGVscywgdG90YWxfYiAvIChmbG9hdCl0b3RhbF9waXhlbHMpOworCisJCQkJcGl4ZWxfY2x1c3RlcnNbY2x1c3Rlcl9pbmRleF0ubV9maXJzdF9waXhlbF9pbmRleCA9IGZpcnN0X3BpeGVsX2luZGV4OworCQkJCXBpeGVsX2NsdXN0ZXJzW2NsdXN0ZXJfaW5kZXhdLm1fdG90YWxfcGl4ZWxzID0gdG90YWxfcGl4ZWxzOworCQkJCWNsdXN0ZXJfc2l6ZXNbY2x1c3Rlcl9pbmRleF0gPSB0b3RhbF9waXhlbHM7CisjZWxpZiAxCisJCQkJY29sb3JzLnJlc2l6ZShjbHVzdGVyX2luZGljZXMuc2l6ZSgpICogOCk7CisJCQkJY29sb3JzMi5yZXNpemUoY2x1c3Rlcl9pbmRpY2VzLnNpemUoKSAqIDgpOworCQkJCXVpbnQzMl90IGRzdF9vZnMgPSAwOworCisJCQkJZm9yICh1aW50MzJfdCBjbHVzdGVyX2luZGljZXNfaXRlciA9IDA7IGNsdXN0ZXJfaW5kaWNlc19pdGVyIDwgY2x1c3Rlcl9pbmRpY2VzLnNpemUoKTsgY2x1c3Rlcl9pbmRpY2VzX2l0ZXIrKykKKwkJCQl7CisJCQkJCWNvbnN0IHVpbnQzMl90IHN1YmJsb2NrX2luZGV4ID0gY2x1c3Rlcl9pbmRpY2VzW2NsdXN0ZXJfaW5kaWNlc19pdGVyXSAmIDE7CisJCQkJCWlmIChzdWJibG9ja19pbmRleCkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCWNvbnN0IHVpbnQzMl90IGJsb2NrX2luZGV4ID0gY2x1c3Rlcl9pbmRpY2VzW2NsdXN0ZXJfaW5kaWNlc19pdGVyXSA+PiAxOworCQkJCQljb25zdCBjb2xvcl9yZ2JhKiBwQmxvY2tfcGl4ZWxzID0gZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCkuZ2V0X3B0cigpOworCisJCQkJCW1lbWNweShjb2xvcnMuZGF0YSgpICsgZHN0X29mcywgcEJsb2NrX3BpeGVscywgc2l6ZW9mKGNvbG9yX3JnYmEpICogMTYpOworCQkJCQlkc3Rfb2ZzICs9IDE2OworCisJCQkJfSAvLyBjbHVzdGVyX2luZGljZXNfaXRlcgorCisJCQkJdWludDMyX3QqIHBTb3J0ZWQgPSByYWRpeF9zb3J0KGNvbG9ycy5zaXplKCksIGNvbG9ycy5kYXRhKCksIGNvbG9yczIuZGF0YSgpLCAwLCAzKTsKKworCQkJCWNvbnN0IHVpbnQ2NF90IGZpcnN0X3BpeGVsX2luZGV4ID0gaW5wdXRfcGl4ZWxzLnNpemUoKTsKKworCQkJCXVpbnQzMl90IHByZXZfY29sb3IgPSAwLCBjdXJfd2VpZ2h0ID0gMDsKKwkJCQkJCQkJCQkJCQkJCQkKKwkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29sb3JzLnNpemUoKTsgaSsrKQorCQkJCXsKKwkJCQkJdWludDMyX3QgY3VyX2NvbG9yID0gcFNvcnRlZFtpXTsKKwkJCQkJaWYgKGN1cl9jb2xvciA9PSBwcmV2X2NvbG9yKQogCQkJCQl7Ci0JCQkJCQlldGMxX29wdGltaXplciBvcHRpbWl6ZXI7Ci0JCQkJCQlldGMxX3NvbHV0aW9uX2Nvb3JkaW5hdGVzIHNvbHV0aW9uc1syXTsKLQotCQkJCQkJZXRjMV9vcHRpbWl6ZXI6OnBhcmFtcyBjbHVzdGVyX29wdGltaXplcl9wYXJhbXM7Ci0JCQkJCQljbHVzdGVyX29wdGltaXplcl9wYXJhbXMubV9udW1fc3JjX3BpeGVscyA9IHRvdGFsX3BpeGVsczsKLQkJCQkJCWNsdXN0ZXJfb3B0aW1pemVyX3BhcmFtcy5tX3BTcmNfcGl4ZWxzID0gJmNsdXN0ZXJfcGl4ZWxzWzBdOwotCi0JCQkJCQljbHVzdGVyX29wdGltaXplcl9wYXJhbXMubV91c2VfY29sb3I0ID0gZmFsc2U7Ci0JCQkJCQljbHVzdGVyX29wdGltaXplcl9wYXJhbXMubV9wZXJjZXB0dWFsID0gbV9wYXJhbXMubV9wZXJjZXB0dWFsOwotCi0JCQkJCQlpZiAobV9wYXJhbXMubV9jb21wcmVzc2lvbl9sZXZlbCA8PSAxKQotCQkJCQkJCWNsdXN0ZXJfb3B0aW1pemVyX3BhcmFtcy5tX3F1YWxpdHkgPSBjRVRDUXVhbGl0eU1lZGl1bTsKLQkJCQkJCWVsc2UgaWYgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPT0gQkFTSVNVX01BWF9DT01QUkVTU0lPTl9MRVZFTCkKLQkJCQkJCQljbHVzdGVyX29wdGltaXplcl9wYXJhbXMubV9xdWFsaXR5ID0gY0VUQ1F1YWxpdHlVYmVyOwotCi0JCQkJCQlldGMxX29wdGltaXplcjo6cmVzdWx0cyBjbHVzdGVyX29wdGltaXplcl9yZXN1bHRzOwotCi0JCQkJCQliYXNpc3U6OnZlY3Rvcjx1aW50OF90PiBjbHVzdGVyX3NlbGVjdG9ycyh0b3RhbF9waXhlbHMpOwotCQkJCQkJY2x1c3Rlcl9vcHRpbWl6ZXJfcmVzdWx0cy5tX24gPSB0b3RhbF9waXhlbHM7Ci0JCQkJCQljbHVzdGVyX29wdGltaXplcl9yZXN1bHRzLm1fcFNlbGVjdG9ycyA9ICZjbHVzdGVyX3NlbGVjdG9yc1swXTsKLQotCQkJCQkJb3B0aW1pemVyLmluaXQoY2x1c3Rlcl9vcHRpbWl6ZXJfcGFyYW1zLCBjbHVzdGVyX29wdGltaXplcl9yZXN1bHRzKTsKLQotCQkJCQkJaWYgKCFvcHRpbWl6ZXIuY29tcHV0ZSgpKQotCQkJCQkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkoZmFsc2UpOwotCi0JCQkJCQluZXdfc3ViYmxvY2tfcGFyYW1zLm1fY29sb3JfdW5zY2FsZWRbMF0gPSBjbHVzdGVyX29wdGltaXplcl9yZXN1bHRzLm1fYmxvY2tfY29sb3JfdW5zY2FsZWQ7Ci0JCQkJCQluZXdfc3ViYmxvY2tfcGFyYW1zLm1faW50ZW5fdGFibGVbMF0gPSBjbHVzdGVyX29wdGltaXplcl9yZXN1bHRzLm1fYmxvY2tfaW50ZW5fdGFibGU7Ci0JCQkJCQluZXdfc3ViYmxvY2tfcGFyYW1zLm1fY29sb3JfZXJyb3JbMF0gPSBjbHVzdGVyX29wdGltaXplcl9yZXN1bHRzLm1fZXJyb3I7Ci0JCQkJCX0gCi0KLQkJCQkJZW5kcG9pbnRfY2x1c3Rlcl9ldGNfcGFyYW1zICZwcmV2X2V0Y19wYXJhbXMgPSBtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tjbHVzdGVyX2luZGV4XTsKLQotCQkJCQlib29sIHVzZV9uZXdfc3ViYmxvY2tfcGFyYW1zID0gZmFsc2U7Ci0JCQkJCWlmICgoIXN0ZXApIHx8ICghcHJldl9ldGNfcGFyYW1zLm1fdmFsaWQpKQotCQkJCQkJdXNlX25ld19zdWJibG9ja19wYXJhbXMgPSB0cnVlOworCQkJCQkJaWYgKCsrY3VyX3dlaWdodCA9PSAwKQorCQkJCQkJCWN1cl93ZWlnaHQtLTsKKwkJCQkJfQogCQkJCQllbHNlCiAJCQkJCXsKLQkJCQkJCWFzc2VydChwcmV2X2V0Y19wYXJhbXMubV92YWxpZCk7Ci0KLQkJCQkJCXVpbnQ2NF90IHRvdGFsX3ByZXZfZXJyID0gMDsKLQkJCQkJCQkJCisJCQkJCQlpZiAoY3VyX3dlaWdodCkKIAkJCQkJCXsKLQkJCQkJCQljb2xvcl9yZ2JhIGJsb2NrX2NvbG9yc1s0XTsKKwkJCQkJCQlpbnB1dF9waXhlbHMucHVzaF9iYWNrKCooY29uc3QgY29sb3JfcmdiYSopJnByZXZfY29sb3IpOworCQkJCQkJCXBpeGVsX3dlaWdodHMucHVzaF9iYWNrKGN1cl93ZWlnaHQpOworCQkJCQkJfQogCi0JCQkJCQkJZXRjX2Jsb2NrOjpnZXRfYmxvY2tfY29sb3JzNShibG9ja19jb2xvcnMsIHByZXZfZXRjX3BhcmFtcy5tX2NvbG9yX3Vuc2NhbGVkWzBdLCBwcmV2X2V0Y19wYXJhbXMubV9pbnRlbl90YWJsZVswXSwgZmFsc2UpOworCQkJCQkJcHJldl9jb2xvciA9IGN1cl9jb2xvcjsKKwkJCQkJCWN1cl93ZWlnaHQgPSAxOworCQkJCQl9CisJCQkJfQogCi0JCQkJCQkJdWludDY0X3QgdG90YWxfZXJyID0gMDsKKwkJCQlpZiAoY3VyX3dlaWdodCkKKwkJCQl7CisJCQkJCWlucHV0X3BpeGVscy5wdXNoX2JhY2soKihjb25zdCBjb2xvcl9yZ2JhKikmcHJldl9jb2xvcik7CisJCQkJCXBpeGVsX3dlaWdodHMucHVzaF9iYWNrKGN1cl93ZWlnaHQpOworCQkJCX0KIAotCQkJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0b3RhbF9waXhlbHM7IGkrKykKKwkJCQl1aW50MzJfdCB0b3RhbF91bmlxdWVfcGl4ZWxzID0gKHVpbnQzMl90KShpbnB1dF9waXhlbHMuc2l6ZSgpIC0gZmlyc3RfcGl4ZWxfaW5kZXgpOworCisJCQkJcGl4ZWxfY2x1c3RlcnNbY2x1c3Rlcl9pbmRleF0ubV9maXJzdF9waXhlbF9pbmRleCA9IGZpcnN0X3BpeGVsX2luZGV4OworCQkJCXBpeGVsX2NsdXN0ZXJzW2NsdXN0ZXJfaW5kZXhdLm1fdG90YWxfcGl4ZWxzID0gdG90YWxfdW5pcXVlX3BpeGVsczsKKworCQkJCWNsdXN0ZXJfc2l6ZXNbY2x1c3Rlcl9pbmRleF0gPSB0b3RhbF91bmlxdWVfcGl4ZWxzOworI2Vsc2UKKwkJCQljb2xvcl9oYXNoZXIucmVzZXQoKTsKKworCQkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pbmRpY2VzX2l0ZXIgPSAwOyBjbHVzdGVyX2luZGljZXNfaXRlciA8IGNsdXN0ZXJfaW5kaWNlcy5zaXplKCk7IGNsdXN0ZXJfaW5kaWNlc19pdGVyKyspCisJCQkJeworCQkJCQljb25zdCB1aW50MzJfdCBzdWJibG9ja19pbmRleCA9IGNsdXN0ZXJfaW5kaWNlc1tjbHVzdGVyX2luZGljZXNfaXRlcl0gJiAxOworCQkJCQlpZiAoc3ViYmxvY2tfaW5kZXgpCisJCQkJCQljb250aW51ZTsKKworCQkJCQljb25zdCB1aW50MzJfdCBibG9ja19pbmRleCA9IGNsdXN0ZXJfaW5kaWNlc1tjbHVzdGVyX2luZGljZXNfaXRlcl0gPj4gMTsKKwkJCQkJY29uc3QgY29sb3JfcmdiYSogcEJsb2NrX3BpeGVscyA9IGdldF9zb3VyY2VfcGl4ZWxfYmxvY2soYmxvY2tfaW5kZXgpLmdldF9wdHIoKTsKKworCQkJCQl1aW50MzJfdCAqcFByZXZfd2VpZ2h0ID0gbnVsbHB0cjsKKwkJCQkJY29sb3JfcmdiYSBwcmV2X2NvbG9yOworCQkJCQkKKwkJCQkJeworCQkJCQkJY29sb3JfcmdiYSBjdXJfY29sb3IgPSBwQmxvY2tfcGl4ZWxzWzBdOworCQkJCQkJYXV0byByZXMgPSBjb2xvcl9oYXNoZXIuaW5zZXJ0KGN1cl9jb2xvciwgMCk7CisKKwkJCQkJCXVpbnQzMl90JiB3ZWlnaHQgPSAocmVzLmZpcnN0KS0+c2Vjb25kOworCQkJCQkJaWYgKHdlaWdodCAhPSBVSU5UMzJfTUFYKQorCQkJCQkJCXdlaWdodCsrOworCisJCQkJCQlwcmV2X2NvbG9yID0gY3VyX2NvbG9yOworCQkJCQkJcFByZXZfd2VpZ2h0ID0gJihyZXMuZmlyc3QpLT5zZWNvbmQ7CisJCQkJCX0KKwkJCQkJCQkJCQorCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgMTY7IGkrKykKKwkJCQkJeworCQkJCQkJY29sb3JfcmdiYSBjdXJfY29sb3IgPSBwQmxvY2tfcGl4ZWxzW2ldOworCisJCQkJCQlpZiAoY3VyX2NvbG9yID09IHByZXZfY29sb3IpCisJCQkJCQl7CisJCQkJCQkJaWYgKCpwUHJldl93ZWlnaHQgIT0gVUlOVDMyX01BWCkKKwkJCQkJCQkJKnBQcmV2X3dlaWdodCA9ICpwUHJldl93ZWlnaHQgKyAxOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWF1dG8gcmVzID0gY29sb3JfaGFzaGVyLmluc2VydChjdXJfY29sb3IsIDApOworCisJCQkJCQkJdWludDMyX3QmIHdlaWdodCA9IChyZXMuZmlyc3QpLT5zZWNvbmQ7CisJCQkJCQkJaWYgKHdlaWdodCAhPSBVSU5UMzJfTUFYKQorCQkJCQkJCQl3ZWlnaHQrKzsKKworCQkJCQkJCXByZXZfY29sb3IgPSBjdXJfY29sb3I7CisJCQkJCQkJcFByZXZfd2VpZ2h0ID0gJihyZXMuZmlyc3QpLT5zZWNvbmQ7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCX0gLy8gY2x1c3Rlcl9pbmRpY2VzX2l0ZXIKKworCQkJCWNvbnN0IHVpbnQ2NF90IGZpcnN0X3BpeGVsX2luZGV4ID0gaW5wdXRfcGl4ZWxzLnNpemUoKTsKKwkJCQl1aW50MzJfdCB0b3RhbF91bmlxdWVfcGl4ZWxzID0gY29sb3JfaGFzaGVyLnNpemUoKTsKKworCQkJCXBpeGVsX2NsdXN0ZXJzW2NsdXN0ZXJfaW5kZXhdLm1fZmlyc3RfcGl4ZWxfaW5kZXggPSBmaXJzdF9waXhlbF9pbmRleDsKKwkJCQlwaXhlbF9jbHVzdGVyc1tjbHVzdGVyX2luZGV4XS5tX3RvdGFsX3BpeGVscyA9IHRvdGFsX3VuaXF1ZV9waXhlbHM7CisKKwkJCQlpbnB1dF9waXhlbHMucmVzaXplKGZpcnN0X3BpeGVsX2luZGV4ICsgdG90YWxfdW5pcXVlX3BpeGVscyk7CisJCQkJcGl4ZWxfd2VpZ2h0cy5yZXNpemUoZmlyc3RfcGl4ZWxfaW5kZXggKyB0b3RhbF91bmlxdWVfcGl4ZWxzKTsKKwkJCQkJCQorCQkJCXVpbnQzMl90IGogPSAwOworCQkJCQorCQkJCWZvciAoYXV0byBpdCA9IGNvbG9yX2hhc2hlci5iZWdpbigpOyBpdCAhPSBjb2xvcl9oYXNoZXIuZW5kKCk7ICsraXQsICsraikKKwkJCQl7CisJCQkJCWlucHV0X3BpeGVsc1tmaXJzdF9waXhlbF9pbmRleCArIGpdID0gaXQtPmZpcnN0OworCQkJCQlwaXhlbF93ZWlnaHRzW2ZpcnN0X3BpeGVsX2luZGV4ICsgal0gPSBpdC0+c2Vjb25kOworCQkJCX0KKworCQkJCWNsdXN0ZXJfc2l6ZXNbY2x1c3Rlcl9pbmRleF0gPSB0b3RhbF91bmlxdWVfcGl4ZWxzOworI2VuZGlmCisKKwkJCX0gLy8gY2x1c3Rlcl9pbmRleAorCisJCQlkZWJ1Z19wcmludGYoIlRvdGFsIGhhc2ggdGltZTogJTMuM2Ygc2Vjc1xuIiwgaGFzaF90bS5nZXRfZWxhcHNlZF9zZWNzKCkpOworCisJCQlkZWJ1Z19wcmludGYoIlRvdGFsIHVuaXF1ZSBjb2xvcnM6ICVsbHVcbiIsIGlucHV0X3BpeGVscy5zaXplKCkpOworCisJCQl1aW50X3ZlYyBzb3J0ZWRfY2x1c3Rlcl9pbmRpY2VzX25ld190b19vbGQodG90YWxfY2x1c3RlcnMpOworCQkJaW5kaXJlY3Rfc29ydCh0b3RhbF9jbHVzdGVycywgc29ydGVkX2NsdXN0ZXJfaW5kaWNlc19uZXdfdG9fb2xkLmRhdGEoKSwgY2x1c3Rlcl9zaXplcy5kYXRhKCkpOworCQkJLy9mb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdG90YWxfY2x1c3RlcnM7IGkrKykKKwkJCS8vCXNvcnRlZF9jbHVzdGVyX2luZGljZXNfbmV3X3RvX29sZFtpXSA9IGk7CisKKwkJCXVpbnRfdmVjIHNvcnRlZF9jbHVzdGVyX2luZGljZXNfb2xkX3RvX25ldyh0b3RhbF9jbHVzdGVycyk7CisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdG90YWxfY2x1c3RlcnM7IGkrKykKKwkJCQlzb3J0ZWRfY2x1c3Rlcl9pbmRpY2VzX29sZF90b19uZXdbc29ydGVkX2NsdXN0ZXJfaW5kaWNlc19uZXdfdG9fb2xkW2ldXSA9IGk7CisKKwkJCWJhc2lzdTo6dmVjdG9yPGNsX3BpeGVsX2NsdXN0ZXI+IHNvcnRlZF9waXhlbF9jbHVzdGVycyh0b3RhbF9jbHVzdGVycyk7CisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdG90YWxfY2x1c3RlcnM7IGkrKykKKwkJCQlzb3J0ZWRfcGl4ZWxfY2x1c3RlcnNbaV0gPSBwaXhlbF9jbHVzdGVyc1tzb3J0ZWRfY2x1c3Rlcl9pbmRpY2VzX25ld190b19vbGRbaV1dOworCisJCQl1aW50MzJfdCB0b3RhbF9wZXJtcyA9IDY0OworCQkJaWYgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPD0gMSkKKwkJCQl0b3RhbF9wZXJtcyA9IDE2OworCQkJZWxzZSBpZiAobV9wYXJhbXMubV9jb21wcmVzc2lvbl9sZXZlbCA9PSBCQVNJU1VfTUFYX0NPTVBSRVNTSU9OX0xFVkVMKQorCQkJCXRvdGFsX3Blcm1zID0gT1BFTkNMX0VOQ09ERV9FVEMxU19NQVhfUEVSTVM7CisKKwkJCWJhc2lzdTo6dmVjdG9yPGV0Y19ibG9jaz4gb3V0cHV0X2Jsb2Nrcyh0b3RhbF9jbHVzdGVycyk7CisKKwkJCWlmIChvcGVuY2xfZW5jb2RlX2V0YzFzX3BpeGVsX2NsdXN0ZXJzKAorCQkJCW1fcGFyYW1zLm1fcE9wZW5DTF9jb250ZXh0LAorCQkJCW91dHB1dF9ibG9ja3MuZGF0YSgpLAorCQkJCXRvdGFsX2NsdXN0ZXJzLAorCQkJCXNvcnRlZF9waXhlbF9jbHVzdGVycy5kYXRhKCksCisJCQkJaW5wdXRfcGl4ZWxzLnNpemUoKSwKKwkJCQlpbnB1dF9waXhlbHMuZGF0YSgpLAorCQkJCXBpeGVsX3dlaWdodHMuZGF0YSgpLAorCQkJCW1fcGFyYW1zLm1fcGVyY2VwdHVhbCwgdG90YWxfcGVybXMpKQorCQkJeworCQkJCWZvciAodWludDMyX3Qgb2xkX2NsdXN0ZXJfaW5kZXggPSAwOyBvbGRfY2x1c3Rlcl9pbmRleCA8IG1fZW5kcG9pbnRfY2x1c3RlcnMuc2l6ZSgpOyBvbGRfY2x1c3Rlcl9pbmRleCsrKQorCQkJCXsKKwkJCQkJY29uc3QgdWludDMyX3QgbmV3X2NsdXN0ZXJfaW5kZXggPSBzb3J0ZWRfY2x1c3Rlcl9pbmRpY2VzX29sZF90b19uZXdbb2xkX2NsdXN0ZXJfaW5kZXhdOworCQkJCQkJCQkJCQorCQkJCQljb25zdCBldGNfYmxvY2smIGJsayA9IG91dHB1dF9ibG9ja3NbbmV3X2NsdXN0ZXJfaW5kZXhdOworCisJCQkJCWVuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtcyYgcHJldl9ldGNfcGFyYW1zID0gbV9lbmRwb2ludF9jbHVzdGVyX2V0Y19wYXJhbXNbb2xkX2NsdXN0ZXJfaW5kZXhdOworCisJCQkJCXByZXZfZXRjX3BhcmFtcy5tX3ZhbGlkID0gdHJ1ZTsKKwkJCQkJZXRjX2Jsb2NrOjp1bnBhY2tfY29sb3I1KHByZXZfZXRjX3BhcmFtcy5tX2NvbG9yX3Vuc2NhbGVkWzBdLCBibGsuZ2V0X2Jhc2U1X2NvbG9yKCksIGZhbHNlKTsKKwkJCQkJcHJldl9ldGNfcGFyYW1zLm1faW50ZW5fdGFibGVbMF0gPSBibGsuZ2V0X2ludGVuX3RhYmxlKDApOworCQkJCQlwcmV2X2V0Y19wYXJhbXMubV9jb2xvcl9lcnJvclswXSA9IDA7IC8vIGR1bW15IHZhbHVlIC0gd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoaXMgCisJCQkJfQorCisJCQkJdXNlX2NwdSA9IGZhbHNlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVycm9yX3ByaW50ZigiYmFzaXN1X2Zyb250ZW5kOjpnZW5lcmF0ZV9lbmRwb2ludF9jb2RlYm9vazogb3BlbmNsX2VuY29kZV9ldGMxc19waXhlbF9jbHVzdGVycygpIGZhaWxlZCEgVXNpbmcgQ1BVLlxuIik7CisJCQkJbV9wYXJhbXMubV9wT3BlbkNMX2NvbnRleHQgPSBudWxscHRyOworCQkJCW1fb3BlbmNsX2ZhaWxlZCA9IHRydWU7CisJCQl9CisKKwkJfSAvLyBpZiAob3BlbmNsX2lzX2F2YWlsYWJsZSgpICYmIG1fcGFyYW1zLm1fdXNlX29wZW5jbCkKKworCQlpZiAodXNlX2NwdSkKKwkJeworCQkJY29uc3QgdWludDMyX3QgTiA9IDEyODsKKwkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pbmRleF9pdGVyID0gMDsgY2x1c3Rlcl9pbmRleF9pdGVyIDwgbV9lbmRwb2ludF9jbHVzdGVycy5zaXplKCk7IGNsdXN0ZXJfaW5kZXhfaXRlciArPSBOKQorCQkJeworCQkJCWNvbnN0IHVpbnQzMl90IGZpcnN0X2luZGV4ID0gY2x1c3Rlcl9pbmRleF9pdGVyOworCQkJCWNvbnN0IHVpbnQzMl90IGxhc3RfaW5kZXggPSBtaW5pbXVtPHVpbnQzMl90PigodWludDMyX3QpbV9lbmRwb2ludF9jbHVzdGVycy5zaXplKCksIGNsdXN0ZXJfaW5kZXhfaXRlciArIE4pOworCisjaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCisJCQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPmFkZF9qb2IoW3RoaXMsIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4LCBzdGVwXSB7CisjZW5kaWYKKworCQkJCQlmb3IgKHVpbnQzMl90IGNsdXN0ZXJfaW5kZXggPSBmaXJzdF9pbmRleDsgY2x1c3Rlcl9pbmRleCA8IGxhc3RfaW5kZXg7IGNsdXN0ZXJfaW5kZXgrKykKKwkJCQkJeworCQkJCQkJY29uc3QgYmFzaXN1Ojp2ZWN0b3I8dWludDMyX3Q+JiBjbHVzdGVyX2luZGljZXMgPSBtX2VuZHBvaW50X2NsdXN0ZXJzW2NsdXN0ZXJfaW5kZXhdOworCisJCQkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKGNsdXN0ZXJfaW5kaWNlcy5zaXplKCkpOworCisJCQkJCQljb25zdCB1aW50MzJfdCB0b3RhbF9waXhlbHMgPSAodWludDMyX3QpY2x1c3Rlcl9pbmRpY2VzLnNpemUoKSAqIDg7CisKKwkJCQkJCWJhc2lzdTo6dmVjdG9yPGNvbG9yX3JnYmE+IGNsdXN0ZXJfcGl4ZWxzKHRvdGFsX3BpeGVscyk7CisKKwkJCQkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pbmRpY2VzX2l0ZXIgPSAwOyBjbHVzdGVyX2luZGljZXNfaXRlciA8IGNsdXN0ZXJfaW5kaWNlcy5zaXplKCk7IGNsdXN0ZXJfaW5kaWNlc19pdGVyKyspCisJCQkJCQl7CisJCQkJCQkJY29uc3QgdWludDMyX3QgYmxvY2tfaW5kZXggPSBjbHVzdGVyX2luZGljZXNbY2x1c3Rlcl9pbmRpY2VzX2l0ZXJdID4+IDE7CisJCQkJCQkJY29uc3QgdWludDMyX3Qgc3ViYmxvY2tfaW5kZXggPSBjbHVzdGVyX2luZGljZXNbY2x1c3Rlcl9pbmRpY2VzX2l0ZXJdICYgMTsKKworCQkJCQkJCWNvbnN0IGJvb2wgZmxpcHBlZCA9IHRydWU7CisKKwkJCQkJCQljb25zdCBjb2xvcl9yZ2JhKiBwQmxvY2tfcGl4ZWxzID0gZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCkuZ2V0X3B0cigpOworCisJCQkJCQkJZm9yICh1aW50MzJfdCBwaXhlbF9pbmRleCA9IDA7IHBpeGVsX2luZGV4IDwgODsgcGl4ZWxfaW5kZXgrKykKIAkJCQkJCQl7Ci0JCQkJCQkJCWNvbnN0IGNvbG9yX3JnYmEgJmMgPSBjbHVzdGVyX3BpeGVsc1tpXTsKKwkJCQkJCQkJY29uc3QgY29sb3JfcmdiYSYgYyA9IHBCbG9ja19waXhlbHNbZ19ldGMxX3BpeGVsX2luZGljZXNbZmxpcHBlZF1bc3ViYmxvY2tfaW5kZXhdW3BpeGVsX2luZGV4XV07CisJCQkJCQkJCWNsdXN0ZXJfcGl4ZWxzW2NsdXN0ZXJfaW5kaWNlc19pdGVyICogOCArIHBpeGVsX2luZGV4XSA9IGM7CisJCQkJCQkJfQorCQkJCQkJfQogCi0JCQkJCQkJCXVpbnQ2NF90IGJlc3RfZXJyID0gVUlOVDY0X01BWDsKLQkJCQkJCQkJLy91aW50MzJfdCBiZXN0X2luZGV4ID0gMDsKKwkJCQkJCWVuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtcyBuZXdfc3ViYmxvY2tfcGFyYW1zOwogCi0JCQkJCQkJCWZvciAodWludDMyX3QgcyA9IDA7IHMgPCA0OyBzKyspCisJCQkJCQl7CisJCQkJCQkJZXRjMV9vcHRpbWl6ZXIgb3B0aW1pemVyOworCQkJCQkJCWV0YzFfc29sdXRpb25fY29vcmRpbmF0ZXMgc29sdXRpb25zWzJdOworCisJCQkJCQkJZXRjMV9vcHRpbWl6ZXI6OnBhcmFtcyBjbHVzdGVyX29wdGltaXplcl9wYXJhbXM7CisJCQkJCQkJY2x1c3Rlcl9vcHRpbWl6ZXJfcGFyYW1zLm1fbnVtX3NyY19waXhlbHMgPSB0b3RhbF9waXhlbHM7CisJCQkJCQkJY2x1c3Rlcl9vcHRpbWl6ZXJfcGFyYW1zLm1fcFNyY19waXhlbHMgPSAmY2x1c3Rlcl9waXhlbHNbMF07CisKKwkJCQkJCQljbHVzdGVyX29wdGltaXplcl9wYXJhbXMubV91c2VfY29sb3I0ID0gZmFsc2U7CisJCQkJCQkJY2x1c3Rlcl9vcHRpbWl6ZXJfcGFyYW1zLm1fcGVyY2VwdHVhbCA9IG1fcGFyYW1zLm1fcGVyY2VwdHVhbDsKKworCQkJCQkJCWlmIChtX3BhcmFtcy5tX2NvbXByZXNzaW9uX2xldmVsIDw9IDEpCisJCQkJCQkJCWNsdXN0ZXJfb3B0aW1pemVyX3BhcmFtcy5tX3F1YWxpdHkgPSBjRVRDUXVhbGl0eU1lZGl1bTsKKwkJCQkJCQllbHNlIGlmIChtX3BhcmFtcy5tX2NvbXByZXNzaW9uX2xldmVsID09IEJBU0lTVV9NQVhfQ09NUFJFU1NJT05fTEVWRUwpCisJCQkJCQkJCWNsdXN0ZXJfb3B0aW1pemVyX3BhcmFtcy5tX3F1YWxpdHkgPSBjRVRDUXVhbGl0eVViZXI7CisKKwkJCQkJCQlldGMxX29wdGltaXplcjo6cmVzdWx0cyBjbHVzdGVyX29wdGltaXplcl9yZXN1bHRzOworCisJCQkJCQkJYmFzaXN1Ojp2ZWN0b3I8dWludDhfdD4gY2x1c3Rlcl9zZWxlY3RvcnModG90YWxfcGl4ZWxzKTsKKwkJCQkJCQljbHVzdGVyX29wdGltaXplcl9yZXN1bHRzLm1fbiA9IHRvdGFsX3BpeGVsczsKKwkJCQkJCQljbHVzdGVyX29wdGltaXplcl9yZXN1bHRzLm1fcFNlbGVjdG9ycyA9ICZjbHVzdGVyX3NlbGVjdG9yc1swXTsKKworCQkJCQkJCW9wdGltaXplci5pbml0KGNsdXN0ZXJfb3B0aW1pemVyX3BhcmFtcywgY2x1c3Rlcl9vcHRpbWl6ZXJfcmVzdWx0cyk7CisKKwkJCQkJCQlpZiAoIW9wdGltaXplci5jb21wdXRlKCkpCisJCQkJCQkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkoZmFsc2UpOworCisJCQkJCQkJbmV3X3N1YmJsb2NrX3BhcmFtcy5tX2NvbG9yX3Vuc2NhbGVkWzBdID0gY2x1c3Rlcl9vcHRpbWl6ZXJfcmVzdWx0cy5tX2Jsb2NrX2NvbG9yX3Vuc2NhbGVkOworCQkJCQkJCW5ld19zdWJibG9ja19wYXJhbXMubV9pbnRlbl90YWJsZVswXSA9IGNsdXN0ZXJfb3B0aW1pemVyX3Jlc3VsdHMubV9ibG9ja19pbnRlbl90YWJsZTsKKwkJCQkJCQluZXdfc3ViYmxvY2tfcGFyYW1zLm1fY29sb3JfZXJyb3JbMF0gPSBjbHVzdGVyX29wdGltaXplcl9yZXN1bHRzLm1fZXJyb3I7CisJCQkJCQl9CisKKwkJCQkJCWVuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtcyYgcHJldl9ldGNfcGFyYW1zID0gbV9lbmRwb2ludF9jbHVzdGVyX2V0Y19wYXJhbXNbY2x1c3Rlcl9pbmRleF07CisKKwkJCQkJCWJvb2wgdXNlX25ld19zdWJibG9ja19wYXJhbXMgPSBmYWxzZTsKKwkJCQkJCWlmICgoIXN0ZXApIHx8ICghcHJldl9ldGNfcGFyYW1zLm1fdmFsaWQpKQorCQkJCQkJCXVzZV9uZXdfc3ViYmxvY2tfcGFyYW1zID0gdHJ1ZTsKKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlhc3NlcnQocHJldl9ldGNfcGFyYW1zLm1fdmFsaWQpOworCisJCQkJCQkJdWludDY0X3QgdG90YWxfcHJldl9lcnIgPSAwOworCisJCQkJCQkJeworCQkJCQkJCQljb2xvcl9yZ2JhIGJsb2NrX2NvbG9yc1s0XTsKKworCQkJCQkJCQlldGNfYmxvY2s6OmdldF9ibG9ja19jb2xvcnM1KGJsb2NrX2NvbG9ycywgcHJldl9ldGNfcGFyYW1zLm1fY29sb3JfdW5zY2FsZWRbMF0sIHByZXZfZXRjX3BhcmFtcy5tX2ludGVuX3RhYmxlWzBdLCBmYWxzZSk7CisKKwkJCQkJCQkJdWludDY0X3QgdG90YWxfZXJyID0gMDsKKworCQkJCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdG90YWxfcGl4ZWxzOyBpKyspCiAJCQkJCQkJCXsKLQkJCQkJCQkJCXVpbnQ2NF90IGVyciA9IGNvbG9yX2Rpc3RhbmNlKG1fcGFyYW1zLm1fcGVyY2VwdHVhbCwgYywgYmxvY2tfY29sb3JzW3NdLCBmYWxzZSk7Ci0JCQkJCQkJCQlpZiAoZXJyIDwgYmVzdF9lcnIpCisJCQkJCQkJCQljb25zdCBjb2xvcl9yZ2JhJiBjID0gY2x1c3Rlcl9waXhlbHNbaV07CisKKwkJCQkJCQkJCXVpbnQ2NF90IGJlc3RfZXJyID0gVUlOVDY0X01BWDsKKwkJCQkJCQkJCS8vdWludDMyX3QgYmVzdF9pbmRleCA9IDA7CisKKwkJCQkJCQkJCWZvciAodWludDMyX3QgcyA9IDA7IHMgPCA0OyBzKyspCiAJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJYmVzdF9lcnIgPSBlcnI7Ci0JCQkJCQkJCQkJLy9iZXN0X2luZGV4ID0gczsKKwkJCQkJCQkJCQl1aW50NjRfdCBlcnIgPSBjb2xvcl9kaXN0YW5jZShtX3BhcmFtcy5tX3BlcmNlcHR1YWwsIGMsIGJsb2NrX2NvbG9yc1tzXSwgZmFsc2UpOworCQkJCQkJCQkJCWlmIChlcnIgPCBiZXN0X2VycikKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWJlc3RfZXJyID0gZXJyOworCQkJCQkJCQkJCQkvL2Jlc3RfaW5kZXggPSBzOworCQkJCQkJCQkJCX0KIAkJCQkJCQkJCX0KKworCQkJCQkJCQkJdG90YWxfZXJyICs9IGJlc3RfZXJyOwogCQkJCQkJCQl9CiAKLQkJCQkJCQkJdG90YWxfZXJyICs9IGJlc3RfZXJyOworCQkJCQkJCQl0b3RhbF9wcmV2X2VyciArPSB0b3RhbF9lcnI7CiAJCQkJCQkJfQogCi0JCQkJCQkJdG90YWxfcHJldl9lcnIgKz0gdG90YWxfZXJyOworCQkJCQkJCS8vIFNlZSBpZiB3ZSBzaG91bGQgdXBkYXRlIHRoaXMgY2x1c3RlcidzIGVuZHBvaW50cyAoaWYgdGhlIGVycm9yIGhhcyBhY3R1YWxseSBmYWxsZW4pCisJCQkJCQkJaWYgKHRvdGFsX3ByZXZfZXJyID4gbmV3X3N1YmJsb2NrX3BhcmFtcy5tX2NvbG9yX2Vycm9yWzBdKQorCQkJCQkJCXsKKwkJCQkJCQkJdXNlX25ld19zdWJibG9ja19wYXJhbXMgPSB0cnVlOworCQkJCQkJCX0KIAkJCQkJCX0KIAotCQkJCQkJLy8gU2VlIGlmIHdlIHNob3VsZCB1cGRhdGUgdGhpcyBjbHVzdGVyJ3MgZW5kcG9pbnRzIChpZiB0aGUgZXJyb3IgaGFzIGFjdHVhbGx5IGZhbGxlbikKLQkJCQkJCWlmICh0b3RhbF9wcmV2X2VyciA+IG5ld19zdWJibG9ja19wYXJhbXMubV9jb2xvcl9lcnJvclswXSkKKwkJCQkJCWlmICh1c2VfbmV3X3N1YmJsb2NrX3BhcmFtcykKIAkJCQkJCXsKLQkJCQkJCQl1c2VfbmV3X3N1YmJsb2NrX3BhcmFtcyA9IHRydWU7CisJCQkJCQkJbmV3X3N1YmJsb2NrX3BhcmFtcy5tX3ZhbGlkID0gdHJ1ZTsKKworCQkJCQkJCXByZXZfZXRjX3BhcmFtcyA9IG5ld19zdWJibG9ja19wYXJhbXM7CiAJCQkJCQl9Ci0JCQkJCX0KIAotCQkJCQlpZiAodXNlX25ld19zdWJibG9ja19wYXJhbXMpCi0JCQkJCXsKLQkJCQkJCW5ld19zdWJibG9ja19wYXJhbXMubV92YWxpZCA9IHRydWU7Ci0KLQkJCQkJCXByZXZfZXRjX3BhcmFtcyA9IG5ld19zdWJibG9ja19wYXJhbXM7Ci0JCQkJCX0KLQkJCQkKLQkJCQl9IC8vIGNsdXN0ZXJfaW5kZXgKKwkJCQkJfSAvLyBjbHVzdGVyX2luZGV4CiAKICNpZm5kZWYgX19FTVNDUklQVEVOX18KLQkJCX0gKTsKKwkJCQkJfSk7CiAjZW5kaWYKIAotCQl9IC8vIGNsdXN0ZXJfaW5kZXhfaXRlcgorCQkJfSAvLyBjbHVzdGVyX2luZGV4X2l0ZXIKIAogI2lmbmRlZiBfX0VNU0NSSVBURU5fXwotCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+d2FpdF9mb3JfYWxsKCk7CisJCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+d2FpdF9mb3JfYWxsKCk7CiAjZW5kaWYKKwkJfQorCisJCWRlYnVnX3ByaW50ZigiRWxhcHNlZCB0aW1lOiAlMy4zZiBzZWNzXG4iLCB0bS5nZXRfZWxhcHNlZF9zZWNzKCkpOwogCX0KIAogCWJvb2wgYmFzaXN1X2Zyb250ZW5kOjpjaGVja19ldGMxc19jb25zdHJhaW50cygpIGNvbnN0CkBAIC0xMzczLDYgKzE2ODQsOCBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKKwkvLyBGb3IgZWFjaCBibG9jaywgZGV0ZXJtaW5lIHdoaWNoIEVUQzFTIGVuZHBvaW50IGNsdXN0ZXIgY2FuIGVuY29kZSB0aGF0IGJsb2NrIHdpdGggbG93ZXN0IGVycm9yLgorCS8vIFRoaXMgcmVhc3NpZ25zIGJsb2NrcyB0byBkaWZmZXJlbnQgZW5kcG9pbnQgY2x1c3RlcnMuCiAJdWludDMyX3QgYmFzaXN1X2Zyb250ZW5kOjpyZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb24oKQogCXsKIAkJZGVidWdfcHJpbnRmKCJyZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb25cbiIpOwpAQCAtMTM4MCw2ICsxNjkzLDggQEAKIAkJaWYgKG1fdXNlX2hpZXJhcmNoaWNhbF9lbmRwb2ludF9jb2RlYm9va3MpCiAJCQljb21wdXRlX2VuZHBvaW50X2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyKCk7CiAKKwkJLy8gTm90ZTogSXQncyBwb3NzaWJsZSB0aGF0IGFuIGVuZHBvaW50IGNsdXN0ZXIgbWF5IGxpdmUgaW4gbW9yZSB0aGFuIG9uZSBwYXJlbnQgY2x1c3RlciBhZnRlciB0aGUgZmlyc3QgcmVmaW5lbWVudCBzdGVwLgorCiAJCWJhc2lzdTo6dmVjdG9yPHZlYzJVPiBibG9ja19jbHVzdGVycyhtX3RvdGFsX2Jsb2Nrcyk7CiAKIAkJZm9yIChpbnQgY2x1c3Rlcl9pbmRleCA9IDA7IGNsdXN0ZXJfaW5kZXggPCBzdGF0aWNfY2FzdDxpbnQ+KG1fZW5kcG9pbnRfY2x1c3RlcnMuc2l6ZSgpKTsgY2x1c3Rlcl9pbmRleCsrKQpAQCAtMTQwMCwxNTYgKzE3MTUsMjU1IEBACiAJCQkJCiAJCS8vIENyZWF0ZSBhIG5ldyBlbmRwb2ludCBjbHVzdGVyaXphdGlvbgogCisJCWludGVydmFsX3RpbWVyIHRtOworCQl0bS5zdGFydCgpOworCiAJCXVpbnRfdmVjIGJlc3RfY2x1c3Rlcl9pbmRpY2VzKG1fdG90YWxfYmxvY2tzKTsKIAotCQljb25zdCB1aW50MzJfdCBOID0gMTAyNDsKLQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleF9pdGVyID0gMDsgYmxvY2tfaW5kZXhfaXRlciA8IG1fdG90YWxfYmxvY2tzOyBibG9ja19pbmRleF9pdGVyICs9IE4pCisJCWJvb2wgdXNlX2NwdSA9IHRydWU7CisJCS8vIFRPRE86IFN1cHBvcnQgbm9uLWhpZXJhcmNoaWNhbCBlbmRwb2ludCBjb2RlYm9va3MgaGVyZQorCQlpZiAobV9wYXJhbXMubV9wT3BlbkNMX2NvbnRleHQgJiYgbV91c2VfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rcykKIAkJewotCQkJY29uc3QgdWludDMyX3QgZmlyc3RfaW5kZXggPSBibG9ja19pbmRleF9pdGVyOwotCQkJY29uc3QgdWludDMyX3QgbGFzdF9pbmRleCA9IG1pbmltdW08dWludDMyX3Q+KG1fdG90YWxfYmxvY2tzLCBmaXJzdF9pbmRleCArIE4pOworCQkJLy8gRm9yIHRoZSBPcGVuQ0wga2VybmVsLCB3ZSBvcmRlciB0aGUgcGFyZW50IGVuZHBvaW50IGNsdXN0ZXJzIGJ5IHNtYWxsZXN0IHRvIGxhcmdlc3QgZm9yIGVmZmljaWVuY3kuCisJCQkvLyBXZSBhbHNvIHByZXBhcmUgYW4gYXJyYXkgb2YgYmxvY2sgaW5mbyBzdHJ1Y3RzIHRoYXQgcG9pbnQgaW50byB0aGlzIG5ldyBwYXJlbnQgZW5kcG9pbnQgY2x1c3RlciBhcnJheS4KKwkJCWNvbnN0IHVpbnQzMl90IHRvdGFsX3BhcmVudF9jbHVzdGVycyA9IG1fZW5kcG9pbnRfY2x1c3RlcnNfd2l0aGluX2VhY2hfcGFyZW50X2NsdXN0ZXIuc2l6ZSgpOworCisJCQliYXNpc3U6OnZlY3RvcjxjbF9ibG9ja19pbmZvX3N0cnVjdD4gY2xfYmxvY2tfaW5mb19zdHJ1Y3RzKG1fdG90YWxfYmxvY2tzKTsKKwkJCQorCQkJLy8gdGhlIHNpemUgb2YgZWFjaCBwYXJlbnQgY2x1c3RlciwgaW4gdG90YWwgY2x1c3RlcnMKKwkJCXVpbnRfdmVjIHBhcmVudF9jbHVzdGVyX3NpemVzKHRvdGFsX3BhcmVudF9jbHVzdGVycyk7CisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdG90YWxfcGFyZW50X2NsdXN0ZXJzOyBpKyspCisJCQkJcGFyZW50X2NsdXN0ZXJfc2l6ZXNbaV0gPSBtX2VuZHBvaW50X2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyW2ldLnNpemUoKTsKKworCQkJdWludF92ZWMgZmlyc3RfcGFyZW50X2NsdXN0ZXJfb2ZzKHRvdGFsX3BhcmVudF9jbHVzdGVycyk7CisJCQl1aW50MzJfdCBjdXJfb2ZzID0gMDsKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0b3RhbF9wYXJlbnRfY2x1c3RlcnM7IGkrKykKKwkJCXsKKwkJCQlmaXJzdF9wYXJlbnRfY2x1c3Rlcl9vZnNbaV0gPSBjdXJfb2ZzOworCisJCQkJY3VyX29mcyArPSBwYXJlbnRfY2x1c3Rlcl9zaXplc1tpXTsKKwkJCX0KKwkJCQkJCQorCQkJLy8gTm90ZTogdG90YWxfYWN0dWFsX2VuZHBvaW50X2NsdXN0ZXJzIGlzIG5vdCBuZWNlc3Nhcmx5IGVxdWFsIHRvIG1fZW5kcG9pbnRfY2x1c3RlcnMuc2l6ZSgpLCBiZWNhdXNlIGNsdXN0ZXJzIG1heSBsaXZlIGluIG11bHRpcGxlIHBhcmVudCBjbHVzdGVycyBhZnRlciB0aGUgZmlyc3QgcmVmaW5lbWVudCBzdGVwLgorCQkJQkFTSVNVX0ZST05URU5EX1ZFUklGWShjdXJfb2ZzID49IG1fZW5kcG9pbnRfY2x1c3RlcnMuc2l6ZSgpKTsKKwkJCWNvbnN0IHVpbnQzMl90IHRvdGFsX2FjdHVhbF9lbmRwb2ludF9jbHVzdGVycyA9IGN1cl9vZnM7CisJCQliYXNpc3U6OnZlY3RvcjxjbF9lbmRwb2ludF9jbHVzdGVyX3N0cnVjdD4gY2xfZW5kcG9pbnRfY2x1c3Rlcl9zdHJ1Y3RzKHRvdGFsX2FjdHVhbF9lbmRwb2ludF9jbHVzdGVycyk7CisKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0b3RhbF9wYXJlbnRfY2x1c3RlcnM7IGkrKykKKwkJCXsKKwkJCQljb25zdCB1aW50MzJfdCBkc3Rfb2ZzID0gZmlyc3RfcGFyZW50X2NsdXN0ZXJfb2ZzW2ldOworCisJCQkJY29uc3QgdWludDMyX3QgcGFyZW50X2NsdXN0ZXJfc2l6ZSA9IHBhcmVudF9jbHVzdGVyX3NpemVzW2ldOworCisJCQkJYXNzZXJ0KG1fZW5kcG9pbnRfY2x1c3RlcnNfd2l0aGluX2VhY2hfcGFyZW50X2NsdXN0ZXJbaV0uc2l6ZSgpID09IHBhcmVudF9jbHVzdGVyX3NpemUpOworCisJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBhcmVudF9jbHVzdGVyX3NpemU7IGorKykKKwkJCQl7CisJCQkJCWNvbnN0IHVpbnQzMl90IGVuZHBvaW50X2NsdXN0ZXJfaW5kZXggPSBtX2VuZHBvaW50X2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyW2ldW2pdOworCisJCQkJCWNvbG9yX3JnYmEgY2x1c3Rlcl9ldGNfYmFzZV9jb2xvcihtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tlbmRwb2ludF9jbHVzdGVyX2luZGV4XS5tX2NvbG9yX3Vuc2NhbGVkWzBdKTsKKwkJCQkJdWludDMyX3QgY2x1c3Rlcl9ldGNfaW50ZW4gPSBtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tlbmRwb2ludF9jbHVzdGVyX2luZGV4XS5tX2ludGVuX3RhYmxlWzBdOworCisJCQkJCWNsX2VuZHBvaW50X2NsdXN0ZXJfc3RydWN0c1tkc3Rfb2ZzICsgal0ubV91bnNjYWxlZF9jb2xvciA9IGNsdXN0ZXJfZXRjX2Jhc2VfY29sb3I7CisJCQkJCWNsX2VuZHBvaW50X2NsdXN0ZXJfc3RydWN0c1tkc3Rfb2ZzICsgal0ubV9ldGNfaW50ZW4gPSAodWludDhfdCljbHVzdGVyX2V0Y19pbnRlbjsKKwkJCQkJY2xfZW5kcG9pbnRfY2x1c3Rlcl9zdHJ1Y3RzW2RzdF9vZnMgKyBqXS5tX2NsdXN0ZXJfaW5kZXggPSAodWludDE2X3QpZW5kcG9pbnRfY2x1c3Rlcl9pbmRleDsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWZvciAodWludDMyX3QgYmxvY2tfaW5kZXggPSAwOyBibG9ja19pbmRleCA8IG1fdG90YWxfYmxvY2tzOyBibG9ja19pbmRleCsrKQorCQkJeworCQkJCWNvbnN0IHVpbnQzMl90IGJsb2NrX3BhcmVudF9lbmRwb2ludF9jbHVzdGVyX2luZGV4ID0gbV9ibG9ja19wYXJlbnRfZW5kcG9pbnRfY2x1c3RlcltibG9ja19pbmRleF07CisJCQkJCisJCQkJY2xfYmxvY2tfaW5mb19zdHJ1Y3RzW2Jsb2NrX2luZGV4XS5tX251bV9jbHVzdGVycyA9ICh1aW50MTZfdCkocGFyZW50X2NsdXN0ZXJfc2l6ZXNbYmxvY2tfcGFyZW50X2VuZHBvaW50X2NsdXN0ZXJfaW5kZXhdKTsKKwkJCQljbF9ibG9ja19pbmZvX3N0cnVjdHNbYmxvY2tfaW5kZXhdLm1fZmlyc3RfY2x1c3Rlcl9vZnMgPSAodWludDE2X3QpKGZpcnN0X3BhcmVudF9jbHVzdGVyX29mc1tibG9ja19wYXJlbnRfZW5kcG9pbnRfY2x1c3Rlcl9pbmRleF0pOworCisJCQkJY29uc3QgdWludDMyX3QgYmxvY2tfY2x1c3Rlcl9pbmRleCA9IGJsb2NrX2NsdXN0ZXJzW2Jsb2NrX2luZGV4XVswXTsKKwkJCQljbF9ibG9ja19pbmZvX3N0cnVjdHNbYmxvY2tfaW5kZXhdLm1fY3VyX2NsdXN0ZXJfaW5kZXggPSAodWludDE2X3QpYmxvY2tfY2x1c3Rlcl9pbmRleDsKKwkJCQljbF9ibG9ja19pbmZvX3N0cnVjdHNbYmxvY2tfaW5kZXhdLm1fY3VyX2NsdXN0ZXJfZXRjX2ludGVuID0gKHVpbnQ4X3QpbV9lbmRwb2ludF9jbHVzdGVyX2V0Y19wYXJhbXNbYmxvY2tfY2x1c3Rlcl9pbmRleF0ubV9pbnRlbl90YWJsZVswXTsKKwkJCX0KKworCQkJdWludF92ZWMgYmxvY2tfY2x1c3Rlcl9pbmRpY2VzKG1fdG90YWxfYmxvY2tzKTsKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3RvdGFsX2Jsb2NrczsgaSsrKQorCQkJCWJsb2NrX2NsdXN0ZXJfaW5kaWNlc1tpXSA9IGJsb2NrX2NsdXN0ZXJzW2ldWzBdOworCisJCQl1aW50X3ZlYyBzb3J0ZWRfYmxvY2tfaW5kaWNlcyhtX3RvdGFsX2Jsb2Nrcyk7CisJCQlpbmRpcmVjdF9zb3J0KG1fdG90YWxfYmxvY2tzLCBzb3J0ZWRfYmxvY2tfaW5kaWNlcy5kYXRhKCksIGJsb2NrX2NsdXN0ZXJfaW5kaWNlcy5kYXRhKCkpOworCQkJCisJCQlib29sIHN0YXR1cyA9IG9wZW5jbF9yZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb24oCisJCQkJbV9wYXJhbXMubV9wT3BlbkNMX2NvbnRleHQsCisJCQkJY2xfYmxvY2tfaW5mb19zdHJ1Y3RzLmRhdGEoKSwKKwkJCQl0b3RhbF9hY3R1YWxfZW5kcG9pbnRfY2x1c3RlcnMsCisJCQkJY2xfZW5kcG9pbnRfY2x1c3Rlcl9zdHJ1Y3RzLmRhdGEoKSwKKwkJCQlzb3J0ZWRfYmxvY2tfaW5kaWNlcy5kYXRhKCksCisJCQkJYmVzdF9jbHVzdGVyX2luZGljZXMuZGF0YSgpLAorCQkJCW1fcGFyYW1zLm1fcGVyY2VwdHVhbCk7CisKKwkJCWlmIChzdGF0dXMpCisJCQl7CisJCQkJdXNlX2NwdSA9IGZhbHNlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVycm9yX3ByaW50ZigiYmFzaXN1X2Zyb250ZW5kOjpyZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb246IG9wZW5jbF9yZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb24oKSBmYWlsZWQhIFVzaW5nIENQVS5cbiIpOworCQkJCW1fcGFyYW1zLm1fcE9wZW5DTF9jb250ZXh0ID0gbnVsbHB0cjsKKwkJCQltX29wZW5jbF9mYWlsZWQgPSB0cnVlOworCQkJfQorCQl9CisKKwkJaWYgKHVzZV9jcHUpCisJCXsKKwkJCWNvbnN0IHVpbnQzMl90IE4gPSAxMDI0OworCQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleF9pdGVyID0gMDsgYmxvY2tfaW5kZXhfaXRlciA8IG1fdG90YWxfYmxvY2tzOyBibG9ja19pbmRleF9pdGVyICs9IE4pCisJCQl7CisJCQkJY29uc3QgdWludDMyX3QgZmlyc3RfaW5kZXggPSBibG9ja19pbmRleF9pdGVyOworCQkJCWNvbnN0IHVpbnQzMl90IGxhc3RfaW5kZXggPSBtaW5pbXVtPHVpbnQzMl90PihtX3RvdGFsX2Jsb2NrcywgZmlyc3RfaW5kZXggKyBOKTsKIAogI2lmbmRlZiBfX0VNU0NSSVBURU5fXwotCQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPmFkZF9qb2IoIFt0aGlzLCBmaXJzdF9pbmRleCwgbGFzdF9pbmRleCwgJmJlc3RfY2x1c3Rlcl9pbmRpY2VzLCAmYmxvY2tfY2x1c3RlcnNdIHsKKwkJCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+YWRkX2pvYihbdGhpcywgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXgsICZiZXN0X2NsdXN0ZXJfaW5kaWNlcywgJmJsb2NrX2NsdXN0ZXJzXSB7CiAjZW5kaWYKIAotCQkJCWZvciAodWludDMyX3QgYmxvY2tfaW5kZXggPSBmaXJzdF9pbmRleDsgYmxvY2tfaW5kZXggPCBsYXN0X2luZGV4OyBibG9ja19pbmRleCsrKQotCQkJCXsKLQkJCQkJY29uc3QgdWludDMyX3QgY2x1c3Rlcl9pbmRleCA9IGJsb2NrX2NsdXN0ZXJzW2Jsb2NrX2luZGV4XVswXTsKLQkJCQkJQkFTSVNVX0ZST05URU5EX1ZFUklGWShjbHVzdGVyX2luZGV4ID09IGJsb2NrX2NsdXN0ZXJzW2Jsb2NrX2luZGV4XVsxXSk7Ci0KLQkJCQkJY29uc3QgY29sb3JfcmdiYSAqcFN1YmJsb2NrX3BpeGVscyA9IGdldF9zb3VyY2VfcGl4ZWxfYmxvY2soYmxvY2tfaW5kZXgpLmdldF9wdHIoKTsKLQkJCQkJY29uc3QgdWludDMyX3QgbnVtX3N1YmJsb2NrX3BpeGVscyA9IDE2OwotCi0JCQkJCXVpbnQ2NF90IGJlc3RfY2x1c3Rlcl9lcnIgPSBJTlQ2NF9NQVg7Ci0JCQkJCXVpbnQzMl90IGJlc3RfY2x1c3Rlcl9pbmRleCA9IDA7Ci0KLQkJCQkJY29uc3QgdWludDMyX3QgYmxvY2tfcGFyZW50X2VuZHBvaW50X2NsdXN0ZXJfaW5kZXggPSBtX2Jsb2NrX3BhcmVudF9lbmRwb2ludF9jbHVzdGVyLnNpemUoKSA/IG1fYmxvY2tfcGFyZW50X2VuZHBvaW50X2NsdXN0ZXJbYmxvY2tfaW5kZXhdIDogMDsKLQkJCQkJY29uc3QgdWludF92ZWMgKnBDbHVzdGVyX2luZGljZXMgPSBtX2VuZHBvaW50X2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyLnNpemUoKSA/ICZtX2VuZHBvaW50X2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyW2Jsb2NrX3BhcmVudF9lbmRwb2ludF9jbHVzdGVyX2luZGV4XSA6IG51bGxwdHI7Ci0KLQkJCQkJY29uc3QgdWludDMyX3QgdG90YWxfY2x1c3RlcnMgPSBtX3VzZV9oaWVyYXJjaGljYWxfZW5kcG9pbnRfY29kZWJvb2tzID8gKHVpbnQzMl90KXBDbHVzdGVyX2luZGljZXMtPnNpemUoKSA6ICh1aW50MzJfdCltX2VuZHBvaW50X2NsdXN0ZXJzLnNpemUoKTsKLQkJCQotCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdG90YWxfY2x1c3RlcnM7IGkrKykKKwkJCQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleCA9IGZpcnN0X2luZGV4OyBibG9ja19pbmRleCA8IGxhc3RfaW5kZXg7IGJsb2NrX2luZGV4KyspCiAJCQkJCXsKLQkJCQkJCWNvbnN0IHVpbnQzMl90IGNsdXN0ZXJfaXRlciA9IG1fdXNlX2hpZXJhcmNoaWNhbF9lbmRwb2ludF9jb2RlYm9va3MgPyAoKnBDbHVzdGVyX2luZGljZXMpW2ldIDogaTsKKwkJCQkJCWNvbnN0IHVpbnQzMl90IGNsdXN0ZXJfaW5kZXggPSBibG9ja19jbHVzdGVyc1tibG9ja19pbmRleF1bMF07CisJCQkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKGNsdXN0ZXJfaW5kZXggPT0gYmxvY2tfY2x1c3RlcnNbYmxvY2tfaW5kZXhdWzFdKTsKIAotCQkJCQkJY29sb3JfcmdiYSBjbHVzdGVyX2V0Y19iYXNlX2NvbG9yKG1fZW5kcG9pbnRfY2x1c3Rlcl9ldGNfcGFyYW1zW2NsdXN0ZXJfaXRlcl0ubV9jb2xvcl91bnNjYWxlZFswXSk7Ci0JCQkJCQl1aW50MzJfdCBjbHVzdGVyX2V0Y19pbnRlbiA9IG1fZW5kcG9pbnRfY2x1c3Rlcl9ldGNfcGFyYW1zW2NsdXN0ZXJfaXRlcl0ubV9pbnRlbl90YWJsZVswXTsKKwkJCQkJCWNvbnN0IGNvbG9yX3JnYmEqIHBTdWJibG9ja19waXhlbHMgPSBnZXRfc291cmNlX3BpeGVsX2Jsb2NrKGJsb2NrX2luZGV4KS5nZXRfcHRyKCk7CisJCQkJCQljb25zdCB1aW50MzJfdCBudW1fc3ViYmxvY2tfcGl4ZWxzID0gMTY7CiAKLQkJCQkJCXVpbnQ2NF90IHRvdGFsX2VyciA9IDA7CisJCQkJCQl1aW50NjRfdCBiZXN0X2NsdXN0ZXJfZXJyID0gSU5UNjRfTUFYOworCQkJCQkJdWludDMyX3QgYmVzdF9jbHVzdGVyX2luZGV4ID0gMDsKIAotCQkJCQkJY29uc3QgdWludDMyX3QgbG93X3NlbGVjdG9yID0gMDsvL3N1YmJsb2NrX2V0Y19wYXJhbXNfdmVjW2pdLm1fbG93X3NlbGVjdG9yc1swXTsKLQkJCQkJCWNvbnN0IHVpbnQzMl90IGhpZ2hfc2VsZWN0b3IgPSAzOy8vc3ViYmxvY2tfZXRjX3BhcmFtc192ZWNbal0ubV9oaWdoX3NlbGVjdG9yc1swXTsKLQkJCQkJCWNvbG9yX3JnYmEgc3ViYmxvY2tfY29sb3JzWzRdOwotCQkJCQkJLy8gQ2FuJ3QgYXNzaWduIGl0IGhlcmUgLSBtYXkgcmVzdWx0IGluIHRvbyBtdWNoIGVycm9yIHdoZW4gc2VsZWN0b3IgcXVhbnQgb2NjdXJzCi0JCQkJCQlpZiAoY2x1c3Rlcl9ldGNfaW50ZW4gPiBtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tjbHVzdGVyX2luZGV4XS5tX2ludGVuX3RhYmxlWzBdKQorCQkJCQkJY29uc3QgdWludDMyX3QgYmxvY2tfcGFyZW50X2VuZHBvaW50X2NsdXN0ZXJfaW5kZXggPSBtX2Jsb2NrX3BhcmVudF9lbmRwb2ludF9jbHVzdGVyLnNpemUoKSA/IG1fYmxvY2tfcGFyZW50X2VuZHBvaW50X2NsdXN0ZXJbYmxvY2tfaW5kZXhdIDogMDsKKwkJCQkJCWNvbnN0IHVpbnRfdmVjKiBwQ2x1c3Rlcl9pbmRpY2VzID0gbV9lbmRwb2ludF9jbHVzdGVyc193aXRoaW5fZWFjaF9wYXJlbnRfY2x1c3Rlci5zaXplKCkgPyAmbV9lbmRwb2ludF9jbHVzdGVyc193aXRoaW5fZWFjaF9wYXJlbnRfY2x1c3RlcltibG9ja19wYXJlbnRfZW5kcG9pbnRfY2x1c3Rlcl9pbmRleF0gOiBudWxscHRyOworCisJCQkJCQljb25zdCB1aW50MzJfdCB0b3RhbF9jbHVzdGVycyA9IG1fdXNlX2hpZXJhcmNoaWNhbF9lbmRwb2ludF9jb2RlYm9va3MgPyAodWludDMyX3QpcENsdXN0ZXJfaW5kaWNlcy0+c2l6ZSgpIDogKHVpbnQzMl90KW1fZW5kcG9pbnRfY2x1c3RlcnMuc2l6ZSgpOworCisJCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdG90YWxfY2x1c3RlcnM7IGkrKykKIAkJCQkJCXsKLQkJCQkJCQl0b3RhbF9lcnIgPSBJTlQ2NF9NQVg7Ci0JCQkJCQkJZ290byBza2lwX2NsdXN0ZXI7Ci0JCQkJCQl9CisJCQkJCQkJY29uc3QgdWludDMyX3QgY2x1c3Rlcl9pdGVyID0gbV91c2VfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rcyA/ICgqcENsdXN0ZXJfaW5kaWNlcylbaV0gOiBpOwogCi0JCQkJCQlldGNfYmxvY2s6OmdldF9ibG9ja19jb2xvcnM1KHN1YmJsb2NrX2NvbG9ycywgY2x1c3Rlcl9ldGNfYmFzZV9jb2xvciwgY2x1c3Rlcl9ldGNfaW50ZW4pOwotCQkJCQkJCQkJCQkJCi0jaWYgMAotCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IG51bV9zdWJibG9ja19waXhlbHM7IHArKykKLQkJCQkJCXsKLQkJCQkJCQl1aW50NjRfdCBiZXN0X2VyciA9IFVJTlQ2NF9NQVg7CisJCQkJCQkJY29sb3JfcmdiYSBjbHVzdGVyX2V0Y19iYXNlX2NvbG9yKG1fZW5kcG9pbnRfY2x1c3Rlcl9ldGNfcGFyYW1zW2NsdXN0ZXJfaXRlcl0ubV9jb2xvcl91bnNjYWxlZFswXSk7CisJCQkJCQkJdWludDMyX3QgY2x1c3Rlcl9ldGNfaW50ZW4gPSBtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tjbHVzdGVyX2l0ZXJdLm1faW50ZW5fdGFibGVbMF07CiAKLQkJCQkJCQlmb3IgKHVpbnQzMl90IHIgPSBsb3dfc2VsZWN0b3I7IHIgPD0gaGlnaF9zZWxlY3RvcjsgcisrKQorCQkJCQkJCXVpbnQ2NF90IHRvdGFsX2VyciA9IDA7CisKKwkJCQkJCQljb25zdCB1aW50MzJfdCBsb3dfc2VsZWN0b3IgPSAwOy8vc3ViYmxvY2tfZXRjX3BhcmFtc192ZWNbal0ubV9sb3dfc2VsZWN0b3JzWzBdOworCQkJCQkJCWNvbnN0IHVpbnQzMl90IGhpZ2hfc2VsZWN0b3IgPSAzOy8vc3ViYmxvY2tfZXRjX3BhcmFtc192ZWNbal0ubV9oaWdoX3NlbGVjdG9yc1swXTsKKwkJCQkJCQljb2xvcl9yZ2JhIHN1YmJsb2NrX2NvbG9yc1s0XTsKKwkJCQkJCQkvLyBDYW4ndCBhc3NpZ24gaXQgaGVyZSAtIG1heSByZXN1bHQgaW4gdG9vIG11Y2ggZXJyb3Igd2hlbiBzZWxlY3RvciBxdWFudCBvY2N1cnMKKwkJCQkJCQlpZiAoY2x1c3Rlcl9ldGNfaW50ZW4gPiBtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tjbHVzdGVyX2luZGV4XS5tX2ludGVuX3RhYmxlWzBdKQogCQkJCQkJCXsKLQkJCQkJCQkJdWludDY0X3QgZXJyID0gY29sb3JfZGlzdGFuY2UobV9wYXJhbXMubV9wZXJjZXB0dWFsLCBwU3ViYmxvY2tfcGl4ZWxzW3BdLCBzdWJibG9ja19jb2xvcnNbcl0sIGZhbHNlKTsKLQkJCQkJCQkJYmVzdF9lcnIgPSBtaW5pbXVtKGJlc3RfZXJyLCBlcnIpOwotCQkJCQkJCQlpZiAoIWJlc3RfZXJyKQorCQkJCQkJCQl0b3RhbF9lcnIgPSBJTlQ2NF9NQVg7CisJCQkJCQkJCWdvdG8gc2tpcF9jbHVzdGVyOworCQkJCQkJCX0KKworCQkJCQkJCWV0Y19ibG9jazo6Z2V0X2Jsb2NrX2NvbG9yczUoc3ViYmxvY2tfY29sb3JzLCBjbHVzdGVyX2V0Y19iYXNlX2NvbG9yLCBjbHVzdGVyX2V0Y19pbnRlbik7CisKKyNpZiAwCisJCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IG51bV9zdWJibG9ja19waXhlbHM7IHArKykKKwkJCQkJCQl7CisJCQkJCQkJCXVpbnQ2NF90IGJlc3RfZXJyID0gVUlOVDY0X01BWDsKKworCQkJCQkJCQlmb3IgKHVpbnQzMl90IHIgPSBsb3dfc2VsZWN0b3I7IHIgPD0gaGlnaF9zZWxlY3RvcjsgcisrKQorCQkJCQkJCQl7CisJCQkJCQkJCQl1aW50NjRfdCBlcnIgPSBjb2xvcl9kaXN0YW5jZShtX3BhcmFtcy5tX3BlcmNlcHR1YWwsIHBTdWJibG9ja19waXhlbHNbcF0sIHN1YmJsb2NrX2NvbG9yc1tyXSwgZmFsc2UpOworCQkJCQkJCQkJYmVzdF9lcnIgPSBtaW5pbXVtKGJlc3RfZXJyLCBlcnIpOworCQkJCQkJCQkJaWYgKCFiZXN0X2VycikKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCisJCQkJCQkJCXRvdGFsX2VyciArPSBiZXN0X2VycjsKKwkJCQkJCQkJaWYgKHRvdGFsX2VyciA+IGJlc3RfY2x1c3Rlcl9lcnIpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9IC8vIHAKKyNlbHNlCisJCQkJCQkJaWYgKG1fcGFyYW1zLm1fcGVyY2VwdHVhbCkKKwkJCQkJCQl7CisJCQkJCQkJCWlmICghZ19jcHVfc3VwcG9ydHNfc3NlNDEpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWZvciAodWludDMyX3QgcCA9IDA7IHAgPCBudW1fc3ViYmxvY2tfcGl4ZWxzOyBwKyspCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJdWludDY0X3QgYmVzdF9lcnIgPSBVSU5UNjRfTUFYOworCisJCQkJCQkJCQkJZm9yICh1aW50MzJfdCByID0gbG93X3NlbGVjdG9yOyByIDw9IGhpZ2hfc2VsZWN0b3I7IHIrKykKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCXVpbnQ2NF90IGVyciA9IGNvbG9yX2Rpc3RhbmNlKHRydWUsIHBTdWJibG9ja19waXhlbHNbcF0sIHN1YmJsb2NrX2NvbG9yc1tyXSwgZmFsc2UpOworCQkJCQkJCQkJCQliZXN0X2VyciA9IG1pbmltdW0oYmVzdF9lcnIsIGVycik7CisJCQkJCQkJCQkJCWlmICghYmVzdF9lcnIpCisJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQl9CisKKwkJCQkJCQkJCQl0b3RhbF9lcnIgKz0gYmVzdF9lcnI7CisJCQkJCQkJCQkJaWYgKHRvdGFsX2VyciA+IGJlc3RfY2x1c3Rlcl9lcnIpCisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfSAvLyBwCisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisjaWYgQkFTSVNVX1NVUFBPUlRfU1NFCisJCQkJCQkJCQlmaW5kX2xvd2VzdF9lcnJvcl9wZXJjZXB0dWFsX3JnYl80X05fc3NlNDEoKGludDY0X3QqKSZ0b3RhbF9lcnIsIHN1YmJsb2NrX2NvbG9ycywgcFN1YmJsb2NrX3BpeGVscywgbnVtX3N1YmJsb2NrX3BpeGVscywgYmVzdF9jbHVzdGVyX2Vycik7CisjZW5kaWYKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlpZiAoIWdfY3B1X3N1cHBvcnRzX3NzZTQxKQorCQkJCQkJCQl7CisJCQkJCQkJCQlmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgbnVtX3N1YmJsb2NrX3BpeGVsczsgcCsrKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCXVpbnQ2NF90IGJlc3RfZXJyID0gVUlOVDY0X01BWDsKKworCQkJCQkJCQkJCWZvciAodWludDMyX3QgciA9IGxvd19zZWxlY3RvcjsgciA8PSBoaWdoX3NlbGVjdG9yOyByKyspCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQl1aW50NjRfdCBlcnIgPSBjb2xvcl9kaXN0YW5jZShmYWxzZSwgcFN1YmJsb2NrX3BpeGVsc1twXSwgc3ViYmxvY2tfY29sb3JzW3JdLCBmYWxzZSk7CisJCQkJCQkJCQkJCWJlc3RfZXJyID0gbWluaW11bShiZXN0X2VyciwgZXJyKTsKKwkJCQkJCQkJCQkJaWYgKCFiZXN0X2VycikKKwkJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCX0KKworCQkJCQkJCQkJCXRvdGFsX2VyciArPSBiZXN0X2VycjsKKwkJCQkJCQkJCQlpZiAodG90YWxfZXJyID4gYmVzdF9jbHVzdGVyX2VycikKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9IC8vIHAKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsKKyNpZiBCQVNJU1VfU1VQUE9SVF9TU0UKKwkJCQkJCQkJCWZpbmRfbG93ZXN0X2Vycm9yX2xpbmVhcl9yZ2JfNF9OX3NzZTQxKChpbnQ2NF90KikmdG90YWxfZXJyLCBzdWJibG9ja19jb2xvcnMsIHBTdWJibG9ja19waXhlbHMsIG51bV9zdWJibG9ja19waXhlbHMsIGJlc3RfY2x1c3Rlcl9lcnIpOworI2VuZGlmCisJCQkJCQkJCX0KKwkJCQkJCQl9CisjZW5kaWYKKworCQkJCQkJc2tpcF9jbHVzdGVyOgorCQkJCQkJCWlmICgodG90YWxfZXJyIDwgYmVzdF9jbHVzdGVyX2VycikgfHwKKwkJCQkJCQkJKChjbHVzdGVyX2l0ZXIgPT0gY2x1c3Rlcl9pbmRleCkgJiYgKHRvdGFsX2VyciA9PSBiZXN0X2NsdXN0ZXJfZXJyKSkpCisJCQkJCQkJeworCQkJCQkJCQliZXN0X2NsdXN0ZXJfZXJyID0gdG90YWxfZXJyOworCQkJCQkJCQliZXN0X2NsdXN0ZXJfaW5kZXggPSBjbHVzdGVyX2l0ZXI7CisKKwkJCQkJCQkJaWYgKCFiZXN0X2NsdXN0ZXJfZXJyKQogCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJfQorCQkJCQkJfSAvLyBqCisJCQkJCQkJCQkJCQkKKwkJCQkJCWJlc3RfY2x1c3Rlcl9pbmRpY2VzW2Jsb2NrX2luZGV4XSA9IGJlc3RfY2x1c3Rlcl9pbmRleDsKIAotCQkJCQkJCXRvdGFsX2VyciArPSBiZXN0X2VycjsKLQkJCQkJCQlpZiAodG90YWxfZXJyID4gYmVzdF9jbHVzdGVyX2VycikKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9IC8vIHAKLSNlbHNlCi0JCQkJCQlpZiAobV9wYXJhbXMubV9wZXJjZXB0dWFsKQotCQkJCQkJewotCQkJCQkJCWlmICghZ19jcHVfc3VwcG9ydHNfc3NlNDEpCi0JCQkJCQkJewotCQkJCQkJCQlmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgbnVtX3N1YmJsb2NrX3BpeGVsczsgcCsrKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQl1aW50NjRfdCBiZXN0X2VyciA9IFVJTlQ2NF9NQVg7Ci0KLQkJCQkJCQkJCWZvciAodWludDMyX3QgciA9IGxvd19zZWxlY3RvcjsgciA8PSBoaWdoX3NlbGVjdG9yOyByKyspCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJdWludDY0X3QgZXJyID0gY29sb3JfZGlzdGFuY2UodHJ1ZSwgcFN1YmJsb2NrX3BpeGVsc1twXSwgc3ViYmxvY2tfY29sb3JzW3JdLCBmYWxzZSk7Ci0JCQkJCQkJCQkJYmVzdF9lcnIgPSBtaW5pbXVtKGJlc3RfZXJyLCBlcnIpOwotCQkJCQkJCQkJCWlmICghYmVzdF9lcnIpCi0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQl0b3RhbF9lcnIgKz0gYmVzdF9lcnI7Ci0JCQkJCQkJCQlpZiAodG90YWxfZXJyID4gYmVzdF9jbHVzdGVyX2VycikKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfSAvLyBwCi0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0jaWYgQkFTSVNVX1NVUFBPUlRfU1NFCi0JCQkJCQkJCWZpbmRfbG93ZXN0X2Vycm9yX3BlcmNlcHR1YWxfcmdiXzRfTl9zc2U0MSgoaW50NjRfdCopJnRvdGFsX2Vyciwgc3ViYmxvY2tfY29sb3JzLCBwU3ViYmxvY2tfcGl4ZWxzLCBudW1fc3ViYmxvY2tfcGl4ZWxzLCBiZXN0X2NsdXN0ZXJfZXJyKTsKLSNlbmRpZgotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlpZiAoIWdfY3B1X3N1cHBvcnRzX3NzZTQxKQotCQkJCQkJCXsKLQkJCQkJCQkJZm9yICh1aW50MzJfdCBwID0gMDsgcCA8IG51bV9zdWJibG9ja19waXhlbHM7IHArKykKLQkJCQkJCQkJewotCQkJCQkJCQkJdWludDY0X3QgYmVzdF9lcnIgPSBVSU5UNjRfTUFYOwotCi0JCQkJCQkJCQlmb3IgKHVpbnQzMl90IHIgPSBsb3dfc2VsZWN0b3I7IHIgPD0gaGlnaF9zZWxlY3RvcjsgcisrKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCXVpbnQ2NF90IGVyciA9IGNvbG9yX2Rpc3RhbmNlKGZhbHNlLCBwU3ViYmxvY2tfcGl4ZWxzW3BdLCBzdWJibG9ja19jb2xvcnNbcl0sIGZhbHNlKTsKLQkJCQkJCQkJCQliZXN0X2VyciA9IG1pbmltdW0oYmVzdF9lcnIsIGVycik7Ci0JCQkJCQkJCQkJaWYgKCFiZXN0X2VycikKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCXRvdGFsX2VyciArPSBiZXN0X2VycjsKLQkJCQkJCQkJCWlmICh0b3RhbF9lcnIgPiBiZXN0X2NsdXN0ZXJfZXJyKQotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9IC8vIHAKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLSNpZiBCQVNJU1VfU1VQUE9SVF9TU0UKLQkJCQkJCQkJZmluZF9sb3dlc3RfZXJyb3JfbGluZWFyX3JnYl80X05fc3NlNDEoKGludDY0X3QqKSZ0b3RhbF9lcnIsIHN1YmJsb2NrX2NvbG9ycywgcFN1YmJsb2NrX3BpeGVscywgbnVtX3N1YmJsb2NrX3BpeGVscywgYmVzdF9jbHVzdGVyX2Vycik7Ci0jZW5kaWYKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0jZW5kaWYKLQotCQkJCQlza2lwX2NsdXN0ZXI6Ci0JCQkJCQlpZiAoKHRvdGFsX2VyciA8IGJlc3RfY2x1c3Rlcl9lcnIpIHx8Ci0JCQkJCQkJKChjbHVzdGVyX2l0ZXIgPT0gY2x1c3Rlcl9pbmRleCkgJiYgKHRvdGFsX2VyciA9PSBiZXN0X2NsdXN0ZXJfZXJyKSkpCi0JCQkJCQl7Ci0JCQkJCQkJYmVzdF9jbHVzdGVyX2VyciA9IHRvdGFsX2VycjsKLQkJCQkJCQliZXN0X2NsdXN0ZXJfaW5kZXggPSBjbHVzdGVyX2l0ZXI7Ci0JCQkJCQotCQkJCQkJCWlmICghYmVzdF9jbHVzdGVyX2VycikKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gLy8gagotCQkJCQkJCi0JCQkJCWJlc3RfY2x1c3Rlcl9pbmRpY2VzW2Jsb2NrX2luZGV4XSA9IGJlc3RfY2x1c3Rlcl9pbmRleDsKLQotCQkJCX0gLy8gYmxvY2tfaW5kZXgKKwkJCQkJfSAvLyBibG9ja19pbmRleAogCiAjaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCi0JCQl9ICk7CisJCQkJCX0pOwogI2VuZGlmCi0JCQkJCQkKLQkJfSAvLyBibG9ja19pbmRleF9pdGVyCisKKwkJCX0gLy8gYmxvY2tfaW5kZXhfaXRlcgogCiAjaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCi0JCW1fcGFyYW1zLm1fcEpvYl9wb29sLT53YWl0X2Zvcl9hbGwoKTsKKwkJCW1fcGFyYW1zLm1fcEpvYl9wb29sLT53YWl0X2Zvcl9hbGwoKTsKICNlbmRpZgorCQkKKwkJfSAvLyB1c2VfY3B1CisJCQkJCQkKKwkJZGVidWdfcHJpbnRmKCJyZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb24gdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKIAogCQliYXNpc3U6OnZlY3Rvcjx0eXBlbmFtZSBiYXNpc3U6OnZlY3Rvcjx1aW50MzJfdD4gPiBvcHRpbWl6ZWRfZW5kcG9pbnRfY2x1c3RlcnMobV9lbmRwb2ludF9jbHVzdGVycy5zaXplKCkpOwogCQl1aW50MzJfdCB0b3RhbF9zdWJibG9ja3NfcmVhc3NpZ25lZCA9IDA7CkBAIC0xNjQ3LDUxICsyMDYxLDkxIEBACiAJdm9pZCBiYXNpc3VfZnJvbnRlbmQ6OmNyZWF0ZV9pbml0aWFsX3BhY2tlZF90ZXh0dXJlKCkKIAl7CiAJCWRlYnVnX3ByaW50ZigiY3JlYXRlX2luaXRpYWxfcGFja2VkX3RleHR1cmVcbiIpOworCQkKKwkJaW50ZXJ2YWxfdGltZXIgdG07CisJCXRtLnN0YXJ0KCk7CiAKLQkJY29uc3QgdWludDMyX3QgTiA9IDQwOTY7Ci0JCWZvciAodWludDMyX3QgYmxvY2tfaW5kZXhfaXRlciA9IDA7IGJsb2NrX2luZGV4X2l0ZXIgPCBtX3RvdGFsX2Jsb2NrczsgYmxvY2tfaW5kZXhfaXRlciArPSBOKQorCQlib29sIHVzZV9jcHUgPSB0cnVlOworCisJCWlmICgobV9wYXJhbXMubV9wT3BlbkNMX2NvbnRleHQpICYmIChvcGVuY2xfaXNfYXZhaWxhYmxlKCkpKQogCQl7Ci0JCQljb25zdCB1aW50MzJfdCBmaXJzdF9pbmRleCA9IGJsb2NrX2luZGV4X2l0ZXI7Ci0JCQljb25zdCB1aW50MzJfdCBsYXN0X2luZGV4ID0gbWluaW11bTx1aW50MzJfdD4obV90b3RhbF9ibG9ja3MsIGZpcnN0X2luZGV4ICsgTik7CisJCQliYXNpc3U6OnZlY3Rvcjxjb2xvcl9yZ2JhPiBibG9ja19ldGM1X2NvbG9yX2ludGVucyhtX3RvdGFsX2Jsb2Nrcyk7CiAKLSNpZm5kZWYgX19FTVNDUklQVEVOX18KLQkJCW1fcGFyYW1zLm1fcEpvYl9wb29sLT5hZGRfam9iKCBbdGhpcywgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXhdIHsKLSNlbmRpZgorCQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleCA9IDA7IGJsb2NrX2luZGV4IDwgbV90b3RhbF9ibG9ja3M7IGJsb2NrX2luZGV4KyspCisJCQl7CisJCQkJdWludDMyX3QgY2x1c3RlcjAgPSBtX2Jsb2NrX2VuZHBvaW50X2NsdXN0ZXJzX2luZGljZXNbYmxvY2tfaW5kZXhdWzBdOwogCQkJCQotCQkJCWZvciAodWludDMyX3QgYmxvY2tfaW5kZXggPSBmaXJzdF9pbmRleDsgYmxvY2tfaW5kZXggPCBsYXN0X2luZGV4OyBibG9ja19pbmRleCsrKQotCQkJCXsKLQkJCQkJdWludDMyX3QgY2x1c3RlcjAgPSBtX2Jsb2NrX2VuZHBvaW50X2NsdXN0ZXJzX2luZGljZXNbYmxvY2tfaW5kZXhdWzBdOwotCQkJCQl1aW50MzJfdCBjbHVzdGVyMSA9IG1fYmxvY2tfZW5kcG9pbnRfY2x1c3RlcnNfaW5kaWNlc1tibG9ja19pbmRleF1bMV07Ci0JCQkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkoY2x1c3RlcjAgPT0gY2x1c3RlcjEpOworCQkJCWNvbnN0IGNvbG9yX3JnYmEmIGNvbG9yX3Vuc2NhbGVkID0gbV9lbmRwb2ludF9jbHVzdGVyX2V0Y19wYXJhbXNbY2x1c3RlcjBdLm1fY29sb3JfdW5zY2FsZWRbMF07CisJCQkJdWludDMyX3QgaW50ZW4gPSBtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tjbHVzdGVyMF0ubV9pbnRlbl90YWJsZVswXTsKIAotCQkJCQljb25zdCBjb2xvcl9yZ2JhICpwU291cmNlX3BpeGVscyA9IGdldF9zb3VyY2VfcGl4ZWxfYmxvY2soYmxvY2tfaW5kZXgpLmdldF9wdHIoKTsKKwkJCQlibG9ja19ldGM1X2NvbG9yX2ludGVuc1tibG9ja19pbmRleF0uc2V0KGNvbG9yX3Vuc2NhbGVkLnIsIGNvbG9yX3Vuc2NhbGVkLmcsIGNvbG9yX3Vuc2NhbGVkLmIsIGludGVuKTsKKwkJCX0KIAotCQkJCQlldGNfYmxvY2sgJmJsayA9IG1fZW5jb2RlZF9ibG9ja3NbYmxvY2tfaW5kZXhdOworCQkJYm9vbCBzdGF0dXMgPSBvcGVuY2xfZGV0ZXJtaW5lX3NlbGVjdG9ycyhtX3BhcmFtcy5tX3BPcGVuQ0xfY29udGV4dCwgYmxvY2tfZXRjNV9jb2xvcl9pbnRlbnMuZGF0YSgpLAorCQkJCW1fZW5jb2RlZF9ibG9ja3MuZGF0YSgpLAorCQkJCW1fcGFyYW1zLm1fcGVyY2VwdHVhbCk7CisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQllcnJvcl9wcmludGYoImJhc2lzdV9mcm9udGVuZDo6Y3JlYXRlX2luaXRpYWxfcGFja2VkX3RleHR1cmU6IG9wZW5jbF9kZXRlcm1pbmVfc2VsZWN0b3JzKCkgZmFpbGVkISBVc2luZyBDUFUuXG4iKTsKKwkJCQltX3BhcmFtcy5tX3BPcGVuQ0xfY29udGV4dCA9IG51bGxwdHI7CisJCQkJbV9vcGVuY2xfZmFpbGVkID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl1c2VfY3B1ID0gZmFsc2U7CisJCQl9CisJCX0KIAotCQkJCQljb2xvcl9yZ2JhIHVuc2NhbGVkWzJdID0geyBtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tjbHVzdGVyMF0ubV9jb2xvcl91bnNjYWxlZFswXSwgbV9lbmRwb2ludF9jbHVzdGVyX2V0Y19wYXJhbXNbY2x1c3RlcjFdLm1fY29sb3JfdW5zY2FsZWRbMF0gfTsKLQkJCQkJdWludDMyX3QgaW50ZW5bMl0gPSB7IG1fZW5kcG9pbnRfY2x1c3Rlcl9ldGNfcGFyYW1zW2NsdXN0ZXIwXS5tX2ludGVuX3RhYmxlWzBdLCBtX2VuZHBvaW50X2NsdXN0ZXJfZXRjX3BhcmFtc1tjbHVzdGVyMV0ubV9pbnRlbl90YWJsZVswXSB9OwotCQkJCQkJCQkJCi0JCQkJCWJsay5zZXRfYmxvY2tfY29sb3I1KHVuc2NhbGVkWzBdLCB1bnNjYWxlZFsxXSk7Ci0JCQkJCWJsay5zZXRfZmxpcF9iaXQodHJ1ZSk7Ci0KLQkJCQkJYmxrLnNldF9pbnRlbl90YWJsZSgwLCBpbnRlblswXSk7Ci0JCQkJCWJsay5zZXRfaW50ZW5fdGFibGUoMSwgaW50ZW5bMV0pOwotCi0JCQkJCWJsay5kZXRlcm1pbmVfc2VsZWN0b3JzKHBTb3VyY2VfcGl4ZWxzLCBtX3BhcmFtcy5tX3BlcmNlcHR1YWwpOwotCQkJCQkJCi0JCQkJfSAvLyBibG9ja19pbmRleAorCQlpZiAodXNlX2NwdSkKKwkJeworCQkJY29uc3QgdWludDMyX3QgTiA9IDQwOTY7CisJCQlmb3IgKHVpbnQzMl90IGJsb2NrX2luZGV4X2l0ZXIgPSAwOyBibG9ja19pbmRleF9pdGVyIDwgbV90b3RhbF9ibG9ja3M7IGJsb2NrX2luZGV4X2l0ZXIgKz0gTikKKwkJCXsKKwkJCQljb25zdCB1aW50MzJfdCBmaXJzdF9pbmRleCA9IGJsb2NrX2luZGV4X2l0ZXI7CisJCQkJY29uc3QgdWludDMyX3QgbGFzdF9pbmRleCA9IG1pbmltdW08dWludDMyX3Q+KG1fdG90YWxfYmxvY2tzLCBmaXJzdF9pbmRleCArIE4pOwogCiAjaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCi0JCQl9ICk7CisJCQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPmFkZF9qb2IoW3RoaXMsIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4XSB7CiAjZW5kaWYKIAotCQl9IC8vIGJsb2NrX2luZGV4X2l0ZXIKKwkJCQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleCA9IGZpcnN0X2luZGV4OyBibG9ja19pbmRleCA8IGxhc3RfaW5kZXg7IGJsb2NrX2luZGV4KyspCisJCQkJCXsKKwkJCQkJCXVpbnQzMl90IGNsdXN0ZXIwID0gbV9ibG9ja19lbmRwb2ludF9jbHVzdGVyc19pbmRpY2VzW2Jsb2NrX2luZGV4XVswXTsKKwkJCQkJCXVpbnQzMl90IGNsdXN0ZXIxID0gbV9ibG9ja19lbmRwb2ludF9jbHVzdGVyc19pbmRpY2VzW2Jsb2NrX2luZGV4XVsxXTsKKwkJCQkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkoY2x1c3RlcjAgPT0gY2x1c3RlcjEpOworCisJCQkJCQljb25zdCBjb2xvcl9yZ2JhKiBwU291cmNlX3BpeGVscyA9IGdldF9zb3VyY2VfcGl4ZWxfYmxvY2soYmxvY2tfaW5kZXgpLmdldF9wdHIoKTsKKworCQkJCQkJZXRjX2Jsb2NrJiBibGsgPSBtX2VuY29kZWRfYmxvY2tzW2Jsb2NrX2luZGV4XTsKKworCQkJCQkJY29sb3JfcmdiYSB1bnNjYWxlZFsyXSA9IHsgbV9lbmRwb2ludF9jbHVzdGVyX2V0Y19wYXJhbXNbY2x1c3RlcjBdLm1fY29sb3JfdW5zY2FsZWRbMF0sIG1fZW5kcG9pbnRfY2x1c3Rlcl9ldGNfcGFyYW1zW2NsdXN0ZXIxXS5tX2NvbG9yX3Vuc2NhbGVkWzBdIH07CisJCQkJCQl1aW50MzJfdCBpbnRlblsyXSA9IHsgbV9lbmRwb2ludF9jbHVzdGVyX2V0Y19wYXJhbXNbY2x1c3RlcjBdLm1faW50ZW5fdGFibGVbMF0sIG1fZW5kcG9pbnRfY2x1c3Rlcl9ldGNfcGFyYW1zW2NsdXN0ZXIxXS5tX2ludGVuX3RhYmxlWzBdIH07CisKKwkJCQkJCWJsay5zZXRfYmxvY2tfY29sb3I1KHVuc2NhbGVkWzBdLCB1bnNjYWxlZFsxXSk7CisJCQkJCQlibGsuc2V0X2ZsaXBfYml0KHRydWUpOworCisJCQkJCQlibGsuc2V0X2ludGVuX3RhYmxlKDAsIGludGVuWzBdKTsKKwkJCQkJCWJsay5zZXRfaW50ZW5fdGFibGUoMSwgaW50ZW5bMV0pOworCisJCQkJCQlibGsuZGV0ZXJtaW5lX3NlbGVjdG9ycyhwU291cmNlX3BpeGVscywgbV9wYXJhbXMubV9wZXJjZXB0dWFsKTsKKworCQkJCQl9IC8vIGJsb2NrX2luZGV4CiAKICNpZm5kZWYgX19FTVNDUklQVEVOX18KLQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPndhaXRfZm9yX2FsbCgpOworCQkJCQl9KTsKICNlbmRpZgogCisJCQl9IC8vIGJsb2NrX2luZGV4X2l0ZXIKKworI2lmbmRlZiBfX0VNU0NSSVBURU5fXworCQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPndhaXRfZm9yX2FsbCgpOworI2VuZGlmCisKKwkJfSAvLyB1c2VfY3B1CisJCQkJCiAJCW1fb3JpZ19lbmNvZGVkX2Jsb2NrcyA9IG1fZW5jb2RlZF9ibG9ja3M7CisKKwkJZGVidWdfcHJpbnRmKCJFbGFwc2VkIHRpbWU6ICUzLjNmIHNlY3NcbiIsIHRtLmdldF9lbGFwc2VkX3NlY3MoKSk7CiAJfQogCiAJdm9pZCBiYXNpc3VfZnJvbnRlbmQ6OmNvbXB1dGVfc2VsZWN0b3JfY2x1c3RlcnNfd2l0aGluX2VhY2hfcGFyZW50X2NsdXN0ZXIoKQpAQCAtMTczOSw4ICsyMTkzLDcgQEAKIAl2b2lkIGJhc2lzdV9mcm9udGVuZDo6Z2VuZXJhdGVfc2VsZWN0b3JfY2x1c3RlcnMoKQogCXsKIAkJZGVidWdfcHJpbnRmKCJnZW5lcmF0ZV9zZWxlY3Rvcl9jbHVzdGVyc1xuIik7Ci0KLQkJdHlwZWRlZiB2ZWM8MTYsIGZsb2F0PiB2ZWMxNkY7CisJCQkJCiAJCXR5cGVkZWYgdHJlZV92ZWN0b3JfcXVhbnQ8dmVjMTZGPiB2ZWMxNkZfY2x1c3Rlcml6ZXI7CiAJCQkJCiAJCXZlYzE2Rl9jbHVzdGVyaXplcjo6YXJyYXlfb2Zfd2VpZ2h0ZWRfdHJhaW5pbmdfdmVjcyB0cmFpbmluZ192ZWNzKG1fdG90YWxfYmxvY2tzKTsKQEAgLTE4MDAsMTIgKzIyNTMsMTQgQEAKIAogCQl1aW50MzJfdCBtYXhfdGhyZWFkcyA9IDA7CiAJCW1heF90aHJlYWRzID0gbV9wYXJhbXMubV9tdWx0aXRocmVhZGVkID8gbWluaW11bTxpbnQ+KHN0ZDo6dGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpLCBjTWF4Q29kZWJvb2tDcmVhdGlvblRocmVhZHMpIDogMDsKKwkJaWYgKG1fcGFyYW1zLm1fcEpvYl9wb29sKQorCQkJbWF4X3RocmVhZHMgPSBtaW5pbXVtPGludD4oKGludCltX3BhcmFtcy5tX3BKb2JfcG9vbC0+Z2V0X3RvdGFsX3RocmVhZHMoKSwgbWF4X3RocmVhZHMpOwogCiAJCWJvb2wgc3RhdHVzID0gZ2VuZXJhdGVfaGllcmFyY2hpY2FsX2NvZGVib29rX3RocmVhZGVkKHNlbGVjdG9yX2NsdXN0ZXJpemVyLAogCQkJbV9wYXJhbXMubV9tYXhfc2VsZWN0b3JfY2x1c3RlcnMsIG1fdXNlX2hpZXJhcmNoaWNhbF9zZWxlY3Rvcl9jb2RlYm9va3MgPyBwYXJlbnRfY29kZWJvb2tfc2l6ZSA6IDAsCiAJCQltX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcywKIAkJCW1fc2VsZWN0b3JfcGFyZW50X2NsdXN0ZXJfYmxvY2tfaW5kaWNlcywKLQkJCW1heF90aHJlYWRzLCBtX3BhcmFtcy5tX3BKb2JfcG9vbCk7CisJCQltYXhfdGhyZWFkcywgbV9wYXJhbXMubV9wSm9iX3Bvb2wsIGZhbHNlKTsKIAkJQkFTSVNVX0ZST05URU5EX1ZFUklGWShzdGF0dXMpOwogCiAJCWlmIChtX3VzZV9oaWVyYXJjaGljYWxfc2VsZWN0b3JfY29kZWJvb2tzKQpAQCAtMTg2NCwyMzUgKzIzMTksMTAzIEBACiAJewogCQlkZWJ1Z19wcmludGYoImNyZWF0ZV9vcHRpbWl6ZWRfc2VsZWN0b3JfY29kZWJvb2tcbiIpOwogCisJCWludGVydmFsX3RpbWVyIHRtOworCQl0bS5zdGFydCgpOworCiAJCWNvbnN0IHVpbnQzMl90IHRvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzID0gKHVpbnQzMl90KW1fc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzLnNpemUoKTsKIAogCQlkZWJ1Z19wcmludGYoIlRvdGFsIHNlbGVjdG9yIGNsdXN0ZXJzIChmcm9tIG1fc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzLnNpemUoKSk6ICV1XG4iLCAodWludDMyX3QpbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXMuc2l6ZSgpKTsKIAogCQltX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9ycy5yZXNpemUodG90YWxfc2VsZWN0b3JfY2x1c3RlcnMpOwotCi0JCWlmICgobV9wYXJhbXMubV9wR2xvYmFsX3NlbF9jb2RlYm9vaykgJiYgKCFtX3BhcmFtcy5tX3VzZV9oeWJyaWRfc2VsZWN0b3JfY29kZWJvb2tzKSkKKwkJCisJCS8vIEZvciBlYWNoIHNlbGVjdG9yIGNvZGVib29rIGVudHJ5LCBhbmQgZm9yIGVhY2ggb2YgdGhlIDR4NCBzZWxlY3RvcnMsIGRldGVybWluZSB3aGljaCBzZWxlY3RvciBtaW5pbWl6ZXMgdGhlIGVycm9yIGFjcm9zcyBhbGwgdGhlIGJsb2NrcyB0aGF0IHVzZSB0aGF0IHF1YW50aXplZCBzZWxlY3Rvci4KKwkJY29uc3QgdWludDMyX3QgTiA9IDI1NjsKKwkJZm9yICh1aW50MzJfdCBjbHVzdGVyX2luZGV4X2l0ZXIgPSAwOyBjbHVzdGVyX2luZGV4X2l0ZXIgPCB0b3RhbF9zZWxlY3Rvcl9jbHVzdGVyczsgY2x1c3Rlcl9pbmRleF9pdGVyICs9IE4pCiAJCXsKLQkJCXVpbnQzMl90IHRvdGFsX2NsdXN0ZXJzX3Byb2Nlc3NlZCA9IDA7Ci0KLQkJCW1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JfZ2xvYmFsX2NiX2lkcy5yZXNpemUodG90YWxfc2VsZWN0b3JfY2x1c3RlcnMpOwotCi0JCQljb25zdCB1aW50MzJfdCBOID0gMjU2OwotCQkJZm9yICh1aW50MzJfdCBjbHVzdGVyX2luZGV4X2l0ZXIgPSAwOyBjbHVzdGVyX2luZGV4X2l0ZXIgPCB0b3RhbF9zZWxlY3Rvcl9jbHVzdGVyczsgY2x1c3Rlcl9pbmRleF9pdGVyICs9IE4pCi0JCQl7Ci0JCQkJY29uc3QgdWludDMyX3QgZmlyc3RfaW5kZXggPSBjbHVzdGVyX2luZGV4X2l0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJY29uc3QgdWludDMyX3QgbGFzdF9pbmRleCA9IG1pbmltdW08dWludDMyX3Q+KCh1aW50MzJfdCl0b3RhbF9zZWxlY3Rvcl9jbHVzdGVycywgY2x1c3Rlcl9pbmRleF9pdGVyICsgTik7ICAgCi0KLSNpZm5kZWYgX19FTVNDUklQVEVOX18KLQkJCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+YWRkX2pvYiggW3RoaXMsIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4LCAmdG90YWxfY2x1c3RlcnNfcHJvY2Vzc2VkLCAmdG90YWxfc2VsZWN0b3JfY2x1c3RlcnNdIHsKLSNlbmRpZgotCQkJCQkKLQkJCQkJZm9yICh1aW50MzJfdCBjbHVzdGVyX2luZGV4ID0gZmlyc3RfaW5kZXg7IGNsdXN0ZXJfaW5kZXggPCBsYXN0X2luZGV4OyBjbHVzdGVyX2luZGV4KyspCi0JCQkJCXsKLQkJCQkJCWNvbnN0IGJhc2lzdTo6dmVjdG9yPHVpbnQzMl90PiAmY2x1c3Rlcl9ibG9ja19pbmRpY2VzID0gbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXNbY2x1c3Rlcl9pbmRleF07Ci0KLQkJCQkJCWlmICghY2x1c3Rlcl9ibG9ja19pbmRpY2VzLnNpemUoKSkKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJZXRjX2Jsb2NrX3ZlYyBldGNfYmxvY2tzOwotCQkJCQkJcGl4ZWxfYmxvY2tfdmVjIHBpeGVsX2Jsb2NrczsKLQotCQkJCQkJZm9yICh1aW50MzJfdCBjbHVzdGVyX2Jsb2NrX2luZGV4ID0gMDsgY2x1c3Rlcl9ibG9ja19pbmRleCA8IGNsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCk7IGNsdXN0ZXJfYmxvY2tfaW5kZXgrKykKLQkJCQkJCXsKLQkJCQkJCQljb25zdCB1aW50MzJfdCBibG9ja19pbmRleCA9IGNsdXN0ZXJfYmxvY2tfaW5kaWNlc1tjbHVzdGVyX2Jsb2NrX2luZGV4XTsKLQotCQkJCQkJCWV0Y19ibG9ja3MucHVzaF9iYWNrKG1fZW5jb2RlZF9ibG9ja3NbYmxvY2tfaW5kZXhdKTsKLQotCQkJCQkJCXBpeGVsX2Jsb2Nrcy5wdXNoX2JhY2soZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCkpOwotCQkJCQkJfQotCi0JCQkJCQl1aW50MzJfdCBwYWxldHRlX2luZGV4OwotCQkJCQkJYmFzaXN0OjpldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyIHBhbGV0dGVfbW9kaWZpZXI7Ci0KLQkJI2lmIDAKLQkJCQkJCW1fcGFyYW1zLm1fcEdsb2JhbF9zZWxfY29kZWJvb2stPmZpbmRfYmVzdF9lbnRyeShldGNfYmxvY2tzLnNpemUoKSwgcGl4ZWxfYmxvY2tzLmdldF9wdHIoKSwgZXRjX2Jsb2Nrcy5nZXRfcHRyKCksCi0JCQkJCQkJcGFsZXR0ZV9pbmRleCwgcGFsZXR0ZV9tb2RpZmllciwKLQkJCQkJCQltX3BhcmFtcy5tX3BlcmNlcHR1YWwsIDEgPDwgbV9wYXJhbXMubV9udW1fZ2xvYmFsX3NlbF9jb2RlYm9va19wYWxfYml0cywgMSA8PCBtX3BhcmFtcy5tX251bV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzKTsKLQkJI2Vsc2UKLQkJCQkJCWV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rX2ZpbmRfYmVzdF9lbnRyeSgqbV9wYXJhbXMubV9wR2xvYmFsX3NlbF9jb2RlYm9vaywKLQkJCQkJCQkodWludDMyX3QpZXRjX2Jsb2Nrcy5zaXplKCksICZwaXhlbF9ibG9ja3NbMF0sICZldGNfYmxvY2tzWzBdLAotCQkJCQkJCXBhbGV0dGVfaW5kZXgsIHBhbGV0dGVfbW9kaWZpZXIsCi0JCQkJCQkJbV9wYXJhbXMubV9wZXJjZXB0dWFsLCAxIDw8IG1fcGFyYW1zLm1fbnVtX2dsb2JhbF9zZWxfY29kZWJvb2tfcGFsX2JpdHMsIDEgPDwgbV9wYXJhbXMubV9udW1fZ2xvYmFsX3NlbF9jb2RlYm9va19tb2RfYml0cyk7Ci0JCSNlbmRpZgotCi0JCQkJCQltX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yX2dsb2JhbF9jYl9pZHNbY2x1c3Rlcl9pbmRleF0uc2V0KHBhbGV0dGVfaW5kZXgsIHBhbGV0dGVfbW9kaWZpZXIpOwotCi0JCQkJCQliYXNpc3Q6OmV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBwYWxfZW50cnkobV9wYXJhbXMubV9wR2xvYmFsX3NlbF9jb2RlYm9vay0+Z2V0X2VudHJ5KHBhbGV0dGVfaW5kZXgsIHBhbGV0dGVfbW9kaWZpZXIpKTsKLQotCQkJCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJCQltX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tjbHVzdGVyX2luZGV4XS5zZXRfc2VsZWN0b3IoeCwgeSwgcGFsX2VudHJ5KHgsIHkpKTsKLQotCQkJCQkJewotCQkJCQkJCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fbG9jayk7Ci0KLQkJCQkJCQl0b3RhbF9jbHVzdGVyc19wcm9jZXNzZWQrKzsKLQkJCQkJCQlpZiAoKHRvdGFsX2NsdXN0ZXJzX3Byb2Nlc3NlZCAlIDYzKSA9PSAwKQotCQkJCQkJCQlkZWJ1Z19wcmludGYoIkdsb2JhbCBzZWxlY3RvciBwYWxldHRlIG9wdGltaXphdGlvbjogJTMuMWYlJSBjb21wbGV0ZVxuIiwgdG90YWxfY2x1c3RlcnNfcHJvY2Vzc2VkICogMTAwLjBmIC8gdG90YWxfc2VsZWN0b3JfY2x1c3RlcnMpOwotCQkJCQkJfQotCi0JCQkJCX0gLy8gY2x1c3Rlcl9pbmRleAotCi0jaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCi0JCQkJfSApOwotI2VuZGlmCi0KLQkJCX0gLy8gY2x1c3Rlcl9pbmRleF9pdGVyCi0KLSNpZm5kZWYgX19FTVNDUklQVEVOX18KLQkJCW1fcGFyYW1zLm1fcEpvYl9wb29sLT53YWl0X2Zvcl9hbGwoKTsKLSNlbmRpZgotCQl9Ci0JCWVsc2UKLQkJewotCQkJY29uc3QgYm9vbCB1c2VzX2h5YnJpZF9zZWxfY29kZWJvb2sgPSAoKG1fcGFyYW1zLm1fcEdsb2JhbF9zZWxfY29kZWJvb2spICYmIChtX3BhcmFtcy5tX3VzZV9oeWJyaWRfc2VsZWN0b3JfY29kZWJvb2tzKSk7Ci0JCQlpZiAodXNlc19oeWJyaWRfc2VsX2NvZGVib29rKQotCQkJewotCQkJCW1fc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYi5yZXNpemUodG90YWxfc2VsZWN0b3JfY2x1c3RlcnMpOwotCQkJCW1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JfZ2xvYmFsX2NiX2lkcy5yZXNpemUodG90YWxfc2VsZWN0b3JfY2x1c3RlcnMpOwotCQkJfQotCi0JCQl1aW50MzJfdCB0b3RhbF9jbHVzdGVyc19wcm9jZXNzZWQgPSAwOwotCi0JCQkvLyBGb3IgZWFjaCBzZWxlY3RvciBjb2RlYm9vayBlbnRyeSwgYW5kIGZvciBlYWNoIG9mIHRoZSA0eDQgc2VsZWN0b3JzLCBkZXRlcm1pbmUgd2hpY2ggc2VsZWN0b3IgbWluaW1pemVzIHRoZSBlcnJvciBhY3Jvc3MgYWxsIHRoZSBibG9ja3MgdGhhdCB1c2UgdGhhdCBxdWFudGl6ZWQgc2VsZWN0b3IuCi0KLQkJCWNvbnN0IHVpbnQzMl90IE4gPSAyNTY7Ci0JCQlmb3IgKHVpbnQzMl90IGNsdXN0ZXJfaW5kZXhfaXRlciA9IDA7IGNsdXN0ZXJfaW5kZXhfaXRlciA8IHRvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzOyBjbHVzdGVyX2luZGV4X2l0ZXIgKz0gTikKLQkJCXsKLQkJCQljb25zdCB1aW50MzJfdCBmaXJzdF9pbmRleCA9IGNsdXN0ZXJfaW5kZXhfaXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQljb25zdCB1aW50MzJfdCBsYXN0X2luZGV4ID0gbWluaW11bTx1aW50MzJfdD4oKHVpbnQzMl90KXRvdGFsX3NlbGVjdG9yX2NsdXN0ZXJzLCBjbHVzdGVyX2luZGV4X2l0ZXIgKyBOKTsgICAKKwkJCWNvbnN0IHVpbnQzMl90IGZpcnN0X2luZGV4ID0gY2x1c3Rlcl9pbmRleF9pdGVyOworCQkJY29uc3QgdWludDMyX3QgbGFzdF9pbmRleCA9IG1pbmltdW08dWludDMyX3Q+KCh1aW50MzJfdCl0b3RhbF9zZWxlY3Rvcl9jbHVzdGVycywgY2x1c3Rlcl9pbmRleF9pdGVyICsgTik7CiAKICNpZm5kZWYgX19FTVNDUklQVEVOX18JCQkKLQkJCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+YWRkX2pvYiggW3RoaXMsIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4LCAmdXNlc19oeWJyaWRfc2VsX2NvZGVib29rLCAmdG90YWxfY2x1c3RlcnNfcHJvY2Vzc2VkLCAmdG90YWxfc2VsZWN0b3JfY2x1c3RlcnNdIHsKKwkJCW1fcGFyYW1zLm1fcEpvYl9wb29sLT5hZGRfam9iKFt0aGlzLCBmaXJzdF9pbmRleCwgbGFzdF9pbmRleF0gewogI2VuZGlmCi0JCQkJCQotCQkJCQlmb3IgKHVpbnQzMl90IGNsdXN0ZXJfaW5kZXggPSBmaXJzdF9pbmRleDsgY2x1c3Rlcl9pbmRleCA8IGxhc3RfaW5kZXg7IGNsdXN0ZXJfaW5kZXgrKykKKworCQkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pbmRleCA9IGZpcnN0X2luZGV4OyBjbHVzdGVyX2luZGV4IDwgbGFzdF9pbmRleDsgY2x1c3Rlcl9pbmRleCsrKQorCQkJCXsKKwkJCQkJY29uc3QgYmFzaXN1Ojp2ZWN0b3I8dWludDMyX3Q+JiBjbHVzdGVyX2Jsb2NrX2luZGljZXMgPSBtX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlc1tjbHVzdGVyX2luZGV4XTsKKworCQkJCQlpZiAoIWNsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQl1aW50NjRfdCBvdmVyYWxsX2Jlc3RfZXJyID0gMDsKKworCQkJCQl1aW50NjRfdCB0b3RhbF9lcnJbNF1bNF1bNF07CisJCQkJCWNsZWFyX29iaih0b3RhbF9lcnIpOworCisJCQkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9ibG9ja19pbmRleCA9IDA7IGNsdXN0ZXJfYmxvY2tfaW5kZXggPCBjbHVzdGVyX2Jsb2NrX2luZGljZXMuc2l6ZSgpOyBjbHVzdGVyX2Jsb2NrX2luZGV4KyspCiAJCQkJCXsKLQkJCQkJCWNvbnN0IGJhc2lzdTo6dmVjdG9yPHVpbnQzMl90PiAmY2x1c3Rlcl9ibG9ja19pbmRpY2VzID0gbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXNbY2x1c3Rlcl9pbmRleF07CisJCQkJCQljb25zdCB1aW50MzJfdCBibG9ja19pbmRleCA9IGNsdXN0ZXJfYmxvY2tfaW5kaWNlc1tjbHVzdGVyX2Jsb2NrX2luZGV4XTsKIAotCQkJCQkJaWYgKCFjbHVzdGVyX2Jsb2NrX2luZGljZXMuc2l6ZSgpKQotCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJY29uc3QgZXRjX2Jsb2NrJiBibGsgPSBtX2VuY29kZWRfYmxvY2tzW2Jsb2NrX2luZGV4XTsKIAotCQkJCQkJdWludDY0X3Qgb3ZlcmFsbF9iZXN0X2VyciA9IDA7CisJCQkJCQljb2xvcl9yZ2JhIGJsa19jb2xvcnNbNF07CisJCQkJCQlibGsuZ2V0X2Jsb2NrX2NvbG9ycyhibGtfY29sb3JzLCAwKTsKIAogCQkJCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKIAkJCQkJCXsKIAkJCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQogCQkJCQkJCXsKLQkJCQkJCQkJdWludDY0X3QgYmVzdF9lcnIgPSBVSU5UNjRfTUFYOwotCQkJCQkJCQl1aW50MzJfdCBiZXN0X3MgPSAwOworCQkJCQkJCQljb25zdCBjb2xvcl9yZ2JhJiBvcmlnX2NvbG9yID0gZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCkoeCwgeSk7CiAKLQkJCQkJCQkJZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IDQ7IHMrKykKKwkJCQkJCQkJaWYgKG1fcGFyYW1zLm1fcGVyY2VwdHVhbCkKIAkJCQkJCQkJewotCQkJCQkJCQkJdWludDMyX3QgdG90YWxfZXJyID0gMDsKLQotCQkJCQkJCQkJZm9yICh1aW50MzJfdCBjbHVzdGVyX2Jsb2NrX2luZGV4ID0gMDsgY2x1c3Rlcl9ibG9ja19pbmRleCA8IGNsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCk7IGNsdXN0ZXJfYmxvY2tfaW5kZXgrKykKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQljb25zdCB1aW50MzJfdCBibG9ja19pbmRleCA9IGNsdXN0ZXJfYmxvY2tfaW5kaWNlc1tjbHVzdGVyX2Jsb2NrX2luZGV4XTsKLQotCQkJCQkJCQkJCWNvbnN0IGV0Y19ibG9jayAmYmxrID0gbV9lbmNvZGVkX2Jsb2Nrc1tibG9ja19pbmRleF07Ci0KLQkJCQkJCQkJCQljb25zdCBjb2xvcl9yZ2JhICZvcmlnX2NvbG9yID0gZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCkoeCwgeSk7Ci0KLQkJCQkJCQkJCQljb2xvcl9yZ2JhIGJsb2NrX2NvbG9yOwotCQkJCQkJCQkJCWJsay5nZXRfYmxvY2tfY29sb3IoYmxvY2tfY29sb3IsIGJsay5nZXRfc3ViYmxvY2tfaW5kZXgoeCwgeSksIHMpOwotCQkJCQkJCQkJCXRvdGFsX2VyciArPSBjb2xvcl9kaXN0YW5jZShtX3BhcmFtcy5tX3BlcmNlcHR1YWwsIGJsb2NrX2NvbG9yLCBvcmlnX2NvbG9yLCBmYWxzZSk7Ci0KLQkJCQkJCQkJCQlpZiAodG90YWxfZXJyID4gYmVzdF9lcnIpCi0JCQkJCQkJCQkJCWJyZWFrOwotCi0JCQkJCQkJCQl9IC8vIGJsb2NrX2luZGV4Ci0KLQkJCQkJCQkJCWlmICh0b3RhbF9lcnIgPCBiZXN0X2VycikKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQliZXN0X2VyciA9IHRvdGFsX2VycjsKLQkJCQkJCQkJCQliZXN0X3MgPSBzOwotCQkJCQkJCQkJCWlmICghYmVzdF9lcnIpCi0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0gLy8gcwotCi0JCQkJCQkJCW1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzW2NsdXN0ZXJfaW5kZXhdLnNldF9zZWxlY3Rvcih4LCB5LCBiZXN0X3MpOwotCi0JCQkJCQkJCW92ZXJhbGxfYmVzdF9lcnIgKz0gYmVzdF9lcnI7Ci0KKwkJCQkJCQkJCWZvciAodWludDMyX3QgcyA9IDA7IHMgPCA0OyBzKyspCisJCQkJCQkJCQkJdG90YWxfZXJyW3ldW3hdW3NdICs9IGNvbG9yX2Rpc3RhbmNlKHRydWUsIGJsa19jb2xvcnNbc10sIG9yaWdfY29sb3IsIGZhbHNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsKKwkJCQkJCQkJCWZvciAodWludDMyX3QgcyA9IDA7IHMgPCA0OyBzKyspCisJCQkJCQkJCQkJdG90YWxfZXJyW3ldW3hdW3NdICs9IGNvbG9yX2Rpc3RhbmNlKGZhbHNlLCBibGtfY29sb3JzW3NdLCBvcmlnX2NvbG9yLCBmYWxzZSk7CisJCQkJCQkJCX0KIAkJCQkJCQl9IC8vIHgKIAkJCQkJCX0gLy8geQogCi0JCQkJCQlpZiAodXNlc19oeWJyaWRfc2VsX2NvZGVib29rKQorCQkJCQl9IC8vIGNsdXN0ZXJfYmxvY2tfaW5kZXgKKworCQkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQorCQkJCQl7CisJCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQogCQkJCQkJewotCQkJCQkJCWV0Y19ibG9ja192ZWMgZXRjX2Jsb2NrczsKLQkJCQkJCQlwaXhlbF9ibG9ja192ZWMgcGl4ZWxfYmxvY2tzOworCQkJCQkJCXVpbnQ2NF90IGJlc3RfZXJyID0gdG90YWxfZXJyW3ldW3hdWzBdOworCQkJCQkJCXVpbnQ4X3QgYmVzdF9zZWwgPSAwOwogCi0JCQkJCQkJZm9yICh1aW50MzJfdCBjbHVzdGVyX2Jsb2NrX2luZGV4ID0gMDsgY2x1c3Rlcl9ibG9ja19pbmRleCA8IGNsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCk7IGNsdXN0ZXJfYmxvY2tfaW5kZXgrKykKKwkJCQkJCQlmb3IgKHVpbnQzMl90IHMgPSAxOyBzIDwgNDsgcysrKQogCQkJCQkJCXsKLQkJCQkJCQkJY29uc3QgdWludDMyX3QgYmxvY2tfaW5kZXggPSBjbHVzdGVyX2Jsb2NrX2luZGljZXNbY2x1c3Rlcl9ibG9ja19pbmRleF07Ci0KLQkJCQkJCQkJZXRjX2Jsb2Nrcy5wdXNoX2JhY2sobV9lbmNvZGVkX2Jsb2Nrc1tibG9ja19pbmRleF0pOwotCi0JCQkJCQkJCXBpeGVsX2Jsb2Nrcy5wdXNoX2JhY2soZ2V0X3NvdXJjZV9waXhlbF9ibG9jayhibG9ja19pbmRleCkpOworCQkJCQkJCQlpZiAodG90YWxfZXJyW3ldW3hdW3NdIDwgYmVzdF9lcnIpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWJlc3RfZXJyID0gdG90YWxfZXJyW3ldW3hdW3NdOworCQkJCQkJCQkJYmVzdF9zZWwgPSAodWludDhfdClzOworCQkJCQkJCQl9CiAJCQkJCQkJfQogCi0JCQkJCQkJdWludDMyX3QgcGFsZXR0ZV9pbmRleDsKLQkJCQkJCQliYXNpc3Q6OmV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgcGFsZXR0ZV9tb2RpZmllcjsKKwkJCQkJCQltX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tjbHVzdGVyX2luZGV4XS5zZXRfc2VsZWN0b3IoeCwgeSwgYmVzdF9zZWwpOwogCi0JCSNpZiAwCi0JCQkJCQkJdWludDY0X3QgYmVzdF9nbG9iYWxfY2JfZXJyID0gbV9wYXJhbXMubV9wR2xvYmFsX3NlbF9jb2RlYm9vay0+ZmluZF9iZXN0X2VudHJ5KGV0Y19ibG9ja3Muc2l6ZSgpLCBwaXhlbF9ibG9ja3MuZ2V0X3B0cigpLCBldGNfYmxvY2tzLmdldF9wdHIoKSwKLQkJCQkJCQkJcGFsZXR0ZV9pbmRleCwgcGFsZXR0ZV9tb2RpZmllciwKLQkJCQkJCQkJbV9wYXJhbXMubV9wZXJjZXB0dWFsLCAxIDw8IG1fcGFyYW1zLm1fbnVtX2dsb2JhbF9zZWxfY29kZWJvb2tfcGFsX2JpdHMsIDEgPDwgbV9wYXJhbXMubV9udW1fZ2xvYmFsX3NlbF9jb2RlYm9va19tb2RfYml0cyk7Ci0JCSNlbHNlCi0JCQkJCQkJdWludDY0X3QgYmVzdF9nbG9iYWxfY2JfZXJyID0gZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZmluZF9iZXN0X2VudHJ5KCptX3BhcmFtcy5tX3BHbG9iYWxfc2VsX2NvZGVib29rLCAodWludDMyX3QpZXRjX2Jsb2Nrcy5zaXplKCksICZwaXhlbF9ibG9ja3NbMF0sICZldGNfYmxvY2tzWzBdLAotCQkJCQkJCQlwYWxldHRlX2luZGV4LCBwYWxldHRlX21vZGlmaWVyLAotCQkJCQkJCQltX3BhcmFtcy5tX3BlcmNlcHR1YWwsIDEgPDwgbV9wYXJhbXMubV9udW1fZ2xvYmFsX3NlbF9jb2RlYm9va19wYWxfYml0cywgMSA8PCBtX3BhcmFtcy5tX251bV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzKTsKLQkJI2VuZGlmCisJCQkJCQkJb3ZlcmFsbF9iZXN0X2VyciArPSBiZXN0X2VycjsKKwkJCQkJCX0gLy8geAorCQkJCQl9IC8vIHkKIAotCQkJCQkJCWlmIChiZXN0X2dsb2JhbF9jYl9lcnIgPD0gb3ZlcmFsbF9iZXN0X2VyciAqIG1fcGFyYW1zLm1faHlicmlkX2NvZGVib29rX3F1YWxpdHlfdGhyZXNoKQotCQkJCQkJCXsKLQkJCQkJCQkJbV9zZWxlY3Rvcl9jbHVzdGVyX3VzZXNfZ2xvYmFsX2NiW2NsdXN0ZXJfaW5kZXhdID0gdHJ1ZTsKLQotCQkJCQkJCQltX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yX2dsb2JhbF9jYl9pZHNbY2x1c3Rlcl9pbmRleF0uc2V0KHBhbGV0dGVfaW5kZXgsIHBhbGV0dGVfbW9kaWZpZXIpOwotCi0JCQkJCQkJCWJhc2lzdDo6ZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHBhbF9lbnRyeShtX3BhcmFtcy5tX3BHbG9iYWxfc2VsX2NvZGVib29rLT5nZXRfZW50cnkocGFsZXR0ZV9pbmRleCwgcGFsZXR0ZV9tb2RpZmllcikpOwotCi0JCQkJCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJCQkJCW1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzW2NsdXN0ZXJfaW5kZXhdLnNldF9zZWxlY3Rvcih4LCB5LCBwYWxfZW50cnkoeCwgeSkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQltX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yX2dsb2JhbF9jYl9pZHNbY2x1c3Rlcl9pbmRleF0uc2V0KDAsIGJhc2lzdDo6ZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllcigwKSk7Ci0KLQkJCQkJCQkJbV9zZWxlY3Rvcl9jbHVzdGVyX3VzZXNfZ2xvYmFsX2NiW2NsdXN0ZXJfaW5kZXhdID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAodXNlc19oeWJyaWRfc2VsX2NvZGVib29rKQotCQkJCQkJewotCQkJCQkJCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fbG9jayk7Ci0JCQotCQkJCQkJCXRvdGFsX2NsdXN0ZXJzX3Byb2Nlc3NlZCsrOwotCQkJCQkJCWlmICgodG90YWxfY2x1c3RlcnNfcHJvY2Vzc2VkICUgNjMpID09IDApCi0JCQkJCQkJCWRlYnVnX3ByaW50ZigiR2xvYmFsIHNlbGVjdG9yIHBhbGV0dGUgb3B0aW1pemF0aW9uOiAlMy4xZiUlIGNvbXBsZXRlXG4iLCB0b3RhbF9jbHVzdGVyc19wcm9jZXNzZWQgKiAxMDAuMGYgLyB0b3RhbF9zZWxlY3Rvcl9jbHVzdGVycyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSAvLyBjbHVzdGVyX2luZGV4CisJCQkJfSAvLyBjbHVzdGVyX2luZGV4CiAKICNpZm5kZWYgX19FTVNDUklQVEVOX18KLQkJCQl9ICk7CisJCQkJfSk7CiAjZW5kaWYKIAotCQkJfSAvLyBjbHVzdGVyX2luZGV4X2l0ZXIKKwkJfSAvLyBjbHVzdGVyX2luZGV4X2l0ZXIKIAogI2lmbmRlZiBfX0VNU0NSSVBURU5fXwotCQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPndhaXRfZm9yX2FsbCgpOworCQltX3BhcmFtcy5tX3BKb2JfcG9vbC0+d2FpdF9mb3JfYWxsKCk7CiAjZW5kaWYKIAotCQl9IC8vIGlmIChtX3BhcmFtcy5tX3BHbG9iYWxfc2VsX2NvZGVib29rKQorCQlkZWJ1Z19wcmludGYoIkVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKIAkJCQkKIAkJaWYgKG1fcGFyYW1zLm1fZGVidWdfaW1hZ2VzKQogCQl7CkBAIC0yMTMzLDE3ICsyNDU2LDI1IEBACiAJCX0KIAl9CiAKKwkvLyBGb3IgZWFjaCBibG9jazogRGV0ZXJtaW5lIHdoaWNoIHF1YW50aXplZCBzZWxlY3RvcnMgYmVzdCBlbmNvZGUgdGhhdCBibG9jaywgZ2l2ZW4gaXRzIHF1YW50aXplZCBlbmRwb2ludHMuCisJLy8gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBsZWF2ZSBzb21lIGVtcHR5IGNsdXN0ZXJzIChpLmUuIGFycmF5cyB3aXRoIG5vIGJsb2NrIGluZGljZXMpLCBpbmNsdWRpbmcgYXQgdGhlIGVuZC4KIAl2b2lkIGJhc2lzdV9mcm9udGVuZDo6ZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrKCkKIAl7CiAJCWRlYnVnX3ByaW50ZigiZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrXG4iKTsKIAotCQkvLyBTYW5pdHkgY2hlY2tzCi0JCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkobV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXMuc2l6ZSgpID09IG1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzLnNpemUoKSk7Ci0JCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3NlbGVjdG9yX2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyLnNpemUoKTsgaSsrKQorCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJdG0uc3RhcnQoKTsKKwkJCisJCWlmIChtX3BhcmFtcy5tX3ZhbGlkYXRlKQogCQl7Ci0JCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbV9zZWxlY3Rvcl9jbHVzdGVyc193aXRoaW5fZWFjaF9wYXJlbnRfY2x1c3RlcltpXS5zaXplKCk7IGorKykKKwkJCS8vIFNhbml0eSBjaGVja3MKKwkJCUJBU0lTVV9GUk9OVEVORF9WRVJJRlkobV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXMuc2l6ZSgpID09IG1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzLnNpemUoKSk7CisJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9zZWxlY3Rvcl9jbHVzdGVyc193aXRoaW5fZWFjaF9wYXJlbnRfY2x1c3Rlci5zaXplKCk7IGkrKykKIAkJCXsKLQkJCQlCQVNJU1VfRlJPTlRFTkRfVkVSSUZZKG1fc2VsZWN0b3JfY2x1c3RlcnNfd2l0aGluX2VhY2hfcGFyZW50X2NsdXN0ZXJbaV1bal0gPCBtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9ycy5zaXplKCkpOworCQkJCWZvciAodWludDMyX3QgaiA9IDA7IGogPCBtX3NlbGVjdG9yX2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyW2ldLnNpemUoKTsgaisrKQorCQkJCXsKKwkJCQkJQkFTSVNVX0ZST05URU5EX1ZFUklGWShtX3NlbGVjdG9yX2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyW2ldW2pdIDwgbV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnMuc2l6ZSgpKTsKKwkJCQl9CiAJCQl9CiAJCX0KIApAQCAtMjE1MSwyMCArMjQ4MiwxMjAgQEAKIAkJCQkJCQkKIAkJaWYgKG1fcGFyYW1zLm1fY29tcHJlc3Npb25fbGV2ZWwgPT0gMCkKIAkJewotCQkJLy8gRG9uJ3QgZG8gYW55dGhpbmcsIGp1c3QgbGVhdmUgdGhlIGJsb2NrcyBpbiB0aGVpciBvcmlnaW5hbCBzZWxlY3RvciBjbHVzdGVycy4KLQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCk7IGkrKykKKwkJCS8vIEp1c3QgbGVhdmUgdGhlIGJsb2NrcyBpbiB0aGVpciBvcmlnaW5hbCBzZWxlY3RvciBjbHVzdGVycy4KKwkJCWZvciAodWludDMyX3Qgc2VsZWN0b3JfY2x1c3Rlcl9pbmRleCA9IDA7IHNlbGVjdG9yX2NsdXN0ZXJfaW5kZXggPCBtX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCk7IHNlbGVjdG9yX2NsdXN0ZXJfaW5kZXgrKykKIAkJCXsKLQkJCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXNbaV0uc2l6ZSgpOyBqKyspCi0JCQkJCW1fYmxvY2tfc2VsZWN0b3JfY2x1c3Rlcl9pbmRleFttX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlc1tpXVtqXV0gPSBpOworCQkJCWZvciAodWludDMyX3QgaiA9IDA7IGogPCBtX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlc1tzZWxlY3Rvcl9jbHVzdGVyX2luZGV4XS5zaXplKCk7IGorKykKKwkJCQl7CisJCQkJCWNvbnN0IHVpbnQzMl90IGJsb2NrX2luZGV4ID0gbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXNbc2VsZWN0b3JfY2x1c3Rlcl9pbmRleF1bal07CisKKwkJCQkJbV9ibG9ja19zZWxlY3Rvcl9jbHVzdGVyX2luZGV4W2Jsb2NrX2luZGV4XSA9IHNlbGVjdG9yX2NsdXN0ZXJfaW5kZXg7CisKKwkJCQkJZXRjX2Jsb2NrJiBibGsgPSBtX2VuY29kZWRfYmxvY2tzW2Jsb2NrX2luZGV4XTsKKwkJCQkJYmxrLnNldF9yYXdfc2VsZWN0b3JfYml0cyhtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tzZWxlY3Rvcl9jbHVzdGVyX2luZGV4XS5nZXRfcmF3X3NlbGVjdG9yX2JpdHMoKSk7CisJCQkJfQorCQkJfQorCisJCQlkZWJ1Z19wcmludGYoIkVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKworCQkJcmV0dXJuOworCQl9CisJCQorCQlib29sIHVzZV9jcHUgPSB0cnVlOworCisJCWlmICgobV9wYXJhbXMubV9wT3BlbkNMX2NvbnRleHQpICYmIG1fdXNlX2hpZXJhcmNoaWNhbF9zZWxlY3Rvcl9jb2RlYm9va3MpCisJCXsKKwkJCWNvbnN0IHVpbnQzMl90IG51bV9wYXJlbnRfY2x1c3RlcnMgPSBtX3NlbGVjdG9yX2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyLnNpemUoKTsKKworCQkJYmFzaXN1Ojp2ZWN0b3I8Zm9zY19zZWxlY3Rvcl9zdHJ1Y3Q+IHNlbGVjdG9yX3N0cnVjdHM7CisJCQlzZWxlY3Rvcl9zdHJ1Y3RzLnJlc2VydmUobV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnMuc2l6ZSgpKTsKKwkJCQkJCQorCQkJdWludF92ZWMgcGFyZW50X3NlbGVjdG9yX2NsdXN0ZXJfb2Zmc2V0cyhudW1fcGFyZW50X2NsdXN0ZXJzKTsKKworCQkJdWludF92ZWMgc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzOworCQkJc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzLnJlc2VydmUobV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnMuc2l6ZSgpKTsKKwkJCQkJCQorCQkJdWludDMyX3QgY3VyX29mcyA9IDA7CisJCQlmb3IgKHVpbnQzMl90IHBhcmVudF9pbmRleCA9IDA7IHBhcmVudF9pbmRleCA8IG51bV9wYXJlbnRfY2x1c3RlcnM7IHBhcmVudF9pbmRleCsrKQorCQkJeworCQkJCXBhcmVudF9zZWxlY3Rvcl9jbHVzdGVyX29mZnNldHNbcGFyZW50X2luZGV4XSA9IGN1cl9vZnM7CisJCQkJCisJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG1fc2VsZWN0b3JfY2x1c3RlcnNfd2l0aGluX2VhY2hfcGFyZW50X2NsdXN0ZXJbcGFyZW50X2luZGV4XS5zaXplKCk7IGorKykKKwkJCQl7CisJCQkJCWNvbnN0IHVpbnQzMl90IHNlbGVjdG9yX2NsdXN0ZXJfaW5kZXggPSBtX3NlbGVjdG9yX2NsdXN0ZXJzX3dpdGhpbl9lYWNoX3BhcmVudF9jbHVzdGVyW3BhcmVudF9pbmRleF1bal07CisKKwkJCQkJdWludDMyX3Qgc2VsX2JpdHMgPSAwOworCQkJCQlmb3IgKHVpbnQzMl90IHAgPSAwOyBwIDwgMTY7IHArKykKKwkJCQkJCXNlbF9iaXRzIHw9IChtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tzZWxlY3Rvcl9jbHVzdGVyX2luZGV4XS5nZXRfc2VsZWN0b3IocCAmIDMsIHAgPj4gMikgPDwgKHAgKiAyKSk7CisKKwkJCQkJc2VsZWN0b3Jfc3RydWN0cy5lbmxhcmdlKDEpLT5tX3BhY2tlZF9zZWxlY3RvcnMgPSBzZWxfYml0czsKKwkJCQkJCQkJCQkKKwkJCQkJc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzLnB1c2hfYmFjayhzZWxlY3Rvcl9jbHVzdGVyX2luZGV4KTsKKwkJCQl9CisKKwkJCQljdXJfb2ZzICs9IG1fc2VsZWN0b3JfY2x1c3RlcnNfd2l0aGluX2VhY2hfcGFyZW50X2NsdXN0ZXJbcGFyZW50X2luZGV4XS5zaXplKCk7CisJCQl9CisKKwkJCWNvbnN0IHVpbnQzMl90IHRvdGFsX2lucHV0X3NlbGVjdG9ycyA9IGN1cl9vZnM7CisJCQkJCQkKKwkJCWJhc2lzdTo6dmVjdG9yPGZvc2NfYmxvY2tfc3RydWN0PiBibG9ja19zdHJ1Y3RzKG1fdG90YWxfYmxvY2tzKTsKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3RvdGFsX2Jsb2NrczsgaSsrKQorCQkJeworCQkJCWNvbnN0IHVpbnQzMl90IHBhcmVudF9zZWxlY3Rvcl9jbHVzdGVyID0gbV9ibG9ja19wYXJlbnRfc2VsZWN0b3JfY2x1c3RlcltpXTsKKworCQkJCWNvbnN0IGV0Y19ibG9jayYgYmxrID0gbV9lbmNvZGVkX2Jsb2Nrc1tpXTsKKwkJCQlibGsudW5wYWNrX2NvbG9yNShibG9ja19zdHJ1Y3RzW2ldLm1fZXRjX2NvbG9yNV9pbnRlbiwgYmxrLmdldF9iYXNlNV9jb2xvcigpLCBmYWxzZSk7CisKKwkJCQlibG9ja19zdHJ1Y3RzW2ldLm1fZXRjX2NvbG9yNV9pbnRlbi5hID0gKHVpbnQ4X3QpYmxrLmdldF9pbnRlbl90YWJsZSgwKTsKKwkJCQlibG9ja19zdHJ1Y3RzW2ldLm1fZmlyc3Rfc2VsZWN0b3IgPSBwYXJlbnRfc2VsZWN0b3JfY2x1c3Rlcl9vZmZzZXRzW3BhcmVudF9zZWxlY3Rvcl9jbHVzdGVyXTsKKwkJCQlibG9ja19zdHJ1Y3RzW2ldLm1fbnVtX3NlbGVjdG9ycyA9IG1fc2VsZWN0b3JfY2x1c3RlcnNfd2l0aGluX2VhY2hfcGFyZW50X2NsdXN0ZXJbcGFyZW50X3NlbGVjdG9yX2NsdXN0ZXJdLnNpemUoKTsKKwkJCX0KKworCQkJdWludF92ZWMgb3V0cHV0X3NlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcyhtX3RvdGFsX2Jsb2Nrcyk7CisKKwkJCWJvb2wgc3RhdHVzID0gb3BlbmNsX2ZpbmRfb3B0aW1hbF9zZWxlY3Rvcl9jbHVzdGVyc19mb3JfZWFjaF9ibG9jaygKKwkJCQltX3BhcmFtcy5tX3BPcGVuQ0xfY29udGV4dCwKKwkJCQlibG9ja19zdHJ1Y3RzLmRhdGEoKSwKKwkJCQl0b3RhbF9pbnB1dF9zZWxlY3RvcnMsCisJCQkJc2VsZWN0b3Jfc3RydWN0cy5kYXRhKCksCisJCQkJc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzLmRhdGEoKSwKKwkJCQlvdXRwdXRfc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzLmRhdGEoKSwKKwkJCQltX3BhcmFtcy5tX3BlcmNlcHR1YWwpOworCQkJCisJCQlpZiAoIXN0YXR1cykKKwkJCXsKKwkJCQllcnJvcl9wcmludGYoImJhc2lzdV9mcm9udGVuZDo6ZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrOiBvcGVuY2xfZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrKCkgZmFpbGVkISBVc2luZyBDUFUuXG4iKTsKKwkJCQltX3BhcmFtcy5tX3BPcGVuQ0xfY29udGV4dCA9IG51bGxwdHI7CisJCQkJbV9vcGVuY2xfZmFpbGVkID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXMuc2l6ZSgpOyBpKyspCisJCQkJeworCQkJCQltX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlc1tpXS5yZXNpemUoMCk7CisJCQkJCW1fc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzW2ldLnJlc2VydmUoMTI4KTsKKwkJCQl9CisJCQkJCQkJCQorCQkJCWZvciAodWludDMyX3QgYmxvY2tfaW5kZXggPSAwOyBibG9ja19pbmRleCA8IG1fdG90YWxfYmxvY2tzOyBibG9ja19pbmRleCsrKQorCQkJCXsKKwkJCQkJZXRjX2Jsb2NrJiBibGsgPSBtX2VuY29kZWRfYmxvY2tzW2Jsb2NrX2luZGV4XTsKKworCQkJCQl1aW50MzJfdCBiZXN0X2NsdXN0ZXJfaW5kZXggPSBvdXRwdXRfc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzW2Jsb2NrX2luZGV4XTsKKworCQkJCQlibGsuc2V0X3Jhd19zZWxlY3Rvcl9iaXRzKG1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzW2Jlc3RfY2x1c3Rlcl9pbmRleF0uZ2V0X3Jhd19zZWxlY3Rvcl9iaXRzKCkpOworCisJCQkJCW1fYmxvY2tfc2VsZWN0b3JfY2x1c3Rlcl9pbmRleFtibG9ja19pbmRleF0gPSBiZXN0X2NsdXN0ZXJfaW5kZXg7CisKKwkJCQkJdmVjdG9yX2Vuc3VyZV9lbGVtZW50X2lzX3ZhbGlkKG1fc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzLCBiZXN0X2NsdXN0ZXJfaW5kZXgpOworCQkJCQltX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlc1tiZXN0X2NsdXN0ZXJfaW5kZXhdLnB1c2hfYmFjayhibG9ja19pbmRleCk7CisJCQkJfQorCisJCQkJdXNlX2NwdSA9IGZhbHNlOwogCQkJfQogCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBsZWF2ZSBzb21lIGVtcHR5IGNsdXN0ZXJzIChpLmUuIGFycmF5cyB3aXRoIG5vIGJsb2NrIGluZGljZXMpLCBpbmNsdWRpbmcgYXQgdGhlIGVuZC4KLQkJCWJhc2lzdTo6dmVjdG9yPCBiYXNpc3U6OnZlY3Rvcjx1aW50MzJfdD4gPiBuZXdfY2x1c3Rlcl9pbmRpY2VzKG1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzLnNpemUoKSk7Ci0JCQkJCQkKLQkJCS8vIEZvciBlYWNoIGJsb2NrOiBEZXRlcm1pbmUgd2hpY2ggcXVhbnRpemVkIHNlbGVjdG9ycyBiZXN0IGVuY29kZSB0aGF0IGJsb2NrLCBnaXZlbiBpdHMgcXVhbnRpemVkIGVuZHBvaW50cy4KIAorCQlpZiAodXNlX2NwdSkKKwkJewogCQkJYmFzaXN1Ojp2ZWN0b3I8dWludDhfdD4gdW5wYWNrZWRfb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzKDE2ICogbV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnMuc2l6ZSgpKTsKIAkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pbmRleCA9IDA7IGNsdXN0ZXJfaW5kZXggPCBtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9ycy5zaXplKCk7IGNsdXN0ZXJfaW5kZXgrKykKIAkJCXsKQEAgLTIxNzYsMzYgKzI2MDcsNzQgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCQkJCQotCQkJY29uc3QgdWludDMyX3QgTiA9IDEwMjQ7CisJCQkJCQkJCQkJCQkKKwkJCWNvbnN0IHVpbnQzMl90IE4gPSAyMDQ4OwogCQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleF9pdGVyID0gMDsgYmxvY2tfaW5kZXhfaXRlciA8IG1fdG90YWxfYmxvY2tzOyBibG9ja19pbmRleF9pdGVyICs9IE4pCiAJCQl7CiAJCQkJY29uc3QgdWludDMyX3QgZmlyc3RfaW5kZXggPSBibG9ja19pbmRleF9pdGVyOwogCQkJCWNvbnN0IHVpbnQzMl90IGxhc3RfaW5kZXggPSBtaW5pbXVtPHVpbnQzMl90PihtX3RvdGFsX2Jsb2NrcywgZmlyc3RfaW5kZXggKyBOKTsKIAotI2lmbmRlZiBfX0VNU0NSSVBURU5fXwotCQkJCW1fcGFyYW1zLm1fcEpvYl9wb29sLT5hZGRfam9iKCBbdGhpcywgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXgsICZuZXdfY2x1c3Rlcl9pbmRpY2VzLCAmdW5wYWNrZWRfb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzXSB7Ci0jZW5kaWYKKwkjaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCisJCQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPmFkZF9qb2IoIFt0aGlzLCBmaXJzdF9pbmRleCwgbGFzdF9pbmRleCwgJnVucGFja2VkX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc10geworCSNlbmRpZgorCisJCQkJaW50IHByZXZfYmVzdF9jbHVzdGVyX2luZGV4ID0gMDsKIAogCQkJCWZvciAodWludDMyX3QgYmxvY2tfaW5kZXggPSBmaXJzdF9pbmRleDsgYmxvY2tfaW5kZXggPCBsYXN0X2luZGV4OyBibG9ja19pbmRleCsrKQogCQkJCXsKLQkJCQkJY29uc3QgY29sb3JfcmdiYSogcEJsb2NrX3BpeGVscyA9IGdldF9zb3VyY2VfcGl4ZWxfYmxvY2soYmxvY2tfaW5kZXgpLmdldF9wdHIoKTsKLQorCQkJCQljb25zdCBwaXhlbF9ibG9jayYgYmxvY2sgPSBnZXRfc291cmNlX3BpeGVsX2Jsb2NrKGJsb2NrX2luZGV4KTsKKwkJCQkJCiAJCQkJCWV0Y19ibG9jayYgYmxrID0gbV9lbmNvZGVkX2Jsb2Nrc1tibG9ja19pbmRleF07Ci0JCQkKKworCQkJCQlpZiAoKGJsb2NrX2luZGV4ID4gZmlyc3RfaW5kZXgpICYmIChibG9jayA9PSBnZXRfc291cmNlX3BpeGVsX2Jsb2NrKGJsb2NrX2luZGV4IC0gMSkpKQorCQkJCQl7CisJCQkJCQlibGsuc2V0X3Jhd19zZWxlY3Rvcl9iaXRzKG1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzW3ByZXZfYmVzdF9jbHVzdGVyX2luZGV4XS5nZXRfcmF3X3NlbGVjdG9yX2JpdHMoKSk7CisKKwkJCQkJCW1fYmxvY2tfc2VsZWN0b3JfY2x1c3Rlcl9pbmRleFtibG9ja19pbmRleF0gPSBwcmV2X2Jlc3RfY2x1c3Rlcl9pbmRleDsKKwkJCQkJCQorCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJCisJCQkJCWNvbnN0IGNvbG9yX3JnYmEqIHBCbG9ja19waXhlbHMgPSBibG9jay5nZXRfcHRyKCk7CisJCQkJCQkJCQkJCQkJCiAJCQkJCWNvbG9yX3JnYmEgdHJpYWxfYmxvY2tfY29sb3JzWzRdOwotCQkJCQlibGsuZ2V0X2Jsb2NrX2NvbG9ycyh0cmlhbF9ibG9ja19jb2xvcnMsIDApOworCQkJCQlibGsuZ2V0X2Jsb2NrX2NvbG9yc19ldGMxcyh0cmlhbF9ibG9ja19jb2xvcnMpOwogCiAJCQkJCS8vIHByZWNvbXB1dGUgZXJyb3JzIGZvciB0aGUgaS10aCBibG9jayBwaXhlbCBhbmQgc2VsZWN0b3Igc2VsOiBbc2VsXVtpXQogCQkJCQl1aW50MzJfdCB0cmlhbF9lcnJvcnNbNF1bMTZdOwotCi0JCQkJCWZvciAoaW50IHNlbCA9IDA7IHNlbCA8IDQ7ICsrc2VsKQorCQkJCQkJCQkJCQorCQkJCQlpZiAobV9wYXJhbXMubV9wZXJjZXB0dWFsKQogCQkJCQl7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpCi0JCQkJCQl7Ci0JCQkJCQkJdHJpYWxfZXJyb3JzW3NlbF1baV0gPSBjb2xvcl9kaXN0YW5jZShtX3BhcmFtcy5tX3BlcmNlcHR1YWwsIHBCbG9ja19waXhlbHNbaV0sIHRyaWFsX2Jsb2NrX2NvbG9yc1tzZWxdLCBmYWxzZSk7Ci0JCQkJCQl9CisJCQkJCQlmb3IgKHVpbnQzMl90IHNlbCA9IDA7IHNlbCA8IDQ7ICsrc2VsKQorCQkJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgKytpKQorCQkJCQkJCQl0cmlhbF9lcnJvcnNbc2VsXVtpXSA9IGNvbG9yX2Rpc3RhbmNlKHRydWUsIHBCbG9ja19waXhlbHNbaV0sIHRyaWFsX2Jsb2NrX2NvbG9yc1tzZWxdLCBmYWxzZSk7CiAJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlmb3IgKHVpbnQzMl90IHNlbCA9IDA7IHNlbCA8IDQ7ICsrc2VsKQorCQkJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgKytpKQorCQkJCQkJCQl0cmlhbF9lcnJvcnNbc2VsXVtpXSA9IGNvbG9yX2Rpc3RhbmNlKGZhbHNlLCBwQmxvY2tfcGl4ZWxzW2ldLCB0cmlhbF9ibG9ja19jb2xvcnNbc2VsXSwgZmFsc2UpOworCQkJCQl9CisKKwkJCQkJLy8gQ29tcHV0ZSB0aGUgbWluaW11bSBwb3NzaWJsZSBlcnJvcnMgKGdpdmVuIGFueSBzZWxlY3RvcnMpIGZvciBwaXhlbHMgMC0xNQorCQkJCQl1aW50NjRfdCBtaW5fcG9zc2libGVfZXJyb3JfMF8xNSA9IDA7CisJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJCQkJbWluX3Bvc3NpYmxlX2Vycm9yXzBfMTUgKz0gYmFzaXN1OjptaW5pbXVtKHRyaWFsX2Vycm9yc1swXVtpXSwgdHJpYWxfZXJyb3JzWzFdW2ldLCB0cmlhbF9lcnJvcnNbMl1baV0sIHRyaWFsX2Vycm9yc1szXVtpXSk7CisKKwkJCQkJLy8gQ29tcHV0ZSB0aGUgbWluaW11bSBwb3NzaWJsZSBlcnJvcnMgKGdpdmVuIGFueSBzZWxlY3RvcnMpIGZvciBwaXhlbHMgNC0xNQorCQkJCQl1aW50NjRfdCBtaW5fcG9zc2libGVfZXJyb3JfNF8xNSA9IDA7CisJCQkJCWZvciAodWludDMyX3QgaSA9IDQ7IGkgPCAxNjsgaSsrKQorCQkJCQkJbWluX3Bvc3NpYmxlX2Vycm9yXzRfMTUgKz0gYmFzaXN1OjptaW5pbXVtKHRyaWFsX2Vycm9yc1swXVtpXSwgdHJpYWxfZXJyb3JzWzFdW2ldLCB0cmlhbF9lcnJvcnNbMl1baV0sIHRyaWFsX2Vycm9yc1szXVtpXSk7CisKKwkJCQkJLy8gQ29tcHV0ZSB0aGUgbWluaW11bSBwb3NzaWJsZSBlcnJvcnMgKGdpdmVuIGFueSBzZWxlY3RvcnMpIGZvciBwaXhlbHMgOC0xNQorCQkJCQl1aW50NjRfdCBtaW5fcG9zc2libGVfZXJyb3JfOF8xNSA9IDA7CisJCQkJCWZvciAodWludDMyX3QgaSA9IDg7IGkgPCAxNjsgaSsrKQorCQkJCQkJbWluX3Bvc3NpYmxlX2Vycm9yXzhfMTUgKz0gYmFzaXN1OjptaW5pbXVtKHRyaWFsX2Vycm9yc1swXVtpXSwgdHJpYWxfZXJyb3JzWzFdW2ldLCB0cmlhbF9lcnJvcnNbMl1baV0sIHRyaWFsX2Vycm9yc1szXVtpXSk7CisKKwkJCQkJLy8gQ29tcHV0ZSB0aGUgbWluaW11bSBwb3NzaWJsZSBlcnJvcnMgKGdpdmVuIGFueSBzZWxlY3RvcnMpIGZvciBwaXhlbHMgMTItMTUKKwkJCQkJdWludDY0X3QgbWluX3Bvc3NpYmxlX2Vycm9yXzEyXzE1ID0gMDsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMTI7IGkgPCAxNjsgaSsrKQorCQkJCQkJbWluX3Bvc3NpYmxlX2Vycm9yXzEyXzE1ICs9IGJhc2lzdTo6bWluaW11bSh0cmlhbF9lcnJvcnNbMF1baV0sIHRyaWFsX2Vycm9yc1sxXVtpXSwgdHJpYWxfZXJyb3JzWzJdW2ldLCB0cmlhbF9lcnJvcnNbM11baV0pOwogCiAJCQkJCXVpbnQ2NF90IGJlc3RfY2x1c3Rlcl9lcnIgPSBJTlQ2NF9NQVg7CiAJCQkJCXVpbnQzMl90IGJlc3RfY2x1c3Rlcl9pbmRleCA9IDA7CkBAIC0yMjE1LDcgKzI2ODQsNyBAQAogCiAJCQkJCWNvbnN0IHVpbnQzMl90IHRvdGFsX2NsdXN0ZXJzID0gbV91c2VfaGllcmFyY2hpY2FsX3NlbGVjdG9yX2NvZGVib29rcyA/ICh1aW50MzJfdClwQ2x1c3Rlcl9pbmRpY2VzLT5zaXplKCkgOiAodWludDMyX3QpbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXMuc2l6ZSgpOwogCi0jaWYgMAorCSNpZiAwCiAJCQkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pdGVyID0gMDsgY2x1c3Rlcl9pdGVyIDwgdG90YWxfY2x1c3RlcnM7IGNsdXN0ZXJfaXRlcisrKQogCQkJCQl7CiAJCQkJCQljb25zdCB1aW50MzJfdCBjbHVzdGVyX2luZGV4ID0gbV91c2VfaGllcmFyY2hpY2FsX3NlbGVjdG9yX2NvZGVib29rcyA/ICgqcENsdXN0ZXJfaW5kaWNlcylbY2x1c3Rlcl9pdGVyXSA6IGNsdXN0ZXJfaXRlcjsKQEAgLTIyNDYsOTkgKzI3MTUsNzMgQEAKIAkJCQkJZWFybHlfb3V0OgogCQkJCQkJOwogCQkJCQl9Ci0jZWxzZQotCQkJCQlpZiAobV9wYXJhbXMubV9wZXJjZXB0dWFsKQorCSNlbHNlCisJCQkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pdGVyID0gMDsgY2x1c3Rlcl9pdGVyIDwgdG90YWxfY2x1c3RlcnM7IGNsdXN0ZXJfaXRlcisrKQogCQkJCQl7Ci0JCQkJCQlmb3IgKHVpbnQzMl90IGNsdXN0ZXJfaXRlciA9IDA7IGNsdXN0ZXJfaXRlciA8IHRvdGFsX2NsdXN0ZXJzOyBjbHVzdGVyX2l0ZXIrKykKKwkJCQkJCWNvbnN0IHVpbnQzMl90IGNsdXN0ZXJfaW5kZXggPSBtX3VzZV9oaWVyYXJjaGljYWxfc2VsZWN0b3JfY29kZWJvb2tzID8gKCpwQ2x1c3Rlcl9pbmRpY2VzKVtjbHVzdGVyX2l0ZXJdIDogY2x1c3Rlcl9pdGVyOworCQkJCQkJCisJCQkJCQljb25zdCB1aW50OF90KiBwU2VscyA9ICZ1bnBhY2tlZF9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnNbY2x1c3Rlcl9pbmRleCAqIDE2XTsKKworCQkJCQkJdWludDY0X3QgdHJpYWxfZXJyID0gKHVpbnQ2NF90KXRyaWFsX2Vycm9yc1twU2Vsc1swXV1bMF0gKyB0cmlhbF9lcnJvcnNbcFNlbHNbMV1dWzFdICsgdHJpYWxfZXJyb3JzW3BTZWxzWzJdXVsyXSArIHRyaWFsX2Vycm9yc1twU2Vsc1szXV1bM107CisJCQkJCQlpZiAoKHRyaWFsX2VyciArIG1pbl9wb3NzaWJsZV9lcnJvcl80XzE1KSA+PSBiZXN0X2NsdXN0ZXJfZXJyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQl0cmlhbF9lcnIgKz0gKHVpbnQ2NF90KXRyaWFsX2Vycm9yc1twU2Vsc1s0XV1bNF0gKyB0cmlhbF9lcnJvcnNbcFNlbHNbNV1dWzVdICsgdHJpYWxfZXJyb3JzW3BTZWxzWzZdXVs2XSArIHRyaWFsX2Vycm9yc1twU2Vsc1s3XV1bN107CisJCQkJCQlpZiAoKHRyaWFsX2VyciArIG1pbl9wb3NzaWJsZV9lcnJvcl84XzE1KSA+PSBiZXN0X2NsdXN0ZXJfZXJyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQl0cmlhbF9lcnIgKz0gKHVpbnQ2NF90KXRyaWFsX2Vycm9yc1twU2Vsc1s4XV1bOF0gKyB0cmlhbF9lcnJvcnNbcFNlbHNbOV1dWzldICsgdHJpYWxfZXJyb3JzW3BTZWxzWzEwXV1bMTBdICsgdHJpYWxfZXJyb3JzW3BTZWxzWzExXV1bMTFdOworCQkJCQkJaWYgKCh0cmlhbF9lcnIgKyBtaW5fcG9zc2libGVfZXJyb3JfMTJfMTUpID49IGJlc3RfY2x1c3Rlcl9lcnIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJCXRyaWFsX2VyciArPSAodWludDY0X3QpdHJpYWxfZXJyb3JzW3BTZWxzWzEyXV1bMTJdICsgdHJpYWxfZXJyb3JzW3BTZWxzWzEzXV1bMTNdICsgdHJpYWxfZXJyb3JzW3BTZWxzWzE0XV1bMTRdICsgdHJpYWxfZXJyb3JzW3BTZWxzWzE1XV1bMTVdOworCisJCQkJCQlpZiAodHJpYWxfZXJyIDwgYmVzdF9jbHVzdGVyX2VycikKIAkJCQkJCXsKLQkJCQkJCQljb25zdCB1aW50MzJfdCBjbHVzdGVyX2luZGV4ID0gbV91c2VfaGllcmFyY2hpY2FsX3NlbGVjdG9yX2NvZGVib29rcyA/ICgqcENsdXN0ZXJfaW5kaWNlcylbY2x1c3Rlcl9pdGVyXSA6IGNsdXN0ZXJfaXRlcjsKLQkJCQkJCQkvL2NvbnN0IGV0Y19ibG9jayYgY2x1c3Rlcl9ibGsgPSBtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tjbHVzdGVyX2luZGV4XTsKKwkJCQkJCQliZXN0X2NsdXN0ZXJfZXJyID0gdHJpYWxfZXJyOworCQkJCQkJCWJlc3RfY2x1c3Rlcl9pbmRleCA9IGNsdXN0ZXJfaW5kZXg7CisJCQkJCQkJaWYgKGJlc3RfY2x1c3Rlcl9lcnIgPT0gbWluX3Bvc3NpYmxlX2Vycm9yXzBfMTUpCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQogCi0JCQkJCQkJdWludDY0X3QgdHJpYWxfZXJyID0gMDsKLQkJCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspCi0JCQkJCQkJewotCQkJCQkJCQljb25zdCB1aW50MzJfdCBzZWwgPSB1bnBhY2tlZF9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3RvcnNbY2x1c3Rlcl9pbmRleCAqIDE2ICsgaV07Ci0JCQkJCQkJCQkJCi0JCQkJCQkJCXRyaWFsX2VyciArPSB0cmlhbF9lcnJvcnNbc2VsXVtpXTsKLQkJCQkJCQkJaWYgKHRyaWFsX2VyciA+IGJlc3RfY2x1c3Rlcl9lcnIpCi0JCQkJCQkJCQlnb3RvIGVhcmx5X291dDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAodHJpYWxfZXJyIDwgYmVzdF9jbHVzdGVyX2VycikKLQkJCQkJCQl7Ci0JCQkJCQkJCWJlc3RfY2x1c3Rlcl9lcnIgPSB0cmlhbF9lcnI7Ci0JCQkJCQkJCWJlc3RfY2x1c3Rlcl9pbmRleCA9IGNsdXN0ZXJfaW5kZXg7Ci0JCQkJCQkJCWlmICghYmVzdF9jbHVzdGVyX2VycikKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQotCQkJCQkJZWFybHlfb3V0OgotCQkJCQkJCTsKLQotCQkJCQkJfSAvLyBjbHVzdGVyX2l0ZXIKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pdGVyID0gMDsgY2x1c3Rlcl9pdGVyIDwgdG90YWxfY2x1c3RlcnM7IGNsdXN0ZXJfaXRlcisrKQotCQkJCQkJewotCQkJCQkJCWNvbnN0IHVpbnQzMl90IGNsdXN0ZXJfaW5kZXggPSBtX3VzZV9oaWVyYXJjaGljYWxfc2VsZWN0b3JfY29kZWJvb2tzID8gKCpwQ2x1c3Rlcl9pbmRpY2VzKVtjbHVzdGVyX2l0ZXJdIDogY2x1c3Rlcl9pdGVyOwotCQkJCQkJCS8vY29uc3QgZXRjX2Jsb2NrJiBjbHVzdGVyX2JsayA9IG1fb3B0aW1pemVkX2NsdXN0ZXJfc2VsZWN0b3JzW2NsdXN0ZXJfaW5kZXhdOwotCi0JCQkJCQkJdWludDY0X3QgdHJpYWxfZXJyID0gMDsKLQotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCWNvbnN0IHVpbnQzMl90IHNlbCA9IHVucGFja2VkX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tjbHVzdGVyX2luZGV4ICogMTYgKyBpXTsKLQotCQkJCQkJCQl0cmlhbF9lcnIgKz0gdHJpYWxfZXJyb3JzW3NlbF1baV07Ci0JCQkJCQkJCWlmICh0cmlhbF9lcnIgPiBiZXN0X2NsdXN0ZXJfZXJyKQotCQkJCQkJCQkJZ290byBlYXJseV9vdXQyOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmICh0cmlhbF9lcnIgPCBiZXN0X2NsdXN0ZXJfZXJyKQotCQkJCQkJCXsKLQkJCQkJCQkJYmVzdF9jbHVzdGVyX2VyciA9IHRyaWFsX2VycjsKLQkJCQkJCQkJYmVzdF9jbHVzdGVyX2luZGV4ID0gY2x1c3Rlcl9pbmRleDsKLQkJCQkJCQkJaWYgKCFiZXN0X2NsdXN0ZXJfZXJyKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCi0JCQkJCQllYXJseV9vdXQyOgotCQkJCQkJCTsKLQotCQkJCQkJfSAvLyBjbHVzdGVyX2l0ZXIKLQkJCQkJfQotI2VuZGlmCisJCQkJCX0gLy8gY2x1c3Rlcl9pdGVyCisJI2VuZGlmCiAKIAkJCQkJYmxrLnNldF9yYXdfc2VsZWN0b3JfYml0cyhtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tiZXN0X2NsdXN0ZXJfaW5kZXhdLmdldF9yYXdfc2VsZWN0b3JfYml0cygpKTsKIAogCQkJCQltX2Jsb2NrX3NlbGVjdG9yX2NsdXN0ZXJfaW5kZXhbYmxvY2tfaW5kZXhdID0gYmVzdF9jbHVzdGVyX2luZGV4OwotCQotCQkJCQl7Ci0JCQkJCQlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX2xvY2spOwogCi0JCQkJCQl2ZWN0b3JfZW5zdXJlX2VsZW1lbnRfaXNfdmFsaWQobmV3X2NsdXN0ZXJfaW5kaWNlcywgYmVzdF9jbHVzdGVyX2luZGV4KTsKLQkJCQkJCW5ld19jbHVzdGVyX2luZGljZXNbYmVzdF9jbHVzdGVyX2luZGV4XS5wdXNoX2JhY2soYmxvY2tfaW5kZXgpOwotCQkJCQl9CisJCQkJCXByZXZfYmVzdF9jbHVzdGVyX2luZGV4ID0gYmVzdF9jbHVzdGVyX2luZGV4OwogCQkJCQkKIAkJCQl9IC8vIGJsb2NrX2luZGV4CiAKLSNpZm5kZWYgX19FTVNDUklQVEVOX18KKwkjaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCiAJCQkJfSApOwotI2VuZGlmCisJI2VuZGlmCiAKIAkJCX0gLy8gYmxvY2tfaW5kZXhfaXRlcgogCi0jaWZuZGVmIF9fRU1TQ1JJUFRFTl9fCisJI2lmbmRlZiBfX0VNU0NSSVBURU5fXwogCQkJbV9wYXJhbXMubV9wSm9iX3Bvb2wtPndhaXRfZm9yX2FsbCgpOwotI2VuZGlmCisJI2VuZGlmCisJCQkJCQkKKwkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCk7IGkrKykKKwkJCXsKKwkJCQltX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlc1tpXS5yZXNpemUoMCk7CisJCQkJbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXNbaV0ucmVzZXJ2ZSgxMjgpOworCQkJfQogCi0JCQltX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zd2FwKG5ld19jbHVzdGVyX2luZGljZXMpOwotCQl9CisJCQlmb3IgKHVpbnQzMl90IGJsb2NrX2luZGV4ID0gMDsgYmxvY2tfaW5kZXggPCBtX3RvdGFsX2Jsb2NrczsgYmxvY2tfaW5kZXgrKykKKwkJCXsKKwkJCQljb25zdCB1aW50MzJfdCBiZXN0X2NsdXN0ZXJfaW5kZXggPSBtX2Jsb2NrX3NlbGVjdG9yX2NsdXN0ZXJfaW5kZXhbYmxvY2tfaW5kZXhdOwogCi0JCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCk7IGkrKykKLQkJCXZlY3Rvcl9zb3J0KG1fc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzW2ldKTsKKwkJCQl2ZWN0b3JfZW5zdXJlX2VsZW1lbnRfaXNfdmFsaWQobV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXMsIGJlc3RfY2x1c3Rlcl9pbmRleCk7CisJCQkJbV9zZWxlY3Rvcl9jbHVzdGVyX2Jsb2NrX2luZGljZXNbYmVzdF9jbHVzdGVyX2luZGV4XS5wdXNoX2JhY2soYmxvY2tfaW5kZXgpOworCQkJfQorCQkKKwkJfSAvLyBpZiAodXNlX2NwdSkKKworCQlkZWJ1Z19wcmludGYoIkVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKIAl9CiAKIAkvLyBUT0RPOiBSZW1vdmUgb2xkIEVUQzEgc3BlY2lmaWMgc3R1ZmYsIGFuZCB0aHJlYWQgdGhpcy4KQEAgLTI4MzcsNyArMzI4MCw4MSBAQAogCQkJCQkJCiAJCS8vZGVidWdfcHJpbnRmKCJ2YWxpZGF0ZV9vdXRwdXQ6ICV1XG4iLCB2YWxpZGF0ZV9vdXRwdXQoKSk7CiAJfQotCQorCisJLy8gRW5kcG9pbnQgY2x1c3Rlcml6YXRpb24gaGllcmFyY2h5IGludGVncml0eSBjaGVja2VyLgorCS8vIE5vdGUgdGhpcyBkb2Vzbid0IGNoZWNrIGZvciBlbXB0eSBjbHVzdGVycy4KKwlib29sIGJhc2lzdV9mcm9udGVuZDo6dmFsaWRhdGVfZW5kcG9pbnRfY2x1c3Rlcl9oaWVyYXJjaHkoYm9vbCBlbnN1cmVfY2x1c3RlcnNfaGF2ZV9zYW1lX3BhcmVudHMpIGNvbnN0CisJeworCQlpZiAoIW1fZW5kcG9pbnRfcGFyZW50X2NsdXN0ZXJzLnNpemUoKSkKKwkJCXJldHVybiB0cnVlOworCisJCWludF92ZWMgc3ViYmxvY2tfcGFyZW50X2luZGljZXMobV90b3RhbF9ibG9ja3MgKiAyKTsKKwkJc3ViYmxvY2tfcGFyZW50X2luZGljZXMuc2V0X2FsbCgtMSk7CisKKwkJaW50X3ZlYyBzdWJibG9ja19jbHVzdGVyX2luZGljZXMobV90b3RhbF9ibG9ja3MgKiAyKTsKKwkJc3ViYmxvY2tfY2x1c3Rlcl9pbmRpY2VzLnNldF9hbGwoLTEpOworCisJCWZvciAodWludDMyX3QgcGFyZW50X2luZGV4ID0gMDsgcGFyZW50X2luZGV4IDwgbV9lbmRwb2ludF9wYXJlbnRfY2x1c3RlcnMuc2l6ZSgpOyBwYXJlbnRfaW5kZXgrKykKKwkJeworCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fZW5kcG9pbnRfcGFyZW50X2NsdXN0ZXJzW3BhcmVudF9pbmRleF0uc2l6ZSgpOyBpKyspCisJCQl7CisJCQkJdWludDMyX3Qgc3ViYmxvY2tfaW5kZXggPSBtX2VuZHBvaW50X3BhcmVudF9jbHVzdGVyc1twYXJlbnRfaW5kZXhdW2ldOworCQkJCWlmIChzdWJibG9ja19pbmRleCA+PSBtX3RvdGFsX2Jsb2NrcyAqIDIpCisJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCS8vIElmIHRoZSBlbmRwb2ludCBjbHVzdGVyIGxpdmVzIGluIG1vcmUgdGhhbiBvbmUgcGFyZW50IG5vZGUsIHRoYXQncyB3cm9uZy4KKwkJCQlpZiAoc3ViYmxvY2tfcGFyZW50X2luZGljZXNbc3ViYmxvY2tfaW5kZXhdICE9IC0xKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCisJCQkJc3ViYmxvY2tfcGFyZW50X2luZGljZXNbc3ViYmxvY2tfaW5kZXhdID0gcGFyZW50X2luZGV4OworCQkJfQorCQl9CisKKwkJLy8gTWFrZSBzdXJlIGFsbCBlbmRwb2ludCBjbHVzdGVycyBhcmUgcHJlc2VudCBpbiB0aGUgcGFyZW50IGNsdXN0ZXIuCisJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdWJibG9ja19wYXJlbnRfaW5kaWNlcy5zaXplKCk7IGkrKykKKwkJeworCQkJaWYgKHN1YmJsb2NrX3BhcmVudF9pbmRpY2VzW2ldID09IC0xKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWZvciAodWludDMyX3QgY2x1c3Rlcl9pbmRleCA9IDA7IGNsdXN0ZXJfaW5kZXggPCBtX2VuZHBvaW50X2NsdXN0ZXJzLnNpemUoKTsgY2x1c3Rlcl9pbmRleCsrKQorCQl7CisJCQlpbnQgcGFyZW50X2luZGV4ID0gMDsKKworCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fZW5kcG9pbnRfY2x1c3RlcnNbY2x1c3Rlcl9pbmRleF0uc2l6ZSgpOyBpKyspCisJCQl7CisJCQkJdWludDMyX3Qgc3ViYmxvY2tfaW5kZXggPSBtX2VuZHBvaW50X2NsdXN0ZXJzW2NsdXN0ZXJfaW5kZXhdW2ldOworCQkJCWlmIChzdWJibG9ja19pbmRleCA+PSBtX3RvdGFsX2Jsb2NrcyAqIDIpCisJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCWlmIChzdWJibG9ja19jbHVzdGVyX2luZGljZXNbc3ViYmxvY2tfaW5kZXhdICE9IC0xKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCisJCQkJc3ViYmxvY2tfY2x1c3Rlcl9pbmRpY2VzW3N1YmJsb2NrX2luZGV4XSA9IGNsdXN0ZXJfaW5kZXg7CisKKwkJCQkvLyBUaGVyZSBhcmUgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBlbmRwb2ludCBjbHVzdGVycyB0aGF0IGNhbiBicmVhayB0aGUgc3RyaWN0IHRyZWUgcmVxdWlyZW1lbnQKKwkJCQlpZiAoZW5zdXJlX2NsdXN0ZXJzX2hhdmVfc2FtZV9wYXJlbnRzKQorCQkJCXsKKwkJCQkJLy8gTWFrZSBzdXJlIGFsbCB0aGUgc3ViYmxvY2tzIGFyZSBpbiB0aGUgc2FtZSBwYXJlbnQgY2x1c3RlcgorCQkJCQlpZiAoIWkpCisJCQkJCQlwYXJlbnRfaW5kZXggPSBzdWJibG9ja19wYXJlbnRfaW5kaWNlc1tzdWJibG9ja19pbmRleF07CisJCQkJCWVsc2UgaWYgKHN1YmJsb2NrX3BhcmVudF9pbmRpY2VzW3N1YmJsb2NrX2luZGV4XSAhPSBwYXJlbnRfaW5kZXgpCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJCQkJCisJCS8vIE1ha2Ugc3VyZSBhbGwgZW5kcG9pbnQgY2x1c3RlcnMgYXJlIHByZXNlbnQgaW4gdGhlIHBhcmVudCBjbHVzdGVyLgorCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3ViYmxvY2tfY2x1c3Rlcl9pbmRpY2VzLnNpemUoKTsgaSsrKQorCQl7CisJCQlpZiAoc3ViYmxvY2tfY2x1c3Rlcl9pbmRpY2VzW2ldID09IC0xKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCS8vIFRoaXMgaXMgdmVyeSBzbG93IGFuZCBvbmx5IGludGVuZGVkIGZvciBkZWJ1Z2dpbmcvZGV2ZWxvcG1lbnQuIEl0J3MgZW5hYmxlZCB1c2luZyB0aGUgIi12YWxpZGF0ZV9ldGMxcyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KIAlib29sIGJhc2lzdV9mcm9udGVuZDo6dmFsaWRhdGVfb3V0cHV0KCkgY29uc3QKIAl7CiAJCWRlYnVnX3ByaW50ZigidmFsaWRhdGVfb3V0cHV0XG4iKTsKQEAgLTI4ODksMjkgKzM0MDYsNyBAQAogCQkJQ0hFQ0socmRvX291dHB1dF9ibG9jay5nZXRfYmFzZTVfY29sb3IoKSA9PSBibGsuZ2V0X2Jhc2U1X2NvbG9yKCkpOwogCQkJQ0hFQ0socmRvX291dHB1dF9ibG9jay5nZXRfZGVsdGEzX2NvbG9yKCkgPT0gYmxrLmdldF9kZWx0YTNfY29sb3IoKSk7CiAJCQlDSEVDSyhyZG9fb3V0cHV0X2Jsb2NrLmdldF9yYXdfc2VsZWN0b3JfYml0cygpID09IGJsay5nZXRfcmF3X3NlbGVjdG9yX2JpdHMoKSk7Ci0KLQkJCWlmIChtX3BhcmFtcy5tX3BHbG9iYWxfc2VsX2NvZGVib29rKQotCQkJewotCQkJCWJvb2wgdXNlZF9nbG9iYWxfY2IgPSB0cnVlOwotCQkJCWlmIChtX3BhcmFtcy5tX3VzZV9oeWJyaWRfc2VsZWN0b3JfY29kZWJvb2tzKQotCQkJCQl1c2VkX2dsb2JhbF9jYiA9IG1fc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYltzZWxlY3Rvcl9jbHVzdGVyX2luZGV4XTsKLQotCQkJCWlmICh1c2VkX2dsb2JhbF9jYikKLQkJCQl7Ci0JCQkJCWJhc2lzdDo6ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZW50cnlfaWQgcGFsX2lkKGdldF9zZWxlY3Rvcl9jbHVzdGVyX2dsb2JhbF9zZWxlY3Rvcl9lbnRyeV9pZHMoKVtzZWxlY3Rvcl9jbHVzdGVyX2luZGV4XSk7Ci0KLQkJCQkJYmFzaXN0OjpldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcGFsX2VudHJ5KG1fcGFyYW1zLm1fcEdsb2JhbF9zZWxfY29kZWJvb2stPmdldF9lbnRyeShwYWxfaWQpKTsKLQotCQkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJCQl7Ci0JCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJewotCQkJCQkJCUNIRUNLKHBhbF9lbnRyeSh4LCB5KSA9PSBibGsuZ2V0X3NlbGVjdG9yKHgsIHkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQorCQkJCQkJCiAjdW5kZWYgQ0hFQ0sKIAkJfQogCmRpZmYgLS1naXQgYS9lbmNvZGVyL2Jhc2lzdV9mcm9udGVuZC5oIGIvZW5jb2Rlci9iYXNpc3VfZnJvbnRlbmQuaAppbmRleCA0ZmY2ZDQwLi5jZGE3M2YzIDEwMDY0NAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9mcm9udGVuZC5oCisrKyBiL2VuY29kZXIvYmFzaXN1X2Zyb250ZW5kLmgKQEAgLTE2LDEyICsxNiwxNCBAQAogI2luY2x1ZGUgImJhc2lzdV9lbmMuaCIKICNpbmNsdWRlICJiYXNpc3VfZXRjLmgiCiAjaW5jbHVkZSAiYmFzaXN1X2dwdV90ZXh0dXJlLmgiCi0jaW5jbHVkZSAiYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuaCIKICNpbmNsdWRlICIuLi90cmFuc2NvZGVyL2Jhc2lzdV9maWxlX2hlYWRlcnMuaCIKICNpbmNsdWRlICIuLi90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmgiCiAKIG5hbWVzcGFjZSBiYXNpc3UKIHsKKwlzdHJ1Y3Qgb3BlbmNsX2NvbnRleHQ7CisJdHlwZWRlZiBvcGVuY2xfY29udGV4dCogb3BlbmNsX2NvbnRleHRfcHRyOworCiAJc3RydWN0IHZlYzJVCiAJewogCQl1aW50MzJfdCBtX2NvbXBzWzJdOwpAQCAtNTEsNyArNTMsOCBAQAogCQkJbV91c2VfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rcyhmYWxzZSksCiAJCQltX3VzZV9oaWVyYXJjaGljYWxfc2VsZWN0b3JfY29kZWJvb2tzKGZhbHNlKSwKIAkJCW1fbnVtX2VuZHBvaW50X2NvZGVib29rX2l0ZXJhdGlvbnMoMCksCi0JCQltX251bV9zZWxlY3Rvcl9jb2RlYm9va19pdGVyYXRpb25zKDApCisJCQltX251bV9zZWxlY3Rvcl9jb2RlYm9va19pdGVyYXRpb25zKDApLAorCQkJbV9vcGVuY2xfZmFpbGVkKGZhbHNlKQogCQl7CiAJCX0KIApAQCAtNzMsMTkgKzc2LDEyIEBACiAJCQkJbV9wZXJjZXB0dWFsKHRydWUpLAogCQkJCW1fZGVidWdfc3RhdHMoZmFsc2UpLAogCQkJCW1fZGVidWdfaW1hZ2VzKGZhbHNlKSwKLQkJCQkJCQkJCQkJCQkJCQkKIAkJCQltX2R1bXBfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb24odHJ1ZSksCiAJCQkJbV92YWxpZGF0ZShmYWxzZSksCiAJCQkJbV9tdWx0aXRocmVhZGVkKGZhbHNlKSwKIAkJCQltX2Rpc2FibGVfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rcyhmYWxzZSksCi0JCQkJbV9wR2xvYmFsX3NlbF9jb2RlYm9vayhOVUxMKSwKLQkJCQltX251bV9nbG9iYWxfc2VsX2NvZGVib29rX3BhbF9iaXRzKDApLAotCQkJCW1fbnVtX2dsb2JhbF9zZWxfY29kZWJvb2tfbW9kX2JpdHMoMCksCi0JCQkJbV91c2VfaHlicmlkX3NlbGVjdG9yX2NvZGVib29rcyhmYWxzZSksCi0JCQkJbV9oeWJyaWRfY29kZWJvb2tfcXVhbGl0eV90aHJlc2goMC4wZiksCiAJCQkJbV90ZXhfdHlwZShiYXNpc3Q6OmNCQVNJU1RleFR5cGUyRCksCi0JCQkJbV9wR2xvYmFsX2NvZGVib29rcyhudWxscHRyKSwKLQkJCQkKKwkJCQltX3BPcGVuQ0xfY29udGV4dChudWxscHRyKSwKIAkJCQltX3BKb2JfcG9vbChudWxscHRyKQogCQkJewogCQkJfQpAQCAtMTA2LDEzICsxMDIsMTAgQEAKIAkJCWJvb2wgbV9tdWx0aXRocmVhZGVkOwogCQkJYm9vbCBtX2Rpc2FibGVfaGllcmFyY2hpY2FsX2VuZHBvaW50X2NvZGVib29rczsKIAkJCQotCQkJY29uc3QgYmFzaXN0OjpldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayAqbV9wR2xvYmFsX3NlbF9jb2RlYm9vazsKLQkJCXVpbnQzMl90IG1fbnVtX2dsb2JhbF9zZWxfY29kZWJvb2tfcGFsX2JpdHM7Ci0JCQl1aW50MzJfdCBtX251bV9nbG9iYWxfc2VsX2NvZGVib29rX21vZF9iaXRzOwotCQkJYm9vbCBtX3VzZV9oeWJyaWRfc2VsZWN0b3JfY29kZWJvb2tzOwotCQkJZmxvYXQgbV9oeWJyaWRfY29kZWJvb2tfcXVhbGl0eV90aHJlc2g7CiAJCQliYXNpc3Q6OmJhc2lzX3RleHR1cmVfdHlwZSBtX3RleF90eXBlOwogCQkJY29uc3QgYmFzaXN0OjpiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlciAqbV9wR2xvYmFsX2NvZGVib29rczsKKwkJCQkJCQorCQkJb3BlbmNsX2NvbnRleHRfcHRyIG1fcE9wZW5DTF9jb250ZXh0OwogCQkJCiAJCQlqb2JfcG9vbCAqbV9wSm9iX3Bvb2w7CiAJCX07CkBAIC0xNTAsMTAgKzE0Myw3IEBACiAJCXVpbnQzMl90IGdldF90b3RhbF9zZWxlY3Rvcl9jbHVzdGVycygpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihtX3NlbGVjdG9yX2NsdXN0ZXJfYmxvY2tfaW5kaWNlcy5zaXplKCkpOyB9CiAJCXVpbnQzMl90IGdldF9ibG9ja19zZWxlY3Rvcl9jbHVzdGVyX2luZGV4KHVpbnQzMl90IGJsb2NrX2luZGV4KSBjb25zdCB7IHJldHVybiBtX2Jsb2NrX3NlbGVjdG9yX2NsdXN0ZXJfaW5kZXhbYmxvY2tfaW5kZXhdOyB9CiAJCWNvbnN0IGV0Y19ibG9jayAmZ2V0X3NlbGVjdG9yX2NsdXN0ZXJfc2VsZWN0b3JfYml0cyh1aW50MzJfdCBjbHVzdGVyX2luZGV4KSBjb25zdCB7IHJldHVybiBtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yc1tjbHVzdGVyX2luZGV4XTsgfQotCi0JCWNvbnN0IGJhc2lzdDo6ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZW50cnlfaWRfdmVjICZnZXRfc2VsZWN0b3JfY2x1c3Rlcl9nbG9iYWxfc2VsZWN0b3JfZW50cnlfaWRzKCkgY29uc3QgeyByZXR1cm4gbV9vcHRpbWl6ZWRfY2x1c3Rlcl9zZWxlY3Rvcl9nbG9iYWxfY2JfaWRzOyB9Ci0JCWNvbnN0IGJvb2xfdmVjICZnZXRfc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYl92ZWMoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdG9yX2NsdXN0ZXJfdXNlc19nbG9iYWxfY2I7IH0KLQorCQkJCQogCQkvLyBSZXR1cm5zIGJsb2NrIGluZGljZXMgdXNpbmcgZWFjaCBzZWxlY3RvciBjbHVzdGVyCiAJCWNvbnN0IHVpbnRfdmVjICZnZXRfc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzKHVpbnQzMl90IHNlbGVjdG9yX2NsdXN0ZXJfaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0b3JfY2x1c3Rlcl9ibG9ja19pbmRpY2VzW3NlbGVjdG9yX2NsdXN0ZXJfaW5kZXhdOyB9CiAKQEAgLTE2MSw2ICsxNTEsOCBAQAogCQkKIAkJdm9pZCByZW9wdGltaXplX3JlbWFwcGVkX2VuZHBvaW50cyhjb25zdCB1aW50X3ZlYyAmbmV3X2Jsb2NrX2VuZHBvaW50cywgaW50X3ZlYyAmb2xkX3RvX25ld19lbmRwb2ludF9jbHVzdGVyX2luZGljZXMsIGJvb2wgb3B0aW1pemVfZmluYWxfY29kZWJvb2ssIHVpbnRfdmVjICpwQmxvY2tfc2VsZWN0b3JfaW5kaWNlcyA9IG51bGxwdHIpOwogCisJCWJvb2wgZ2V0X29wZW5jbF9mYWlsZWQoKSBjb25zdCB7IHJldHVybiBtX29wZW5jbF9mYWlsZWQ7IH0KKwogCXByaXZhdGU6CiAJCXBhcmFtcyBtX3BhcmFtczsKIAkJdWludDMyX3QgbV90b3RhbF9ibG9ja3M7CkBAIC0xOTIsMTMgKzE4NCwxNCBAQAogCQl2ZWM2Rl9xdWFudGl6ZXIgbV9lbmRwb2ludF9jbHVzdGVyaXplcjsKIAogCQkvLyBGb3IgZWFjaCBlbmRwb2ludCBjbHVzdGVyOiBBbiBhcnJheSBvZiB3aGljaCBzdWJibG9jayBpbmRpY2VzIChibG9ja19pbmRleCoyK3N1YmJsb2NrKSBhcmUgbG9jYXRlZCBpbiB0aGF0IGNsdXN0ZXIuCi0JCS8vIEFycmF5IG9mIGJsb2NrIGluZGljZXMgZm9yIGVhY2ggZW5kcG9pbnQgY2x1c3RlcgogCQliYXNpc3U6OnZlY3Rvcjx1aW50X3ZlYz4gbV9lbmRwb2ludF9jbHVzdGVyczsKIAotCQkvLyBBcnJheSBvZiBibG9jayBpbmRpY2VzIGZvciBlYWNoIHBhcmVudCBlbmRwb2ludCBjbHVzdGVyCisJCS8vIEFycmF5IG9mIHN1YmJsb2NrIGluZGljZXMgZm9yIGVhY2ggcGFyZW50IGVuZHBvaW50IGNsdXN0ZXIKKwkJLy8gTm90ZTogSW5pdGlhbGx5LCBlYWNoIGVuZHBvaW50IGNsdXN0ZXIgd2lsbCBvbmx5IGxpdmUgaW4gYSBzaW5nbGUgcGFyZW50IGNsdXN0ZXIsIGluIGEgc2hhbGxvdyB0cmVlLiAKKwkJLy8gQXMgdGhlIGVuZHBvaW50IGNsdXN0ZXJzIGFyZSBtYW5pcHVsYXRlZCB0aGlzIGNvbnN0cmFpbnQgZ2V0cyBicm9rZW4uCiAJCWJhc2lzdTo6dmVjdG9yPHVpbnRfdmVjPiBtX2VuZHBvaW50X3BhcmVudF9jbHVzdGVyczsKIAkJCi0JCS8vIEVhY2ggYmxvY2sncyBwYXJlbnQgY2x1c3RlciBpbmRleAorCQkvLyBFYWNoIGJsb2NrJ3MgcGFyZW50IGVuZHBvaW50IGNsdXN0ZXIgaW5kZXgKIAkJdWludDhfdmVjIG1fYmxvY2tfcGFyZW50X2VuZHBvaW50X2NsdXN0ZXI7IAogCiAJCS8vIEFycmF5IG9mIGVuZHBvaW50IGNsdXN0ZXIgaW5kaWNlcyBmb3IgZWFjaCBwYXJlbnQgZW5kcG9pbnQgY2x1c3RlcgpAQCAtMjk1LDEwICsyODgsNyBAQAogCiAJCS8vIEFycmF5IG9mIHNlbGVjdG9yIGNsdXN0ZXIgaW5kaWNlcyBmb3IgZWFjaCBwYXJlbnQgc2VsZWN0b3IgY2x1c3RlcgogCQliYXNpc3U6OnZlY3Rvcjx1aW50X3ZlYz4gbV9zZWxlY3Rvcl9jbHVzdGVyc193aXRoaW5fZWFjaF9wYXJlbnRfY2x1c3RlcjsKLQotCQliYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rX2VudHJ5X2lkX3ZlYyBtX29wdGltaXplZF9jbHVzdGVyX3NlbGVjdG9yX2dsb2JhbF9jYl9pZHM7Ci0JCWJvb2xfdmVjIG1fc2VsZWN0b3JfY2x1c3Rlcl91c2VzX2dsb2JhbF9jYjsKLQorCQkJCQogCQkvLyBFYWNoIGJsb2NrJ3Mgc2VsZWN0b3IgY2x1c3RlciBpbmRleAogCQliYXNpc3U6OnZlY3Rvcjx1aW50MzJfdD4gbV9ibG9ja19zZWxlY3Rvcl9jbHVzdGVyX2luZGV4OwogCkBAIC0zMzAsNiArMzIwLDggQEAKIAogCQlzdGQ6Om11dGV4IG1fbG9jazsKIAorCQlib29sIG1fb3BlbmNsX2ZhaWxlZDsKKwogCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAkJdm9pZCBpbml0X2V0YzFfaW1hZ2VzKCk7CkBAIC0zNTEsNiArMzQzLDcgQEAKIAkJdm9pZCBmaW5kX29wdGltYWxfc2VsZWN0b3JfY2x1c3RlcnNfZm9yX2VhY2hfYmxvY2soKTsKIAkJdWludDMyX3QgcmVmaW5lX2Jsb2NrX2VuZHBvaW50c19naXZlbl9zZWxlY3RvcnMoKTsKIAkJdm9pZCBmaW5hbGl6ZSgpOworCQlib29sIHZhbGlkYXRlX2VuZHBvaW50X2NsdXN0ZXJfaGllcmFyY2h5KGJvb2wgZW5zdXJlX2NsdXN0ZXJzX2hhdmVfc2FtZV9wYXJlbnRzKSBjb25zdDsKIAkJYm9vbCB2YWxpZGF0ZV9vdXRwdXQoKSBjb25zdDsKIAkJdm9pZCBpbnRyb2R1Y2Vfc3BlY2lhbF9zZWxlY3Rvcl9jbHVzdGVycygpOwogCQl2b2lkIG9wdGltaXplX3NlbGVjdG9yX2NvZGVib29rKCk7CmRpZmYgLS1naXQgYS9lbmNvZGVyL2Jhc2lzdV9nbG9iYWxfc2VsZWN0b3JfcGFsZXR0ZV9oZWxwZXJzLmNwcCBiL2VuY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJmYzI0Li4wMDAwMDAwCi0tLSBhL2VuY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gYmFzaXVfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfaGVscGVycy5jcHAKLS8vIENvcHlyaWdodCAoQykgMjAxOSBCaW5vbWlhbCBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSNpbmNsdWRlICJiYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfaGVscGVycy5oIgotCi1uYW1lc3BhY2UgYmFzaXN1Ci17Ci0JdWludDY0X3QgZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZmluZF9iZXN0X2VudHJ5KGNvbnN0IGJhc2lzdDo6ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sgJmNvZGVib29rLAotCQl1aW50MzJfdCBudW1fc3JjX3BpeGVsX2Jsb2NrcywgY29uc3QgcGl4ZWxfYmxvY2sgKnBTcmNfcGl4ZWxfYmxvY2tzLCBjb25zdCBldGNfYmxvY2sgKnBCbG9ja19lbmRwb2ludHMsCi0JCXVpbnQzMl90ICZwYWxldHRlX2luZGV4LCBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgJnBhbGV0dGVfbW9kaWZpZXIsCi0JCWJvb2wgcGVyY2VwdHVhbCwgdWludDMyX3QgbWF4X3BhbF9lbnRyaWVzLCB1aW50MzJfdCBtYXhfbW9kaWZpZXJzKQotCXsKLQkJdWludDY0X3QgYmVzdF9lcnIgPSBVSU5UNjRfTUFYOwotCQl1aW50MzJfdCBiZXN0X3BhbF9pbmRleCA9IDA7Ci0JCWJhc2lzdDo6ZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllciBiZXN0X3BhbF9tb2RpZmllcjsKLQotCQlpZiAoIW1heF9wYWxfZW50cmllcykKLQkJCW1heF9wYWxfZW50cmllcyA9IGNvZGVib29rLnNpemUoKTsKLQotCQlpZiAoIW1heF9tb2RpZmllcnMpCi0JCQltYXhfbW9kaWZpZXJzID0gYmFzaXN0OjpldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyOjpjVG90YWxWYWx1ZXM7Ci0KLQkJZm9yICh1aW50MzJfdCBwYWxfaW5kZXggPSAwOyBwYWxfaW5kZXggPCBtYXhfcGFsX2VudHJpZXM7IHBhbF9pbmRleCsrKQotCQl7Ci0JCQlmb3IgKHVpbnQzMl90IG1vZF9pbmRleCA9IDA7IG1vZF9pbmRleCA8IG1heF9tb2RpZmllcnM7IG1vZF9pbmRleCsrKQotCQkJewotCQkJCWNvbnN0IGJhc2lzdDo6ZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllciBwYWxfbW9kaWZpZXIobW9kX2luZGV4KTsKLQotCQkJCWNvbnN0IGJhc2lzdDo6ZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHBhbF9lbnRyeShjb2RlYm9vay5nZXRfZW50cnkocGFsX2luZGV4LCBwYWxfbW9kaWZpZXIpKTsKLQotCQkJCXVpbnQ2NF90IHRyaWFsX2VyciA9IDA7Ci0JCQkJZm9yICh1aW50MzJfdCBibG9ja19pbmRleCA9IDA7IGJsb2NrX2luZGV4IDwgbnVtX3NyY19waXhlbF9ibG9ja3M7IGJsb2NrX2luZGV4KyspCi0JCQkJewotCQkJCQlldGNfYmxvY2sgdHJpYWxfYmxvY2socEJsb2NrX2VuZHBvaW50c1tibG9ja19pbmRleF0pOwotCi0JCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJCXRyaWFsX2Jsb2NrLnNldF9zZWxlY3Rvcih4LCB5LCBwYWxfZW50cnkoeCwgeSkpOwotCi0JCQkJCXRyaWFsX2VyciArPSB0cmlhbF9ibG9jay5ldmFsdWF0ZV9ldGMxX2Vycm9yKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmFzaXN1Ojpjb2xvcl9yZ2JhICo+KHBTcmNfcGl4ZWxfYmxvY2tzW2Jsb2NrX2luZGV4XS5nZXRfcHRyKCkpLCBwZXJjZXB0dWFsKTsKLQkJCQkJaWYgKHRyaWFsX2VyciA+PSBiZXN0X2VycikKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmICh0cmlhbF9lcnIgPCBiZXN0X2VycikKLQkJCQl7Ci0JCQkJCWJlc3RfZXJyID0gdHJpYWxfZXJyOwotCQkJCQliZXN0X3BhbF9pbmRleCA9IHBhbF9pbmRleDsKLQkJCQkJYmVzdF9wYWxfbW9kaWZpZXIgPSBwYWxfbW9kaWZpZXI7Ci0JCQkJfQotCQkJfSAvLyBtb2RfaW5kZXgKLQkJfSAvLyBwYWxfaW5kZXgKLQotCQlwYWxldHRlX2luZGV4ID0gYmVzdF9wYWxfaW5kZXg7Ci0JCXBhbGV0dGVfbW9kaWZpZXIgPSBiZXN0X3BhbF9tb2RpZmllcjsKLQotCQlyZXR1cm4gYmVzdF9lcnI7Ci0JfQotCi19IC8vIG5hbWVzcGFjZSBiYXNpc3UKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuaCBiL2VuY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzNTQzOS4uMDAwMDAwMAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9nbG9iYWxfc2VsZWN0b3JfcGFsZXR0ZV9oZWxwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyBGaWxlOiBiYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGVfaGVscGVycy5oCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTkgQmlub21pYWwgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIi4uL3RyYW5zY29kZXIvYmFzaXN1LmgiCi0jaW5jbHVkZSAiYmFzaXN1X2V0Yy5oIgotI2luY2x1ZGUgIi4uL3RyYW5zY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlLmgiCi0KLW5hbWVzcGFjZSBiYXNpc3UKLXsKLQljb25zdCB1aW50MzJfdCBjUGl4ZWxCbG9ja1dpZHRoID0gNDsKLQljb25zdCB1aW50MzJfdCBjUGl4ZWxCbG9ja0hlaWdodCA9IDQ7Ci0JY29uc3QgdWludDMyX3QgY1BpeGVsQmxvY2tUb3RhbFBpeGVscyA9IGNQaXhlbEJsb2NrV2lkdGggKiBjUGl4ZWxCbG9ja0hlaWdodDsKLQotCXN0cnVjdCBwaXhlbF9ibG9jawotCXsKLQkJY29sb3JfcmdiYSBtX3BpeGVsc1tjUGl4ZWxCbG9ja0hlaWdodF1bY1BpeGVsQmxvY2tXaWR0aF07IC8vIFt5XVt4XQotCi0JCWNvbnN0IGNvbG9yX3JnYmEgJm9wZXJhdG9yKCkgKHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIGNvbnN0IHsgYXNzZXJ0KCh4IDwgY1BpeGVsQmxvY2tXaWR0aCkgJiYgKHkgPCBjUGl4ZWxCbG9ja0hlaWdodCkpOyByZXR1cm4gbV9waXhlbHNbeV1beF07IH0KLQkJY29sb3JfcmdiYSAmb3BlcmF0b3IoKSAodWludDMyX3QgeCwgdWludDMyX3QgeSkgeyBhc3NlcnQoKHggPCBjUGl4ZWxCbG9ja1dpZHRoKSAmJiAoeSA8IGNQaXhlbEJsb2NrSGVpZ2h0KSk7IHJldHVybiBtX3BpeGVsc1t5XVt4XTsgfQotCi0JCWNvbnN0IGNvbG9yX3JnYmEgKmdldF9wdHIoKSBjb25zdCB7IHJldHVybiAmbV9waXhlbHNbMF1bMF07IH0KLQkJY29sb3JfcmdiYSAqZ2V0X3B0cigpIHsgcmV0dXJuICZtX3BpeGVsc1swXVswXTsgfQotCi0JCXZvaWQgY2xlYXIoKSB7IGNsZWFyX29iaigqdGhpcyk7IH0KLQl9OwotCXR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8cGl4ZWxfYmxvY2s+IHBpeGVsX2Jsb2NrX3ZlYzsKLQotCXVpbnQ2NF90IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rX2ZpbmRfYmVzdF9lbnRyeShjb25zdCBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rICZjb2RlYm9vaywKLQkJdWludDMyX3QgbnVtX3NyY19waXhlbF9ibG9ja3MsIGNvbnN0IHBpeGVsX2Jsb2NrICpwU3JjX3BpeGVsX2Jsb2NrcywgY29uc3QgZXRjX2Jsb2NrICpwQmxvY2tfZW5kcG9pbnRzLAotCQl1aW50MzJfdCAmcGFsZXR0ZV9pbmRleCwgYmFzaXN0OjpldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyICZwYWxldHRlX21vZGlmaWVyLAotCQlib29sIHBlcmNlcHR1YWwsIHVpbnQzMl90IG1heF9wYWxfZW50cmllcywgdWludDMyX3QgbWF4X21vZGlmaWVycyk7Ci0KLX0gLy8gbmFtZXNwYWNlIGJhc2lzdQpkaWZmIC0tZ2l0IGEvZW5jb2Rlci9iYXNpc3VfZ3B1X3RleHR1cmUuY3BwIGIvZW5jb2Rlci9iYXNpc3VfZ3B1X3RleHR1cmUuY3BwCmluZGV4IDNmOWZiNjcuLmRlYzc2OWQgMTAwNjQ0Ci0tLSBhL2VuY29kZXIvYmFzaXN1X2dwdV90ZXh0dXJlLmNwcAorKysgYi9lbmNvZGVyL2Jhc2lzdV9ncHVfdGV4dHVyZS5jcHAKQEAgLTE1LDcgKzE1LDkgQEAKICNpbmNsdWRlICJiYXNpc3VfZ3B1X3RleHR1cmUuaCIKICNpbmNsdWRlICJiYXNpc3VfZW5jLmgiCiAjaW5jbHVkZSAiYmFzaXN1X3B2cnRjMV80LmgiCisjaWYgQkFTSVNVX1VTRV9BU1RDX0RFQ09NUFJFU1MKICNpbmNsdWRlICJiYXNpc3VfYXN0Y19kZWNvbXAuaCIKKyNlbmRpZgogI2luY2x1ZGUgImJhc2lzdV9iYzdlbmMuaCIKIAogbmFtZXNwYWNlIGJhc2lzdQpAQCAtMTE1MCw4ICsxMTUyLDEyIEBACiAJCX0KIAkJY2FzZSB0ZXh0dXJlX2Zvcm1hdDo6Y0FTVEM0eDQ6CiAJCXsKKyNpZiBCQVNJU1VfVVNFX0FTVENfREVDT01QUkVTUwogCQkJY29uc3QgYm9vbCBhc3RjX3NyZ2IgPSBmYWxzZTsKIAkJCWJhc2lzdV9hc3RjOjphc3RjOjpkZWNvbXByZXNzKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBQaXhlbHMpLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4ocEJsb2NrKSwgYXN0Y19zcmdiLCA0LCA0KTsKKyNlbHNlCisJCQltZW1zZXQocFBpeGVscywgMjU1LCAxNiAqIHNpemVvZihjb2xvcl9yZ2JhKSk7CisjZW5kaWYKIAkJCWJyZWFrOwogCQl9CiAJCWNhc2UgdGV4dHVyZV9mb3JtYXQ6OmNBVENfUkdCOgpAQCAtMTQ5OCw2ICsxNTA0LDggQEAKIAkJCiAJCWhlYWRlci5tX3BpeGVsV2lkdGggPSB3aWR0aDsKIAkJaGVhZGVyLm1fcGl4ZWxIZWlnaHQgPSBoZWlnaHQ7CisJCQkJCisJCWhlYWRlci5tX2dsVHlwZVNpemUgPSAxOwogCQkKIAkJaGVhZGVyLm1fZ2xJbnRlcm5hbEZvcm1hdCA9IGludGVybmFsX2ZtdDsKIAkJaGVhZGVyLm1fZ2xCYXNlSW50ZXJuYWxGb3JtYXQgPSBiYXNlX2ludGVybmFsX2ZtdDsKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X2tlcm5lbHNfZGVjbGFyZXMuaCBiL2VuY29kZXIvYmFzaXN1X2tlcm5lbHNfZGVjbGFyZXMuaAppbmRleCBlMjRiZGQ3Li5iMDNlMmVhIDEwMDY0NAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9rZXJuZWxzX2RlY2xhcmVzLmgKKysrIGIvZW5jb2Rlci9iYXNpc3Vfa2VybmVsc19kZWNsYXJlcy5oCkBAIC0yMiw0ICsyMiw2IEBACiAKIHZvaWQgQ1BQU1BNRF9OQU1FKGZpbmRfbG93ZXN0X2Vycm9yX3BlcmNlcHR1YWxfcmdiXzRfTikoaW50NjRfdCogcERpc3RhbmNlLCBjb25zdCBiYXNpc3U6OmNvbG9yX3JnYmEqIHBCbG9ja19jb2xvcnMsIGNvbnN0IGJhc2lzdTo6Y29sb3JfcmdiYSogcFNyY19waXhlbHMsIHVpbnQzMl90IG4sIGludDY0X3QgZWFybHlfb3V0X2Vycm9yKTsKIHZvaWQgQ1BQU1BNRF9OQU1FKGZpbmRfbG93ZXN0X2Vycm9yX2xpbmVhcl9yZ2JfNF9OKShpbnQ2NF90KiBwRGlzdGFuY2UsIGNvbnN0IGJhc2lzdTo6Y29sb3JfcmdiYSogcEJsb2NrX2NvbG9ycywgY29uc3QgYmFzaXN1Ojpjb2xvcl9yZ2JhKiBwU3JjX3BpeGVscywgdWludDMyX3QgbiwgaW50NjRfdCBlYXJseV9vdXRfZXJyb3IpOworCit2b2lkIENQUFNQTURfTkFNRSh1cGRhdGVfY292YXJfbWF0cml4XzE2eDE2KSh1aW50MzJfdCBudW1fdmVjcywgY29uc3Qgdm9pZCogcFdlaWdodGVkX3ZlY3MsIGNvbnN0IHZvaWQgKnBPcmlnaW4sIGNvbnN0IHVpbnQzMl90KiBwVmVjX2luZGljZXMsIHZvaWQgKnBNYXRyaXgxNngxNik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X2tlcm5lbHNfaW1wLmggYi9lbmNvZGVyL2Jhc2lzdV9rZXJuZWxzX2ltcC5oCmluZGV4IDA0Njg4MDUuLmRjZjFjZTAgMTAwNjQ0Ci0tLSBhL2VuY29kZXIvYmFzaXN1X2tlcm5lbHNfaW1wLmgKKysrIGIvZW5jb2Rlci9iYXNpc3Vfa2VybmVsc19pbXAuaApAQCAtNTQ4LDYgKzU0OCw2NSBAQAogICAgICAgfQogICAgfTsKIAorICAgc3RydWN0IHVwZGF0ZV9jb3Zhcl9tYXRyaXhfMTZ4MTYgOiBzcG1kX2tlcm5lbAorICAgeworICAgICAgdm9pZCBfY2FsbCgKKyAgICAgICAgIHVpbnQzMl90IG51bV92ZWNzLCBjb25zdCB2b2lkKiBwV2VpZ2h0ZWRfdmVjc192b2lkLCBjb25zdCB2b2lkKiBwT3JpZ2luX3ZvaWQsIGNvbnN0IHVpbnQzMl90KiBwVmVjX2luZGljZXMsIHZvaWQqIHBNYXRyaXgxNngxNl92b2lkKQorICAgICAgeworICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPHZlYzE2RiwgdWludDY0X3Q+KiBwV2VpZ2h0ZWRfdmVjcyA9IHN0YXRpY19jYXN0PCBjb25zdCBzdGQ6OnBhaXI8dmVjMTZGLCB1aW50NjRfdD4gKj4ocFdlaWdodGVkX3ZlY3Nfdm9pZCk7CisgICAgICAgICAKKyAgICAgICAgIGNvbnN0IGZsb2F0KiBwT3JpZ2luID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQqPihwT3JpZ2luX3ZvaWQpOworICAgICAgICAgdmZsb2F0IG9yZzAgPSBsb2FkdV9saW5lYXJfYWxsKHBPcmlnaW4pLCBvcmcxID0gbG9hZHVfbGluZWFyX2FsbChwT3JpZ2luICsgNCksIG9yZzIgPSBsb2FkdV9saW5lYXJfYWxsKHBPcmlnaW4gKyA4KSwgb3JnMyA9IGxvYWR1X2xpbmVhcl9hbGwocE9yaWdpbiArIDEyKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgdmZsb2F0IG1hdFsxNl1bNF07CisgICAgICAgICB2ZmxvYXQgdnplcm8oemVyb192ZmxvYXQoKSk7CisKKyAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgc3RvcmVfYWxsKG1hdFtpXVswXSwgdnplcm8pOworICAgICAgICAgICAgc3RvcmVfYWxsKG1hdFtpXVsxXSwgdnplcm8pOworICAgICAgICAgICAgc3RvcmVfYWxsKG1hdFtpXVsyXSwgdnplcm8pOworICAgICAgICAgICAgc3RvcmVfYWxsKG1hdFtpXVszXSwgdnplcm8pOworICAgICAgICAgfQorCisgICAgICAgICBmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgbnVtX3ZlY3M7IGsrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZlY19pbmRleCA9IHBWZWNfaW5kaWNlc1trXTsKKworICAgICAgICAgICAgY29uc3QgZmxvYXQqIHBXID0gcFdlaWdodGVkX3ZlY3NbdmVjX2luZGV4XS5maXJzdC5nZXRfcHRyKCk7CisgICAgICAgICAgICB2ZmxvYXQgd2VpZ2h0KChmbG9hdClwV2VpZ2h0ZWRfdmVjc1t2ZWNfaW5kZXhdLnNlY29uZCk7CisKKyAgICAgICAgICAgIHZmbG9hdCB2ZWNbNF0gPSB7IGxvYWR1X2xpbmVhcl9hbGwocFcpIC0gb3JnMCwgbG9hZHVfbGluZWFyX2FsbChwVyArIDQpIC0gb3JnMSwgbG9hZHVfbGluZWFyX2FsbChwVyArIDgpIC0gb3JnMiwgbG9hZHVfbGluZWFyX2FsbChwVyArIDEyKSAtIG9yZzMgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdmZsb2F0IHd2ZWMwID0gdmVjWzBdICogd2VpZ2h0LCB3dmVjMSA9IHZlY1sxXSAqIHdlaWdodCwgd3ZlYzIgPSB2ZWNbMl0gKiB3ZWlnaHQsIHd2ZWMzID0gdmVjWzNdICogd2VpZ2h0OworCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHZmbG9hdCB2eCA9ICgoY29uc3QgZmxvYXQqKXZlYylbal07CisKKyAgICAgICAgICAgICAgIHN0b3JlX2FsbChtYXRbal1bMF0sIG1hdFtqXVswXSArIHZ4ICogd3ZlYzApOworICAgICAgICAgICAgICAgc3RvcmVfYWxsKG1hdFtqXVsxXSwgbWF0W2pdWzFdICsgdnggKiB3dmVjMSk7CisgICAgICAgICAgICAgICBzdG9yZV9hbGwobWF0W2pdWzJdLCBtYXRbal1bMl0gKyB2eCAqIHd2ZWMyKTsKKyAgICAgICAgICAgICAgIHN0b3JlX2FsbChtYXRbal1bM10sIG1hdFtqXVszXSArIHZ4ICogd3ZlYzMpOworCisgICAgICAgICAgICB9IC8vIGoKKworICAgICAgICAgfSAvLyBrCisKKyAgICAgICAgIGZsb2F0KiBwTWF0cml4ID0gc3RhdGljX2Nhc3Q8ZmxvYXQqPihwTWF0cml4MTZ4MTZfdm9pZCk7CisKKyAgICAgICAgIGZsb2F0KiBwRHN0ID0gcE1hdHJpeDsKKyAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgc3RvcmV1X2xpbmVhcl9hbGwocERzdCwgbWF0W2ldWzBdKTsKKyAgICAgICAgICAgIHN0b3JldV9saW5lYXJfYWxsKHBEc3QgKyA0LCBtYXRbaV1bMV0pOworICAgICAgICAgICAgc3RvcmV1X2xpbmVhcl9hbGwocERzdCArIDgsIG1hdFtpXVsyXSk7CisgICAgICAgICAgICBzdG9yZXVfbGluZWFyX2FsbChwRHN0ICsgMTIsIG1hdFtpXVszXSk7CisgICAgICAgICAgICBwRHN0ICs9IDE2OworICAgICAgICAgfQorICAgICAgfQorICAgfTsKKwogfSAvLyBuYW1lc3BhY2UKIAogdXNpbmcgbmFtZXNwYWNlIENQUFNQTURfTkFNRShiYXNpc3Vfa2VybmVsc19uYW1lc3BhY2UpOwpAQCAtNTgyLDMgKzY0MSw3IEBACiAgICBzcG1kX2NhbGw8IGZpbmRfbG93ZXN0X2Vycm9yX2xpbmVhcl9yZ2JfNF9OID4ocERpc3RhbmNlLCBwQmxvY2tfY29sb3JzLCBwU3JjX3BpeGVscywgbiwgZWFybHlfb3V0X2Vycm9yKTsKIH0KIAordm9pZCBDUFBTUE1EX05BTUUodXBkYXRlX2NvdmFyX21hdHJpeF8xNngxNikodWludDMyX3QgbnVtX3ZlY3MsIGNvbnN0IHZvaWQqIHBXZWlnaHRlZF92ZWNzLCBjb25zdCB2b2lkKiBwT3JpZ2luLCBjb25zdCB1aW50MzJfdCAqcFZlY19pbmRpY2VzLCB2b2lkKiBwTWF0cml4MTZ4MTYpCit7CisgICBzcG1kX2NhbGwgPCB1cGRhdGVfY292YXJfbWF0cml4XzE2eDE2ID4obnVtX3ZlY3MsIHBXZWlnaHRlZF92ZWNzLCBwT3JpZ2luLCBwVmVjX2luZGljZXMsIHBNYXRyaXgxNngxNik7Cit9CmRpZmYgLS1naXQgYS9lbmNvZGVyL2Jhc2lzdV9taW5pei5oIGIvZW5jb2Rlci9iYXNpc3VfbWluaXouaAppbmRleCA4NjI3YWJlLi4xOGRlOTk3IDEwMDY0NAotLS0gYS9lbmNvZGVyL2Jhc2lzdV9taW5pei5oCisrKyBiL2VuY29kZXIvYmFzaXN1X21pbml6LmgKQEAgLTc2LDYgKzc2LDE0IEBACiAjZGVmaW5lIE1JTklaX1VTRV9VTkFMSUdORURfTE9BRFNfQU5EX1NUT1JFUyAxCiAjZW5kaWYKIAorLy8gVXNpbmcgdW5hbGlnbmVkIGxvYWRzIGFuZCBzdG9yZXMgY2F1c2VzIGVycm9ycyB3aGVuIHVzaW5nIFVCU2FuLiBKYW0gaXQgb2ZmLgorI2lmIGRlZmluZWQoX19oYXNfZmVhdHVyZSkKKyNpZiBfX2hhc19mZWF0dXJlKHVuZGVmaW5lZF9iZWhhdmlvcl9zYW5pdGl6ZXIpCisjdW5kZWYgTUlOSVpfVVNFX1VOQUxJR05FRF9MT0FEU19BTkRfU1RPUkVTCisjZGVmaW5lIE1JTklaX1VTRV9VTkFMSUdORURfTE9BRFNfQU5EX1NUT1JFUyAwCisjZW5kaWYKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX1dJTjY0KSB8fCBkZWZpbmVkKF9fTUlOR1c2NF9fKSB8fCBkZWZpbmVkKF9MUDY0KSB8fCBkZWZpbmVkKF9fTFA2NF9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCiAvLyBTZXQgTUlOSVpfSEFTXzY0QklUX1JFR0lTVEVSUyB0byAxIGlmIG9wZXJhdGlvbnMgb24gNjQtYml0IGludGVnZXJzIGFyZSByZWFzb25hYmx5IGZhc3QgKGFuZCBkb24ndCBpbnZvbHZlIGNvbXBpbGVyIGdlbmVyYXRlZCBjYWxscyB0byBoZWxwZXIgZnVuY3Rpb25zKS4KICNkZWZpbmUgTUlOSVpfSEFTXzY0QklUX1JFR0lTVEVSUyAxCkBAIC0yMzYsNiArMjQ0LDcgQEAKIC8vICAgTVpfQlVGX0VSUk9SIGlmIG5vIGZvcndhcmQgcHJvZ3Jlc3MgaXMgcG9zc2libGUgYmVjYXVzZSB0aGUgaW5wdXQgYnVmZmVyIGlzIGVtcHR5IGJ1dCB0aGUgaW5mbGF0ZXIgbmVlZHMgbW9yZSBpbnB1dCB0byBjb250aW51ZSwgb3IgaWYgdGhlIG91dHB1dCBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaC4gQ2FsbCBtel9pbmZsYXRlKCkgYWdhaW4KIC8vICAgd2l0aCBtb3JlIGlucHV0IGRhdGEsIG9yIHdpdGggbW9yZSByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIChleGNlcHQgd2hlbiB1c2luZyBzaW5nbGUgY2FsbCBkZWNvbXByZXNzaW9uLCBkZXNjcmliZWQgYWJvdmUpLgogaW50IG16X2luZmxhdGUobXpfc3RyZWFtcCBwU3RyZWFtLCBpbnQgZmx1c2gpOworaW50IG16X2luZmxhdGUyKG16X3N0cmVhbXAgcFN0cmVhbSwgaW50IGZsdXNoLCBpbnQgYWRsZXIzMl9jaGVja2luZyk7CiAKIC8vIERlaW5pdGlhbGl6ZXMgYSBkZWNvbXByZXNzb3IuCiBpbnQgbXpfaW5mbGF0ZUVuZChtel9zdHJlYW1wIHBTdHJlYW0pOwpAQCAtODgwLDEwICs4ODksMTAgQEAKICAgIHJldHVybiBtel9pbmZsYXRlSW5pdDIocFN0cmVhbSwgTVpfREVGQVVMVF9XSU5ET1dfQklUUyk7CiB9CiAKLWludCBtel9pbmZsYXRlKG16X3N0cmVhbXAgcFN0cmVhbSwgaW50IGZsdXNoKQoraW50IG16X2luZmxhdGUyKG16X3N0cmVhbXAgcFN0cmVhbSwgaW50IGZsdXNoLCBpbnQgYWRsZXIzMl9jaGVja2luZykKIHsKICAgaW5mbGF0ZV9zdGF0ZSogcFN0YXRlOwotICBtel91aW50IG4sIGZpcnN0X2NhbGwsIGRlY29tcF9mbGFncyA9IFRJTkZMX0ZMQUdfQ09NUFVURV9BRExFUjMyOworICBtel91aW50IG4sIGZpcnN0X2NhbGwsIGRlY29tcF9mbGFncyA9IGFkbGVyMzJfY2hlY2tpbmcgPyBUSU5GTF9GTEFHX0NPTVBVVEVfQURMRVIzMiA6IDA7CiAgIHNpemVfdCBpbl9ieXRlcywgb3V0X2J5dGVzLCBvcmlnX2F2YWlsX2luOwogICB0aW5mbF9zdGF0dXMgc3RhdHVzOwogCkBAIC05NzEsNiArOTgwLDExIEBACiAgIHJldHVybiAoKHN0YXR1cyA9PSBUSU5GTF9TVEFUVVNfRE9ORSkgJiYgKCFwU3RhdGUtPm1fZGljdF9hdmFpbCkpID8gTVpfU1RSRUFNX0VORCA6IE1aX09LOwogfQogCitpbnQgbXpfaW5mbGF0ZShtel9zdHJlYW1wIHBTdHJlYW0sIGludCBmbHVzaCkKK3sKKyAgICByZXR1cm4gbXpfaW5mbGF0ZTIocFN0cmVhbSwgZmx1c2gsIE1aX1RSVUUpOworfQorCiBpbnQgbXpfaW5mbGF0ZUVuZChtel9zdHJlYW1wIHBTdHJlYW0pCiB7CiAgIGlmICghcFN0cmVhbSkKQEAgLTEzNDgsNyArMTM2Miw4IEBACiBjb21tb25fZXhpdDoKICAgci0+bV9udW1fYml0cyA9IG51bV9iaXRzOyByLT5tX2JpdF9idWYgPSBiaXRfYnVmOyByLT5tX2Rpc3QgPSBkaXN0OyByLT5tX2NvdW50ZXIgPSBjb3VudGVyOyByLT5tX251bV9leHRyYSA9IG51bV9leHRyYTsgci0+bV9kaXN0X2Zyb21fb3V0X2J1Zl9zdGFydCA9IGRpc3RfZnJvbV9vdXRfYnVmX3N0YXJ0OwogICAqcEluX2J1Zl9zaXplID0gcEluX2J1Zl9jdXIgLSBwSW5fYnVmX25leHQ7ICpwT3V0X2J1Zl9zaXplID0gcE91dF9idWZfY3VyIC0gcE91dF9idWZfbmV4dDsKLSAgaWYgKChkZWNvbXBfZmxhZ3MgJiAoVElORkxfRkxBR19QQVJTRV9aTElCX0hFQURFUiB8IFRJTkZMX0ZMQUdfQ09NUFVURV9BRExFUjMyKSkgJiYgKHN0YXR1cyA+PSAwKSkKKyAgLy9pZiAoKGRlY29tcF9mbGFncyAmIChUSU5GTF9GTEFHX1BBUlNFX1pMSUJfSEVBREVSIHwgVElORkxfRkxBR19DT01QVVRFX0FETEVSMzIpKSAmJiAoc3RhdHVzID49IDApKQorICBpZiAoKGRlY29tcF9mbGFncyAmIFRJTkZMX0ZMQUdfQ09NUFVURV9BRExFUjMyKSAmJiAoc3RhdHVzID49IDApKQogICB7CiAgICAgY29uc3QgbXpfdWludDggKnB0ciA9IHBPdXRfYnVmX25leHQ7IHNpemVfdCBidWZfbGVuID0gKnBPdXRfYnVmX3NpemU7CiAgICAgbXpfdWludDMyIGksIHMxID0gci0+bV9jaGVja19hZGxlcjMyICYgMHhmZmZmLCBzMiA9IHItPm1fY2hlY2tfYWRsZXIzMiA+PiAxNjsgc2l6ZV90IGJsb2NrX2xlbiA9IGJ1Zl9sZW4gJSA1NTUyOwpAQCAtMTM2Miw3ICsxMzc3LDkgQEAKICAgICAgIGZvciAoIDsgaSA8IGJsb2NrX2xlbjsgKytpKSBzMSArPSAqcHRyKyssIHMyICs9IHMxOwogICAgICAgczEgJT0gNjU1MjFVLCBzMiAlPSA2NTUyMVU7IGJ1Zl9sZW4gLT0gYmxvY2tfbGVuOyBibG9ja19sZW4gPSA1NTUyOwogICAgIH0KLSAgICByLT5tX2NoZWNrX2FkbGVyMzIgPSAoczIgPDwgMTYpICsgczE7IGlmICgoc3RhdHVzID09IFRJTkZMX1NUQVRVU19ET05FKSAmJiAoZGVjb21wX2ZsYWdzICYgVElORkxfRkxBR19QQVJTRV9aTElCX0hFQURFUikgJiYgKHItPm1fY2hlY2tfYWRsZXIzMiAhPSByLT5tX3pfYWRsZXIzMikpIHN0YXR1cyA9IFRJTkZMX1NUQVRVU19BRExFUjMyX01JU01BVENIOworICAgIHItPm1fY2hlY2tfYWRsZXIzMiA9IChzMiA8PCAxNikgKyBzMTsgCisgICAgaWYgKChzdGF0dXMgPT0gVElORkxfU1RBVFVTX0RPTkUpICYmIChkZWNvbXBfZmxhZ3MgJiBUSU5GTF9GTEFHX1BBUlNFX1pMSUJfSEVBREVSKSAmJiAoci0+bV9jaGVja19hZGxlcjMyICE9IHItPm1fel9hZGxlcjMyKSkgCisgICAgICAgIHN0YXR1cyA9IFRJTkZMX1NUQVRVU19BRExFUjMyX01JU01BVENIOwogICB9CiAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yNDc5LDcgKzI0OTYsNyBAQAogICAvLyB3cml0ZSBkdW1teSBoZWFkZXIKICAgZm9yICh6ID0gNDE7IHo7IC0teikgdGRlZmxfb3V0cHV0X2J1ZmZlcl9wdXR0ZXIoJnosIDEsICZvdXRfYnVmKTsKICAgLy8gY29tcHJlc3MgaW1hZ2UgZGF0YQotICB0ZGVmbF9pbml0KHBDb21wLCB0ZGVmbF9vdXRwdXRfYnVmZmVyX3B1dHRlciwgJm91dF9idWYsIHNfdGRlZmxfcG5nX251bV9wcm9iZXNbTVpfTUlOKDEwLCBsZXZlbCldIHwgVERFRkxfV1JJVEVfWkxJQl9IRUFERVIpOworICB0ZGVmbF9pbml0KHBDb21wLCB0ZGVmbF9vdXRwdXRfYnVmZmVyX3B1dHRlciwgJm91dF9idWYsIHNfdGRlZmxfcG5nX251bV9wcm9iZXNbTVpfTUlOKDEwLCBsZXZlbCldIHwgVERFRkxfV1JJVEVfWkxJQl9IRUFERVIgfCAobGV2ZWwgPD0gMyA/IFRERUZMX0dSRUVEWV9QQVJTSU5HX0ZMQUcgOiAwKSk7CiAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsgdGRlZmxfY29tcHJlc3NfYnVmZmVyKHBDb21wLCAmeiwgMSwgVERFRkxfTk9fRkxVU0gpOyB0ZGVmbF9jb21wcmVzc19idWZmZXIocENvbXAsIChtel91aW50OCopcEltYWdlICsgKGZsaXAgPyAoaCAtIDEgLSB5KSA6IHkpICogYnBsLCBicGwsIFRERUZMX05PX0ZMVVNIKTsgfQogICBpZiAodGRlZmxfY29tcHJlc3NfYnVmZmVyKHBDb21wLCBOVUxMLCAwLCBUREVGTF9GSU5JU0gpICE9IFRERUZMX1NUQVRVU19ET05FKSB7IE1aX0ZSRUUocENvbXApOyBNWl9GUkVFKG91dF9idWYubV9wQnVmKTsgcmV0dXJuIE5VTEw7IH0KICAgLy8gd3JpdGUgcmVhbCBoZWFkZXIKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X29jbF9rZXJuZWxzLmggYi9lbmNvZGVyL2Jhc2lzdV9vY2xfa2VybmVscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZGI2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9lbmNvZGVyL2Jhc2lzdV9vY2xfa2VybmVscy5oCkBAIC0wLDAgKzEsMTQzOSBAQAordW5zaWduZWQgY2hhciBvY2xfa2VybmVsc19jbFtdID0geworICAweDJmLCAweDJmLCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDVmLCAweDQ0LCAweDQ1LCAweDQyLCAweDU1LCAweDQ3LCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDIzLCAweDY5LCAweDY2LCAweDZlLCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDRlLCAweDU1LCAweDRjLCAweDRjLAorICAweDBkLCAweDBhLCAweDA5LCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDRlLCAweDU1LCAweDRjLCAweDRjLCAweDIwLCAweDMwLCAweDRjLCAweDBkLCAweDBhLCAweDIzLCAweDY1LCAweDZlLCAweDY0LCAweDY5LCAweDY2LCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LAorICAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDc1LCAweDYzLCAweDY4LCAweDYxLAorICAweDcyLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDY4LCAweDZmLCAweDcyLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDMxLAorICAweDM2LCAweDVmLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDc1LCAweDczLCAweDY4LCAweDZmLCAweDcyLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDNiLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDZjLCAweDZmLCAweDZlLCAweDY3LCAweDIwLCAweDY5LAorICAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDc1LCAweDZjLCAweDZmLCAweDZlLCAweDY3LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDNiLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDc1LCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDM0LCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDNiLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDU1LCAweDQ5LCAweDRlLCAweDU0LCAweDMzLCAweDMyLCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDIwLCAweDMwLCAweDc4LCAweDQ2LCAweDQ2LCAweDQ2LCAweDQ2LCAweDQ2LCAweDQ2LCAweDQ2LCAweDQ2LCAweDU1LAorICAweDRjLCAweDBkLCAweDBhLCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDQ5LCAweDRlLCAweDU0LCAweDM2LCAweDM0LCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDIwLCAweDRjLCAweDRmLCAweDRlLCAweDQ3LCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDBkLCAweDBhLCAweDIzLAorICAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDU1LCAweDQ5LCAweDRlLCAweDU0LCAweDM2LCAweDM0LCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDIwLCAweDU1LCAweDRjLCAweDRmLCAweDRlLCAweDQ3LCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDY5LAorICAweDZlLCAweDc0LCAweDIwLCAweDczLCAweDcxLCAweDc1LCAweDYxLCAweDcyLCAweDY1LCAweDY5LCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYxLCAweDI5LCAweDIwLCAweDdiLCAweDIwLCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDYxLCAweDIwLCAweDJhLCAweDIwLCAweDYxLAorICAweDNiLCAweDIwLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDIzLCAweDY5LCAweDY2LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDVmLCAweDQ0LCAweDQ1LCAweDQyLCAweDU1LCAweDQ3LCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDc2LCAweDZmLAorICAweDY5LCAweDY0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDcyLCAweDZlLCAweDYxLCAweDZjLCAweDVmLCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDc4LCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LAorICAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDcwLCAweDRkLCAweDczLCAweDY3LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDIxLCAweDc4LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI5LCAweDIwLCAweDY2LCAweDYxLAorICAweDY5LCAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDZmLCAweDZlLCAweDIwLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDI1LCAweDY5LCAweDNhLCAweDIwLCAweDI1LCAweDczLCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDJjLCAweDIwLCAweDcwLCAweDRkLAorICAweDczLCAweDY3LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDc4LCAweDI5LCAweDIwLCAweDY5LCAweDZlLCAweDc0LAorICAweDY1LCAweDcyLCAweDZlLCAweDYxLCAweDZjLCAweDVmLCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDc4LCAweDJjLCAweDIwLCAweDIzLCAweDc4LCAweDJjLCAweDIwLCAweDVmLCAweDVmLCAweDRjLCAweDQ5LCAweDRlLCAweDQ1LCAweDVmLCAweDVmLCAweDI5LCAweDBkLCAweDBhLCAweDIzLAorICAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDc4LCAweDI5LCAweDBkLCAweDBhLCAweDIzLCAweDY1LCAweDZlLCAweDY0LCAweDY5LCAweDY2LAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDY5LCAweDZlLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDIwLAorICAweDc4LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDc4LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDY5LCAweDZlLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LAorICAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDc4LCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDJhLCAweDcwLCAweDQ0LCAweDY5LCAweDY0LCAweDVmLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLAorICAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc4LCAweDIwLCAweDNjLCAweDIwLCAweDMwLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDJhLCAweDcwLCAweDQ0LCAweDY5LCAweDY0LCAweDVmLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDIwLAorICAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDIwLAorICAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc4LCAweDIwLCAweDNlLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDJhLCAweDcwLCAweDQ0LCAweDY5LCAweDY0LCAweDVmLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDIwLAorICAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcyLAorICAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDc4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LAorICAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LAorICAweDI5LCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLAorICAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLAorICAweDcwLCAweDY1LCAweDcyLCAweDZkLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLAorICAweDc1LCAweDYzLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LAorICAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLAorICAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDViLCAweDMxLCAweDM2LCAweDVkLCAweDNiLCAweDIwLCAweDJmLCAweDJmLAorICAweDIwLCAweDViLCAweDc5LCAweDJhLCAweDM0LCAweDJiLCAweDc4LCAweDVkLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LAorICAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLAorICAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDY1LCAweDMxLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDY1LCAweDMyLCAweDJjLCAweDIwLCAweDYyLAorICAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDI5LCAweDBkLAorICAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDIzLCAweDY5LCAweDY2LCAweDIwLCAweDMwLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDMzLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDIwLCAweDNkLAorICAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDMzLCAweDI5LCAweDI4LCAweDY1LCAweDMxLCAweDJlLCAweDc4LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc4LCAweDJjLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDc5LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLAorICAweDJlLCAweDc5LCAweDJjLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDdhLCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDdhLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDMzLCAweDIwLCAweDY0LCAweDY1LAorICAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLCAweDYyLCAweDYzLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLCAweDYyLCAweDYzLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDY0LCAweDZmLAorICAweDc0LCAweDI4LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDJjLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDMzLCAweDI5LCAweDI4LCAweDJlLCAweDMyLCAweDMxLCAweDMyLCAweDM2LCAweDY2LCAweDJjLCAweDIwLCAweDJlLCAweDM3LAorICAweDMxLCAweDM1LCAweDMyLCAweDY2LCAweDJjLCAweDIwLCAweDJlLCAweDMwLCAweDM3LCAweDMyLCAweDMyLCAweDY2LCAweDI5LCAweDI5LCAweDNiLCAweDIwLCAweDJmLCAweDJmLCAweDIwLCAweDc5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLAorICAweDYyLCAweDYzLCAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDNkLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJkLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLCAweDYyLCAweDYzLAorICAweDcyLCAweDJlLCAweDc4LCAweDNiLCAweDIwLCAweDJmLCAweDJmLCAweDIwLCAweDYzLCAweDcyLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLCAweDYyLCAweDYzLCAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDNkLCAweDIwLCAweDY0LCAweDY1LAorICAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJkLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLCAweDYyLCAweDYzLCAweDcyLCAweDJlLCAweDc4LCAweDNiLCAweDIwLCAweDJmLCAweDJmLCAweDIwLCAweDYzLCAweDYyLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLCAweDYyLCAweDYzLCAweDcyLCAweDIwLCAweDJhLCAweDNkLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLCAweDYyLCAweDYzLCAweDcyLAorICAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDIwLCAweDY0LCAweDIwLCAweDNkLCAweDIwLCAweDY0LCAweDZmLCAweDc0LCAweDI4LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDc5LCAweDYzLCAweDYyLCAweDYzLCAweDcyLAorICAweDJjLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDMzLCAweDI5LCAweDI4LCAweDMxLCAweDJlLCAweDMwLCAweDY2LCAweDJjLCAweDIwLCAweDMwLCAweDJlLCAweDMyLCAweDMwLCAweDMzLCAweDMxLCAweDMyLCAweDM1LCAweDY2LCAweDJjLCAweDIwLCAweDMwLCAweDJlLCAweDMwLCAweDMyLAorICAweDMzLCAweDM0LCAweDMzLCAweDM3LCAweDM1LCAweDY2LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYxLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDc3LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDA5LCAweDY0LCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYxLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY0LCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDY0LCAweDIwLCAweDJhLCAweDIwLCAweDMyLCAweDM1LCAweDM2LCAweDJlLCAweDMwLCAweDY2LCAweDIwLCAweDJiLCAweDIwLCAweDJlLCAweDM1LCAweDY2LCAweDJjLCAweDIwLAorICAweDMwLCAweDJlLCAweDMwLCAweDY2LCAweDJjLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDI5LCAweDU1LCAweDQ5LCAweDRlLCAweDU0LCAweDMzLCAweDMyLCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLAorICAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDIzLCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDU0LCAweDY4LAorICAweDY5LCAweDczLCAweDIwLCAweDZkLCAweDYxLCAweDc0LCAweDYzLCAweDY4LCAweDY1LCAweDczLCAweDIwLCAweDc0LCAweDY4LCAweDY1LCAweDIwLCAweDQzLCAweDUwLCAweDU1LCAweDIwLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDJjLCAweDIwLCAweDc3LCAweDY4LCAweDY5LCAweDYzLCAweDY4LCAweDIwLCAweDY5LAorICAweDczLCAweDIwLCAweDc1LCAweDczLCAweDY1LCAweDY2LCAweDc1LCAweDZjLCAweDIwLCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDc0LCAweDY1LCAweDczLCAweDc0LCAweDY5LCAweDZlLCAweDY3LCAweDJlLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDcyLCAweDIwLAorICAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDc4LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDc5LCAweDIwLAorICAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDdhLCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDdhLCAweDNiLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDJhLCAweDIwLCAweDMyLCAweDM3LCAweDIwLCAweDJiLCAweDIwLCAweDY0LCAweDY3LAorICAweDIwLCAweDJhLCAweDIwLCAweDM5LCAweDMyLCAweDIwLCAweDJiLCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDJhLCAweDIwLCAweDM5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYzLCAweDcyLCAweDIwLAorICAweDNkLCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDJhLCAweDIwLCAweDMxLCAweDMyLCAweDM4LCAweDIwLCAweDJkLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDZjLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY1LCAweDZjLAorICAweDc0LCAweDYxLCAweDVmLCAweDYzLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDJhLCAweDIwLCAweDMxLCAweDMyLCAweDM4LCAweDIwLCAweDJkLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDZjLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDY0LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDZjLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDY1LCAweDZjLAorICAweDc0LCAweDYxLCAweDVmLCAweDZjLCAweDI5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM3LCAweDU1LCAweDI5LCAweDIwLCAweDJiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDY1LCAweDZjLAorICAweDc0LCAweDYxLCAweDVmLCAweDYzLCAweDcyLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYzLCAweDcyLCAweDI5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM3LCAweDU1LCAweDI5LCAweDIwLCAweDJhLCAweDIwLCAweDMyLCAweDM2LCAweDU1LCAweDI5LCAweDIwLAorICAweDNlLCAweDNlLCAweDIwLCAweDM3LCAweDU1LCAweDI5LCAweDIwLCAweDJiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYzLCAweDYyLCAweDIwLAorICAweDJhLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYzLCAweDYyLCAweDI5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM3LCAweDU1LCAweDI5LCAweDIwLCAweDJhLCAweDIwLCAweDMzLCAweDU1LCAweDI5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM3LCAweDU1LCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDYxLAorICAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY1LCAweDMxLCAweDJlLCAweDc3LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc3LCAweDI5LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY0LCAweDIwLCAweDJiLCAweDNkLAorICAweDIwLCAweDI4LCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDYxLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDYxLCAweDI5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM3LCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDY5LCAweDY0LCAweDNiLCAweDBkLCAweDBhLCAweDIzLCAweDY1LCAweDZlLCAweDY0LCAweDY5LCAweDY2LCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDY1LAorICAweDZjLCAweDczLCAweDY1LCAweDIwLCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LAorICAweDMxLCAweDJlLCAweDc4LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDc5LCAweDIwLCAweDJkLCAweDIwLCAweDY1LAorICAweDMyLCAweDJlLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDdhLCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDdhLCAweDNiLCAweDA5LCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDYxLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDc3LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLAorICAweDZlLCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDJiLCAweDIwLCAweDY0LCAweDY3LCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDY3LCAweDIwLCAweDJiLCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDJiLCAweDIwLAorICAweDY0LCAweDYxLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDYxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDc4LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLAorICAweDc5LCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDMxLCAweDJlLCAweDdhLCAweDIwLCAweDJkLCAweDIwLCAweDY1LCAweDMyLCAweDJlLAorICAweDdhLCAweDNiLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDJiLCAweDIwLCAweDY0LCAweDY3LCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDY3LCAweDIwLAorICAweDJiLCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDJhLCAweDIwLCAweDY0LCAweDYyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLAorICAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLCAweDY1LCAweDc0LCAweDYzLAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDYyLCAweDY5LCAweDY3LCAweDIwLCAweDY1LCAweDZlLCAweDY0LCAweDY5LCAweDYxLCAweDZlLCAweDIwLCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDNhLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDNhLCAweDIwLCAweDIwLCAweDM1LCAweDM2LCAweDIwLCAweDIwLCAweDM0LCAweDM4LCAweDIwLCAweDIwLCAweDM0LCAweDMwLCAweDIwLAorICAweDIwLCAweDMzLCAweDMyLCAweDIwLCAweDIwLCAweDMyLCAweDM0LCAweDIwLCAweDIwLCAweDMxLCAweDM2LCAweDIwLCAweDIwLCAweDIwLCAweDM4LCAweDIwLCAweDIwLCAweDIwLCAweDMwLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDIwLCAweDZmLCAweDY2LAorICAweDczLCAweDNhLCAweDIwLCAweDYyLCAweDMwLCAweDJjLCAweDIwLCAweDYyLCAweDMxLCAweDJjLCAweDIwLCAweDYyLCAweDMyLCAweDJjLCAweDIwLCAweDYyLCAweDMzLCAweDJjLCAweDIwLCAweDYyLCAweDM0LCAweDJjLCAweDIwLCAweDYyLCAweDM1LCAweDJjLCAweDIwLCAweDYyLCAweDM2LCAweDJjLCAweDIwLCAweDYyLAorICAweDM3LCAweDIwLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDZlLCAweDY5LCAweDZmLCAweDZlLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDc1LCAweDY5LCAweDZlLAorICAweDc0LCAweDM2LCAweDM0LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDM4LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDNiLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDY1LCAweDZlLCAweDc1LCAweDZkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZlLAorICAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDczLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDUwLCAweDY1LCAweDcyLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDNkLAorICAweDIwLCAweDM4LCAweDU1LCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMyLCAweDU1LCAweDJjLAorICAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDU2LCAweDYxLCAweDZjLCAweDc1LCAweDY1LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDU1LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYzLAorICAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLAorICAweDcyLCAweDRkLCAweDYxLCAweDczLCAweDZiLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDU2LCAweDYxLCAweDZjLCAweDc1LCAweDY1LCAweDczLCAweDIwLCAweDJkLCAweDIwLCAweDMxLCAweDU1LAorICAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDUzLCAweDY4LCAweDY5LCAweDY2LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDMyLCAweDU1LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LAorICAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDUzLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDU1LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDUzLAorICAweDY4LCAweDY5LCAweDY2LCAweDc0LCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDRjLCAweDUzLCAweDQyLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDQ5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LAorICAweDczLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDRkLCAweDUzLCAweDQyLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LAorICAweDZmLCAweDcyLCAweDQ5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LCAweDczLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDM2LCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LAorICAweDQzLCAweDMxLCAweDQ2LCAweDZjLCAweDY5LCAweDcwLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDMyLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY5LCAweDY2LAorICAweDY2LCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDMzLCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDRkLAorICAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDRlLCAweDc1LCAweDZkLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLAorICAweDRkLCAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDU2LCAweDYxLCAweDZjLCAweDc1LCAweDY1LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLAorICAweDRkLCAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDRlLCAweDc1LCAweDZkLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUyLCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDQ5LCAweDZlLCAweDc0LAorICAweDY1LCAweDZlLCAweDRkLCAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDU0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDM0LCAweDJjLCAweDBkLCAweDBhLAorICAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDRjLCAweDY1LCAweDY2LCAweDc0LCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDRkLCAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDU0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDQyLCAweDY5LCAweDc0LCAweDRmLAorICAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDM3LCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDJiLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDIwLCAweDY1LCAweDZlLAorICAweDYzLCAweDZmLCAweDY0LCAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDI4LCAweDM1LCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDIwLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDczLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLAorICAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDIwLCAweDNkLCAweDIwLAorICAweDM1LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDRkLCAweDYxLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDIwLCAweDNjLAorICAweDNjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLAorICAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDJjLAorICAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYzLCAweDQ1LAorICAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLAorICAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDRkLCAweDYxLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LAorICAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLAorICAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDUyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM1LCAweDM5LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLAorICAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDQ3LCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM1LCAweDMxLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LAorICAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDQyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM0LCAweDMzLCAweDJjLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDUyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM1LAorICAweDM2LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDQ3LCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLAorICAweDNkLCAweDIwLCAweDM0LCAweDM4LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDQyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLAorICAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM0LCAweDMwLCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDQxLCAweDYyLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY1LCAweDIwLCAweDI4LCAweDZlLCAweDZmLCAweDZlLCAweDJkLCAweDY0LCAweDY1LAorICAweDZjLCAweDc0LCAweDYxLCAweDI5LCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDI4LCAweDc0LCAweDc3LCAweDZmLCAweDIwLCAweDM0LCAweDJkLCAweDYyLCAweDY5LCAweDc0LCAweDIwLCAweDcwLCAweDY1LCAweDcyLCAweDIwLCAweDYzLCAweDZmLCAweDZkLAorICAweDcwLCAweDZmLCAweDZlLCAweDY1LCAweDZlLCAweDc0LCAweDIwLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLAorICAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDM0LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLAorICAweDcwLCAweDRkLCAweDYxLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQzLCAweDZmLCAweDZkLCAweDcwLCAweDRlLCAweDc1LCAweDZkLAorICAweDQyLCAweDY5LCAweDc0LCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDUyLCAweDMxLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LAorICAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM2LCAweDMwLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDQ3LCAweDMxLCAweDQyLCAweDY5LCAweDc0LCAweDRmLAorICAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM1LCAweDMyLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDQyLCAweDMxLCAweDQyLCAweDY5LAorICAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM0LCAweDM0LCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LAorICAweDUyLCAweDMyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM1LCAweDM2LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDM0LCAweDQ3LCAweDMyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM0LCAweDM4LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLAorICAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDQyLCAweDMyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDM0LCAweDMwLCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDY5LCAweDZlLCAweDIwLCAweDNkLCAweDIwLCAweDJkLCAweDM0LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LAorICAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDYxLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDJjLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDNhLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLAorICAweDIwLCAweDMwLCAweDIwLCAweDIwLCAweDIwLCAweDMxLCAweDIwLCAweDIwLCAweDIwLCAweDMyLCAweDIwLCAweDIwLCAweDIwLCAweDMzLCAweDIwLCAweDIwLCAweDIwLCAweDM0LCAweDIwLCAweDIwLCAweDIwLCAweDM1LCAweDIwLCAweDIwLCAweDIwLCAweDM2LCAweDIwLCAweDIwLCAweDIwLCAweDM3LCAweDBkLCAweDBhLAorICAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDMwLCAweDMwLCAweDMwLCAweDIwLCAweDMwLCAweDMwLCAweDMxLCAweDIwLCAweDMwLCAweDMxLCAweDMwLCAweDIwLCAweDMwLCAweDMxLCAweDMxLCAweDIwLCAweDMxLCAweDMwLCAweDMwLCAweDIwLCAweDMxLCAweDMwLCAweDMxLCAweDIwLCAweDMxLCAweDMxLCAweDMwLCAweDIwLAorICAweDMxLCAweDMxLCAweDMxLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDMwLCAweDIwLCAweDIwLCAweDIwLCAweDMxLCAweDIwLCAweDIwLCAweDIwLCAweDMyLCAweDIwLCAweDIwLCAweDIwLCAweDMzLCAweDIwLCAweDIwLCAweDIwLCAweDJkLCAweDM0LCAweDIwLCAweDIwLCAweDJkLCAweDMzLCAweDIwLAorICAweDIwLCAweDJkLCAweDMyLCAweDIwLCAweDIwLCAweDJkLCAweDMxLCAweDBkLCAweDBhLCAweDdkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDQyLCAweDQxLCAweDUzLCAweDQ5LCAweDUzLCAweDU1LCAweDVmLCAweDQ1LCAweDU0LAorICAweDQzLCAweDMxLCAweDVmLCAweDQzLCAweDRjLCAweDU1LCAweDUzLCAweDU0LCAweDQ1LCAweDUyLCAweDVmLCAweDQ2LCAweDQ5LCAweDU0LCAweDVmLCAweDRmLCAweDUyLCAweDQ0LCAweDQ1LCAweDUyLCAweDVmLCAweDU0LCAweDQxLCAweDQyLCAweDRjLCAweDQ1LCAweDVmLCAweDUzLCAweDQ5LCAweDVhLCAweDQ1LCAweDIwLAorICAweDI4LCAweDMxLCAweDM2LCAweDM1LCAweDI5LCAweDBkLCAweDBhLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDdiLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LAorICAweDIwLCAweDZkLCAweDVmLCAweDc2LCAweDViLCAweDM0LCAweDVkLCAweDNiLCAweDIwLCAweDdkLCAweDIwLCAweDY3LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY2LCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDcyLCAweDY0LCAweDY1LCAweDcyLCAweDVmLCAweDc0LAorICAweDYxLCAweDYyLCAweDViLCAweDQyLCAweDQxLCAweDUzLCAweDQ5LCAweDUzLCAweDU1LCAweDVmLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDVmLCAweDQzLCAweDRjLCAweDU1LCAweDUzLCAweDU0LCAweDQ1LCAweDUyLCAweDVmLCAweDQ2LCAweDQ5LCAweDU0LCAweDVmLCAweDRmLCAweDUyLCAweDQ0LCAweDQ1LCAweDUyLAorICAweDVmLCAweDU0LCAweDQxLCAweDQyLCAweDRjLCAweDQ1LCAweDVmLCAweDUzLCAweDQ5LCAweDVhLCAweDQ1LCAweDVkLCAweDIwLCAweDNkLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDM4LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLAorICAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLAorICAweDM4LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLAorICAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLAorICAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM2LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLAorICAweDJjLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM3LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLAorICAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLAorICAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLAorICAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLAorICAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLAorICAweDMxLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLAorICAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLAorICAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLAorICAweDdiLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDIwLAorICAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM4LCAweDJjLAorICAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LAorICAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLAorICAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLAorICAweDMyLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLAorICAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM1LAorICAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLAorICAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLAorICAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLAorICAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLAorICAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLAorICAweDM2LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLAorICAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLAorICAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLAorICAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLAorICAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDJjLAorICAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLAorICAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLAorICAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLAorICAweDMzLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLAorICAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLAorICAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLAorICAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLAorICAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDJjLAorICAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLAorICAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLAorICAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLAorICAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLAorICAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLAorICAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLAorICAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLAorICAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM3LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLAorICAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLAorICAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLAorICAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLAorICAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLAorICAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLAorICAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLAorICAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMyLCAweDIwLAorICAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM4LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLAorICAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLAorICAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLAorICAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLAorICAweDMzLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLAorICAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLAorICAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLAorICAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDIwLAorICAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDJjLAorICAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LAorICAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLAorICAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLAorICAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM2LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLAorICAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLAorICAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LAorICAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLAorICAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLAorICAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLAorICAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLAorICAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLAorICAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMwLAorICAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLAorICAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLAorICAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLAorICAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLAorICAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLAorICAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLAorICAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLAorICAweDIwLCAweDdiLCAweDIwLCAweDM2LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LAorICAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLAorICAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLAorICAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLAorICAweDIwLCAweDMyLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLAorICAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM2LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLAorICAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLAorICAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM3LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLAorICAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM3LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLAorICAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLAorICAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMzLCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDM0LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLAorICAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLAorICAweDIwLCAweDM2LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM2LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLCAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDM1LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDJjLAorICAweDdiLCAweDIwLCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDM2LCAweDIwLCAweDdkLCAweDIwLCAweDdkLCAweDBkLCAweDBhLCAweDdkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLAorICAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDViLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLAorICAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDRkLCAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDU2LCAweDYxLCAweDZjLCAweDc1LCAweDY1LCAweDczLCAweDVkLCAweDViLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LAorICAweDZmLCAweDcyLCAweDU2LCAweDYxLCAweDZjLCAweDc1LCAweDY1LCAweDczLCAweDVkLCAweDIwLCAweDNkLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDJkLCAweDM4LCAweDJjLCAweDIwLCAweDIwLCAweDJkLCAweDMyLCAweDJjLCAweDIwLCAweDIwLCAweDIwLCAweDMyLCAweDJjLAorICAweDIwLCAweDIwLCAweDIwLCAweDM4LCAweDIwLCAweDdkLCAweDJjLCAweDIwLCAweDdiLCAweDIwLCAweDJkLCAweDMxLCAweDM3LCAweDJjLCAweDIwLCAweDIwLCAweDJkLCAweDM1LCAweDJjLCAweDIwLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDIwLCAweDMxLCAweDM3LCAweDIwLCAweDdkLCAweDJjLCAweDIwLCAweDdiLAorICAweDIwLCAweDJkLCAweDMyLCAweDM5LCAweDJjLCAweDIwLCAweDIwLCAweDJkLCAweDM5LCAweDJjLCAweDIwLCAweDIwLCAweDIwLCAweDM5LCAweDJjLCAweDIwLCAweDIwLCAweDMyLCAweDM5LCAweDIwLCAweDdkLCAweDJjLCAweDIwLCAweDdiLCAweDIwLCAweDIwLCAweDJkLCAweDM0LCAweDMyLCAweDJjLCAweDIwLCAweDJkLAorICAweDMxLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDMzLCAweDJjLCAweDIwLCAweDIwLCAweDM0LCAweDMyLCAweDIwLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDJkLCAweDM2LCAweDMwLCAweDJjLCAweDIwLCAweDJkLCAweDMxLCAweDM4LCAweDJjLCAweDIwLCAweDMxLCAweDM4LCAweDJjLAorICAweDIwLCAweDIwLCAweDM2LCAweDMwLCAweDIwLCAweDdkLCAweDJjLCAweDIwLCAweDdiLCAweDIwLCAweDJkLCAweDM4LCAweDMwLCAweDJjLCAweDIwLCAweDJkLCAweDMyLCAweDM0LCAweDJjLCAweDIwLCAweDMyLCAweDM0LCAweDJjLCAweDIwLCAweDIwLCAweDM4LCAweDMwLCAweDIwLCAweDdkLCAweDJjLCAweDIwLCAweDdiLAorICAweDIwLCAweDJkLCAweDMxLCAweDMwLCAweDM2LCAweDJjLCAweDIwLCAweDJkLCAweDMzLCAweDMzLCAweDJjLCAweDIwLCAweDMzLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDMwLCAweDM2LCAweDIwLCAweDdkLCAweDJjLCAweDIwLCAweDdiLCAweDIwLCAweDJkLCAweDMxLCAweDM4LCAweDMzLCAweDJjLCAweDIwLCAweDJkLAorICAweDM0LCAweDM3LCAweDJjLCAweDIwLCAweDM0LCAweDM3LCAweDJjLCAweDIwLCAweDMxLCAweDM4LCAweDMzLCAweDIwLCAweDdkLCAweDBkLCAweDBhLCAweDdkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDc0LCAweDZmLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDViLCAweDYzLAorICAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDU2LCAweDYxLCAweDZjLCAweDc1LCAweDY1LCAweDczLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDdiLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMxLCAweDJjLAorICAweDIwLCAweDMwLCAweDIwLCAweDdkLCAweDNiLCAweDBkLCAweDBhLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDY3LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LAorICAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVmLCAweDc0LCAweDZmLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDViLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDU2LCAweDYxLAorICAweDZjLCAweDc1LCAweDY1LCAweDczLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDdiLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMxLCAweDIwLCAweDdkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLAorICAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLAorICAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDJjLCAweDIwLCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDJiLCAweDIwLAorICAweDZlLCAweDc1LCAweDZkLCAweDI5LCAweDIwLCAweDNjLCAweDNkLCAweDIwLCAweDM2LCAweDM0LCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDZlLCAweDc1LCAweDZkLCAweDIwLCAweDI2LCAweDI2LCAweDIwLCAweDI4LCAweDZlLAorICAweDc1LCAweDZkLCAweDIwLCAweDNjLCAweDNkLCAweDIwLCAweDM4LCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDIwLAorICAweDNkLCAweDNkLCAweDIwLCAweDI4LCAweDI4LCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDJiLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDIwLCAweDJkLCAweDIwLCAweDMxLCAweDI5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLAorICAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDM3LCAweDIwLCAweDJkLCAweDIwLCAweDI4LCAweDZmLCAweDY2LCAweDczLAorICAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LAorICAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLAorICAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDVkLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDI5LAorICAweDIwLCAweDI2LCAweDIwLCAweDI4LCAweDI4LCAweDMxLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDI5LCAweDIwLCAweDJkLCAweDIwLCAweDMxLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLAorICAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZlLCAweDc1LCAweDZkLAorICAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDZmLCAweDY2LAorICAweDczLCAweDIwLCAweDJiLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDI5LCAweDIwLCAweDNjLCAweDNkLCAweDIwLCAweDM2LCAweDM0LCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDZlLCAweDc1LCAweDZkLCAweDIwLCAweDI2LAorICAweDI2LCAweDIwLCAweDI4LCAweDZlLCAweDc1LCAweDZkLCAweDIwLCAweDNjLCAweDIwLCAweDMzLCAweDMyLCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNlLCAweDNlLAorICAweDIwLCAweDMzLCAweDI5LCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDI4LCAweDI4LCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDJiLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDIwLCAweDJkLCAweDIwLCAweDMxLCAweDI5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDI5LCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDIwLCAweDNjLCAweDIwLCAweDI4LCAweDMxLCAweDU1LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDM3LCAweDIwLCAweDJkLCAweDIwLCAweDI4LCAweDZmLAorICAweDY2LCAweDczLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLAorICAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLAorICAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDYxLCAweDczLCAweDZiLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDMxLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDI5LCAweDIwLCAweDJkLCAweDIwLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDJkLCAweDNlLAorICAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDVkLCAweDIwLCAweDI2LCAweDNkLCAweDIwLCAweDdlLCAweDI4LCAweDZkLCAweDYxLCAweDczLCAweDZiLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYyLAorICAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLAorICAweDZmLCAweDY2LCAweDczLCAweDVkLCAweDIwLCAweDdjLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDI5LCAweDNiLCAweDBkLAorICAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY2LCAweDZjLCAweDY5LCAweDcwLCAweDVmLCAweDYyLCAweDY5LAorICAweDc0LCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LAorICAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDI5LCAweDIwLCAweDIxLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLAorICAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY2LCAweDZjLCAweDY5LCAweDcwLCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDY1LAorICAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDY2LCAweDZjLCAweDY5LCAweDcwLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDJkLCAweDNlLAorICAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDI2LCAweDNkLCAweDIwLCAweDdlLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLAorICAweDVkLCAweDIwLCAweDdjLCAweDNkLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDY2LCAweDZjLCAweDY5LCAweDcwLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYyLCAweDZmLCAweDZmLCAweDZjLAorICAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY5LCAweDY2LCAweDY2LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDc0LAorICAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLAorICAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDI2LCAweDIwLCAweDMyLCAweDI5LCAweDIwLCAweDIxLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LAorICAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY5LCAweDY2LCAweDY2LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLAorICAweDcwLCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDY0LCAweDY5LCAweDY2LCAweDY2LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLCAweDVkLAorICAweDIwLCAweDI2LCAweDNkLCAweDIwLCAweDdlLCAweDMyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDdjLCAweDNkLCAweDIwLCAweDI4LCAweDI4LCAweDc1LCAweDY5LCAweDZlLAorICAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDY5LCAweDY2LCAweDY2LCAweDI5LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMxLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDUyLCAweDY1LCAweDc0LAorICAweDc1LCAweDcyLCAweDZlLCAweDczLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDczLCAweDY5LCAweDc0LCAweDc5LCAweDIwLCAweDZkLCAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDIwLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLCAweDI4LCAweDMwLAorICAweDJkLCAweDM3LCAweDI5LCAweDIwLCAweDc1LCAweDczLCAweDY1LCAweDY0LCAweDIwLCAweDYyLCAweDc5LCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDY0LAorICAweDJlLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDY0LCAweDNkLCAweDMwLCAweDIwLCAweDZjLCAweDY1LCAweDY2LCAweDc0LCAweDJmLCAweDc0LCAweDZmLCAweDcwLCAweDIwLCAweDI4LCAweDQzLCAweDU3LAorICAweDIwLCAweDMxLCAweDI5LCAweDJjLCAweDIwLCAweDMxLCAweDNkLCAweDcyLCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDJmLCAweDYyLCAweDZmLCAweDc0LCAweDc0LCAweDZmLCAweDZkLCAweDIwLCAweDI4LCAweDQzLCAweDU3LCAweDIwLCAweDMyLCAweDI5LCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LAorICAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDI4LCAweDYzLAorICAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLAorICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDY0LCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LAorICAweDY0LCAweDIwLCAweDNjLCAweDIwLCAweDMyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDczLAorICAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDY0LCAweDIwLCAweDNmLCAweDIwLCAweDMyLCAweDIwLCAweDNhLCAweDIwLCAweDM1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDcwLCAweDJkLAorICAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLAorICAweDJmLCAweDIwLCAweDUzLCAweDY1LCAweDc0LCAweDczLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDczLCAweDY5LCAweDc0LCAweDc5LCAweDIwLCAweDZkLCAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDIwLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLAorICAweDI4LCAweDMwLCAweDJkLCAweDM3LCAweDI5LCAweDIwLCAweDc1LCAweDczLCAweDY1LCAweDY0LCAweDIwLCAweDYyLCAweDc5LCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLAorICAweDY5LCAweDY0LCAweDIwLCAweDI4LCAweDMwLCAweDIwLCAweDZmLCAweDcyLCAweDIwLCAweDMxLCAweDI5LCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLAorICAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLAorICAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDY0LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLAorICAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDY0LCAweDIwLCAweDNjLCAweDIwLCAweDMyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LAorICAweDcyLCAweDc0LCAweDI4LCAweDc0LCAweDIwLCAweDNjLCAweDIwLCAweDM4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDIwLAorICAweDNkLCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDY0LCAweDIwLCAweDNmLCAweDIwLCAweDMyLCAweDIwLCAweDNhLCAweDIwLCAweDM1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LAorICAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDI2LCAweDNkLCAweDIwLCAweDdlLCAweDI4LCAweDM3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LAorICAweDc0LCAweDY1LCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDdjLCAweDNkLCAweDIwLCAweDI4LCAweDc0LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LAorICAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLAorICAweDczLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLAorICAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDI4LCAweDcwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDc0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LAorICAweDI4LCAweDcwLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDc0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDcyLCAweDYxLCAweDc3LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLAorICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc4LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLAorICAweDVmLCAweDc0LCAweDIwLCAweDc5LCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDc4LCAweDIwLCAweDdjLCAweDIwLCAweDc5LCAweDI5LCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLAorICAweDc4LCAweDIwLCAweDJhLCAweDIwLCAweDM0LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LAorICAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLAorICAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDIwLCAweDNkLCAweDIwLCAweDI2LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLAorICAweDM3LCAweDIwLCAweDJkLCAweDIwLCAweDI4LCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LAorICAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZjLCAweDczLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcwLCAweDViLCAweDMwLCAweDVkLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLAorICAweDZmLCAweDY2LCAweDczLCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDczLCAweDYyLCAweDIwLCAweDNkLAorICAweDIwLCAweDI4LCAweDcwLCAweDViLCAweDJkLCAweDMyLCAweDVkLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc2LCAweDYxLCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDZjLCAweDczLCAweDYyLCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDZkLCAweDczLCAweDYyLCAweDIwLAorICAweDNjLCAweDNjLCAweDIwLCAweDMxLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDc2LCAweDYxLCAweDZjLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLAorICAweDUyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDY1LCAweDY0LCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDIwLCAweDc2LCAweDYxLCAweDZjLCAweDc1LCAweDY1LCAweDIwLCAweDcyLCAweDYxLCAweDZlLCAweDY3LCAweDY1LCAweDczLCAweDIwLCAweDY2LAorICAweDcyLCAweDZmLCAweDZkLCAweDIwLCAweDMwLCAweDJkLCAweDMzLCAweDIwLCAweDYxLCAweDZlLCAweDY0LCAweDIwLCAweDY5LCAweDczLCAweDIwLCAweDYxLCAweDIwLCAweDY0LCAweDY5LCAweDcyLCAweDY1LCAweDYzLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDY5LCAweDZlLAorICAweDc0LCAweDZmLCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDJlLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLAorICAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY1LAorICAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc4LCAweDJjLCAweDIwLCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc5LCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDc0LCAweDZmLAorICAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDViLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDcyLCAweDYxLAorICAweDc3LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc4LCAweDJjLCAweDIwLCAweDc5LCAweDI5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDIwLCAweDIyLCAweDc2LCAweDYxLCAweDZjLCAweDIyLCAweDIwLCAweDcyLCAweDYxLCAweDZlLCAweDY3LCAweDY1LCAweDczLCAweDIwLCAweDY2LCAweDcyLCAweDZmLCAweDZkLCAweDIwLCAweDMwLAorICAweDJkLCAweDMzLCAweDIwLCAweDYxLCAweDZlLCAweDY0LCAweDIwLCAweDY5LCAweDczLCAweDIwLCAweDYxLCAweDIwLCAweDY0LCAweDY5LCAweDcyLCAweDY1LCAweDYzLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDZmLCAweDIwLCAweDY3LCAweDVmLAorICAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDJlLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc4LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc5LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLAorICAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc2LCAweDYxLCAweDZjLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDc4LCAweDIwLCAweDdjLCAweDIwLCAweDc5LCAweDIwLCAweDdjLCAweDIwLCAweDc2LCAweDYxLAorICAweDZjLCAweDI5LCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLAorICAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDc4LCAweDIwLCAweDJhLCAweDIwLCAweDM0LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDIwLAorICAweDNkLCAweDIwLCAweDI2LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDM3LCAweDIwLCAweDJkLCAweDIwLCAweDI4LCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LAorICAweDc4LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDc5LCAweDc0LAorICAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLAorICAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDYxLCAweDczLCAweDZiLCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LAorICAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDc2LCAweDYxLAorICAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVmLCAweDc0LCAweDZmLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDViLCAweDc2LCAweDYxLCAweDZjLAorICAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZjLCAweDczLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLAorICAweDMxLCAweDVmLCAweDc2LCAweDYxLCAweDZjLCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDczLCAweDYyLCAweDIwLAorICAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDc2LCAweDYxLCAweDZjLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDViLCAweDMwLCAweDVkLCAweDIwLCAweDI2LCAweDNkLCAweDIwLCAweDdlLCAweDZkLCAweDYxLAorICAweDczLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDViLCAweDMwLCAweDVkLCAweDIwLCAweDdjLCAweDNkLCAweDIwLCAweDI4LCAweDZjLCAweDczLCAweDYyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLAorICAweDY2LCAweDczLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDViLCAweDJkLCAweDMyLCAweDVkLCAweDIwLCAweDI2LCAweDNkLCAweDIwLCAweDdlLCAweDZkLCAweDYxLCAweDczLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDViLCAweDJkLCAweDMyLCAweDVkLAorICAweDIwLCAweDdjLCAweDNkLCAweDIwLCAweDI4LCAweDZkLCAweDczLCAweDYyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LAorICAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDY0LCAweDc4LCAweDJjLAorICAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY5LCAweDY0LCAweDc4LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLAorICAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDUyLCAweDMyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLAorICAweDI4LCAweDYzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM4LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LAorICAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDM0LCAweDQ3LCAweDMyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDI4LCAweDYzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM0LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDM1LCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDQyLCAweDMyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LAorICAweDJjLCAweDIwLCAweDYzLCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LAorICAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDUyLCAweDMxLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDI4LCAweDYzLCAweDIwLCAweDNlLCAweDNlLAorICAweDIwLCAweDM4LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LAorICAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDQ3LCAweDMxLCAweDQyLCAweDY5LAorICAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDI4LCAweDYzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM0LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LAorICAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLAorICAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDQyLCAweDMxLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDJjLCAweDIwLCAweDYzLCAweDIwLCAweDI2LAorICAweDIwLCAweDMxLCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDY0LCAweDc4LCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDcyLCAweDJjLCAweDIwLCAweDY3LCAweDJjLCAweDIwLCAweDYyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY5LCAweDY0LCAweDc4LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLAorICAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LAorICAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDUyLCAweDMyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LAorICAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LAorICAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDQ3LCAweDMyLCAweDQyLCAweDY5LAorICAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LAorICAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDM0LCAweDQyLCAweDMyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LAorICAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLAorICAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDUyLCAweDMxLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLAorICAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LAorICAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDQ3LCAweDMxLCAweDQyLAorICAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LAorICAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQxLCAweDYyLCAweDczLCAweDQzLCAweDZmLCAweDZjLAorICAweDZmLCAweDcyLCAweDM0LCAweDQyLCAweDMxLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLAorICAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDYyLCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM0LCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLAorICAweDNjLCAweDIwLCAweDM4LCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LAorICAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLAorICAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LAorICAweDUyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDI4LCAweDYzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMxLCAweDMwLCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDI5LCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLAorICAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDQ3LCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLAorICAweDI4LCAweDYzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM1LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLAorICAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDM1LCAweDQyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM1LCAweDJjLCAweDIwLCAweDYzLCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LAorICAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LAorICAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LAorICAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDM1LCAweDUyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLAorICAweDVmLCAweDc0LCAweDIwLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLAorICAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDQ3LCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LAorICAweDJjLCAweDIwLCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLAorICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLAorICAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDQyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LAorICAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDYyLCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM1LCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDcyLAorICAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMxLCAweDMwLCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLAorICAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLAorICAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDUyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDI4LCAweDYzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM2LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDM3LAorICAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDQ3LCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLAorICAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDI4LCAweDYzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLAorICAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDQyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDMzLCAweDJjLCAweDIwLCAweDYzLCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDVmLAorICAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI5LCAweDIwLCAweDBkLAorICAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLAorICAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDUyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLAorICAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDQ3LCAweDQyLCAweDY5LAorICAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDIwLAorICAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLAorICAweDJjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDMzLCAweDQyLCAweDQyLCAweDY5LCAweDc0LCAweDRmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDMzLCAweDI5LAorICAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDYyLCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLAorICAweDMzLCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM2LCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc1LCAweDZlLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUyLCAweDJjLCAweDIwLCAweDY5LCAweDZlLAorICAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDQ3LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLAorICAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLAorICAweDc0LCAweDYxLCAweDMzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM2LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LAorICAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMzLCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDYxLCAweDYzLAorICAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDIwLCAweDI2LCAweDIwLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNlLCAweDNkLCAweDIwLCAweDM0LCAweDI5LCAweDIwLCAweDcyLCAweDIwLAorICAweDJkLCAweDNkLCAweDIwLCAweDM4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNlLCAweDNkLCAweDIwLCAweDM0LCAweDI5LCAweDIwLCAweDY3LCAweDIwLCAweDJkLCAweDNkLCAweDIwLCAweDM4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LAorICAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDNlLCAweDNkLCAweDIwLCAweDM0LCAweDI5LCAweDIwLCAweDYyLCAweDIwLCAweDJkLCAweDNkLCAweDIwLCAweDM4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDJhLCAweDcwLCAweDUyLCAweDIwLCAweDNkLCAweDIwLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDJhLAorICAweDcwLCAweDQ3LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDJhLCAweDcwLCAweDQyLCAweDIwLCAweDNkLCAweDIwLCAweDYyLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDY1LCAweDc0LAorICAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc1LCAweDZlLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI4LCAweDYzLCAweDZmLCAweDZjLAorICAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDUyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LAorICAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLAorICAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDI5LCAweDBkLCAweDBhLAorICAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDcyLCAweDJjLCAweDIwLCAweDY0LCAweDY3LCAweDJjLCAweDIwLCAweDY0LCAweDYyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLAorICAweDc1LCAweDZlLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI4LCAweDI2LCAweDY0LCAweDcyLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDY3LCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYyLCAweDJjLCAweDIwLCAweDcwLCAweDYxLCAweDYzLAorICAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LAorICAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDI5LCAweDIwLCAweDJiLCAweDIwLCAweDY0LCAweDYyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDI4LAorICAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM1LCAweDU1LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDI5LCAweDIwLCAweDJiLCAweDIwLCAweDY0LAorICAweDY3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDIwLCAweDNlLCAweDNlLCAweDIwLAorICAweDMxLCAweDMwLCAweDU1LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDI5LCAweDIwLCAweDJiLCAweDIwLCAweDY0LCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDc1LCAweDYzLCAweDYzLCAweDY1LAorICAweDczLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDcyLCAweDIwLCAweDdjLCAweDIwLAorICAweDY3LCAweDIwLCAweDdjLCAweDIwLCAweDYyLCAweDI5LCAweDIwLCAweDNlLCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDczLCAweDc1LCAweDYzLCAweDYzLCAweDY1LCAweDczLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDY2LAorICAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDcyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDMxLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDY3LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDMxLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLAorICAweDZkLCAweDcwLCAweDI4LCAweDYyLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMzLCAweDMxLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LAorICAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLAorICAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDU1LCAweDI5LAorICAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDU1LCAweDI5LCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDJhLCAweDcwLCAweDUyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LAorICAweDcyLCAweDJjLCAweDIwLCAweDY3LCAweDJjLCAweDIwLCAweDYyLCAweDJjLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LAorICAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDczLCAweDc1LCAweDYzLCAweDYzLCAweDY1LCAweDczLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDY1LAorICAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc1LCAweDZlLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLAorICAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LAorICAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDYxLAorICAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY3LCAweDIwLAorICAweDNkLCAweDIwLCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM1LCAweDU1LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDNiLCAweDBkLCAweDBhLAorICAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDIwLCAweDNlLCAweDNlLCAweDIwLAorICAweDMxLCAweDMwLCAweDU1LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLAorICAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDcyLCAweDJjLCAweDIwLCAweDY3LCAweDJjLCAweDIwLCAweDYyLCAweDJjLCAweDIwLCAweDZkLAorICAweDY5LCAweDZlLCAweDI4LCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LAorICAweDYyLCAweDYxLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc1LCAweDZlLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLAorICAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDIwLAorICAweDNkLCAweDIwLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDM1LCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLAorICAweDc0LCAweDIwLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM0LCAweDU1LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDM1LAorICAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LAorICAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM4LCAweDU1LCAweDI5LCAweDIwLCAweDI2LCAweDIwLCAweDMxLCAweDM1LCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLAorICAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM0LCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDYyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLAorICAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM0LCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDY3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM0LCAweDU1LCAweDI5LCAweDIwLAorICAweDdjLCAweDIwLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LAorICAweDI4LCAweDcyLCAweDJjLCAweDIwLCAweDY3LCAweDJjLCAweDIwLCAweDYyLCAweDJjLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDYxLCAweDZjLCAweDcwLCAweDY4LCAweDYxLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLAorICAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDIwLCAweDY5LCAweDY2LCAweDIwLCAweDY0LCAweDY5LCAweDY0LCAweDZlLCAweDI3LCAweDc0LCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LAorICAweDY1LCAweDIwLCAweDY5LCAweDY2LCAweDIwLCAweDYxLCAweDZlLCAweDc5LCAweDIwLCAweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDZmLCAweDZlLCAweDY1LCAweDZlLCAweDc0LCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDY1LCAweDY0LCAweDBkLCAweDBhLCAweDYyLCAweDZmLCAweDZmLCAweDZjLAorICAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDI4LCAweDYzLCAweDZmLCAweDZlLCAweDczLAorICAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDJhLAorICAweDIwLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYyLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLAorICAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY5LCAweDY2LCAweDY2LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDI5LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDI5LCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc1LCAweDZlLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LAorICAweDYxLCAweDMzLCAweDI4LCAweDI2LCAweDYyLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI5LCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDVmLCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI5LCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDZjLCAweDczLAorICAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc1LCAweDZlLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDM1LCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDI5LCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDc1LCAweDZlLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDI4LCAweDY1LAorICAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLAorICAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDI5LCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDJhLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LAorICAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDViLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLAorICAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDI5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDY0LCAweDYzLCAweDIwLCAweDNkLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMwLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLAorICAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLAorICAweDZjLCAweDY1LCAweDViLCAweDMwLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLAorICAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMwLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LAorICAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMwLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLAorICAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMxLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDcwLAorICAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMxLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LAorICAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMxLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLAorICAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLAorICAweDY1LCAweDViLCAweDMxLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDczLCAweDViLCAweDMyLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLAorICAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMyLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDYzLAorICAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLAorICAweDMyLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LAorICAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMyLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLAorICAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMzLCAweDVkLAorICAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LAorICAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMzLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDVmLCAweDY2LCAweDZjLCAweDYxLCAweDY3LAorICAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMzLCAweDVkLCAweDJjLCAweDIwLCAweDI2LCAweDY0LCAweDYzLCAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LAorICAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDY0LCAweDYzLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLAorICAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDM1LCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLAorICAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDYxLCAweDczLCAweDY1LAorICAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDJjLCAweDIwLCAweDYyLAorICAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDJmLCAweDJhLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDIwLCAweDJhLCAweDJmLCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLAorICAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LAorICAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDIxLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDNjLAorICAweDNjLCAweDIwLCAweDMzLCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDJlLCAweDc5LAorICAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLAorICAweDJlLCAweDdhLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLAorICAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDJhLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc0LAorICAweDYzLCAweDMxLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDViLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMwLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLAorICAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMwLCAweDVkLAorICAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMwLAorICAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLAorICAweDMwLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMxLCAweDVkLCAweDIwLCAweDNkLCAweDIwLAorICAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LAorICAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMxLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLAorICAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMxLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LAorICAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMxLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMyLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LAorICAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMyLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LAorICAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMyLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLAorICAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMyLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLAorICAweDYxLCAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDMzLAorICAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLAorICAweDMzLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LAorICAweDViLCAweDMzLCAweDVkLCAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLAorICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY0LCAweDY1LCAweDc0LCAweDY1LCAweDcyLCAweDZkLCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDJhLCAweDIwLCAweDcwLCAweDUzLAorICAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDc1LAorICAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDY3LCAweDY5LCAweDZlLCAweDVmLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJmLCAweDJhLCAweDNkLCAweDIwLCAweDMwLCAweDJhLCAweDJmLCAweDJjLCAweDIwLAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDZlLCAweDY0LCAweDVmLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJmLCAweDJhLCAweDNkLCAweDIwLCAweDMyLCAweDJhLCAweDJmLCAweDI5LCAweDBkLCAweDBhLAorICAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDNkLCAweDIwLCAweDYyLCAweDY1LCAweDY3LCAweDY5LCAweDZlLAorICAweDVmLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNiLCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDNjLCAweDIwLCAweDY1LCAweDZlLCAweDY0LCAweDVmLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDNiLCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLAorICAweDYxLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDM0LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLAorICAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDJjLCAweDIwLCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLAorICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY2LCAweDZjLCAweDY5LCAweDcwLCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI5LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDc5LCAweDIwLCAweDNjLCAweDIwLCAweDMyLCAweDNiLCAweDIwLAorICAweDc5LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc4LCAweDIwLAorICAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDc4LCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDc4LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDU1LCAweDQ5LCAweDRlLCAweDU0LCAweDM2LCAweDM0LCAweDVmLCAweDRkLCAweDQxLCAweDU4LAorICAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDczLAorICAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDczLCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LAorICAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LAorICAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDczLCAweDVkLCAweDJjLCAweDIwLCAweDcwLCAweDUzLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDVmLCAweDcwLCAweDY5LCAweDc4LAorICAweDY1LCAweDZjLCAweDczLCAweDViLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDI4LCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDIwLCAweDMyLCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDI5LCAweDIwLCAweDJhLCAweDIwLCAweDM0LCAweDVkLCAweDJjLAorICAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LAorICAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDIwLCAweDNkLAorICAweDIwLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc4LCAweDJjLCAweDIwLCAweDczLAorICAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDIwLCAweDMyLCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDJjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLAorICAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDc5LCAweDIwLCAweDNjLCAweDIwLAorICAweDM0LCAweDNiLCAweDIwLCAweDc5LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LAorICAweDIwLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDc4LCAweDIwLCAweDNjLCAweDIwLCAweDMyLCAweDNiLCAweDIwLCAweDc4LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorICAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LAorICAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDU1LCAweDQ5LCAweDRlLCAweDU0LCAweDM2LCAweDM0LCAweDVmLAorICAweDRkLCAweDQxLCAweDU4LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMwLAorICAweDNiLCAweDIwLCAweDczLCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDczLCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLAorICAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LAorICAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDczLCAweDVkLCAweDJjLCAweDIwLCAweDcwLCAweDUzLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDVmLAorICAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDViLCAweDI4LCAweDczLCAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDIwLCAweDMyLCAweDI5LCAweDIwLCAweDJiLCAweDIwLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDIwLCAweDJhLCAweDIwLAorICAweDM0LCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYyLCAweDY1LCAweDczLAorICAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LAorICAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorICAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDczLAorICAweDc1LCAweDYyLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDIwLCAweDMyLCAweDIwLCAweDJiLCAweDIwLCAweDc4LCAweDJjLCAweDIwLCAweDc5LCAweDJjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLAorICAweDcyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLAorICAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLAorICAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLAorICAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDI4LCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDcyLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY3LCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLAorICAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY5LCAweDYxLAorICAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDMyLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDJhLCAweDIwLCAweDMxLCAweDM1LCAweDU1LCAweDIwLCAweDJiLCAweDIwLCAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDI5LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LAorICAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDJhLCAweDIwLCAweDMxLCAweDM1LCAweDU1LCAweDIwLCAweDJiLCAweDIwLCAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDI5LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LAorICAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDJhLCAweDIwLCAweDMxLCAweDM1LCAweDU1LCAweDIwLCAweDJiLCAweDIwLCAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDI5LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDcyLCAweDJjLCAweDIwLCAweDMxLCAweDM1LCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LAorICAweDY3LCAweDJjLCAweDIwLCAweDMxLCAweDM1LCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDYyLCAweDJjLCAweDIwLCAweDMxLCAweDM1LCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LAorICAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDYyLCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM0LCAweDU1LCAweDI5LCAweDIwLAorICAweDdjLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM4LCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDZmLAorICAweDZjLCAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLAorICAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDMyLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLAorICAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDJjLAorICAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDJjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLAorICAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDcyLCAweDJjLCAweDIwLCAweDY5LAorICAweDZlLCAweDc0LCAweDIwLCAweDY3LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYyLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDcyLCAweDIwLCAweDNlLCAweDNkLCAweDIwLCAweDYzLAorICAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDY5LCAweDZlLCAweDI5LCAweDIwLCAweDI2LCAweDI2LCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDNkLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLAorICAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDYxLCAweDc4LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDY3LCAweDIwLCAweDNlLCAweDNkLAorICAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDY5LCAweDZlLCAweDI5LCAweDIwLCAweDI2LCAweDI2LCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNkLCAweDIwLCAweDYzLCAweDQ1LAorICAweDU0LCAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDYxLCAweDc4LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDczLCAweDczLCAweDY1LCAweDcyLCAweDc0LCAweDI4LCAweDI4LCAweDYyLCAweDIwLAorICAweDNlLCAweDNkLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDY5LCAweDZlLCAweDI5LCAweDIwLCAweDI2LCAweDI2LCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDNjLCAweDNkLCAweDIwLAorICAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDYxLCAweDc4LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDIwLAorICAweDMwLCAweDI5LCAweDIwLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDM4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDIwLCAweDMwLCAweDI5LCAweDIwLCAweDY3LCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDM4LCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDNjLCAweDIwLCAweDMwLCAweDI5LCAweDIwLCAweDYyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDM4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDc1LAorICAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDYyLCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM2LCAweDI5LAorICAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLAorICAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LAorICAweDY5LCAweDY2LCAweDY2LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLAorICAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDMwLCAweDJjLAorICAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDI4LCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLAorICAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLAorICAweDY1LCAweDM0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDMxLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLAorICAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM0LCAweDI4LCAweDYzLCAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLAorICAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLAorICAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDcyLCAweDJjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY3LCAweDJjLAorICAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LAorICAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDMyLCAweDM3LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDYzLCAweDYxLCAweDZjLAorICAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDJhLCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDIwLCAweDJiLCAweDIwLCAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDI5LCAweDIwLAorICAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDJhLCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDIwLCAweDJiLCAweDIwLCAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDI5LCAweDIwLAorICAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDIwLCAweDJhLCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDIwLCAweDJiLCAweDIwLCAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDI5LCAweDIwLAorICAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDU1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDcyLCAweDJjLCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDY3LCAweDJjLCAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDYyLCAweDJjLAorICAweDIwLCAweDMzLCAweDMxLCAweDU1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDYyLCAweDIwLCAweDdjLAorICAweDIwLCAweDI4LCAweDY3LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDM1LCAweDU1LCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDcyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMxLCAweDMwLCAweDU1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDI4LCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDJjLCAweDIwLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDcyLAorICAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDI4LAorICAweDYzLCAweDJlLCAweDc4LCAweDJjLCAweDIwLCAweDYzLCAweDJlLCAweDc5LCAweDJjLCAweDIwLCAweDYzLCAweDJlLCAweDdhLCAweDJjLCAweDIwLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLAorICAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDI4LCAweDY1LCAweDc0LAorICAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LAorICAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LAorICAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY5LCAweDY2LCAweDY2LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDcwLCAweDQyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLAorICAweDczLCAweDY1LCAweDM1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLAorICAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDI4LCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDc4LCAweDIwLCAweDJkLCAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLAorICAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LAorICAweDJlLCAweDc5LCAweDIwLCAweDJkLCAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLAorICAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDdhLCAweDIwLCAweDJkLCAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDdhLCAweDNiLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI4LCAweDY0LCAweDcyLCAweDJjLCAweDIwLCAweDY0LAorICAweDY3LCAweDJjLCAweDIwLCAweDY0LCAweDYyLCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LAorICAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLAorICAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLAorICAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY5LCAweDY2LCAweDY2LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLAorICAweDYxLCAweDczLCAweDY1LCAweDM1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLAorICAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDI4LCAweDYzLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI4LCAweDMwLCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMwLAorICAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDYzLCAweDY4LCAweDY1LCAweDYzLCAweDZiLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY5LCAweDY2LCAweDY2LCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDM1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDQyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDI4LCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLAorICAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDMxLCAweDVmLAorICAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDc4LCAweDIwLCAweDJkLCAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLAorICAweDc0LCAweDIwLCAweDY0LCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDc5LCAweDIwLCAweDJkLCAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLAorICAweDY1LCAweDY0LCAweDJlLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDMxLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDdhLCAweDIwLCAweDJkLAorICAweDIwLCAweDYzLCAweDMwLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDJlLCAweDdhLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDI4LCAweDI4LCAweDY0LCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYzLAorICAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDY5LCAweDZlLCAweDI5LCAweDIwLCAweDdjLCAweDdjLCAweDIwLCAweDI4LCAweDY0LCAweDcyLCAweDIwLCAweDNlLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLAorICAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDYxLCAweDc4LCAweDI5LCAweDI5LCAweDIwLCAweDdjLCAweDdjLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDI4LCAweDI4LCAweDY0LCAweDY3LCAweDIwLCAweDNjLCAweDIwLCAweDYzLCAweDQ1LAorICAweDU0LCAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDY5LCAweDZlLCAweDI5LCAweDIwLCAweDdjLCAweDdjLCAweDIwLCAweDI4LCAweDY0LCAweDY3LCAweDIwLCAweDNlLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLAorICAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDYxLCAweDc4LCAweDI5LCAweDI5LCAweDIwLCAweDdjLCAweDdjLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDI4LCAweDI4LCAweDY0LCAweDYyLCAweDIwLCAweDNjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LAorICAweDQzLCAweDMxLCAweDQzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDY5LCAweDZlLCAweDI5LCAweDIwLCAweDdjLCAweDdjLCAweDIwLCAweDI4LCAweDY0LCAweDYyLCAweDIwLCAweDNlLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDQ0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDRkLCAweDYxLCAweDc4LCAweDI5LCAweDI5LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDNiLAorICAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LAorICAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDMzLCAweDI4LCAweDY0LCAweDcyLAorICAweDJjLCAweDIwLCAweDY0LCAweDY3LCAweDJjLCAweDIwLCAweDY0LCAweDYyLCAweDI5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLAorICAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDcyLCAweDYxLCAweDc3LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLAorICAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LAorICAweDIwLCAweDc3LCAweDZmLCAweDcyLCAweDY0LCAweDMzLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDc3LCAweDZmLCAweDcyLCAweDY0LCAweDMyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDc5LCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDc5LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDc4LCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDc4LCAweDJiLCAweDJiLAorICAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLAorICAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDc4LCAweDIwLCAweDJhLCAweDIwLCAweDM0LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLAorICAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDIwLCAweDJhLCAweDIwLCAweDM0LCAweDVkLCAweDNiLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZjLCAweDczLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDczLCAweDIwLCAweDI2LCAweDIwLAorICAweDMxLCAweDJjLCAweDIwLCAweDZkLCAweDczLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDczLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc3LCAweDZmLCAweDcyLCAweDY0LCAweDMzLCAweDIwLCAweDdjLAorICAweDNkLCAweDIwLCAweDI4LCAweDZjLCAweDczLCAweDYyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc3LCAweDZmLCAweDcyLCAweDY0LCAweDMyLCAweDIwLAorICAweDdjLCAweDNkLCAweDIwLCAweDI4LCAweDZkLCAweDczLCAweDYyLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDYyLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLAorICAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDM3LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLAorICAweDc0LCAweDI5LCAweDI4LCAweDc3LCAweDZmLCAweDcyLCAweDY0LCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDM2LCAweDVkLCAweDIwLAorICAweDNkLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDc3LCAweDZmLCAweDcyLCAweDY0LCAweDMzLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDM1LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDc3LCAweDZmLCAweDcyLCAweDY0LCAweDMyLCAweDI5LAorICAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDc5LCAweDc0LCAweDY1LCAweDczLCAweDViLCAweDM0LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLAorICAweDc0LCAweDI5LCAweDI4LCAweDc3LCAweDZmLCAweDcyLCAweDY0LCAweDMyLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDM4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDJkLCAweDJkLCAweDJkLCAweDJkLCAweDIwLCAweDQ1LCAweDQzLAorICAweDMxLCAweDUzLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY5LCAweDZlLCAweDY3LCAweDJmLCAweDY1LCAweDZlLCAweDY0LCAweDcwLCAweDZmLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLAorICAweDY5LCAweDdhLCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc2LAorICAweDYxLCAweDZjLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDViLCAweDM4LCAweDVkLCAweDViLCAweDMyLCAweDM1LCAweDM2LCAweDVkLCAweDIwLCAweDNkLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLAorICAweDIwLCAweDM5LCAweDM5LCAweDI1LCAweDIwLCAweDc0LCAweDY4LCAweDcyLCAweDY1LCAweDczLCAweDY4LCAweDZmLCAweDZjLCAweDY0LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLAorICAweDIwLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLAorICAweDJjLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLAorICAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDdkLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDMxLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLAorICAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLAorICAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDdkLCAweDJjLCAweDBkLAorICAweDBhLCAweDA5LCAweDdiLCAweDIwLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLAorICAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMwLCAweDJjLCAweDMwLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDMxLCAweDJjLAorICAweDMxLCAweDJjLCAweDMxLCAweDJjLCAweDdkLCAweDBkLCAweDBhLCAweDdkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLAorICAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDY5LCAweDZlLCAweDYxLCAweDc0LCAweDY1LCAweDczLAorICAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLAorICAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDNiLAorICAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZmLAorICAweDcyLCAweDY0LCAweDY5LCAweDZlLCAweDYxLCAweDc0LCAweDY1LCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDczLCAweDYzLCAweDYxLCAweDZjLAorICAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLAorICAweDZmLCAweDcyLCAweDI5LCAweDIwLCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYyLCAweDcyLCAweDJjLCAweDIwLCAweDYyLCAweDY3LCAweDJjLCAweDIwLCAweDYyLCAweDYyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYyLAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDc1LAorICAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYyLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDc1LAorICAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LAorICAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYyLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LAorICAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDI5LCAweDIwLCAweDdjLCAweDIwLCAweDI4LCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDNjLCAweDNjLCAweDIwLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LAorICAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDI5LCAweDYyLCAweDcyLCAweDJjLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDI5LCAweDYyLCAweDY3LCAweDJjLCAweDIwLCAweDI4LCAweDc1LAorICAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDI5LCAweDYyLCAweDYyLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLAorICAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDcwLCAweDZmLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDY5LCAweDYxLCAweDZjLCAweDVmLAorICAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDZkLAorICAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LAorICAweDZmLCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDY5LCAweDZlLCAweDYxLCAweDc0LCAweDY1LCAweDczLCAweDIwLCAweDZkLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDc1LAorICAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMxLCAweDM2LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYyLAorICAweDZmLCAweDZmLCAweDZjLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDZkLCAweDVmLCAweDc2LCAweDYxLCAweDZjLCAweDY5LCAweDY0LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLAorICAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDcwLCAweDZmLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LAorICAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LAorICAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDYyLCAweDcyLCAweDJjLCAweDIwLCAweDZkLCAweDVmLCAweDYyLCAweDY3LCAweDJjLCAweDIwLCAweDZkLCAweDVmLCAweDYyLCAweDYyLCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDMzLCAweDIwLCAweDZkLCAweDVmLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDZkLCAweDYxLAorICAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDVmLCAweDczLCAweDcwLCAweDcyLCAweDY1LCAweDYxLCAweDY0LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLAorICAweDVmLCAweDcwLCAweDZmLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDIwLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LAorICAweDY5LCAweDZmLCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDNiLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDY1LCAweDc2LCAweDYxLCAweDZjLCAweDc1LCAweDYxLCAweDc0LCAweDY1LCAweDVmLAorICAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDI4LCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LAorICAweDY1LCAweDIwLCAweDJhLCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LAorICAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLAorICAweDZjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLAorICAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLAorICAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDY5LCAweDZlLCAweDYxLCAweDc0LCAweDY1LAorICAweDczLCAweDIwLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDcwLCAweDZmLCAweDc0LAorICAweDY1LCAweDZlLCAweDc0LCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJhLCAweDIwLCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLAorICAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDcwLCAweDZmLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLAorICAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJhLCAweDIwLCAweDcwLCAweDQyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDY1LCAweDZkLCAweDcwLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMxLCAweDM2LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDU0LAorICAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDc2LCAweDYxLCAweDZjLCAweDY5LCAweDY0LCAweDIwLCAweDNkLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLAorICAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LAorICAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDQ5LCAweDRlLCAweDU0LCAweDM2LCAweDM0LCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LAorICAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LAorICAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLCAweDNjLCAweDIwLCAweDYzLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDRkLCAweDZmLCAweDY0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDU2LAorICAweDYxLCAweDZjLCAweDc1LCAweDY1LCAweDczLCAweDNiLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDJmLCAweDJmLCAweDIwLAorICAweDU0LCAweDRmLCAweDQ0LCAweDRmLCAweDNhLCAweDIwLCAweDU0LCAweDY4LCAweDY5LCAweDczLCAweDIwLCAweDYzLCAweDY4LCAweDY1LCAweDYzLCAweDZiLCAweDIwLCAweDY5LCAweDczLCAweDIwLCAweDY1LCAweDcxLCAweDc1LCAweDY5LCAweDc2LCAweDYxLCAweDZjLCAweDY1LCAweDZlLCAweDc0LCAweDIwLCAweDc0LAorICAweDZmLCAweDIwLCAweDZkLCAweDY1LCAweDY0LCAweDY5LCAweDc1LCAweDZkLCAweDIwLCAweDcxLCAweDc1LCAweDYxLCAweDZjLCAweDY5LCAweDc0LCAweDc5LCAweDIwLCAweDY5LCAweDZlLCAweDIwLCAweDc0LCAweDY4LCAweDY1LCAweDIwLCAweDQzLCAweDJiLCAweDJiLCAweDIwLCAweDc2LCAweDY1LCAweDcyLCAweDczLAorICAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDIxLCAweDY3LCAweDVmLCAweDY1LCAweDc2LCAweDYxLCAweDZjLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDViLAorICAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDVkLCAweDViLCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDZkLCAweDYxLCAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDVmLAorICAweDczLCAweDcwLCAweDcyLCAweDY1LCAweDYxLCAweDY0LCAweDVkLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY5LCAweDZlLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLAorICAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDJhLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLAorICAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDViLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LAorICAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDM0LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LAorICAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDczLCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDczLCAweDJiLCAweDJiLCAweDI5LCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDc5LCAweDY0LCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDczLAorICAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDczLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLAorICAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDY0LAorICAweDI5LCAweDJjLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDY0LCAweDI5LCAweDJjLCAweDIwLAorICAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDMyLCAweDM1LCAweDM1LCAweDI4LCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDY0LCAweDI5LCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LAorICAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDIwLAorICAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDYzLCAweDIwLCAweDNjLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDNiLCAweDIwLCAweDYzLCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLAorICAweDczLCAweDViLCAweDYzLCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LAorICAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLAorICAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJkLCAweDNlLAorICAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMwLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LAorICAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDUwLAorICAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDJjLCAweDIwLAorICAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMxLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLAorICAweDI4LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdiLAorICAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LAorICAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDczLCAweDcyLAorICAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMyLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LAorICAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLAorICAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLAorICAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LAorICAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLAorICAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LAorICAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMzLAorICAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLAorICAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLAorICAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LAorICAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LAorICAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDNjLCAweDNkLCAweDIwLCAweDMxLCAweDM2LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDY1LCAweDZkLCAweDcwLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LAorICAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDYzLCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDI5LCAweDI4LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LAorICAweDZmLCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLAorICAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDIwLCAweDNmLCAweDIwLCAweDI4LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDJhLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LAorICAweDVmLCAweDc0LCAweDI5LCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDViLCAweDYzLCAweDVkLCAweDI5LCAweDIwLCAweDNhLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNlLCAweDNkLCAweDIwLCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLAorICAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDcwLCAweDU0LCAweDcyLCAweDY5LAorICAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDcwLAorICAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLAorICAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYzLCAweDZmLAorICAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLCAweDNkLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LAorICAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDNjLCAweDNkLCAweDIwLCAweDMxLCAweDM2LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LAorICAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LCAweDIwLCAweDNjLCAweDIwLAorICAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDNiLCAweDIwLCAweDY5LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLAorICAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDY5LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDY1LCAweDZkLCAweDcwLCAweDVmLCAweDczLCAweDY1LAorICAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDY5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLAorICAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDc2LCAweDYxLCAweDZjLCAweDY5LCAweDY0LCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLAorICAweDBhLCAweDA5LCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLAorICAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LAorICAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYyLCAweDZmLCAweDZmLCAweDZjLCAweDIwLCAweDczLCAweDc1LCAweDYzLCAweDYzLCAweDY1LCAweDczLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LAorICAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcwLCAweDQyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LAorICAweDY2LCAweDIwLCAweDI4LCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDcwLCAweDQyLAorICAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LAorICAweDJhLCAweDcwLCAweDQyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDIwLCAweDNkLCAweDIwLCAweDJhLCAweDcwLCAweDU0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LAorICAweDZmLCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDczLCAweDc1LCAweDYzLCAweDYzLCAweDY1LCAweDczLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDdkLAorICAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDIwLCAweDczLCAweDc1LCAweDYzLCAweDYzLCAweDY1LCAweDczLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LAorICAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY5LCAweDc0LCAweDI4LCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLAorICAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDIwLCAweDJhLCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLAorICAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLAorICAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LAorICAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDUwLAorICAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLAorICAweDJhLCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDIwLAorICAweDNkLCAweDIwLCAweDMzLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDIwLCAweDNkLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDZkLCAweDYxLCAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDNkLAorICAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDMwLAorICAweDJjLCAweDIwLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LAorICAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LCAweDIwLCAweDNjLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDNiLCAweDIwLCAweDY5LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLAorICAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYzLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LAorICAweDZjLCAweDczLCAweDViLCAweDY5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDZkLCAweDY5LCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDZkLCAweDY5LCAweDZlLCAweDVmLAorICAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDYzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDZkLCAweDYxLCAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDYxLCAweDc4LCAweDI4LCAweDZkLCAweDYxLAorICAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDYzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDI5LCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LAorICAweDY4LCAweDc0LCAweDczLCAweDViLCAweDY5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDIwLCAweDJhLCAweDIwLAorICAweDYzLCAweDJlLCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDY3LCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDIwLCAweDJhLCAweDIwLCAweDYzLCAweDJlLCAweDc5LCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDYyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDIwLCAweDJhLCAweDIwLCAweDYzLCAweDJlLCAweDdhLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDYzLCAweDJlLCAweDc4LCAweDNiLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDA5LCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDY3LCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDYzLCAweDJlLCAweDc5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDYyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDYzLCAweDJlLAorICAweDdhLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDJiLCAweDJiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LAorICAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDMzLCAweDIwLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDc2LAorICAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDI5LCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDcyLCAweDIwLCAweDJmLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLAorICAweDVmLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDI5LAorICAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDY3LCAweDIwLCAweDJmLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDI5LCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDYyLCAweDIwLCAweDJmLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LAorICAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYxLCAweDc2LCAweDY3LAorICAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDZkLCAweDYxLCAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDVmLCAweDczLCAweDcwLCAweDcyLAorICAweDY1LCAweDYxLCAweDY0LCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDYxLCAweDc4LCAweDI4LCAweDZkLCAweDYxLCAweDc4LCAweDI4LCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDZkLCAweDYxLCAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDJkLAorICAweDIwLCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDZkLCAweDY5LCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDJjLCAweDIwLCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDZkLCAweDYxLCAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDJkLCAweDIwLCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDZkLCAweDY5LCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDI5LCAweDJjLCAweDIwLCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDZkLCAweDYxLAorICAweDc4LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDJkLCAweDIwLCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDZkLCAweDY5LCAweDZlLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDI5LCAweDNiLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDU0LCAweDRmLCAweDQ0LCAweDRmLCAweDNhLCAweDIwLCAweDU0LCAweDY4LCAweDY1LCAweDIwLCAweDcyLCAweDZmLCAweDc1LCAweDZlLCAweDY0LCAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDY4LCAweDY1LCAweDcyLCAweDY1LCAweDIwLAorICAweDYzLCAweDZmLCAweDc1LCAweDZjLCAweDY0LCAweDIwLCAweDYyLCAweDY1LCAweDIwLCAweDY5LCAweDZkLCAweDcwLCAweDcyLCAweDZmLCAweDc2LCAweDY1LCAweDY0LCAweDJjLCAweDIwLCAweDZjLCAweDY5LCAweDZiLCAweDY1LCAweDIwLCAweDc3LCAweDY5LCAweDc0LCAweDY4LCAweDIwLCAweDQ0LCAweDU4LCAweDU0LAorICAweDMxLCAweDJmLCAweDQyLCAweDQzLCAweDMxLCAweDJlLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDI4LCAweDY5LAorICAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDJhLCAweDIwLCAweDI4LCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDJlLCAweDMwLAorICAweDY2LCAweDI5LCAweDIwLCAweDJiLCAweDIwLCAweDJlLCAweDM1LCAweDY2LCAweDI5LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLAorICAweDZkLCAweDVmLCAweDYyLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDJhLAorICAweDIwLCAweDI4LCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDJlLCAweDMwLCAweDY2LCAweDI5LCAweDIwLCAweDJiLCAweDIwLCAweDJlLCAweDM1LCAweDY2LCAweDI5LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDRjLCAweDQ5LCAweDRkLAorICAweDQ5LCAweDU0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDI4LCAweDY5LCAweDZlLCAweDc0LAorICAweDI5LCAweDI4LCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDJhLCAweDIwLCAweDI4LCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDJlLCAweDMwLCAweDY2LCAweDI5LAorICAweDIwLCAweDJiLCAweDIwLCAweDJlLCAweDM1LCAweDY2LCAweDI5LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLAorICAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDZkLCAweDVmLCAweDc2LCAweDYxLCAweDZjLCAweDY5LCAweDY0LCAweDIwLCAweDNkLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLAorICAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDU1LCAweDQ5LCAweDRlLCAweDU0LCAweDM2LCAweDM0LCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDMxLAorICAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDcyLCAweDZlLCAweDYxLCAweDZjLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY2LCAweDY5LCAweDc0LAorICAweDI4LCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDZkLCAweDczLCAweDVmLCAweDc0LCAweDZmLCAweDVmLCAweDc0LCAweDcyLCAweDc5LCAweDJjLAorICAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDIwLCAweDJhLCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LAorICAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDcwLCAweDYxLAorICAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLAorICAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLAorICAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLAorICAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLAorICAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDIwLCAweDNkLCAweDIwLCAweDMzLCAweDMxLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLAorICAweDcwLCAweDZmLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLAorICAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDVmLAorICAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDY5LCAweDZlLCAweDYxLCAweDc0LCAweDY1LCAweDczLCAweDIwLCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYzLCAweDZmLAorICAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLAorICAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDcyLCAweDJjLCAweDIwLCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDY3LCAweDJjLAorICAweDIwLCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDYyLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LAorICAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDY1LCAweDc2LCAweDYxLCAweDZjLCAweDc1LCAweDYxLCAweDc0LCAweDY1LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDI4LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJjLAorICAweDIwLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDcwLAorICAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDJjLCAweDIwLCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJjLCAweDIwLCAweDI2LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LAorICAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJjLCAweDIwLCAweDI2LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LAorICAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDMwLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLAorICAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LCAweDIwLCAweDNjLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLAorICAweDcwLCAweDY1LCAweDcyLCAweDZkLCAweDczLCAweDVmLCAweDc0LCAweDZmLCAweDVmLCAweDc0LCAweDcyLCAweDc5LCAweDNiLCAweDIwLCAweDY5LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY0LCAweDY1LAorICAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDY3LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDJjLCAweDIwLAorICAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDYyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDY5LAorICAweDZlLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLAorICAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDViLCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDZkLAorICAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LAorICAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDczLCAweDYzLCAweDYxLAorICAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI4LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLAorICAweDZlLCAweDJlLCAweDZkLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LAorICAweDZmLCAweDcyLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY2LCAweDY5LCAweDc0LCAweDVmLCAweDZmLCAweDcyLCAweDY0LCAweDY1LCAweDcyLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDViLCAweDY5LCAweDVkLAorICAweDJlLCAweDZkLCAweDVmLCAweDc2LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDcxLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLAorICAweDcxLCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDcxLCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDc5LAorICAweDY0LCAweDVmLCAweDc0LCAweDY1LCAweDZkLCAweDcwLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDcxLCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LAorICAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDcxLCAweDVkLAorICAweDIwLCAweDJhLCAweDIwLCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDY0LCAweDVmLCAweDc0LCAweDY1LCAweDZkLCAweDcwLAorICAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDIwLCAweDJkLCAweDIwLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY0LAorICAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDY3LCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDcxLCAweDVkLCAweDIwLAorICAweDJhLCAweDIwLCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDY0LCAweDVmLCAweDc0LCAweDY1LCAweDZkLCAweDcwLCAweDJjLAorICAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDIwLCAweDJkLCAweDIwLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY0LCAweDY1LAorICAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDYyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDcwLCAweDRlLCAweDc1LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDcxLCAweDVkLCAweDIwLCAweDJhLAorICAweDIwLCAweDI4LCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDJiLCAweDIwLCAweDc5LCAweDY0LCAweDVmLCAweDc0LCAweDY1LCAweDZkLCAweDcwLCAweDJjLCAweDIwLAorICAweDMwLCAweDJjLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDIwLCAweDJkLCAweDIwLCAweDYyLCAweDYxLCAweDczLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDI4LCAweDIxLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDcyLCAweDI5LCAweDIwLCAweDI2LCAweDI2LCAweDIwLCAweDI4LCAweDIxLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLAorICAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDY3LCAweDI5LCAweDIwLCAweDI2LCAweDI2LCAweDIwLCAweDI4LCAweDIxLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDYyLCAweDI5LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYzLAorICAweDZmLCAweDZlLCAweDc0LCAweDY5LCAweDZlLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDIwLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDY0LCAweDY1LAorICAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDcyLCAweDVmLCAweDY2LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDcyLCAweDI5LCAweDIwLCAweDJmLAorICAweDIwLCAweDM4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDIwLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDY3LCAweDVmLCAweDY2LAorICAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDY3LCAweDI5LCAweDIwLCAweDJmLCAweDIwLCAweDM4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LAorICAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY2LCAweDZjLCAweDZmLCAweDYxLCAweDc0LCAweDIwLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYyLCAweDVmLCAweDY2LCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDY2LCAweDZjLCAweDZmLAorICAweDYxLCAweDc0LCAweDI5LCAweDI4LCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDczLCAweDc1LCAweDZkLCAweDVmLCAweDYyLCAweDI5LCAweDIwLCAweDJmLCAweDIwLCAweDM4LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LAorICAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYyLCAweDcyLCAweDMxLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDI4LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLAorICAweDZkLCAweDVmLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc4LCAweDIwLCAweDJkLCAweDIwLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDcyLCAweDVmLCAweDY2LCAweDI5LCAweDIwLCAweDJhLAorICAweDIwLCAweDI4LCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDJlLCAweDMwLCAweDY2LCAweDI5LCAweDIwLCAweDJiLCAweDIwLCAweDJlLCAweDM1LCAweDY2LCAweDI5LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDRjLCAweDQ5LCAweDRkLAorICAweDQ5LCAweDU0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYyLCAweDY3LCAweDMxLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDI4LCAweDY5LAorICAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDI4LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDc5LCAweDIwLCAweDJkLCAweDIwLCAweDYxLCAweDc2LCAweDY3LAorICAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDY3LCAweDVmLCAweDY2LCAweDI5LCAweDIwLCAweDJhLCAweDIwLCAweDI4LCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDJlLCAweDMwLCAweDY2LCAweDI5LCAweDIwLCAweDJiLAorICAweDIwLCAweDJlLCAweDM1LCAweDY2LCAweDI5LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYyLAorICAweDYyLCAweDMxLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZjLCAweDYxLCAweDZkLCAweDcwLCAweDI4LCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDI4LCAweDI4LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYxLCAweDc2LCAweDY3LCAweDVmLAorICAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJlLCAweDdhLCAweDIwLCAweDJkLCAweDIwLCAweDYxLCAweDc2LCAweDY3LCAweDVmLCAweDY0LCAweDY1LCAweDZjLCAweDc0LCAweDYxLCAweDVmLCAweDYyLCAweDVmLCAweDY2LCAweDI5LCAweDIwLCAweDJhLCAweDIwLCAweDI4LCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LAorICAweDU0LCAweDIwLCAweDJmLCAweDIwLCAweDMyLCAweDM1LCAweDM1LCAweDJlLCAweDMwLCAweDY2LCAweDI5LCAweDIwLCAweDJiLCAweDIwLCAweDJlLCAweDM1LCAweDY2LCAweDI5LCAweDJjLCAweDIwLCAweDMwLCAweDJjLCAweDIwLCAweDRjLCAweDQ5LCAweDRkLCAweDQ5LCAweDU0LCAweDI5LCAweDNiLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDI5LCAweDI4LCAweDYyLCAweDcyLCAweDMxLCAweDJjLCAweDIwLCAweDYyLCAweDY3LCAweDMxLCAweDJjLCAweDIwLCAweDYyLCAweDYyLCAweDMxLCAweDJjLCAweDIwLAorICAweDMyLCAweDM1LCAweDM1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDY1LCAweDc2LCAweDYxLCAweDZjLCAweDc1LAorICAweDYxLCAweDc0LCAweDY1LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDI4LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJjLCAweDIwLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDZlLCAweDc1LAorICAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDJjLCAweDIwLCAweDYzLCAweDc1LCAweDcyLAorICAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJjLCAweDIwLCAweDI2LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJjLCAweDIwLCAweDI2LCAweDcwLCAweDUzLCAweDc0LCAweDYxLCAweDc0LAorICAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcwLAorICAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDZkLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLAorICAweDNkLCAweDIwLCAweDMwLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDQ1LCAweDZlLCAweDYzLAorICAweDZmLCAweDY0LCAweDY1LCAweDIwLCAweDYxLCAweDZlLCAweDIwLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDY3LCAweDY5LCAweDc2LCAweDY1LCAweDZlLCAweDIwLCAweDYxLCAweDIwLCAweDM0LCAweDc4LCAweDM0LCAweDIwLCAweDcwLAorICAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJlLCAweDBkLCAweDBhLCAweDZiLCAweDY1LCAweDcyLCAweDZlLCAweDY1LCAweDZjLCAweDIwLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDVmLAorICAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDI4LCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLAorICAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLAorICAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY1LAorICAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLAorICAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLAorICAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDVmLCAweDY5LCAweDY0LCAweDI4LCAweDMwLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLAorICAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDNkLCAweDIwLCAweDI2LCAweDcwLCAweDQ5LCAweDZlLAorICAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLAorICAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLAorICAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY5LCAweDc0LCAweDI4LCAweDI2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJjLCAweDIwLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLAorICAweDJjLCAweDIwLCAweDMxLCAweDM2LCAweDJjLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDRlLCAweDU1LAorICAweDRjLCAweDRjLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDcyLCAweDZlLCAweDYxLCAweDZjLCAweDVmLAorICAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY2LCAweDY5LCAweDc0LCAweDI4LCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDcwLCAweDY1LCAweDcyLAorICAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDI2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJjLCAweDIwLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDMxLCAweDM2LCAweDJjLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLAorICAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDRlLCAweDU1LCAweDRjLCAweDRjLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDYyLCAweDZjLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY2LCAweDZjLCAweDY5LCAweDcwLAorICAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDI2LCAweDYyLCAweDZjLCAweDZiLCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LAorICAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDI4LCAweDI2LCAweDYyLCAweDZjLCAweDZiLCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LAorICAweDJlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDZkLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLAorICAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LAorICAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDI4LCAweDI2LCAweDYyLCAweDZjLCAweDZiLCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LAorICAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDZkLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLAorICAweDZjLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDVmLCAweDcyLCAweDYxLCAweDc3LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LAorICAweDZmLCAweDcyLCAweDczLCAweDI4LCAweDI2LCAweDYyLCAweDZjLCAweDZiLCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLAorICAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDYyLCAweDZjLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LAorICAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLAorICAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LAorICAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDY2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDcwLCAweDY5LCAweDc4LAorICAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDQ0LCAweDY1LCAweDc0LCAweDY1LCAweDcyLCAweDZkLCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDc0LCAweDY4LCAweDY1LCAweDIwLAorICAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDYxLCAweDZjLCAweDIwLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDJmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDczLCAweDY5LCAweDc0LCAweDc5LCAweDIwLCAweDY3LAorICAweDY5LCAweDc2LCAweDY1LCAweDZlLCAweDIwLCAweDYxLCAweDZlLCAweDIwLCAweDYxLCAweDcyLCAweDYyLCAweDY5LCAweDc0LCAweDcyLCAweDYxLCAweDcyLCAweDc5LCAweDIwLCAweDZjLCAweDYxLCAweDcyLCAweDY3LCAweDY1LCAweDIwLCAweDYxLCAweDcyLCAweDcyLCAweDYxLCAweDc5LCAweDIwLCAweDZmLCAweDY2LAorICAweDIwLCAweDM0LCAweDc4LCAweDM0LCAweDIwLCAweDY5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDJlLCAweDBkLCAweDBhLCAweDZiLCAweDY1LCAweDcyLCAweDZlLCAweDY1LCAweDZjLAorICAweDIwLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDY2LCAweDcyLCAweDZmLCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZjLAorICAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDI4LCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDVmLAorICAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDIwLAorICAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDIwLCAweDJhLCAweDcwLAorICAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLAorICAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDBkLAorICAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLAorICAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLAorICAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLAorICAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDVmLCAweDY5LAorICAweDY0LCAweDI4LCAweDMwLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZjLAorICAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDI2LCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLAorICAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDViLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDNiLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LAorICAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLAorICAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDNkLCAweDIwLAorICAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDJkLCAweDNlLAorICAweDZkLCAweDVmLCAweDY2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLAorICAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLAorICAweDc3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDIwLCAweDJiLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY2LCAweDY5LCAweDcyLCAweDczLAorICAweDc0LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLAorICAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LAorICAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY5LCAweDc0LCAweDI4LCAweDI2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJjLCAweDIwLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDcwLCAweDY5LAorICAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDMxLAorICAweDczLCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDY5LCAweDdhLCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDcyLCAweDZlLCAweDYxLCAweDZjLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY2LCAweDY5LCAweDc0LAorICAweDI4LCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDI2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJjLAorICAweDIwLCAweDcwLCAweDUwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLCAweDIwLCAweDcwLCAweDUwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDJjLAorICAweDIwLCAweDcwLCAweDU3LCAweDY1LCAweDY5LCAweDY3LCAweDY4LCAweDc0LCAweDczLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDYyLCAweDZjLCAweDZiLCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY2LCAweDZjLCAweDY5LCAweDcwLCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDI2LCAweDYyLCAweDZjLCAweDZiLCAweDJjLCAweDIwLCAweDc0LAorICAweDcyLCAweDc1LCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDM1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDI4LCAweDI2LCAweDYyLCAweDZjLCAweDZiLCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LAorICAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDZkLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDVmLCAweDY1LCAweDc0LAorICAweDYzLCAweDMxLCAweDczLCAweDI4LCAweDI2LCAweDYyLCAweDZjLCAweDZiLCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDJlLCAweDZkLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDZmLCAweDZjLCAweDc1LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLAorICAweDZkLCAweDVmLCAweDYzLCAweDZmLCAweDZmLCAweDcyLCAweDY0LCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorICAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDViLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LAorICAweDc4LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDYyLCAweDZjLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDJkLCAweDJkLCAweDJkLCAweDJkLCAweDIwLCAweDcyLCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDY1LAorICAweDZlLCAweDY0LCAweDcwLCAweDZmLCAweDY5LCAweDZlLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDY5LCAweDdhLCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLAorICAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLAorICAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LAorICAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDY2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LAorICAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLAorICAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDYzLAorICAweDc1LCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLAorICAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDY1LCAweDZlLCAweDY0LCAweDcwLCAweDZmLCAweDY5LAorICAweDZlLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLAorICAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLCAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLAorICAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDY1LCAweDZlLCAweDY0LCAweDcwLCAweDZmLCAweDY5LCAweDZlLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LAorICAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLAorICAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLAorICAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLAorICAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDQ2LCAweDZmLCAweDcyLCAweDIwLCAweDY1LCAweDYxLCAweDYzLCAweDY4LAorICAweDIwLCAweDY5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNhLCAweDIwLCAweDY2LCAweDY5LCAweDZlLCAweDY0LCAweDIwLCAweDc0LCAweDY4LCAweDY1LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDZlLCAweDY0LCAweDcwLAorICAweDZmLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDIwLCAweDc0LCAweDY4LCAweDYxLCAweDc0LCAweDIwLCAweDY1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDczLCAweDIwLCAweDY5LCAweDc0LCAweDJlLCAweDBkLCAweDBhLCAweDZiLAorICAweDY1LCAweDcyLCAweDZlLCAweDY1LCAweDZjLCAweDIwLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDcyLCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDY1LCAweDZlLCAweDY0LCAweDcwLCAweDZmLCAweDY5LCAweDZlLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LAorICAweDY1LCAweDcyLCAweDY5LCAweDdhLCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDI4LCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLAorICAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLAorICAweDZjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LAorICAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLAorICAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLAorICAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDVmLCAweDY1LCAweDZlLCAweDY0LCAweDcwLCAweDZmLCAweDY5LCAweDZlLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDQ5LAorICAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUzLCAweDZmLCAweDcyLCAweDc0LCAweDY1LCAweDY0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LCAweDczLCAweDJjLCAweDBkLCAweDBhLAorICAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LAorICAweDY5LCAweDYzLCAweDY1LCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDZmLCAweDcyLCAweDc0LCAweDY1LCAweDY0LAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDVmLCAweDY5LCAweDY0LCAweDI4LCAweDMwLCAweDI5LCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLAorICAweDcwLCAweDUzLCAweDZmLCAweDcyLCAweDc0LCAweDY1LCAweDY0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LCAweDczLCAweDViLCAweDczLCAweDZmLCAweDcyLCAweDc0LCAweDY1LCAweDY0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLAorICAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLAorICAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDNkLCAweDIwLCAweDI2LCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LAorICAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDcwLCAweDcyLCAweDY5LCAweDc2LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLAorICAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDc2LCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDNkLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LAorICAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY2LAorICAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLAorICAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDJlLCAweDZkLCAweDVmLCAweDY2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LAorICAweDcyLCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLAorICAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LAorICAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDJlLCAweDZkLCAweDVmLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLAorICAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDJlLAorICAweDZkLCAweDVmLCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLAorICAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LAorICAweDZlLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LAorICAweDc4LCAweDVkLCAweDJlLCAweDZkLCAweDVmLCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLAorICAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDZmLCAweDc2LCAweDY1LCAweDcyLCAweDYxLCAweDZjLCAweDZjLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDU1LCAweDQ5LCAweDRlLAorICAweDU0LCAweDM2LCAweDM0LCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLAorICAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDIwLAorICAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LCAweDIwLCAweDNjLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDNiLCAweDIwLCAweDY5LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLAorICAweDNkLCAweDIwLCAweDY2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDZmLCAweDY2LCAweDczLCAweDIwLCAweDJiLCAweDIwLCAweDY5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYzLAorICAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDViLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDJlLCAweDZkLCAweDVmLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LAorICAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM4LCAweDVmLCAweDc0LCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDY5LCAweDZlLAorICAweDc0LCAweDY1LCAweDZlLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDViLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLAorICAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDJlLCAweDZkLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMxLAorICAweDM2LCAweDVmLCAweDc0LCAweDIwLCAweDZmLCAweDcyLCAweDY5LCAweDY3LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLAorICAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDViLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDJlLCAweDZkLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LAorICAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDIwLCAweDNlLCAweDIwLCAweDYzLCAweDc1LAorICAweDcyLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYzLAorICAweDZmLCAweDZlLCAweDc0LCAweDY5LCAweDZlLCAweDc1LCAweDY1LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDM0LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDM1LCAweDI4LCAweDYyLAorICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDJjLCAweDIwLCAweDI2LCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LCAweDY0LCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDY1LCAweDc0LAorICAweDYzLCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDc0LAorICAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYzLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDYzLCAweDIwLCAweDNjLCAweDIwLCAweDMxLCAweDM2LCAweDNiLCAweDIwLCAweDYzLCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDcyLCAweDY5LCAweDc2LCAweDVmLAorICAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDViLCAweDYzLCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc1LAorICAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLAorICAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLAorICAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMwLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLAorICAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LAorICAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLAorICAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMxLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLAorICAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLAorICAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLAorICAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLAorICAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMyLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLAorICAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LAorICAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLAorICAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LAorICAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDczLCAweDcyLCAweDYzLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDJjLCAweDIwLCAweDYyLAorICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LAorICAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLAorICAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorICAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDNiLAorICAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDIwLCAweDI4LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDZmLAorICAweDc2LCAweDY1LCAweDcyLCAweDYxLCAweDZjLCAweDZjLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDI5LCAweDIwLCAweDdjLCAweDdjLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDI4LCAweDI4LCAweDZmLCAweDcyLAorICAweDY5LCAweDY3LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDYzLCAweDc1LCAweDcyLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZjLAorICAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDI5LCAweDIwLCAweDI2LCAweDI2LCAweDIwLCAweDI4LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDNkLCAweDIwLAorICAweDZmLCAweDc2LCAweDY1LCAweDcyLCAweDYxLCAweDZjLCAweDZjLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDI5LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LAorICAweDA5LCAweDA5LCAweDZmLCAweDc2LCAweDY1LCAweDcyLCAweDYxLCAweDZjLCAweDZjLCAweDVmLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLAorICAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDZmLCAweDcyLCAweDY5LCAweDY3LCAweDVmLAorICAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDIxLCAweDZmLCAweDc2LCAweDY1LCAweDcyLCAweDYxLCAweDZjLCAweDZjLCAweDVmLAorICAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LCAweDczLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDIwLAorICAweDNkLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDJkLAorICAweDJkLCAweDJkLCAweDJkLCAweDIwLCAweDY2LCAweDY5LCAweDZlLCAweDY0LCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LAorICAweDcyLCAweDczLCAweDVmLCAweDY2LCAweDZmLCAweDcyLCAweDVmLCAweDY1LCAweDYxLCAweDYzLCAweDY4LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLAorICAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLCAweDY2LCAweDZmLCAweDczLAorICAweDYzLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLAorICAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDNiLCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDM0LCAweDc4LCAweDM0LCAweDIwLCAweDY3LAorICAweDcyLCAweDY5LCAweDY0LCAweDIwLCAweDZmLCAweDY2LCAweDIwLCAweDMyLCAweDJkLCAweDYyLCAweDY5LCAweDc0LCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDczLAorICAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLAorICAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLAorICAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLAorICAweDIwLCAweDZkLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDNiLCAweDIwLCAweDIwLCAweDJmLCAweDJmLCAweDIwLCAweDc1LCAweDZlLCAweDczLCAweDYzLCAweDYxLCAweDZjLCAweDY1LAorICAweDY0LCAweDIwLCAweDM1LCAweDJkLCAweDYyLCAweDY5LCAweDc0LCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDIwLCAweDY5LCAweDZlLCAweDIwLCAweDUyLCAweDQ3LCAweDQyLCAweDJjLCAweDIwLCAweDYxLCAweDZjLCAweDcwLCAweDY4LAorICAweDYxLCAweDIwLCAweDY4LCAweDYxLCAweDczLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI3LCAweDczLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDczLCAweDY5LCAweDc0LCAweDc5LCAweDIwLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDBkLCAweDBhLCAweDA5LAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDY2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDNiLCAweDA5LCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDZmLAorICAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDZmLCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDIwLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LAorICAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDNiLCAweDA5LCAweDA5LCAweDJmLCAweDJmLCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDYyLCAweDY1LCAweDcyLAorICAweDIwLCAweDZmLCAweDY2LCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDIwLCAweDc0LCAweDZmLCAweDIwLCAweDYzLCAweDY4LCAweDY1LCAweDYzLCAweDZiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDYyLAorICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLAorICAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDcwLCAweDYxLCAweDcyLAorICAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDc0LCAweDZmLAorICAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDNiLCAweDBkLAorICAweDBhLCAweDdkLCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLCAweDQ2LCAweDZmLCAweDcyLCAweDIwLAorICAweDY1LCAweDYxLCAweDYzLCAweDY4LCAweDIwLCAweDY5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNhLCAweDIwLCAweDQ2LCAweDY5LCAweDZlLCAweDY0LCAweDIwLCAweDc0LCAweDY4LCAweDY1LCAweDIwLCAweDcxLCAweDc1LCAweDYxLCAweDZlLCAweDc0LAorICAweDY5LCAweDdhLCAweDY1LCAweDY0LCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDIwLCAweDc3LCAweDY4LCAweDY5LCAweDYzLCAweDY4LCAweDIwLCAweDcyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDczLCAweDIwLCAweDY5LCAweDZlLCAweDIwLCAweDc0LAorICAweDY4LCAweDY1LCAweDIwLCAweDZjLCAweDZmLCAweDc3LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDJlLCAweDBkLCAweDBhLCAweDZiLCAweDY1LCAweDcyLCAweDZlLCAweDY1LCAweDZjLCAweDIwLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY2LCAweDY5LAorICAweDZlLCAweDY0LCAweDVmLCAweDZmLCAweDcwLCAweDc0LCAweDY5LCAweDZkLCAweDYxLCAweDZjLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDczLCAweDVmLCAweDY2LCAweDZmLCAweDcyLAorICAweDVmLCAweDY1LCAweDYxLCAweDYzLCAweDY4LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI4LCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDcwLCAweDYxLCAweDcyLAorICAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLAorICAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDJjLAorICAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLAorICAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLAorICAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LAorICAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LAorICAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LCAweDczLCAweDJjLAorICAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDczLAorICAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLAorICAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY3LAorICAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDVmLCAweDY5LCAweDY0LCAweDI4LCAweDMwLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LAorICAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDNiLCAweDBkLAorICAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LAorICAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDIwLCAweDNkLCAweDIwLCAweDI2LCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLAorICAweDY2LCAweDZmLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLAorICAweDYxLCAweDZjLCAweDIwLCAweDY2LCAweDZmLCAweDczLCAweDYzLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDJhLCAweDcwLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LAorICAweDZmLCAweDcyLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDI2LCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LAorICAweDZlLCAweDY2LCAweDZmLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLAorICAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDM0LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDNiLCAweDBkLCAweDBhLCAweDA5LAorICAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDM1LCAweDI4LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLAorICAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDJjLCAweDIwLCAweDI2LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLAorICAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDJlLCAweDc3LCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLAorICAweDc0LCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDM0LCAweDVkLCAweDViLCAweDMxLCAweDM2LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcwLAorICAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LAorICAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDJiLCAweDJiLCAweDczLCAweDY1LCAweDZjLAorICAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LCAweDIwLCAweDNjLCAweDIwLCAweDMxLAorICAweDM2LCAweDNiLCAweDIwLCAweDJiLCAweDJiLCAweDY5LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDczLCAweDY1LCAweDZjLCAweDVkLCAweDViLCAweDY5LAorICAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDJjLCAweDIwLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLAorICAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDViLCAweDY5LCAweDVkLCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDczLCAweDY1LAorICAweDZjLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDZjLCAweDczLCAweDY1LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LCAweDZmLAorICAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDIwLCAweDNjLCAweDIwLCAweDM0LCAweDNiLCAweDIwLCAweDJiLCAweDJiLAorICAweDczLCAweDY1LCAweDZjLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LCAweDIwLAorICAweDNjLCAweDIwLCAweDMxLCAweDM2LCAweDNiLCAweDIwLCAweDJiLCAweDJiLCAweDY5LCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDczLCAweDY1LCAweDZjLAorICAweDVkLCAweDViLCAweDY5LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDJjLCAweDIwLCAweDcwLCAweDQyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDViLCAweDY5LCAweDVkLCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDczLCAweDViLCAweDczLCAweDY1LCAweDZjLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LAorICAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDU1LCAweDQ5LCAweDRlLCAweDU0LCAweDM2LCAweDM0LCAweDVmLCAweDRkLCAweDQxLCAweDU4LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLAorICAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LAorICAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNjLCAweDIwLAorICAweDZlLCAweDc1LCAweDZkLCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDNiLCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLAorICAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDczLCAweDY1LAorICAweDZjLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LAorICAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDM2LCAweDM0LCAweDVmLCAweDc0LCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY2LAorICAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LCAweDIwLCAweDNjLCAweDIwLCAweDMxLCAweDM2LCAweDNiLCAweDIwLCAweDY5LCAweDJiLCAweDJiLCAweDJjLAorICAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDNlLCAweDNlLCAweDNkLCAweDIwLCAweDMyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDJiLCAweDNkLCAweDIwLCAweDc0LCAweDcyLAorICAweDY5LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDczLCAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDI2LCAweDIwLCAweDMzLCAweDVkLCAweDViLCAweDY5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LAorICAweDIwLCAweDI4LCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LAorICAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLAorICAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDIxLCAweDYyLCAweDY1LAorICAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLAorICAweDA5LCAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LAorICAweDczLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDUzLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDVmLCAweDYzLCAweDZjLCAweDc1LCAweDczLCAweDc0LAorICAweDY1LCAweDcyLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY5LCAweDYzLCAweDY1LCAweDczLCAweDViLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY2LCAweDZmLCAweDJkLCAweDNlLCAweDZkLCAweDVmLCAweDY2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDVmLAorICAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDIwLCAweDJiLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLAorICAweDIwLCAweDY0LCAweDY1LCAweDc0LCAweDY1LCAweDcyLCAweDZkLCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDY0LCAweDY1LCAweDY2LCAweDIwLAorICAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDVmLCAweDVmLCAweDYxLCAweDc0LCAweDc0LCAweDcyLCAweDY5LCAweDYyLCAweDc1LCAweDc0LCAweDY1LCAweDVmLCAweDVmLCAweDIwLCAweDI4LCAweDI4LCAweDcwLCAweDYxLCAweDYzLCAweDZiLCAweDY1LCAweDY0LCAweDI5LCAweDI5LCAweDIwLAorICAweDY0LCAweDczLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDVmLCAweDc0LCAweDYxLCAweDY3LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLAorICAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDc0LCAweDZmLCAweDc0LCAweDYxLCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLAorICAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDIwLCAweDY0LCAweDczLCAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDJmLCAweDJmLCAweDIwLAorICAweDQ2LCAweDZmLCAweDcyLCAweDIwLCAweDY1LCAweDYxLCAweDYzLCAweDY4LCAweDIwLCAweDY5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNhLCAweDIwLCAweDQ0LCAweDY1LCAweDc0LCAweDY1LCAweDcyLCAweDZkLCAweDY5LCAweDZlLCAweDY1LCAweDIwLAorICAweDc0LCAweDY4LCAweDY1LCAweDIwLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDIwLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDIwLCAweDc0LCAweDY4LCAweDYxLCAweDc0LCAweDIwLCAweDcyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDIwLAorICAweDY5LCAweDZlLCAweDIwLCAweDc0LCAweDY4LCAweDY1LCAweDIwLCAweDZjLCAweDZmLCAweDc3LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDY3LCAweDY5LCAweDc2LCAweDY1LCAweDZlLCAweDIwLCAweDY1LCAweDYxLCAweDYzLCAweDY4LCAweDIwLAorICAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDI3LCAweDczLCAweDIwLCAweDcwLCAweDcyLCAweDY1LCAweDY0LCAweDY1LCAweDc0LCAweDY1LCAweDcyLCAweDZkLCAweDY5LCAweDZlLCAweDY1LCAweDY0LCAweDIwLCAweDQ1LCAweDU0LCAweDQzLCAweDMxLCAweDUzLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLAorICAweDcyLCAweDM1LCAweDJmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDczLCAweDY5LCAweDc0LCAweDY5LCAweDY1LCAweDczLCAweDJlLCAweDIwLCAweDBkLCAweDBhLCAweDZiLCAweDY1LCAweDcyLCAweDZlLCAweDY1LCAweDZjLCAweDIwLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDY1LAorICAweDc0LCAweDY1LCAweDcyLCAweDZkLCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDczLCAweDI4LCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY0LCAweDczLAorICAweDVmLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDVmLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJjLCAweDIwLCAweDBkLCAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYzLCAweDZmLCAweDZlLCAweDczLAorICAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDczLCAweDJjLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLAorICAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDYxLCAweDZlLCAweDY0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDJjLCAweDBkLCAweDBhLCAweDIwLCAweDIwLAorICAweDIwLCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDJhLCAweDcwLCAweDRmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorICAweDZiLCAweDczLCAweDI5LCAweDBkLCAweDBhLCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLCAweDczLCAweDc0LCAweDIwLCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLAorICAweDY0LCAweDY1LCAweDc4LCAweDIwLCAweDNkLCAweDIwLCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDVmLCAweDY5LCAweDY0LCAweDI4LCAweDMwLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZlLAorICAweDczLCAweDc0LCAweDIwLCAweDY3LCAweDZjLCAweDZmLCAweDYyLCAweDYxLCAweDZjLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDJhLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDY5LCAweDc4LAorICAweDY1LCAweDZjLCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLAorICAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLAorICAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQ5LCAweDZlLCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDYxLAorICAweDZlLCAweDY0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLAorICAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDM0LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY3LCAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDM1LCAweDI4LCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDJjLCAweDIwLCAweDI2LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLAorICAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDJlLCAweDc3LCAweDJjLCAweDIwLAorICAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDIwLCAweDZmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLAorICAweDYzLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY2LCAweDZjLCAweDY5LCAweDcwLCAweDVmLCAweDYyLCAweDY5LCAweDc0LCAweDI4LCAweDI2LCAweDZmLCAweDc1LAorICAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDc0LCAweDcyLCAweDc1LCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLAorICAweDY1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDI4LCAweDI2LCAweDZmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLAorICAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLCAweDY1LCAweDc0LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDVmLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDVmLCAweDY1LCAweDc0LCAweDYzLCAweDMxLCAweDczLCAweDI4LCAweDI2LCAweDZmLCAweDc1LCAweDc0LCAweDcwLAorICAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDM1LCAweDVmLCAweDY5LCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDJlLCAweDc3LCAweDI5LCAweDNiLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDY5LCAweDIwLCAweDNkLCAweDIwLCAweDMwLCAweDNiLCAweDIwLCAweDY5LCAweDIwLCAweDNjLCAweDIwLCAweDMxLCAweDM2LCAweDNiLCAweDIwLAorICAweDY5LCAweDJiLCAweDJiLCAweDI5LCAweDBkLCAweDBhLCAweDA5LCAweDdiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDcyLCAweDY3LCAweDYyLCAweDYxLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZmLCAweDZjLAorICAweDZmLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDcwLCAweDQyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDczLCAweDViLCAweDY5LCAweDVkLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LAorICAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMwLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJlLCAweDZkLCAweDVmLAorICAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLAorICAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMwLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMxLCAweDIwLCAweDNkLAorICAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LAorICAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMxLAorICAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMyLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLAorICAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLCAweDY1LCAweDI4LCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDcwLCAweDY5LAorICAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMyLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLAorICAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMzLCAweDIwLCAweDNkLCAweDIwLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDVmLCAweDY0LCAweDY5LCAweDczLCAweDc0LCAweDYxLCAweDZlLCAweDYzLAorICAweDY1LCAweDI4LCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZkLCAweDczLCAweDJlLCAweDZkLCAweDVmLCAweDcwLCAweDY1LCAweDcyLCAweDYzLCAweDY1LCAweDcwLCAweDc0LCAweDc1LCAweDYxLCAweDZjLCAweDJjLCAweDIwLCAweDcwLCAweDY5LCAweDc4LCAweDY1LCAweDZjLCAweDVmLCAweDYzLCAweDZmLCAweDZjLAorICAweDZmLCAweDcyLCAweDJjLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDYzLCAweDZmLCAweDZjLCAweDZmLCAweDcyLCAweDczLCAweDViLCAweDMzLCAweDVkLCAweDJjLCAweDIwLCAweDY2LCAweDYxLCAweDZjLCAweDczLCAweDY1LCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDc1LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDIwLCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDZkLCAweDY5LCAweDZlLCAweDI4LCAweDY1LCAweDcyLAorICAweDcyLCAweDMwLCAweDJjLCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMxLCAweDI5LCAweDJjLCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMyLCAweDI5LCAweDJjLCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMzLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDc1LCAweDY5LAorICAweDZlLCAweDc0LCAweDMzLCAweDMyLCAweDVmLCAweDc0LCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDY1LAorICAweDcyLCAweDcyLCAweDMyLCAweDI5LCAweDIwLCAweDNmLCAweDIwLCAweDMyLCAweDIwLCAweDNhLCAweDIwLCAweDMzLCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDY1LCAweDczLAorICAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMxLCAweDI5LCAweDIwLCAweDNmLCAweDIwLCAweDMxLCAweDIwLCAweDNhLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDNiLCAweDBkLCAweDBhLAorICAweDA5LCAweDA5LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDIwLCAweDNkLCAweDIwLCAweDI4LCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDY1LCAweDcyLCAweDcyLCAweDMwLCAweDI5LCAweDIwLAorICAweDNmLCAweDIwLCAweDMwLCAweDIwLCAweDNhLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDNiLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDc0LCAweDYzLCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDczLAorICAweDY1LCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDZmLCAweDcyLCAweDI4LCAweDI2LCAweDZmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJjLCAweDIwLCAweDY5LCAweDIwLCAweDI2LCAweDIwLCAweDMzLAorICAweDJjLCAweDIwLCAweDY5LCAweDIwLCAweDNlLCAweDNlLCAweDIwLCAweDMyLCAweDJjLCAweDIwLCAweDYyLCAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY1LCAweDZjLCAweDI5LCAweDNiLCAweDBkLCAweDBhLCAweDA5LCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhLCAweDA5LCAweDcwLCAweDRmLCAweDc1LAorICAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDczLCAweDViLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDVmLCAweDY5LCAweDZlLCAweDY0LCAweDY1LCAweDc4LCAweDVkLCAweDIwLCAweDNkLCAweDIwLCAweDZmLCAweDc1LCAweDc0LCAweDcwLCAweDc1LAorICAweDc0LCAweDVmLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDNiLCAweDBkLCAweDBhLCAweDdkLCAweDBkLCAweDBhLCAweDBkLCAweDBhCit9OwordW5zaWduZWQgaW50IG9jbF9rZXJuZWxzX2NsX2xlbiA9IDQ1OTM1OwpkaWZmIC0tZ2l0IGEvZW5jb2Rlci9iYXNpc3Vfb3BlbmNsLmNwcCBiL2VuY29kZXIvYmFzaXN1X29wZW5jbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlMzA5MAotLS0gL2Rldi9udWxsCisrKyBiL2VuY29kZXIvYmFzaXN1X29wZW5jbC5jcHAKQEAgLTAsMCArMSwxMzMyIEBACisvLyBiYXNpc3Vfb3BlbmNsLmNwcAorLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgQmlub21pYWwgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjaW5jbHVkZSAiYmFzaXN1X29wZW5jbC5oIgorCisvLyBJZiAxLCB0aGUga2VybmVsIHNvdXJjZSBjb2RlIHdpbGwgY29tZSBmcm9tIGVuY29kZXJzL29jbF9rZXJuZWxzLmguIE90aGVyd2lzZSwgaXQgd2lsbCBiZSByZWFkIGZyb20gdGhlICJvY2xfa2VybmVscy5jbCIgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKGZvciBkZXZlbG9wbWVudCkuCisjZGVmaW5lIEJBU0lTVV9VU0VfT0NMX0tFUk5FTFNfSEVBREVSICgxKQorI2RlZmluZSBCQVNJU1VfT0NMX0tFUk5FTFNfRklMRU5BTUUgIm9jbF9rZXJuZWxzLmNsIgorCisjaWYgQkFTSVNVX1NVUFBPUlRfT1BFTkNMCisKKyNpbmNsdWRlICJiYXNpc3VfZW5jLmgiCisKKy8vIFdlIG9ubHkgdXNlIE9wZW5DTCB2MS4yIG9yIGxlc3MuCisjZGVmaW5lIENMX1RBUkdFVF9PUEVOQ0xfVkVSU0lPTiAxMjAKKworI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPE9wZW5DTC9vcGVuY2wuaD4KKyNlbHNlCisjaW5jbHVkZSA8Q0wvY2wuaD4KKyNlbmRpZgorCisjZGVmaW5lIEJBU0lTVV9PUEVOQ0xfQVNTRVJUX09OX0FOWV9FUlJPUlMgKDEpCisKK25hbWVzcGFjZSBiYXNpc3UKK3sKKyNpZiBCQVNJU1VfVVNFX09DTF9LRVJORUxTX0hFQURFUgorI2luY2x1ZGUgImJhc2lzdV9vY2xfa2VybmVscy5oIgorI2VuZGlmCisKKwlzdGF0aWMgdm9pZCBvY2xfZXJyb3JfcHJpbnRmKGNvbnN0IGNoYXIqIHBGbXQsIC4uLikKKwl7CisJCXZhX2xpc3QgYXJnczsKKwkJdmFfc3RhcnQoYXJncywgcEZtdCk7CisJCWVycm9yX3ZwcmludGYocEZtdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKworI2lmIEJBU0lTVV9PUEVOQ0xfQVNTRVJUX09OX0FOWV9FUlJPUlMKKwkJYXNzZXJ0KDApOworI2VuZGlmCisJfQorCisJY2xhc3Mgb2NsCisJeworCXB1YmxpYzoKKwkJb2NsKCkgCisJCXsKKwkJCW1lbXNldCgmbV9kZXZfZnBfY29uZmlnLCAwLCBzaXplb2YobV9kZXZfZnBfY29uZmlnKSk7CisJCQkKKwkJCW1fb2NsX211dGV4LmxvY2soKTsKKwkJCW1fb2NsX211dGV4LnVubG9jaygpOworCQl9CisKKwkJfm9jbCgpCisJCXsKKwkJfQorCisJCWJvb2wgaXNfaW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBtX2RldmljZV9pZCAhPSBudWxscHRyOyB9CisKKwkJY2xfZGV2aWNlX2lkIGdldF9kZXZpY2VfaWQoKSBjb25zdCB7IHJldHVybiBtX2RldmljZV9pZDsgfQorCQljbF9jb250ZXh0IGdldF9jb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZXh0OyB9CisJCWNsX2NvbW1hbmRfcXVldWUgZ2V0X2NvbW1hbmRfcXVldWUoKSB7IHJldHVybiBtX2NvbW1hbmRfcXVldWU7IH0KKwkJY2xfcHJvZ3JhbSBnZXRfcHJvZ3JhbSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvZ3JhbTsgfQorCisJCWJvb2wgaW5pdChib29sIGZvcmNlX3NlcmlhbGl6YXRpb24pCisJCXsKKwkJCWRlaW5pdCgpOworCisJCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJCXRtLnN0YXJ0KCk7CisKKwkJCWNsX3VpbnQgbnVtX3BsYXRmb3JtcyA9IDA7CisJCQljbF9pbnQgcmV0ID0gY2xHZXRQbGF0Zm9ybUlEcygwLCBOVUxMLCAmbnVtX3BsYXRmb3Jtcyk7CisJCQlpZiAocmV0ICE9IENMX1NVQ0NFU1MpCisJCQl7CisJCQkJb2NsX2Vycm9yX3ByaW50Zigib2NsOjppbml0OiBjbEdldFBsYXRmb3JtSURzKCkgZmFpbGVkIHdpdGggJWlcbiIsIHJldCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpZiAoKCFudW1fcGxhdGZvcm1zKSB8fCAobnVtX3BsYXRmb3JtcyA+IElOVF9NQVgpKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6aW5pdDogY2xHZXRQbGF0Zm9ybUlEcygpIHJldHVybmVkIGFuIGludmFsaWQgbnVtYmVyIG9mIG51bV9wbGF0Zm9ybXNcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJc3RkOjp2ZWN0b3I8Y2xfcGxhdGZvcm1faWQ+IHBsYXRmb3JtcyhudW1fcGxhdGZvcm1zKTsKKworCQkJcmV0ID0gY2xHZXRQbGF0Zm9ybUlEcyhudW1fcGxhdGZvcm1zLCBwbGF0Zm9ybXMuZGF0YSgpLCBOVUxMKTsKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OmluaXQ6IGNsR2V0UGxhdGZvcm1JRHMoKSBmYWlsZWRcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJY2xfdWludCBudW1fZGV2aWNlcyA9IDA7CisJCQlyZXQgPSBjbEdldERldmljZUlEcyhwbGF0Zm9ybXNbMF0sIENMX0RFVklDRV9UWVBFX0dQVSwgMSwgJm1fZGV2aWNlX2lkLCAmbnVtX2RldmljZXMpOworCisJCQlpZiAocmV0ID09IENMX0RFVklDRV9OT1RfRk9VTkQpCisJCQl7CisJCQkJb2NsX2Vycm9yX3ByaW50Zigib2NsOjppbml0OiBDb3VsZG4ndCBnZXQgYW55IEdQVSBkZXZpY2UgSUQncywgdHJ5aW5nIENMX0RFVklDRV9UWVBFX0NQVVxuIik7CisKKwkJCQlyZXQgPSBjbEdldERldmljZUlEcyhwbGF0Zm9ybXNbMF0sIENMX0RFVklDRV9UWVBFX0NQVSwgMSwgJm1fZGV2aWNlX2lkLCAmbnVtX2RldmljZXMpOworCQkJfQorCisJCQlpZiAocmV0ICE9IENMX1NVQ0NFU1MpCisJCQl7CisJCQkJb2NsX2Vycm9yX3ByaW50Zigib2NsOjppbml0OiBVbmFibGUgdG8gZ2V0IGFueSBkZXZpY2UgSUQnc1xuIik7CisKKwkJCQltX2RldmljZV9pZCA9IG51bGxwdHI7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXQgPSBjbEdldERldmljZUluZm8obV9kZXZpY2VfaWQsCisJCQkJQ0xfREVWSUNFX1NJTkdMRV9GUF9DT05GSUcsCisJCQkJc2l6ZW9mKG1fZGV2X2ZwX2NvbmZpZyksCisJCQkJJm1fZGV2X2ZwX2NvbmZpZywKKwkJCQludWxscHRyKTsKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OmluaXQ6IGNsR2V0RGV2aWNlSW5mbygpIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQljaGFyIHBsYXRfdmVyc1syNTZdOworCQkJc2l6ZV90IHJ2ID0gMDsKKwkJCXJldCA9IGNsR2V0UGxhdGZvcm1JbmZvKHBsYXRmb3Jtc1swXSwgQ0xfUExBVEZPUk1fVkVSU0lPTiwgc2l6ZW9mKHBsYXRfdmVycyksIHBsYXRfdmVycywgJnJ2KTsKKwkJCWlmIChyZXQgPT0gQ0xfU1VDQ0VTUykKKwkJCQlwcmludGYoIk9wZW5DTCBwbGF0Zm9ybSB2ZXJzaW9uOiBcIiVzXCJcbiIsIHBsYXRfdmVycyk7CisKKwkJCS8vIFNlcmlhbGl6ZSBDTCBjYWxscyB3aXRoIHRoZSBBTUQgZHJpdmVyIHRvIGF2b2lkIGxvY2t1cHMgd2hlbiBtdWx0aXBsZSBjb21tYW5kIHF1ZXVlcyBwZXIgdGhyZWFkIGFyZSB1c2VkLiBUaGlzIHN1Y2tzLCBidXQgd2hhdCBjYW4gd2UgZG8/CisJCQltX3VzZV9tdXRleCA9IChzdHJzdHIocGxhdF92ZXJzLCAiQU1EIikgIT0gbnVsbHB0cikgfHwgZm9yY2Vfc2VyaWFsaXphdGlvbjsKKworCQkJcHJpbnRmKCJTZXJpYWxpemluZyBPcGVuQ0wgY2FsbHMgYWNyb3NzIHRocmVhZHM6ICV1XG4iLCAodWludDMyX3QpbV91c2VfbXV0ZXgpOworCisJCQltX2NvbnRleHQgPSBjbENyZWF0ZUNvbnRleHQobnVsbHB0ciwgMSwgJm1fZGV2aWNlX2lkLCBudWxscHRyLCBudWxscHRyLCAmcmV0KTsKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OmluaXQ6IGNsQ3JlYXRlQ29udGV4dCgpIGZhaWxlZFxuIik7CisKKwkJCQltX2RldmljZV9pZCA9IG51bGxwdHI7CisJCQkJbV9jb250ZXh0ID0gbnVsbHB0cjsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCW1fY29tbWFuZF9xdWV1ZSA9IGNsQ3JlYXRlQ29tbWFuZFF1ZXVlKG1fY29udGV4dCwgbV9kZXZpY2VfaWQsIDAsICZyZXQpOworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6aW5pdDogY2xDcmVhdGVDb21tYW5kUXVldWUoKSBmYWlsZWRcbiIpOworCisJCQkJZGVpbml0KCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJCQkJCisJCQlwcmludGYoIk9wZW5DTCBpbml0IHRpbWU6ICUzLjNmIHNlY3NcbiIsIHRtLmdldF9lbGFwc2VkX3NlY3MoKSk7CisKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQkJCisJCWJvb2wgZGVpbml0KCkKKwkJeworCQkJaWYgKG1fcHJvZ3JhbSkKKwkJCXsKKwkJCQljbFJlbGVhc2VQcm9ncmFtKG1fcHJvZ3JhbSk7CisJCQkJbV9wcm9ncmFtID0gbnVsbHB0cjsKKwkJCX0KKworCQkJaWYgKG1fY29tbWFuZF9xdWV1ZSkKKwkJCXsKKwkJCQljbFJlbGVhc2VDb21tYW5kUXVldWUobV9jb21tYW5kX3F1ZXVlKTsKKwkJCQltX2NvbW1hbmRfcXVldWUgPSBudWxscHRyOworCQkJfQorCisJCQlpZiAobV9jb250ZXh0KQorCQkJeworCQkJCWNsUmVsZWFzZUNvbnRleHQobV9jb250ZXh0KTsKKwkJCQltX2NvbnRleHQgPSBudWxscHRyOworCQkJfQorCisJCQltX2RldmljZV9pZCA9IG51bGxwdHI7CisKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJY2xfY29tbWFuZF9xdWV1ZSBjcmVhdGVfY29tbWFuZF9xdWV1ZSgpCisJCXsKKwkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJY2xfaW50IHJldCA9IDA7CisJCQljbF9jb21tYW5kX3F1ZXVlIHAgPSBjbENyZWF0ZUNvbW1hbmRRdWV1ZShtX2NvbnRleHQsIG1fZGV2aWNlX2lkLCAwLCAmcmV0KTsKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCQlyZXR1cm4gbnVsbHB0cjsKKworCQkJcmV0dXJuIHA7CisJCX0KKworCQl2b2lkIGRlc3Ryb3lfY29tbWFuZF9xdWV1ZShjbF9jb21tYW5kX3F1ZXVlIHApCisJCXsKKwkJCWlmIChwKQorCQkJeworCQkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJCWNsUmVsZWFzZUNvbW1hbmRRdWV1ZShwKTsKKwkJCX0KKwkJfQorCisJCWJvb2wgaW5pdF9wcm9ncmFtKGNvbnN0IGNoYXIqIHBTcmMsIHNpemVfdCBzcmNfc2l6ZSkKKwkJeworCQkJY2xfaW50IHJldDsKKworCQkJaWYgKG1fcHJvZ3JhbSAhPSBudWxscHRyKQorCQkJeworCQkJCWNsUmVsZWFzZVByb2dyYW0obV9wcm9ncmFtKTsKKwkJCQltX3Byb2dyYW0gPSBudWxscHRyOworCQkJfQorCisJCQltX3Byb2dyYW0gPSBjbENyZWF0ZVByb2dyYW1XaXRoU291cmNlKG1fY29udGV4dCwgMSwgKGNvbnN0IGNoYXIqKikmcFNyYywgKGNvbnN0IHNpemVfdCopJnNyY19zaXplLCAmcmV0KTsKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OmluaXRfcHJvZ3JhbTogY2xDcmVhdGVQcm9ncmFtV2l0aFNvdXJjZSgpIGZhaWxlZCFcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJc3RkOjpzdHJpbmcgb3B0aW9uczsKKwkJCWlmIChtX2Rldl9mcF9jb25maWcgJiBDTF9GUF9DT1JSRUNUTFlfUk9VTkRFRF9ESVZJREVfU1FSVCkKKwkJCXsKKwkJCQlvcHRpb25zICs9ICItY2wtZnAzMi1jb3JyZWN0bHktcm91bmRlZC1kaXZpZGUtc3FydCI7CisJCQl9CisKKwkJCW9wdGlvbnMgKz0gIiAtY2wtc3RkPUNMMS4yIjsKKwkJCS8vb3B0aW9ucyArPSAiIC1jbC1vcHQtZGlzYWJsZSI7CisJCQkvL29wdGlvbnMgKz0gIiAtY2wtbWFkLWVuYWJsZSI7CisJCQkvL29wdGlvbnMgKz0gIiAtY2wtZmFzdC1yZWxheGVkLW1hdGgiOworCisJCQlyZXQgPSBjbEJ1aWxkUHJvZ3JhbShtX3Byb2dyYW0sIDEsICZtX2RldmljZV9pZCwKKwkJCQlvcHRpb25zLnNpemUoKSA/IG9wdGlvbnMuY19zdHIoKSA6IG51bGxwdHIsICAvLyBvcHRpb25zCisJCQkJbnVsbHB0ciwgIC8vIG5vdGlmeQorCQkJCW51bGxwdHIpOyAvLyB1c2VyX2RhdGEKKworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCWNvbnN0IGNsX2ludCBidWlsZF9wcm9ncmFtX3Jlc3VsdCA9IHJldDsKKworCQkJCXNpemVfdCByZXRfdmFsX3NpemU7CisJCQkJcmV0ID0gY2xHZXRQcm9ncmFtQnVpbGRJbmZvKG1fcHJvZ3JhbSwgbV9kZXZpY2VfaWQsIENMX1BST0dSQU1fQlVJTERfTE9HLCAwLCBOVUxMLCAmcmV0X3ZhbF9zaXplKTsKKwkJCQlpZiAocmV0ICE9IENMX1NVQ0NFU1MpCisJCQkJeworCQkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OmluaXRfcHJvZ3JhbTogY2xHZXRQcm9ncmFtQnVpbGRJbmZvKCkgZmFpbGVkIVxuIik7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCQlzdGQ6OnZlY3RvcjxjaGFyPiBidWlsZF9sb2cocmV0X3ZhbF9zaXplICsgMSk7CisKKwkJCQlyZXQgPSBjbEdldFByb2dyYW1CdWlsZEluZm8obV9wcm9ncmFtLCBtX2RldmljZV9pZCwgQ0xfUFJPR1JBTV9CVUlMRF9MT0csIHJldF92YWxfc2l6ZSwgYnVpbGRfbG9nLmRhdGEoKSwgTlVMTCk7CisKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJcbmNsQnVpbGRQcm9ncmFtKCkgZmFpbGVkIHdpdGggZXJyb3IgJWk6XG4lcyIsIGJ1aWxkX3Byb2dyYW1fcmVzdWx0LCBidWlsZF9sb2cuZGF0YSgpKTsKKworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQljbF9rZXJuZWwgY3JlYXRlX2tlcm5lbChjb25zdCBjaGFyKiBwTmFtZSkKKwkJeworCQkJaWYgKCFtX3Byb2dyYW0pCisJCQkJcmV0dXJuIG51bGxwdHI7CisKKwkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJY2xfaW50IHJldDsKKwkJCWNsX2tlcm5lbCBrZXJuZWwgPSBjbENyZWF0ZUtlcm5lbChtX3Byb2dyYW0sIHBOYW1lLCAmcmV0KTsKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OmNyZWF0ZV9rZXJuZWw6IGNsQ3JlYXRlS2VybmVsKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIG51bGxwdHI7CisJCQl9CisKKwkJCXJldHVybiBrZXJuZWw7CisJCX0KKworCQlib29sIGRlc3Ryb3lfa2VybmVsKGNsX2tlcm5lbCBrKQorCQl7CisJCQlpZiAoaykKKwkJCXsKKwkJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisKKwkJCQljbF9pbnQgcmV0ID0gY2xSZWxlYXNlS2VybmVsKGspOworCQkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCQl7CisJCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6ZGVzdHJveV9rZXJuZWw6IGNsUmVsZWFzZUtlcm5lbCgpIGZhaWxlZCFcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQljbF9tZW0gYWxsb2NfcmVhZF9idWZmZXIoc2l6ZV90IHNpemUpCisJCXsKKwkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJY2xfaW50IHJldDsKKwkJCWNsX21lbSBvYmogPSBjbENyZWF0ZUJ1ZmZlcihtX2NvbnRleHQsIENMX01FTV9SRUFEX09OTFksIHNpemUsIE5VTEwsICZyZXQpOworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6YWxsb2NfcmVhZF9idWZmZXI6IGNsQ3JlYXRlQnVmZmVyKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIG51bGxwdHI7CisJCQl9CisKKwkJCXJldHVybiBvYmo7CisJCX0KKworCQljbF9tZW0gYWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXIoY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjb25zdCB2b2lkICpwSW5pdCwgc2l6ZV90IHNpemUpCisJCXsKKwkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJY2xfaW50IHJldDsKKwkJCWNsX21lbSBvYmogPSBjbENyZWF0ZUJ1ZmZlcihtX2NvbnRleHQsIENMX01FTV9SRUFEX09OTFksIHNpemUsIE5VTEwsICZyZXQpOworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6YWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXI6IGNsQ3JlYXRlQnVmZmVyKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIG51bGxwdHI7CisJCQl9CisKKyNpZiAwCisJCQlpZiAoIXdyaXRlX3RvX2J1ZmZlcihjb21tYW5kX3F1ZXVlLCBvYmosIHBJbml0LCBzaXplKSkKKwkJCXsKKwkJCQlkZXN0cm95X2J1ZmZlcihvYmopOworCQkJCXJldHVybiBudWxscHRyOworCQkJfQorI2Vsc2UKKwkJCXJldCA9IGNsRW5xdWV1ZVdyaXRlQnVmZmVyKGNvbW1hbmRfcXVldWUsIG9iaiwgQ0xfVFJVRSwgMCwgc2l6ZSwgcEluaXQsIDAsIE5VTEwsIE5VTEwpOworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6YWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXI6IGNsRW5xdWV1ZVdyaXRlQnVmZmVyKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIG51bGxwdHI7CisJCQl9CisjZW5kaWYKKworCQkJcmV0dXJuIG9iajsKKwkJfQorCisJCWNsX21lbSBhbGxvY193cml0ZV9idWZmZXIoc2l6ZV90IHNpemUpCisJCXsKKwkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJY2xfaW50IHJldDsKKwkJCWNsX21lbSBvYmogPSBjbENyZWF0ZUJ1ZmZlcihtX2NvbnRleHQsIENMX01FTV9XUklURV9PTkxZLCBzaXplLCBOVUxMLCAmcmV0KTsKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OmFsbG9jX3dyaXRlX2J1ZmZlcjogY2xDcmVhdGVCdWZmZXIoKSBmYWlsZWQhXG4iKTsKKwkJCQlyZXR1cm4gbnVsbHB0cjsKKwkJCX0KKworCQkJcmV0dXJuIG9iajsKKwkJfQorCQkJCQorCQlib29sIGRlc3Ryb3lfYnVmZmVyKGNsX21lbSBidWYpCisJCXsKKwkJCWlmIChidWYpCisJCQl7CisJCQkJY2xfc2VyaWFsaXplciBzZXJpYWxpemVyKHRoaXMpOworCisJCQkJY2xfaW50IHJldCA9IGNsUmVsZWFzZU1lbU9iamVjdChidWYpOworCQkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCQl7CisJCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6ZGVzdHJveV9idWZmZXI6IGNsUmVsZWFzZU1lbU9iamVjdCgpIGZhaWxlZCFcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWJvb2wgd3JpdGVfdG9fYnVmZmVyKGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIGNsbWVtLCBjb25zdCB2b2lkKiBkLCBjb25zdCBzaXplX3QgbSkKKwkJeworCQkJY2xfc2VyaWFsaXplciBzZXJpYWxpemVyKHRoaXMpOworCisJCQljbF9pbnQgcmV0ID0gY2xFbnF1ZXVlV3JpdGVCdWZmZXIoY29tbWFuZF9xdWV1ZSwgY2xtZW0sIENMX1RSVUUsIDAsIG0sIGQsIDAsIE5VTEwsIE5VTEwpOworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6d3JpdGVfdG9fYnVmZmVyOiBjbEVucXVldWVXcml0ZUJ1ZmZlcigpIGZhaWxlZCFcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlib29sIHJlYWRfZnJvbV9idWZmZXIoY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlLCBjb25zdCBjbF9tZW0gY2xtZW0sIHZvaWQqIGQsIHNpemVfdCBtKQorCQl7CisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisKKwkJCWNsX2ludCByZXQgPSBjbEVucXVldWVSZWFkQnVmZmVyKGNvbW1hbmRfcXVldWUsIGNsbWVtLCBDTF9UUlVFLCAwLCBtLCBkLCAwLCBOVUxMLCBOVUxMKTsKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OnJlYWRfZnJvbV9idWZmZXI6IGNsRW5xdWV1ZVJlYWRCdWZmZXIoKSBmYWlsZWQhXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJY2xfbWVtIGNyZWF0ZV9yZWFkX2ltYWdlX3U4KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGNvbnN0IHZvaWQqIHBQaXhlbHMsIHVpbnQzMl90IGJ5dGVzX3Blcl9waXhlbCwgYm9vbCBub3JtYWxpemVkKQorCQl7CisJCQljbF9pbWFnZV9mb3JtYXQgZm10ID0gZ2V0X2ltYWdlX2Zvcm1hdChieXRlc19wZXJfcGl4ZWwsIG5vcm1hbGl6ZWQpOworCisJCQljbF9pbWFnZV9kZXNjIGRlc2M7CisJCQltZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisJCQlkZXNjLmltYWdlX3R5cGUgPSBDTF9NRU1fT0JKRUNUX0lNQUdFMkQ7CisJCQlkZXNjLmltYWdlX3dpZHRoID0gd2lkdGg7CisJCQlkZXNjLmltYWdlX2hlaWdodCA9IGhlaWdodDsKKwkJCWRlc2MuaW1hZ2Vfcm93X3BpdGNoID0gd2lkdGggKiBieXRlc19wZXJfcGl4ZWw7CisKKwkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJY2xfaW50IHJldDsKKwkJCWNsX21lbSBpbWcgPSBjbENyZWF0ZUltYWdlKG1fY29udGV4dCwgQ0xfTUVNX1JFQURfT05MWSB8IENMX01FTV9DT1BZX0hPU1RfUFRSLCAmZm10LCAmZGVzYywgKHZvaWQqKXBQaXhlbHMsICZyZXQpOworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6Y3JlYXRlX3JlYWRfaW1hZ2VfdTg6IGNsQ3JlYXRlSW1hZ2UoKSBmYWlsZWQhXG4iKTsKKwkJCQlyZXR1cm4gbnVsbHB0cjsKKwkJCX0KKworCQkJcmV0dXJuIGltZzsKKwkJfQorCisJCWNsX21lbSBjcmVhdGVfd3JpdGVfaW1hZ2VfdTgodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgYnl0ZXNfcGVyX3BpeGVsLCBib29sIG5vcm1hbGl6ZWQpCisJCXsKKwkJCWNsX2ltYWdlX2Zvcm1hdCBmbXQgPSBnZXRfaW1hZ2VfZm9ybWF0KGJ5dGVzX3Blcl9waXhlbCwgbm9ybWFsaXplZCk7CisKKwkJCWNsX2ltYWdlX2Rlc2MgZGVzYzsKKwkJCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKwkJCWRlc2MuaW1hZ2VfdHlwZSA9IENMX01FTV9PQkpFQ1RfSU1BR0UyRDsKKwkJCWRlc2MuaW1hZ2Vfd2lkdGggPSB3aWR0aDsKKwkJCWRlc2MuaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OworCisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisKKwkJCWNsX2ludCByZXQ7CisJCQljbF9tZW0gaW1nID0gY2xDcmVhdGVJbWFnZShtX2NvbnRleHQsIENMX01FTV9XUklURV9PTkxZLCAmZm10LCAmZGVzYywgbnVsbHB0ciwgJnJldCk7CisJCQlpZiAocmV0ICE9IENMX1NVQ0NFU1MpCisJCQl7CisJCQkJb2NsX2Vycm9yX3ByaW50Zigib2NsOjpjcmVhdGVfd3JpdGVfaW1hZ2VfdTg6IGNsQ3JlYXRlSW1hZ2UoKSBmYWlsZWQhXG4iKTsKKwkJCQlyZXR1cm4gbnVsbHB0cjsKKwkJCX0KKworCQkJcmV0dXJuIGltZzsKKwkJfQorCisJCWJvb2wgcmVhZF9mcm9tX2ltYWdlKGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY2xfbWVtIGltZywgdm9pZCogcFBpeGVscywgdWludDMyX3Qgb2ZzX3gsIHVpbnQzMl90IG9mc195LCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQorCQl7CisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisKKwkJCXNpemVfdCBvcmlnaW5bM10gPSB7IG9mc194LCBvZnNfeSwgMCB9LCByZWdpb25bM10gPSB7IHdpZHRoLCBoZWlnaHQsIDEgfTsKKworCQkJY2xfaW50IGVyciA9IGNsRW5xdWV1ZVJlYWRJbWFnZShjb21tYW5kX3F1ZXVlLCBpbWcsIENMX1RSVUUsIG9yaWdpbiwgcmVnaW9uLCAwLCAwLCBwUGl4ZWxzLCAwLCBOVUxMLCBOVUxMKTsKKwkJCWlmIChlcnIgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OnJlYWRfZnJvbV9pbWFnZTogY2xFbnF1ZXVlUmVhZEltYWdlKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWJvb2wgcnVuXzFEKGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY29uc3QgY2xfa2VybmVsIGtlcm5lbCwgc2l6ZV90IG51bV9pdGVtcykKKwkJeworCQkJY2xfc2VyaWFsaXplciBzZXJpYWxpemVyKHRoaXMpOworCisJCQljbF9pbnQgcmV0ID0gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbChjb21tYW5kX3F1ZXVlLCBrZXJuZWwsCisJCQkJMSwgIC8vIHdvcmtfZGltCisJCQkJbnVsbHB0ciwgLy8gZ2xvYmFsX3dvcmtfb2Zmc2V0CisJCQkJJm51bV9pdGVtcywgLy8gZ2xvYmFsX3dvcmtfc2l6ZQorCQkJCW51bGxwdHIsIC8vIGxvY2FsX3dvcmtfc2l6ZQorCQkJCTAsIC8vIG51bV9ldmVudHNfaW5fd2FpdF9saXN0CisJCQkJbnVsbHB0ciwgLy8gZXZlbnRfd2FpdF9saXN0CisJCQkJbnVsbHB0ciAvLyBldmVudAorCQkJKTsKKworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6cnVuXzFEOiBjbEVucXVldWVORFJhbmdlS2VybmVsKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWJvb2wgcnVuXzJEKGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZSwgY29uc3QgY2xfa2VybmVsIGtlcm5lbCwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KQorCQl7CisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisKKwkJCXNpemVfdCBudW1fZ2xvYmFsX2l0ZW1zWzJdID0geyB3aWR0aCwgaGVpZ2h0IH07CisJCQkvL3NpemVfdCBudW1fbG9jYWxfaXRlbXNbMl0gPSB7IDEsIDEgfTsKKworCQkJY2xfaW50IHJldCA9IGNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwoY29tbWFuZF9xdWV1ZSwga2VybmVsLAorCQkJCTIsICAvLyB3b3JrX2RpbQorCQkJCW51bGxwdHIsIC8vIGdsb2JhbF93b3JrX29mZnNldAorCQkJCW51bV9nbG9iYWxfaXRlbXMsIC8vIGdsb2JhbF93b3JrX3NpemUKKwkJCQludWxscHRyLCAvLyBsb2NhbF93b3JrX3NpemUKKwkJCQkwLCAvLyBudW1fZXZlbnRzX2luX3dhaXRfbGlzdAorCQkJCW51bGxwdHIsIC8vIGV2ZW50X3dhaXRfbGlzdAorCQkJCW51bGxwdHIgLy8gZXZlbnQKKwkJCSk7CisKKwkJCWlmIChyZXQgIT0gQ0xfU1VDQ0VTUykKKwkJCXsKKwkJCQlvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OnJ1bl8yRDogY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCgpIGZhaWxlZCFcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlib29sIHJ1bl8yRChjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWUsIGNvbnN0IGNsX2tlcm5lbCBrZXJuZWwsIHNpemVfdCBvZnNfeCwgc2l6ZV90IG9mc195LCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCisJCXsKKwkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJc2l6ZV90IGdsb2JhbF9vZnNbMl0gPSB7IG9mc194LCBvZnNfeSB9OworCQkJc2l6ZV90IG51bV9nbG9iYWxfaXRlbXNbMl0gPSB7IHdpZHRoLCBoZWlnaHQgfTsKKwkJCS8vc2l6ZV90IG51bV9sb2NhbF9pdGVtc1syXSA9IHsgMSwgMSB9OworCisJCQljbF9pbnQgcmV0ID0gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbChjb21tYW5kX3F1ZXVlLCBrZXJuZWwsCisJCQkJMiwgIC8vIHdvcmtfZGltCisJCQkJZ2xvYmFsX29mcywgLy8gZ2xvYmFsX3dvcmtfb2Zmc2V0CisJCQkJbnVtX2dsb2JhbF9pdGVtcywgLy8gZ2xvYmFsX3dvcmtfc2l6ZQorCQkJCW51bGxwdHIsIC8vIGxvY2FsX3dvcmtfc2l6ZQorCQkJCTAsIC8vIG51bV9ldmVudHNfaW5fd2FpdF9saXN0CisJCQkJbnVsbHB0ciwgLy8gZXZlbnRfd2FpdF9saXN0CisJCQkJbnVsbHB0ciAvLyBldmVudAorCQkJKTsKKworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6cnVuXzJEOiBjbEVucXVldWVORFJhbmdlS2VybmVsKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXZvaWQgZmx1c2goY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlKQorCQl7CisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisKKwkJCWNsRmx1c2goY29tbWFuZF9xdWV1ZSk7CisJCQljbEZpbmlzaChjb21tYW5kX3F1ZXVlKTsKKwkJfQorCisJCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CisJCWJvb2wgc2V0X2tlcm5lbF9hcmcoY2xfa2VybmVsIGtlcm5lbCwgdWludDMyX3QgaW5kZXgsIGNvbnN0IFQmIG9iaikKKwkJeworCQkJY2xfc2VyaWFsaXplciBzZXJpYWxpemVyKHRoaXMpOworCisJCQljbF9pbnQgcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCBpbmRleCwgc2l6ZW9mKFQpLCAodm9pZCopJm9iaik7CisJCQlpZiAocmV0ICE9IENMX1NVQ0NFU1MpCisJCQl7CisJCQkJb2NsX2Vycm9yX3ByaW50Zigib2NsOjpzZXRfa2VybmVsX2FyZzogY2xTZXRLZXJuZWxBcmcoKSBmYWlsZWQhXG4iKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CisJCWJvb2wgc2V0X2tlcm5lbF9hcmdzKGNsX2tlcm5lbCBrZXJuZWwsIGNvbnN0IFQmIG9iajEpCisJCXsKKwkJCWNsX3NlcmlhbGl6ZXIgc2VyaWFsaXplcih0aGlzKTsKKworCQkJY2xfaW50IHJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMCwgc2l6ZW9mKFQpLCAodm9pZCopJm9iajEpOworCQkJaWYgKHJldCAhPSBDTF9TVUNDRVNTKQorCQkJeworCQkJCW9jbF9lcnJvcl9wcmludGYoIm9jbDo6c2V0X2tlcm5lbF9hcmc6IGNsU2V0S2VybmVsQXJnKCkgZmFpbGVkIVxuIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworI2RlZmluZSBCQVNJU1VfQ0hFQ0tfRVJSIGlmIChyZXQgIT0gQ0xfU1VDQ0VTUykJeyBvY2xfZXJyb3JfcHJpbnRmKCJvY2w6OnNldF9rZXJuZWxfYXJnczogY2xTZXRLZXJuZWxBcmcoKSBmYWlsZWQhXG4iKTsgcmV0dXJuIGZhbHNlOyB9CisKKwkJdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKwkJYm9vbCBzZXRfa2VybmVsX2FyZ3MoY2xfa2VybmVsIGtlcm5lbCwgY29uc3QgVCYgb2JqMSwgY29uc3QgVSYgb2JqMikKKwkJeworCQkJY2xfc2VyaWFsaXplciBzZXJpYWxpemVyKHRoaXMpOworCQkJY2xfaW50IHJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMCwgc2l6ZW9mKFQpLCAodm9pZCopJm9iajEpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDEsIHNpemVvZihVKSwgKHZvaWQqKSZvYmoyKTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgorCQlib29sIHNldF9rZXJuZWxfYXJncyhjbF9rZXJuZWwga2VybmVsLCBjb25zdCBUJiBvYmoxLCBjb25zdCBVJiBvYmoyLCBjb25zdCBWJiBvYmozKQorCQl7CisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisJCQljbF9pbnQgcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAwLCBzaXplb2YoVCksICh2b2lkKikmb2JqMSk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMSwgc2l6ZW9mKFUpLCAodm9pZCopJm9iajIpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDIsIHNpemVvZihWKSwgKHZvaWQqKSZvYmozKTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXPgorCQlib29sIHNldF9rZXJuZWxfYXJncyhjbF9rZXJuZWwga2VybmVsLCBjb25zdCBUJiBvYmoxLCBjb25zdCBVJiBvYmoyLCBjb25zdCBWJiBvYmozLCBjb25zdCBXJiBvYmo0KQorCQl7CisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisJCQljbF9pbnQgcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAwLCBzaXplb2YoVCksICh2b2lkKikmb2JqMSk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMSwgc2l6ZW9mKFUpLCAodm9pZCopJm9iajIpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDIsIHNpemVvZihWKSwgKHZvaWQqKSZvYmozKTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAzLCBzaXplb2YoVyksICh2b2lkKikmb2JqNCk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgVywgdHlwZW5hbWUgWD4KKwkJYm9vbCBzZXRfa2VybmVsX2FyZ3MoY2xfa2VybmVsIGtlcm5lbCwgY29uc3QgVCYgb2JqMSwgY29uc3QgVSYgb2JqMiwgY29uc3QgViYgb2JqMywgY29uc3QgVyYgb2JqNCwgY29uc3QgWCYgb2JqNSkKKwkJeworCQkJY2xfc2VyaWFsaXplciBzZXJpYWxpemVyKHRoaXMpOworCQkJY2xfaW50IHJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMCwgc2l6ZW9mKFQpLCAodm9pZCopJm9iajEpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDEsIHNpemVvZihVKSwgKHZvaWQqKSZvYmoyKTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAyLCBzaXplb2YoViksICh2b2lkKikmb2JqMyk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMywgc2l6ZW9mKFcpLCAodm9pZCopJm9iajQpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDQsIHNpemVvZihYKSwgKHZvaWQqKSZvYmo1KTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPgorCQlib29sIHNldF9rZXJuZWxfYXJncyhjbF9rZXJuZWwga2VybmVsLCBjb25zdCBUJiBvYmoxLCBjb25zdCBVJiBvYmoyLCBjb25zdCBWJiBvYmozLCBjb25zdCBXJiBvYmo0LCBjb25zdCBYJiBvYmo1LCBjb25zdCBZJiBvYmo2KQorCQl7CisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisJCQljbF9pbnQgcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAwLCBzaXplb2YoVCksICh2b2lkKikmb2JqMSk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMSwgc2l6ZW9mKFUpLCAodm9pZCopJm9iajIpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDIsIHNpemVvZihWKSwgKHZvaWQqKSZvYmozKTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAzLCBzaXplb2YoVyksICh2b2lkKikmb2JqNCk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgNCwgc2l6ZW9mKFgpLCAodm9pZCopJm9iajUpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDUsIHNpemVvZihZKSwgKHZvaWQqKSZvYmo2KTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYLCB0eXBlbmFtZSBZLCB0eXBlbmFtZSBaPgorCQlib29sIHNldF9rZXJuZWxfYXJncyhjbF9rZXJuZWwga2VybmVsLCBjb25zdCBUJiBvYmoxLCBjb25zdCBVJiBvYmoyLCBjb25zdCBWJiBvYmozLCBjb25zdCBXJiBvYmo0LCBjb25zdCBYJiBvYmo1LCBjb25zdCBZJiBvYmo2LCBjb25zdCBaJiBvYmo3KQorCQl7CisJCQljbF9zZXJpYWxpemVyIHNlcmlhbGl6ZXIodGhpcyk7CisJCQljbF9pbnQgcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAwLCBzaXplb2YoVCksICh2b2lkKikmb2JqMSk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMSwgc2l6ZW9mKFUpLCAodm9pZCopJm9iajIpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDIsIHNpemVvZihWKSwgKHZvaWQqKSZvYmozKTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAzLCBzaXplb2YoVyksICh2b2lkKikmb2JqNCk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgNCwgc2l6ZW9mKFgpLCAodm9pZCopJm9iajUpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDUsIHNpemVvZihZKSwgKHZvaWQqKSZvYmo2KTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCA2LCBzaXplb2YoWiksICh2b2lkKikmb2JqNyk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgVywgdHlwZW5hbWUgWCwgdHlwZW5hbWUgWSwgdHlwZW5hbWUgWiwgdHlwZW5hbWUgQT4KKwkJYm9vbCBzZXRfa2VybmVsX2FyZ3MoY2xfa2VybmVsIGtlcm5lbCwgY29uc3QgVCYgb2JqMSwgY29uc3QgVSYgb2JqMiwgY29uc3QgViYgb2JqMywgY29uc3QgVyYgb2JqNCwgY29uc3QgWCYgb2JqNSwgY29uc3QgWSYgb2JqNiwgY29uc3QgWiYgb2JqNywgY29uc3QgQSYgb2JqOCkKKwkJeworCQkJY2xfc2VyaWFsaXplciBzZXJpYWxpemVyKHRoaXMpOworCQkJY2xfaW50IHJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMCwgc2l6ZW9mKFQpLCAodm9pZCopJm9iajEpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDEsIHNpemVvZihVKSwgKHZvaWQqKSZvYmoyKTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCAyLCBzaXplb2YoViksICh2b2lkKikmb2JqMyk7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgMywgc2l6ZW9mKFcpLCAodm9pZCopJm9iajQpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDQsIHNpemVvZihYKSwgKHZvaWQqKSZvYmo1KTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0ID0gY2xTZXRLZXJuZWxBcmcoa2VybmVsLCA1LCBzaXplb2YoWSksICh2b2lkKikmb2JqNik7IEJBU0lTVV9DSEVDS19FUlIKKwkJCXJldCA9IGNsU2V0S2VybmVsQXJnKGtlcm5lbCwgNiwgc2l6ZW9mKFopLCAodm9pZCopJm9iajcpOyBCQVNJU1VfQ0hFQ0tfRVJSCisJCQlyZXQgPSBjbFNldEtlcm5lbEFyZyhrZXJuZWwsIDcsIHNpemVvZihBKSwgKHZvaWQqKSZvYmo4KTsgQkFTSVNVX0NIRUNLX0VSUgorCQkJcmV0dXJuIHRydWU7CisJCX0KKyN1bmRlZiBCQVNJU1VfQ0hFQ0tfRVJSCisKKwlwcml2YXRlOgorCQljbF9kZXZpY2VfaWQgbV9kZXZpY2VfaWQgPSBudWxscHRyOworCQljbF9jb250ZXh0IG1fY29udGV4dCA9IG51bGxwdHI7CisJCWNsX2NvbW1hbmRfcXVldWUgbV9jb21tYW5kX3F1ZXVlID0gbnVsbHB0cjsKKwkJY2xfcHJvZ3JhbSBtX3Byb2dyYW0gPSBudWxscHRyOworCQljbF9kZXZpY2VfZnBfY29uZmlnIG1fZGV2X2ZwX2NvbmZpZzsKKwkJCisJCWJvb2wgbV91c2VfbXV0ZXggPSBmYWxzZTsKKwkJc3RkOjptdXRleCBtX29jbF9tdXRleDsKKworCQkvLyBUaGlzIGhlbHBlciBvYmplY3QgaXMgdXNlZCB0byBvcHRpb25hbGx5IHNlcmlhbGl6ZSBhbGwgY2FsbHMgdG8gdGhlIENMIGRyaXZlciBhZnRlciBpbml0aWFsaXphdGlvbi4KKwkJLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHRvIHdvcmsgYXJvdW5kIHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgV2luZG93cyBBTUQgZHJpdmVyLgorCQlzdHJ1Y3QgY2xfc2VyaWFsaXplcgorCQl7CisJCQlpbmxpbmUgY2xfc2VyaWFsaXplcihjb25zdCBjbF9zZXJpYWxpemVyJik7CisJCQljbF9zZXJpYWxpemVyJiBvcGVyYXRvcj0gKGNvbnN0IGNsX3NlcmlhbGl6ZXImKTsKKworCQkJaW5saW5lIGNsX3NlcmlhbGl6ZXIob2NsICpwKSA6IG1fcChwKQorCQkJeworCQkJCWlmIChtX3AtPm1fdXNlX211dGV4KQorCQkJCQltX3AtPm1fb2NsX211dGV4LmxvY2soKTsKKwkJCX0KKworCQkJaW5saW5lIH5jbF9zZXJpYWxpemVyKCkKKwkJCXsKKwkJCQlpZiAobV9wLT5tX3VzZV9tdXRleCkKKwkJCQkJbV9wLT5tX29jbF9tdXRleC51bmxvY2soKTsKKwkJCX0KKworCQlwcml2YXRlOgorCQkJb2NsKiBtX3A7CisJCX07CisJCQorCQljbF9pbWFnZV9mb3JtYXQgZ2V0X2ltYWdlX2Zvcm1hdCh1aW50MzJfdCBieXRlc19wZXJfcGl4ZWwsIGJvb2wgbm9ybWFsaXplZCkKKwkJeworCQkJY2xfaW1hZ2VfZm9ybWF0IGZtdDsKKwkJCXN3aXRjaCAoYnl0ZXNfcGVyX3BpeGVsKQorCQkJeworCQkJY2FzZSAxOiBmbXQuaW1hZ2VfY2hhbm5lbF9vcmRlciA9IENMX0xVTUlOQU5DRTsgYnJlYWs7CisJCQljYXNlIDI6IGZtdC5pbWFnZV9jaGFubmVsX29yZGVyID0gQ0xfUkc7IGJyZWFrOworCQkJY2FzZSAzOiBmbXQuaW1hZ2VfY2hhbm5lbF9vcmRlciA9IENMX1JHQjsgYnJlYWs7CisJCQljYXNlIDQ6IGZtdC5pbWFnZV9jaGFubmVsX29yZGVyID0gQ0xfUkdCQTsgYnJlYWs7CisJCQlkZWZhdWx0OiBhc3NlcnQoMCk7IGZtdC5pbWFnZV9jaGFubmVsX29yZGVyID0gQ0xfTFVNSU5BTkNFOyBicmVhazsKKwkJCX0KKworCQkJZm10LmltYWdlX2NoYW5uZWxfZGF0YV90eXBlID0gbm9ybWFsaXplZCA/IENMX1VOT1JNX0lOVDggOiBDTF9VTlNJR05FRF9JTlQ4OworCQkJcmV0dXJuIGZtdDsKKwkJfQorCX07CisJCQorCS8vIExpYnJhcnkgYmxvYmFsIHN0YXRlCisJb2NsIGdfb2NsOworCQkJCisJYm9vbCBvcGVuY2xfaW5pdChib29sIGZvcmNlX3NlcmlhbGl6YXRpb24pCisJeworCQlpZiAoZ19vY2wuaXNfaW5pdGlhbGl6ZWQoKSkKKwkJeworCQkJYXNzZXJ0KDApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFnX29jbC5pbml0KGZvcmNlX3NlcmlhbGl6YXRpb24pKQorCQl7CisJCQlvY2xfZXJyb3JfcHJpbnRmKCJvcGVuY2xfaW5pdDogRmFpbGVkIGluaXRpYWxpemluZyBPcGVuQ0xcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJY29uc3QgY2hhciogcEtlcm5lbF9zcmMgPSBudWxscHRyOworCQlzaXplX3Qga2VybmVsX3NyY19zaXplID0gMDsKKwkJdWludDhfdmVjIGtlcm5lbF9zcmM7CisKKyNpZiBCQVNJU1VfVVNFX09DTF9LRVJORUxTX0hFQURFUgorCQlwS2VybmVsX3NyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG9jbF9rZXJuZWxzX2NsKTsKKwkJa2VybmVsX3NyY19zaXplID0gb2NsX2tlcm5lbHNfY2xfbGVuOworI2Vsc2UKKwkJaWYgKCFyZWFkX2ZpbGVfdG9fdmVjKEJBU0lTVV9PQ0xfS0VSTkVMU19GSUxFTkFNRSwga2VybmVsX3NyYykpCisJCXsKKwkJCW9jbF9lcnJvcl9wcmludGYoIm9wZW5jbF9pbml0OiBDYW5ub3QgcmVhZCBPcGVuQ0wga2VybmVsIHNvdXJjZSBmaWxlIFwiJXNcIlxuIiwgQkFTSVNVX09DTF9LRVJORUxTX0ZJTEVOQU1FKTsKKwkJCWdfb2NsLmRlaW5pdCgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQkKKwkJcEtlcm5lbF9zcmMgPSAoY2hhciopa2VybmVsX3NyYy5kYXRhKCk7CisJCWtlcm5lbF9zcmNfc2l6ZSA9IGtlcm5lbF9zcmMuc2l6ZSgpOworI2VuZGlmCisJCQorCQlpZiAoIWtlcm5lbF9zcmNfc2l6ZSkKKwkJeworCQkJb2NsX2Vycm9yX3ByaW50Zigib3BlbmNsX2luaXQ6IEludmFsaWQgT3BlbkNMIGtlcm5lbCBzb3VyY2UgZmlsZSBcIiVzXCJcbiIsIEJBU0lTVV9PQ0xfS0VSTkVMU19GSUxFTkFNRSk7CisJCQlnX29jbC5kZWluaXQoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghZ19vY2wuaW5pdF9wcm9ncmFtKHBLZXJuZWxfc3JjLCBrZXJuZWxfc3JjX3NpemUpKQorCQl7CisJCQlvY2xfZXJyb3JfcHJpbnRmKCJvcGVuY2xfaW5pdDogRmFpbGVkIGNvbXBpbGluZyBPcGVuQ0wgcHJvZ3JhbVxuIik7CisJCQlnX29jbC5kZWluaXQoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkJCQkJCQkKKwkJcHJpbnRmKCJPcGVuQ0wgc3VwcG9ydCBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcbiIpOworCisJCXJldHVybiB0cnVlOworCX0KKworCXZvaWQgb3BlbmNsX2RlaW5pdCgpCisJeworCQlnX29jbC5kZWluaXQoKTsKKwl9CisKKwlib29sIG9wZW5jbF9pc19hdmFpbGFibGUoKQorCXsKKwkJcmV0dXJuIGdfb2NsLmlzX2luaXRpYWxpemVkKCk7CisJfQorCisJc3RydWN0IG9wZW5jbF9jb250ZXh0CisJeworCQl1aW50MzJfdCBtX29jbF90b3RhbF9waXhlbF9ibG9ja3M7CisJCWNsX21lbSBtX29jbF9waXhlbF9ibG9ja3M7CisKKwkJY2xfY29tbWFuZF9xdWV1ZSBtX2NvbW1hbmRfcXVldWU7CisKKwkJY2xfa2VybmVsIG1fb2NsX2VuY29kZV9ldGMxc19ibG9ja3Nfa2VybmVsOworCQljbF9rZXJuZWwgbV9vY2xfcmVmaW5lX2VuZHBvaW50X2NsdXN0ZXJpemF0aW9uX2tlcm5lbDsKKwkJY2xfa2VybmVsIG1fb2NsX2VuY29kZV9ldGMxc19mcm9tX3BpeGVsX2NsdXN0ZXJfa2VybmVsOworCQljbF9rZXJuZWwgbV9vY2xfZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrX2tlcm5lbDsKKwkJY2xfa2VybmVsIG1fb2NsX2RldGVybWluZV9zZWxlY3RvcnNfa2VybmVsOworCX07CisKKwlvcGVuY2xfY29udGV4dF9wdHIgb3BlbmNsX2NyZWF0ZV9jb250ZXh0KCkKKwl7CisJCWlmICghb3BlbmNsX2lzX2F2YWlsYWJsZSgpKQorCQl7CisJCQlvY2xfZXJyb3JfcHJpbnRmKCJvcGVuY2xfY3JlYXRlX2NvbnRleHQ6IE9wZW5DTCBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQkJYXNzZXJ0KDApOworCQkJcmV0dXJuIG51bGxwdHI7CisJCX0KKworCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJdG0uc3RhcnQoKTsKKworCQlvcGVuY2xfY29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxvcGVuY2xfY29udGV4dCAqID4oY2FsbG9jKHNpemVvZihvcGVuY2xfY29udGV4dCksIDEpKTsKKwkJaWYgKCFwQ29udGV4dCkKKwkJCXJldHVybiBudWxscHRyOworCQkJCQorCQkvLyBUbyBhdm9pZCBkcml2ZXIgYnVncyBpbiBzb21lIGRyaXZlcnMgLSBzZXJpYWxpemUgdGhpcy4gTGlrZWx5IG5vdCBuZWNlc3NhcnksIHdlIGRvbid0IGtub3cuCisJCS8vIGh0dHBzOi8vY29tbXVuaXR5LmludGVsLmNvbS90NS9PcGVuQ0wtZm9yLUNQVS9CdWctcmVwb3J0LWNsQ3JlYXRlS2VybmVsc0luUHJvZ3JhbS1pcy1ub3QtdGhyZWFkLXNhZmUvdGQtcC8xMTU5NzcxCisJCQorCQlwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlID0gZ19vY2wuY3JlYXRlX2NvbW1hbmRfcXVldWUoKTsKKwkJaWYgKCFwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlKQorCQl7CisJCQlvY2xfZXJyb3JfcHJpbnRmKCJvcGVuY2xfY3JlYXRlX2NvbnRleHQ6IEZhaWxlZCBjcmVhdGluZyBPcGVuQ0wgY29tbWFuZCBxdWV1ZSFcbiIpOworCQkJb3BlbmNsX2Rlc3Ryb3lfY29udGV4dChwQ29udGV4dCk7CisJCQlyZXR1cm4gbnVsbHB0cjsKKwkJfQorCisJCXBDb250ZXh0LT5tX29jbF9lbmNvZGVfZXRjMXNfYmxvY2tzX2tlcm5lbCA9IGdfb2NsLmNyZWF0ZV9rZXJuZWwoImVuY29kZV9ldGMxc19ibG9ja3MiKTsKKwkJaWYgKCFwQ29udGV4dC0+bV9vY2xfZW5jb2RlX2V0YzFzX2Jsb2Nrc19rZXJuZWwpCisJCXsKKwkJCW9jbF9lcnJvcl9wcmludGYoIm9wZW5jbF9jcmVhdGVfY29udGV4dDogRmFpbGVkIGNyZWF0aW5nIE9wZW5DTCBrZXJuZWwgZW5jb2RlX2V0YzFzX2Jsb2NrXG4iKTsKKwkJCW9wZW5jbF9kZXN0cm95X2NvbnRleHQocENvbnRleHQpOworCQkJcmV0dXJuIG51bGxwdHI7CisJCX0KKworCQlwQ29udGV4dC0+bV9vY2xfcmVmaW5lX2VuZHBvaW50X2NsdXN0ZXJpemF0aW9uX2tlcm5lbCA9IGdfb2NsLmNyZWF0ZV9rZXJuZWwoInJlZmluZV9lbmRwb2ludF9jbHVzdGVyaXphdGlvbiIpOworCQlpZiAoIXBDb250ZXh0LT5tX29jbF9yZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb25fa2VybmVsKQorCQl7CisJCQlvY2xfZXJyb3JfcHJpbnRmKCJvcGVuY2xfY3JlYXRlX2NvbnRleHQ6IEZhaWxlZCBjcmVhdGluZyBPcGVuQ0wga2VybmVsIHJlZmluZV9lbmRwb2ludF9jbHVzdGVyaXphdGlvblxuIik7CisJCQlvcGVuY2xfZGVzdHJveV9jb250ZXh0KHBDb250ZXh0KTsKKwkJCXJldHVybiBudWxscHRyOworCQl9CisKKwkJcENvbnRleHQtPm1fb2NsX2VuY29kZV9ldGMxc19mcm9tX3BpeGVsX2NsdXN0ZXJfa2VybmVsID0gZ19vY2wuY3JlYXRlX2tlcm5lbCgiZW5jb2RlX2V0YzFzX2Zyb21fcGl4ZWxfY2x1c3RlciIpOworCQlpZiAoIXBDb250ZXh0LT5tX29jbF9lbmNvZGVfZXRjMXNfZnJvbV9waXhlbF9jbHVzdGVyX2tlcm5lbCkKKwkJeworCQkJb2NsX2Vycm9yX3ByaW50Zigib3BlbmNsX2NyZWF0ZV9jb250ZXh0OiBGYWlsZWQgY3JlYXRpbmcgT3BlbkNMIGtlcm5lbCBlbmNvZGVfZXRjMXNfZnJvbV9waXhlbF9jbHVzdGVyXG4iKTsKKwkJCW9wZW5jbF9kZXN0cm95X2NvbnRleHQocENvbnRleHQpOworCQkJcmV0dXJuIG51bGxwdHI7CisJCX0KKworCQlwQ29udGV4dC0+bV9vY2xfZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrX2tlcm5lbCA9IGdfb2NsLmNyZWF0ZV9rZXJuZWwoImZpbmRfb3B0aW1hbF9zZWxlY3Rvcl9jbHVzdGVyc19mb3JfZWFjaF9ibG9jayIpOworCQlpZiAoIXBDb250ZXh0LT5tX29jbF9maW5kX29wdGltYWxfc2VsZWN0b3JfY2x1c3RlcnNfZm9yX2VhY2hfYmxvY2tfa2VybmVsKQorCQl7CisJCQlvY2xfZXJyb3JfcHJpbnRmKCJvcGVuY2xfY3JlYXRlX2NvbnRleHQ6IEZhaWxlZCBjcmVhdGluZyBPcGVuQ0wga2VybmVsIGZpbmRfb3B0aW1hbF9zZWxlY3Rvcl9jbHVzdGVyc19mb3JfZWFjaF9ibG9ja1xuIik7CisJCQlvcGVuY2xfZGVzdHJveV9jb250ZXh0KHBDb250ZXh0KTsKKwkJCXJldHVybiBudWxscHRyOworCQl9CisKKwkJcENvbnRleHQtPm1fb2NsX2RldGVybWluZV9zZWxlY3RvcnNfa2VybmVsID0gZ19vY2wuY3JlYXRlX2tlcm5lbCgiZGV0ZXJtaW5lX3NlbGVjdG9ycyIpOworCQlpZiAoIXBDb250ZXh0LT5tX29jbF9kZXRlcm1pbmVfc2VsZWN0b3JzX2tlcm5lbCkKKwkJeworCQkJb2NsX2Vycm9yX3ByaW50Zigib3BlbmNsX2NyZWF0ZV9jb250ZXh0OiBGYWlsZWQgY3JlYXRpbmcgT3BlbkNMIGtlcm5lbCBkZXRlcm1pbmVfc2VsZWN0b3JzXG4iKTsKKwkJCW9wZW5jbF9kZXN0cm95X2NvbnRleHQocENvbnRleHQpOworCQkJcmV0dXJuIG51bGxwdHI7CisJCX0KKworCQlkZWJ1Z19wcmludGYoIm9wZW5jbF9jcmVhdGVfY29udGV4dDogRWxhcHNlZCB0aW1lOiAlZiBzZWNzXG4iLCB0bS5nZXRfZWxhcHNlZF9zZWNzKCkpOworCisJCXJldHVybiBwQ29udGV4dDsKKwl9CisKKwl2b2lkIG9wZW5jbF9kZXN0cm95X2NvbnRleHQob3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0KQorCXsKKwkJaWYgKCFwQ29udGV4dCkKKwkJCXJldHVybjsKKworCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJdG0uc3RhcnQoKTsKKworCQlnX29jbC5kZXN0cm95X2J1ZmZlcihwQ29udGV4dC0+bV9vY2xfcGl4ZWxfYmxvY2tzKTsKKworCQlnX29jbC5kZXN0cm95X2tlcm5lbChwQ29udGV4dC0+bV9vY2xfZGV0ZXJtaW5lX3NlbGVjdG9yc19rZXJuZWwpOworCQlnX29jbC5kZXN0cm95X2tlcm5lbChwQ29udGV4dC0+bV9vY2xfZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrX2tlcm5lbCk7CisJCWdfb2NsLmRlc3Ryb3lfa2VybmVsKHBDb250ZXh0LT5tX29jbF9lbmNvZGVfZXRjMXNfZnJvbV9waXhlbF9jbHVzdGVyX2tlcm5lbCk7CisJCWdfb2NsLmRlc3Ryb3lfa2VybmVsKHBDb250ZXh0LT5tX29jbF9lbmNvZGVfZXRjMXNfYmxvY2tzX2tlcm5lbCk7CisJCWdfb2NsLmRlc3Ryb3lfa2VybmVsKHBDb250ZXh0LT5tX29jbF9yZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb25fa2VybmVsKTsKKworCQlnX29jbC5kZXN0cm95X2NvbW1hbmRfcXVldWUocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSk7CisJCQkKKwkJbWVtc2V0KHBDb250ZXh0LCAwLCBzaXplb2Yob3BlbmNsX2NvbnRleHQpKTsKKworCQlmcmVlKHBDb250ZXh0KTsKKworCQlkZWJ1Z19wcmludGYoIm9wZW5jbF9kZXN0cm95X2NvbnRleHQ6IEVsYXBzZWQgdGltZTogJWYgc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKwl9CisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorCXN0cnVjdCBjbF9lbmNvZGVfZXRjMXNfcGFyYW1fc3RydWN0CisJeworCQlpbnQgbV90b3RhbF9ibG9ja3M7CisJCWludCBtX3BlcmNlcHR1YWw7CisJCWludCBtX3RvdGFsX3Blcm1zOworCX07CisjcHJhZ21hIHBhY2socG9wKQorCisJYm9vbCBvcGVuY2xfc2V0X3BpeGVsX2Jsb2NrcyhvcGVuY2xfY29udGV4dF9wdHIgcENvbnRleHQsIHVpbnQzMl90IHRvdGFsX2Jsb2NrcywgY29uc3QgY2xfcGl4ZWxfYmxvY2sqIHBQaXhlbF9ibG9ja3MpCisJeworCQlpZiAoIW9wZW5jbF9pc19hdmFpbGFibGUoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAocENvbnRleHQtPm1fb2NsX3BpeGVsX2Jsb2NrcykKKwkJeworCQkJZ19vY2wuZGVzdHJveV9idWZmZXIocENvbnRleHQtPm1fb2NsX3BpeGVsX2Jsb2Nrcyk7CisJCQlwQ29udGV4dC0+bV9vY2xfcGl4ZWxfYmxvY2tzID0gbnVsbHB0cjsKKwkJfQorCisJCXBDb250ZXh0LT5tX29jbF9waXhlbF9ibG9ja3MgPSBnX29jbC5hbGxvY19hbmRfaW5pdF9yZWFkX2J1ZmZlcihwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlLCBwUGl4ZWxfYmxvY2tzLCBzaXplb2YoY2xfcGl4ZWxfYmxvY2spICogdG90YWxfYmxvY2tzKTsKKwkJaWYgKCFwQ29udGV4dC0+bV9vY2xfcGl4ZWxfYmxvY2tzKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXBDb250ZXh0LT5tX29jbF90b3RhbF9waXhlbF9ibG9ja3MgPSB0b3RhbF9ibG9ja3M7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJYm9vbCBvcGVuY2xfZW5jb2RlX2V0YzFzX2Jsb2NrcyhvcGVuY2xfY29udGV4dF9wdHIgcENvbnRleHQsIGV0Y19ibG9jayogcE91dHB1dF9ibG9ja3MsIGJvb2wgcGVyY2VwdHVhbCwgdWludDMyX3QgdG90YWxfcGVybXMpCisJeworCQlpZiAoIW9wZW5jbF9pc19hdmFpbGFibGUoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJdG0uc3RhcnQoKTsKKworCQlhc3NlcnQocENvbnRleHQtPm1fb2NsX3BpeGVsX2Jsb2Nrcyk7CisJCWlmICghcENvbnRleHQtPm1fb2NsX3BpeGVsX2Jsb2NrcykKKwkJCXJldHVybiBmYWxzZTsKKwkJCQkKKwkJY2xfZW5jb2RlX2V0YzFzX3BhcmFtX3N0cnVjdCBwczsKKwkJcHMubV90b3RhbF9ibG9ja3MgPSBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzOworCQlwcy5tX3BlcmNlcHR1YWwgPSBwZXJjZXB0dWFsOworCQlwcy5tX3RvdGFsX3Blcm1zID0gdG90YWxfcGVybXM7CisKKwkJYm9vbCBzdGF0dXMgPSBmYWxzZTsKKworCQljbF9tZW0gdmFycyA9IGdfb2NsLmFsbG9jX2FuZF9pbml0X3JlYWRfYnVmZmVyKHBDb250ZXh0LT5tX2NvbW1hbmRfcXVldWUgLCAmcHMsIHNpemVvZihwcykpOworCQljbF9tZW0gYmxvY2tfYnVmID0gZ19vY2wuYWxsb2Nfd3JpdGVfYnVmZmVyKHNpemVvZihldGNfYmxvY2spICogcENvbnRleHQtPm1fb2NsX3RvdGFsX3BpeGVsX2Jsb2Nrcyk7CisJCQorCQlpZiAoIXZhcnMgfHwgIWJsb2NrX2J1ZikKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoIWdfb2NsLnNldF9rZXJuZWxfYXJncyhwQ29udGV4dC0+bV9vY2xfZW5jb2RlX2V0YzFzX2Jsb2Nrc19rZXJuZWwsIHZhcnMsIHBDb250ZXh0LT5tX29jbF9waXhlbF9ibG9ja3MsIGJsb2NrX2J1ZikpCisJCQlnb3RvIGV4aXQ7CisKKwkJaWYgKCFnX29jbC5ydW5fMkQocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgcENvbnRleHQtPm1fb2NsX2VuY29kZV9ldGMxc19ibG9ja3Nfa2VybmVsLCBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzLCAxKSkKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoIWdfb2NsLnJlYWRfZnJvbV9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgYmxvY2tfYnVmLCBwT3V0cHV0X2Jsb2NrcywgcENvbnRleHQtPm1fb2NsX3RvdGFsX3BpeGVsX2Jsb2NrcyAqIHNpemVvZihldGNfYmxvY2spKSkKKwkJCWdvdG8gZXhpdDsKKworCQlzdGF0dXMgPSB0cnVlOworCisJCWRlYnVnX3ByaW50Zigib3BlbmNsX2VuY29kZV9ldGMxc19ibG9ja3M6IEVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKworZXhpdDoKKwkJZ19vY2wuZGVzdHJveV9idWZmZXIoYmxvY2tfYnVmKTsKKwkJZ19vY2wuZGVzdHJveV9idWZmZXIodmFycyk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlib29sIG9wZW5jbF9lbmNvZGVfZXRjMXNfcGl4ZWxfY2x1c3RlcnMoCisJCW9wZW5jbF9jb250ZXh0X3B0ciBwQ29udGV4dCwKKwkJZXRjX2Jsb2NrKiBwT3V0cHV0X2Jsb2NrcywKKwkJdWludDMyX3QgdG90YWxfY2x1c3RlcnMsCisJCWNvbnN0IGNsX3BpeGVsX2NsdXN0ZXIqIHBDbHVzdGVycywKKwkJdWludDY0X3QgdG90YWxfcGl4ZWxzLAorCQljb25zdCBjb2xvcl9yZ2JhKiBwUGl4ZWxzLCBjb25zdCB1aW50MzJfdCogcFBpeGVsX3dlaWdodHMsCisJCWJvb2wgcGVyY2VwdHVhbCwgdWludDMyX3QgdG90YWxfcGVybXMpCisJeworCQlpZiAoIW9wZW5jbF9pc19hdmFpbGFibGUoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJdG0uc3RhcnQoKTsKKwkJCQkKKwkJY2xfZW5jb2RlX2V0YzFzX3BhcmFtX3N0cnVjdCBwczsKKwkJcHMubV90b3RhbF9ibG9ja3MgPSB0b3RhbF9jbHVzdGVyczsKKwkJcHMubV9wZXJjZXB0dWFsID0gcGVyY2VwdHVhbDsKKwkJcHMubV90b3RhbF9wZXJtcyA9IHRvdGFsX3Blcm1zOworCisJCWJvb2wgc3RhdHVzID0gZmFsc2U7CisKKwkJaWYgKHNpemVvZihzaXplX3QpID09IHNpemVvZih1aW50MzJfdCkpCisJCXsKKwkJCWlmICggKChzaXplb2YoY2xfcGl4ZWxfY2x1c3RlcikgKiB0b3RhbF9jbHVzdGVycykgPiBVSU5UMzJfTUFYKSB8fAorCQkJCSAoKHNpemVvZihjb2xvcl9yZ2JhKSAqIHRvdGFsX3BpeGVscykgPiBVSU5UMzJfTUFYKSB8fAorCQkJCSAoKHNpemVvZih1aW50MzJfdCkgKiB0b3RhbF9waXhlbHMpID4gVUlOVDMyX01BWCkgKQorCQkJeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQkJCQorCQljbF9tZW0gdmFycyA9IGdfb2NsLmFsbG9jX2FuZF9pbml0X3JlYWRfYnVmZmVyKHBDb250ZXh0LT5tX2NvbW1hbmRfcXVldWUgLCAmcHMsIHNpemVvZihwcykpOworCQljbF9tZW0gaW5wdXRfY2x1c3RlcnMgPSBnX29jbC5hbGxvY19hbmRfaW5pdF9yZWFkX2J1ZmZlcihwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlLCBwQ2x1c3RlcnMsIChzaXplX3QpKHNpemVvZihjbF9waXhlbF9jbHVzdGVyKSAqIHRvdGFsX2NsdXN0ZXJzKSk7CisJCWNsX21lbSBpbnB1dF9waXhlbHMgPSBnX29jbC5hbGxvY19hbmRfaW5pdF9yZWFkX2J1ZmZlcihwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlLCBwUGl4ZWxzLCAoc2l6ZV90KShzaXplb2YoY29sb3JfcmdiYSkgKiB0b3RhbF9waXhlbHMpKTsKKwkJY2xfbWVtIHdlaWdodHNfYnVmID0gZ19vY2wuYWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgcFBpeGVsX3dlaWdodHMsIChzaXplX3QpKHNpemVvZih1aW50MzJfdCkgKiB0b3RhbF9waXhlbHMpKTsKKwkJY2xfbWVtIGJsb2NrX2J1ZiA9IGdfb2NsLmFsbG9jX3dyaXRlX2J1ZmZlcihzaXplb2YoZXRjX2Jsb2NrKSAqIHRvdGFsX2NsdXN0ZXJzKTsKKworCQlpZiAoIXZhcnMgfHwgIWlucHV0X2NsdXN0ZXJzIHx8ICFpbnB1dF9waXhlbHMgfHwgIXdlaWdodHNfYnVmIHx8ICFibG9ja19idWYpCisJCQlnb3RvIGV4aXQ7CisKKwkJaWYgKCFnX29jbC5zZXRfa2VybmVsX2FyZ3MocENvbnRleHQtPm1fb2NsX2VuY29kZV9ldGMxc19mcm9tX3BpeGVsX2NsdXN0ZXJfa2VybmVsLCB2YXJzLCBpbnB1dF9jbHVzdGVycywgaW5wdXRfcGl4ZWxzLCB3ZWlnaHRzX2J1ZiwgYmxvY2tfYnVmKSkKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoIWdfb2NsLnJ1bl8yRChwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlLCBwQ29udGV4dC0+bV9vY2xfZW5jb2RlX2V0YzFzX2Zyb21fcGl4ZWxfY2x1c3Rlcl9rZXJuZWwsIHRvdGFsX2NsdXN0ZXJzLCAxKSkKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoIWdfb2NsLnJlYWRfZnJvbV9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgYmxvY2tfYnVmLCBwT3V0cHV0X2Jsb2Nrcywgc2l6ZW9mKGV0Y19ibG9jaykgKiB0b3RhbF9jbHVzdGVycykpCisJCQlnb3RvIGV4aXQ7CisKKwkJc3RhdHVzID0gdHJ1ZTsKKworCQlkZWJ1Z19wcmludGYoIm9wZW5jbF9lbmNvZGVfZXRjMXNfcGl4ZWxfY2x1c3RlcnM6IEVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKworCWV4aXQ6CisJCWdfb2NsLmRlc3Ryb3lfYnVmZmVyKGJsb2NrX2J1Zik7CisJCWdfb2NsLmRlc3Ryb3lfYnVmZmVyKHdlaWdodHNfYnVmKTsKKwkJZ19vY2wuZGVzdHJveV9idWZmZXIoaW5wdXRfcGl4ZWxzKTsKKwkJZ19vY2wuZGVzdHJveV9idWZmZXIoaW5wdXRfY2x1c3RlcnMpOworCQlnX29jbC5kZXN0cm95X2J1ZmZlcih2YXJzKTsKKworCQlyZXR1cm4gc3RhdHVzOworCX0KKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisJc3RydWN0IGNsX3JlY19wYXJhbV9zdHJ1Y3QKKwl7CisJCWludCBtX3RvdGFsX2Jsb2NrczsKKwkJaW50IG1fcGVyY2VwdHVhbDsKKwl9OworI3ByYWdtYSBwYWNrKHBvcCkKKworCWJvb2wgb3BlbmNsX3JlZmluZV9lbmRwb2ludF9jbHVzdGVyaXphdGlvbigKKwkJb3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0LAorCQljb25zdCBjbF9ibG9ja19pbmZvX3N0cnVjdCogcFBpeGVsX2Jsb2NrX2luZm8sCisJCXVpbnQzMl90IHRvdGFsX2NsdXN0ZXJzLAorCQljb25zdCBjbF9lbmRwb2ludF9jbHVzdGVyX3N0cnVjdCogcENsdXN0ZXJfaW5mbywKKwkJY29uc3QgdWludDMyX3QqIHBTb3J0ZWRfYmxvY2tfaW5kaWNlcywKKwkJdWludDMyX3QqIHBPdXRwdXRfY2x1c3Rlcl9pbmRpY2VzLAorCQlib29sIHBlcmNlcHR1YWwpCisJeworCQlpZiAoIW9wZW5jbF9pc19hdmFpbGFibGUoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpbnRlcnZhbF90aW1lciB0bTsKKwkJdG0uc3RhcnQoKTsKKworCQlhc3NlcnQocENvbnRleHQtPm1fb2NsX3BpeGVsX2Jsb2Nrcyk7CisJCWlmICghcENvbnRleHQtPm1fb2NsX3BpeGVsX2Jsb2NrcykKKwkJCXJldHVybiBmYWxzZTsKKwkJCQkKKwkJY2xfcmVjX3BhcmFtX3N0cnVjdCBwczsKKwkJcHMubV90b3RhbF9ibG9ja3MgPSBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzOworCQlwcy5tX3BlcmNlcHR1YWwgPSBwZXJjZXB0dWFsOworCisJCWJvb2wgc3RhdHVzID0gZmFsc2U7CisKKwkJY2xfbWVtIHBpeGVsX2Jsb2NrX2luZm8gPSBnX29jbC5hbGxvY19hbmRfaW5pdF9yZWFkX2J1ZmZlcihwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlLCBwUGl4ZWxfYmxvY2tfaW5mbywgc2l6ZW9mKGNsX2Jsb2NrX2luZm9fc3RydWN0KSAqIHBDb250ZXh0LT5tX29jbF90b3RhbF9waXhlbF9ibG9ja3MpOworCQljbF9tZW0gY2x1c3Rlcl9pbmZvID0gZ19vY2wuYWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgcENsdXN0ZXJfaW5mbywgc2l6ZW9mKGNsX2VuZHBvaW50X2NsdXN0ZXJfc3RydWN0KSAqIHRvdGFsX2NsdXN0ZXJzKTsKKwkJY2xfbWVtIHNvcnRlZF9ibG9ja19pbmRpY2VzID0gZ19vY2wuYWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgcFNvcnRlZF9ibG9ja19pbmRpY2VzLCBzaXplb2YodWludDMyX3QpICogcENvbnRleHQtPm1fb2NsX3RvdGFsX3BpeGVsX2Jsb2Nrcyk7CisJCWNsX21lbSBvdXRwdXRfYnVmID0gZ19vY2wuYWxsb2Nfd3JpdGVfYnVmZmVyKHNpemVvZih1aW50MzJfdCkgKiBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzKTsKKwkJCisJCWlmICghcGl4ZWxfYmxvY2tfaW5mbyB8fCAhY2x1c3Rlcl9pbmZvIHx8ICFzb3J0ZWRfYmxvY2tfaW5kaWNlcyB8fCAhb3V0cHV0X2J1ZikKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoIWdfb2NsLnNldF9rZXJuZWxfYXJncyhwQ29udGV4dC0+bV9vY2xfcmVmaW5lX2VuZHBvaW50X2NsdXN0ZXJpemF0aW9uX2tlcm5lbCwgcHMsIHBDb250ZXh0LT5tX29jbF9waXhlbF9ibG9ja3MsIHBpeGVsX2Jsb2NrX2luZm8sIGNsdXN0ZXJfaW5mbywgc29ydGVkX2Jsb2NrX2luZGljZXMsIG91dHB1dF9idWYpKQorCQkJZ290byBleGl0OworCisJCWlmICghZ19vY2wucnVuXzJEKHBDb250ZXh0LT5tX2NvbW1hbmRfcXVldWUsIHBDb250ZXh0LT5tX29jbF9yZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb25fa2VybmVsLCBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzLCAxKSkKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoIWdfb2NsLnJlYWRfZnJvbV9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgb3V0cHV0X2J1ZiwgcE91dHB1dF9jbHVzdGVyX2luZGljZXMsIHBDb250ZXh0LT5tX29jbF90b3RhbF9waXhlbF9ibG9ja3MgKiBzaXplb2YodWludDMyX3QpKSkKKwkJCWdvdG8gZXhpdDsKKworCQlkZWJ1Z19wcmludGYoIm9wZW5jbF9yZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb246IEVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKwkJCisJCXN0YXR1cyA9IHRydWU7CisKK2V4aXQ6CisJCWdfb2NsLmRlc3Ryb3lfYnVmZmVyKHBpeGVsX2Jsb2NrX2luZm8pOworCQlnX29jbC5kZXN0cm95X2J1ZmZlcihjbHVzdGVyX2luZm8pOworCQlnX29jbC5kZXN0cm95X2J1ZmZlcihzb3J0ZWRfYmxvY2tfaW5kaWNlcyk7CisJCWdfb2NsLmRlc3Ryb3lfYnVmZmVyKG91dHB1dF9idWYpOworCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJYm9vbCBvcGVuY2xfZmluZF9vcHRpbWFsX3NlbGVjdG9yX2NsdXN0ZXJzX2Zvcl9lYWNoX2Jsb2NrKAorCQlvcGVuY2xfY29udGV4dF9wdHIgcENvbnRleHQsCisJCWNvbnN0IGZvc2NfYmxvY2tfc3RydWN0KiBwSW5wdXRfYmxvY2tfaW5mbywJLy8gb25lIHBlciBibG9jaworCQl1aW50MzJfdCB0b3RhbF9pbnB1dF9zZWxlY3RvcnMsCisJCWNvbnN0IGZvc2Nfc2VsZWN0b3Jfc3RydWN0KiBwSW5wdXRfc2VsZWN0b3JzLAorCQljb25zdCB1aW50MzJfdCogcFNlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcywKKwkJdWludDMyX3QqIHBPdXRwdXRfc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzLCAvLyBvbmUgcGVyIGJsb2NrCisJCWJvb2wgcGVyY2VwdHVhbCkKKwl7CisJCWlmICghb3BlbmNsX2lzX2F2YWlsYWJsZSgpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWludGVydmFsX3RpbWVyIHRtOworCQl0bS5zdGFydCgpOworCisJCWFzc2VydChwQ29udGV4dC0+bV9vY2xfcGl4ZWxfYmxvY2tzKTsKKwkJaWYgKCFwQ29udGV4dC0+bV9vY2xfcGl4ZWxfYmxvY2tzKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWZvc2NfcGFyYW1fc3RydWN0IHBzOworCQlwcy5tX3RvdGFsX2Jsb2NrcyA9IHBDb250ZXh0LT5tX29jbF90b3RhbF9waXhlbF9ibG9ja3M7CisJCXBzLm1fcGVyY2VwdHVhbCA9IHBlcmNlcHR1YWw7CisJCQorCQlib29sIHN0YXR1cyA9IGZhbHNlOworCisJCWNsX21lbSBpbnB1dF9ibG9ja19pbmZvID0gZ19vY2wuYWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgcElucHV0X2Jsb2NrX2luZm8sIHNpemVvZihmb3NjX2Jsb2NrX3N0cnVjdCkgKiBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzKTsKKwkJY2xfbWVtIGlucHV0X3NlbGVjdG9ycyA9IGdfb2NsLmFsbG9jX2FuZF9pbml0X3JlYWRfYnVmZmVyKHBDb250ZXh0LT5tX2NvbW1hbmRfcXVldWUsIHBJbnB1dF9zZWxlY3RvcnMsIHNpemVvZihmb3NjX3NlbGVjdG9yX3N0cnVjdCkgKiB0b3RhbF9pbnB1dF9zZWxlY3RvcnMpOworCQljbF9tZW0gc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzID0gZ19vY2wuYWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgcFNlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcywgc2l6ZW9mKHVpbnQzMl90KSAqIHRvdGFsX2lucHV0X3NlbGVjdG9ycyk7CisJCWNsX21lbSBvdXRwdXRfc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzID0gZ19vY2wuYWxsb2Nfd3JpdGVfYnVmZmVyKHNpemVvZih1aW50MzJfdCkgKiBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzKTsKKworCQlpZiAoIWlucHV0X2Jsb2NrX2luZm8gfHwgIWlucHV0X3NlbGVjdG9ycyB8fCAhc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzIHx8ICFvdXRwdXRfc2VsZWN0b3JfY2x1c3Rlcl9pbmRpY2VzKQorCQkJZ290byBleGl0OworCisJCWlmICghZ19vY2wuc2V0X2tlcm5lbF9hcmdzKHBDb250ZXh0LT5tX29jbF9maW5kX29wdGltYWxfc2VsZWN0b3JfY2x1c3RlcnNfZm9yX2VhY2hfYmxvY2tfa2VybmVsLCBwcywgcENvbnRleHQtPm1fb2NsX3BpeGVsX2Jsb2NrcywgaW5wdXRfYmxvY2tfaW5mbywgaW5wdXRfc2VsZWN0b3JzLCBzZWxlY3Rvcl9jbHVzdGVyX2luZGljZXMsIG91dHB1dF9zZWxlY3Rvcl9jbHVzdGVyX2luZGljZXMpKQorCQkJZ290byBleGl0OworCisJCWlmICghZ19vY2wucnVuXzJEKHBDb250ZXh0LT5tX2NvbW1hbmRfcXVldWUsIHBDb250ZXh0LT5tX29jbF9maW5kX29wdGltYWxfc2VsZWN0b3JfY2x1c3RlcnNfZm9yX2VhY2hfYmxvY2tfa2VybmVsLCBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzLCAxKSkKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoIWdfb2NsLnJlYWRfZnJvbV9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgb3V0cHV0X3NlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcywgcE91dHB1dF9zZWxlY3Rvcl9jbHVzdGVyX2luZGljZXMsIHBDb250ZXh0LT5tX29jbF90b3RhbF9waXhlbF9ibG9ja3MgKiBzaXplb2YodWludDMyX3QpKSkKKwkJCWdvdG8gZXhpdDsKKworCQlkZWJ1Z19wcmludGYoIm9wZW5jbF9maW5kX29wdGltYWxfc2VsZWN0b3JfY2x1c3RlcnNfZm9yX2VhY2hfYmxvY2s6IEVsYXBzZWQgdGltZTogJTMuM2Ygc2Vjc1xuIiwgdG0uZ2V0X2VsYXBzZWRfc2VjcygpKTsKKworCQlzdGF0dXMgPSB0cnVlOworCisJZXhpdDoKKwkJZ19vY2wuZGVzdHJveV9idWZmZXIoaW5wdXRfYmxvY2tfaW5mbyk7CisJCWdfb2NsLmRlc3Ryb3lfYnVmZmVyKGlucHV0X3NlbGVjdG9ycyk7CisJCWdfb2NsLmRlc3Ryb3lfYnVmZmVyKHNlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcyk7CisJCWdfb2NsLmRlc3Ryb3lfYnVmZmVyKG91dHB1dF9zZWxlY3Rvcl9jbHVzdGVyX2luZGljZXMpOworCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJYm9vbCBvcGVuY2xfZGV0ZXJtaW5lX3NlbGVjdG9ycygKKwkJb3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0LAorCQljb25zdCBjb2xvcl9yZ2JhKiBwSW5wdXRfZXRjX2NvbG9yNV9hbmRfaW50ZW4sCisJCWV0Y19ibG9jayogcE91dHB1dF9ibG9ja3MsCisJCWJvb2wgcGVyY2VwdHVhbCkKKwl7CisJCWlmICghb3BlbmNsX2lzX2F2YWlsYWJsZSgpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWludGVydmFsX3RpbWVyIHRtOworCQl0bS5zdGFydCgpOworCisJCWFzc2VydChwQ29udGV4dC0+bV9vY2xfcGl4ZWxfYmxvY2tzKTsKKwkJaWYgKCFwQ29udGV4dC0+bV9vY2xfcGl4ZWxfYmxvY2tzKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWRzX3BhcmFtX3N0cnVjdCBwczsKKwkJcHMubV90b3RhbF9ibG9ja3MgPSBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzOworCQlwcy5tX3BlcmNlcHR1YWwgPSBwZXJjZXB0dWFsOworCisJCWJvb2wgc3RhdHVzID0gZmFsc2U7CisKKwkJY2xfbWVtIGlucHV0X2V0Y19jb2xvcjVfaW50ZW5zID0gZ19vY2wuYWxsb2NfYW5kX2luaXRfcmVhZF9idWZmZXIocENvbnRleHQtPm1fY29tbWFuZF9xdWV1ZSwgcElucHV0X2V0Y19jb2xvcjVfYW5kX2ludGVuLCBzaXplb2YoY29sb3JfcmdiYSkgKiBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzKTsKKwkJY2xfbWVtIG91dHB1dF9ibG9ja3MgPSBnX29jbC5hbGxvY193cml0ZV9idWZmZXIoc2l6ZW9mKGV0Y19ibG9jaykgKiBwQ29udGV4dC0+bV9vY2xfdG90YWxfcGl4ZWxfYmxvY2tzKTsKKworCQlpZiAoIWlucHV0X2V0Y19jb2xvcjVfaW50ZW5zIHx8ICFvdXRwdXRfYmxvY2tzKQorCQkJZ290byBleGl0OworCisJCWlmICghZ19vY2wuc2V0X2tlcm5lbF9hcmdzKHBDb250ZXh0LT5tX29jbF9kZXRlcm1pbmVfc2VsZWN0b3JzX2tlcm5lbCwgcHMsIHBDb250ZXh0LT5tX29jbF9waXhlbF9ibG9ja3MsIGlucHV0X2V0Y19jb2xvcjVfaW50ZW5zLCBvdXRwdXRfYmxvY2tzKSkKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoIWdfb2NsLnJ1bl8yRChwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlLCBwQ29udGV4dC0+bV9vY2xfZGV0ZXJtaW5lX3NlbGVjdG9yc19rZXJuZWwsIHBDb250ZXh0LT5tX29jbF90b3RhbF9waXhlbF9ibG9ja3MsIDEpKQorCQkJZ290byBleGl0OworCisJCWlmICghZ19vY2wucmVhZF9mcm9tX2J1ZmZlcihwQ29udGV4dC0+bV9jb21tYW5kX3F1ZXVlLCBvdXRwdXRfYmxvY2tzLCBwT3V0cHV0X2Jsb2NrcywgcENvbnRleHQtPm1fb2NsX3RvdGFsX3BpeGVsX2Jsb2NrcyAqIHNpemVvZihldGNfYmxvY2spKSkKKwkJCWdvdG8gZXhpdDsKKworCQlkZWJ1Z19wcmludGYoIm9wZW5jbF9kZXRlcm1pbmVfc2VsZWN0b3JzOiBFbGFwc2VkIHRpbWU6ICUzLjNmIHNlY3NcbiIsIHRtLmdldF9lbGFwc2VkX3NlY3MoKSk7CisJCQkJCQorCQlzdGF0dXMgPSB0cnVlOworCQorCWV4aXQ6CisJCWdfb2NsLmRlc3Ryb3lfYnVmZmVyKGlucHV0X2V0Y19jb2xvcjVfaW50ZW5zKTsKKwkJZ19vY2wuZGVzdHJveV9idWZmZXIob3V0cHV0X2Jsb2Nrcyk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKyNlbHNlCQorbmFtZXNwYWNlIGJhc2lzdQoreworCS8vIE5vIE9wZW5DTCBzdXBwb3J0IC0gYWxsIGR1bW15IGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmYWxzZTsKKwlib29sIG9wZW5jbF9pbml0KGJvb2wgZm9yY2Vfc2VyaWFsaXphdGlvbikKKwl7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChmb3JjZV9zZXJpYWxpemF0aW9uKTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJdm9pZCBvcGVuY2xfZGVpbml0KCkKKwl7CisJfQorCisJYm9vbCBvcGVuY2xfaXNfYXZhaWxhYmxlKCkKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlvcGVuY2xfY29udGV4dF9wdHIgb3BlbmNsX2NyZWF0ZV9jb250ZXh0KCkKKwl7CisJCXJldHVybiBudWxscHRyOworCX0KKworCXZvaWQgb3BlbmNsX2Rlc3Ryb3lfY29udGV4dChvcGVuY2xfY29udGV4dF9wdHIgY29udGV4dCkKKwl7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChjb250ZXh0KTsKKwl9CisKKwlib29sIG9wZW5jbF9zZXRfcGl4ZWxfYmxvY2tzKG9wZW5jbF9jb250ZXh0X3B0ciBwQ29udGV4dCwgdWludDMyX3QgdG90YWxfYmxvY2tzLCBjb25zdCBjbF9waXhlbF9ibG9jayogcFBpeGVsX2Jsb2NrcykKKwl7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChwQ29udGV4dCk7CisJCUJBU0lTVV9OT1RFX1VOVVNFRCh0b3RhbF9ibG9ja3MpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocFBpeGVsX2Jsb2Nrcyk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgb3BlbmNsX2VuY29kZV9ldGMxc19ibG9ja3Mob3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0LCBldGNfYmxvY2sqIHBPdXRwdXRfYmxvY2tzLCBib29sIHBlcmNlcHR1YWwsIHVpbnQzMl90IHRvdGFsX3Blcm1zKQorCXsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKHBDb250ZXh0KTsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKHBPdXRwdXRfYmxvY2tzKTsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKHBlcmNlcHR1YWwpOworCQlCQVNJU1VfTk9URV9VTlVTRUQodG90YWxfcGVybXMpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlib29sIG9wZW5jbF9lbmNvZGVfZXRjMXNfcGl4ZWxfY2x1c3RlcnMoCisJCW9wZW5jbF9jb250ZXh0X3B0ciBwQ29udGV4dCwKKwkJZXRjX2Jsb2NrKiBwT3V0cHV0X2Jsb2NrcywKKwkJdWludDMyX3QgdG90YWxfY2x1c3RlcnMsCisJCWNvbnN0IGNsX3BpeGVsX2NsdXN0ZXIqIHBDbHVzdGVycywKKwkJdWludDY0X3QgdG90YWxfcGl4ZWxzLAorCQljb25zdCBjb2xvcl9yZ2JhKiBwUGl4ZWxzLCBjb25zdCB1aW50MzJfdCAqcFBpeGVsX3dlaWdodHMsCisJCWJvb2wgcGVyY2VwdHVhbCwgdWludDMyX3QgdG90YWxfcGVybXMpCisJeworCQlCQVNJU1VfTk9URV9VTlVTRUQocENvbnRleHQpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocE91dHB1dF9ibG9ja3MpOworCQlCQVNJU1VfTk9URV9VTlVTRUQodG90YWxfY2x1c3RlcnMpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocENsdXN0ZXJzKTsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKHRvdGFsX3BpeGVscyk7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChwUGl4ZWxzKTsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKHBQaXhlbF93ZWlnaHRzKTsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKHBlcmNlcHR1YWwpOworCQlCQVNJU1VfTk9URV9VTlVTRUQodG90YWxfcGVybXMpOworCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgb3BlbmNsX3JlZmluZV9lbmRwb2ludF9jbHVzdGVyaXphdGlvbigKKwkJb3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0LAorCQljb25zdCBjbF9ibG9ja19pbmZvX3N0cnVjdCogcFBpeGVsX2Jsb2NrX2luZm8sCisJCXVpbnQzMl90IHRvdGFsX2NsdXN0ZXJzLAorCQljb25zdCBjbF9lbmRwb2ludF9jbHVzdGVyX3N0cnVjdCogcENsdXN0ZXJfaW5mbywKKwkJY29uc3QgdWludDMyX3QqIHBTb3J0ZWRfYmxvY2tfaW5kaWNlcywKKwkJdWludDMyX3QqIHBPdXRwdXRfY2x1c3Rlcl9pbmRpY2VzLAorCQlib29sIHBlcmNlcHR1YWwpCisJeworCQlCQVNJU1VfTk9URV9VTlVTRUQocENvbnRleHQpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocFBpeGVsX2Jsb2NrX2luZm8pOworCQlCQVNJU1VfTk9URV9VTlVTRUQodG90YWxfY2x1c3RlcnMpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocENsdXN0ZXJfaW5mbyk7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChwU29ydGVkX2Jsb2NrX2luZGljZXMpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocE91dHB1dF9jbHVzdGVyX2luZGljZXMpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocGVyY2VwdHVhbCk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWJvb2wgb3BlbmNsX2ZpbmRfb3B0aW1hbF9zZWxlY3Rvcl9jbHVzdGVyc19mb3JfZWFjaF9ibG9jaygKKwkJb3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0LAorCQljb25zdCBmb3NjX2Jsb2NrX3N0cnVjdCogcElucHV0X2Jsb2NrX2luZm8sCS8vIG9uZSBwZXIgYmxvY2sKKwkJdWludDMyX3QgdG90YWxfaW5wdXRfc2VsZWN0b3JzLAorCQljb25zdCBmb3NjX3NlbGVjdG9yX3N0cnVjdCogcElucHV0X3NlbGVjdG9ycywKKwkJY29uc3QgdWludDMyX3QqIHBTZWxlY3Rvcl9jbHVzdGVyX2luZGljZXMsCisJCXVpbnQzMl90KiBwT3V0cHV0X3NlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcywgLy8gb25lIHBlciBibG9jaworCQlib29sIHBlcmNlcHR1YWwpCisJeworCQlCQVNJU1VfTk9URV9VTlVTRUQocENvbnRleHQpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocElucHV0X2Jsb2NrX2luZm8pOworCQlCQVNJU1VfTk9URV9VTlVTRUQodG90YWxfaW5wdXRfc2VsZWN0b3JzKTsKKwkJQkFTSVNVX05PVEVfVU5VU0VEKHBJbnB1dF9zZWxlY3RvcnMpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocFNlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcyk7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChwT3V0cHV0X3NlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcyk7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChwZXJjZXB0dWFsKTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYm9vbCBvcGVuY2xfZGV0ZXJtaW5lX3NlbGVjdG9ycygKKwkJb3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0LAorCQljb25zdCBjb2xvcl9yZ2JhKiBwSW5wdXRfZXRjX2NvbG9yNV9hbmRfaW50ZW4sCisJCWV0Y19ibG9jayogcE91dHB1dF9ibG9ja3MsCisJCWJvb2wgcGVyY2VwdHVhbCkKKwl7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChwQ29udGV4dCk7CisJCUJBU0lTVV9OT1RFX1VOVVNFRChwSW5wdXRfZXRjX2NvbG9yNV9hbmRfaW50ZW4pOworCQlCQVNJU1VfTk9URV9VTlVTRUQocE91dHB1dF9ibG9ja3MpOworCQlCQVNJU1VfTk9URV9VTlVTRUQocGVyY2VwdHVhbCk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworI2VuZGlmIC8vIEJBU0lTVV9TVVBQT1JUX09QRU5DTAorCit9IC8vIG5hbWVzcGFjZSBiYXNpc3UKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X29wZW5jbC5oIGIvZW5jb2Rlci9iYXNpc3Vfb3BlbmNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5NGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2VuY29kZXIvYmFzaXN1X29wZW5jbC5oCkBAIC0wLDAgKzEsMTQzIEBACisvLyBiYXNpc3Vfb3BlbmNsLmgKKy8vIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEJpbm9taWFsIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBOb3RlOiBVbmRlZmluZSBvciBzZXQgQkFTSVNVX1NVUFBPUlRfT1BFTkNMIHRvIDAgdG8gY29tcGxldGVseSBPcGVuQ0wgc3VwcG9ydC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAiLi4vdHJhbnNjb2Rlci9iYXNpc3UuaCIKKyNpbmNsdWRlICJiYXNpc3VfZW5jLmgiCisjaW5jbHVkZSAiYmFzaXN1X2V0Yy5oIgorCituYW1lc3BhY2UgYmFzaXN1Cit7CisJYm9vbCBvcGVuY2xfaW5pdChib29sIGZvcmNlX3NlcmlhbGl6YXRpb24pOworCXZvaWQgb3BlbmNsX2RlaW5pdCgpOworCWJvb2wgb3BlbmNsX2lzX2F2YWlsYWJsZSgpOworCisJc3RydWN0IG9wZW5jbF9jb250ZXh0OworCisJLy8gRWFjaCB0aHJlYWQgY2FsbGluZyBPcGVuQ0wgc2hvdWxkIGhhdmUgaXRzIG93biBvcGVuY2xfY29udGV4dF9wdHIuIFRoaXMgY29ycmVzcG9uZHMgdG8gYSBPcGVuQ0wgY29tbWFuZCBxdWV1ZS4gKENvbmZ1c2luZ2x5LCB3ZSBvbmx5IHVzZSBhIHNpbmdsZSBPcGVuQ0wgZGV2aWNlICJjb250ZXh0Ii4pCisJdHlwZWRlZiBvcGVuY2xfY29udGV4dCogb3BlbmNsX2NvbnRleHRfcHRyOworCisJb3BlbmNsX2NvbnRleHRfcHRyIG9wZW5jbF9jcmVhdGVfY29udGV4dCgpOworCXZvaWQgb3BlbmNsX2Rlc3Ryb3lfY29udGV4dChvcGVuY2xfY29udGV4dF9wdHIgY29udGV4dCk7CisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorCXN0cnVjdCBjbF9waXhlbF9ibG9jaworCXsKKwkJY29sb3JfcmdiYSBtX3BpeGVsc1sxNl07IC8vIFt5KjQreF0KKwl9OworI3ByYWdtYSBwYWNrKHBvcCkKKworCS8vIE11c3QgbWF0Y2ggQkFTSVNVX0VUQzFfQ0xVU1RFUl9GSVRfT1JERVJfVEFCTEVfU0laRQorCWNvbnN0IHVpbnQzMl90IE9QRU5DTF9FTkNPREVfRVRDMVNfTUFYX1BFUk1TID0gMTY1OworCisJYm9vbCBvcGVuY2xfc2V0X3BpeGVsX2Jsb2NrcyhvcGVuY2xfY29udGV4dF9wdHIgcENvbnRleHQsIHVpbnQzMl90IHRvdGFsX2Jsb2NrcywgY29uc3QgY2xfcGl4ZWxfYmxvY2sqIHBQaXhlbF9ibG9ja3MpOworCisJYm9vbCBvcGVuY2xfZW5jb2RlX2V0YzFzX2Jsb2NrcyhvcGVuY2xfY29udGV4dF9wdHIgcENvbnRleHQsIGV0Y19ibG9jayogcE91dHB1dF9ibG9ja3MsIGJvb2wgcGVyY2VwdHVhbCwgdWludDMyX3QgdG90YWxfcGVybXMpOworCisJLy8gb3BlbmNsX2VuY29kZV9ldGMxc19waXhlbF9jbHVzdGVycworCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKwlzdHJ1Y3QgY2xfcGl4ZWxfY2x1c3RlcgorCXsKKwkJdWludDY0X3QgbV90b3RhbF9waXhlbHM7CisJCXVpbnQ2NF90IG1fZmlyc3RfcGl4ZWxfaW5kZXg7CisJfTsKKyNwcmFnbWEgcGFjayhwb3ApCisKKwlib29sIG9wZW5jbF9lbmNvZGVfZXRjMXNfcGl4ZWxfY2x1c3RlcnMoCisJCW9wZW5jbF9jb250ZXh0X3B0ciBwQ29udGV4dCwKKwkJZXRjX2Jsb2NrKiBwT3V0cHV0X2Jsb2NrcywgCisJCXVpbnQzMl90IHRvdGFsX2NsdXN0ZXJzLAorCQljb25zdCBjbF9waXhlbF9jbHVzdGVyICpwQ2x1c3RlcnMsCisJCXVpbnQ2NF90IHRvdGFsX3BpeGVscywKKwkJY29uc3QgY29sb3JfcmdiYSAqcFBpeGVscywKKwkJY29uc3QgdWludDMyX3QgKnBQaXhlbF93ZWlnaHRzLAorCQlib29sIHBlcmNlcHR1YWwsIHVpbnQzMl90IHRvdGFsX3Blcm1zKTsKKworCS8vIG9wZW5jbF9yZWZpbmVfZW5kcG9pbnRfY2x1c3Rlcml6YXRpb24KKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisJc3RydWN0IGNsX2Jsb2NrX2luZm9fc3RydWN0CisJeworCQl1aW50MTZfdCBtX2ZpcnN0X2NsdXN0ZXJfb2ZzOworCQl1aW50MTZfdCBtX251bV9jbHVzdGVyczsKKwkJdWludDE2X3QgbV9jdXJfY2x1c3Rlcl9pbmRleDsKKwkJdWludDhfdCBtX2N1cl9jbHVzdGVyX2V0Y19pbnRlbjsKKwl9OworCisJc3RydWN0IGNsX2VuZHBvaW50X2NsdXN0ZXJfc3RydWN0CisJeworCQljb2xvcl9yZ2JhIG1fdW5zY2FsZWRfY29sb3I7CisJCXVpbnQ4X3QgbV9ldGNfaW50ZW47CisJCXVpbnQxNl90IG1fY2x1c3Rlcl9pbmRleDsKKwl9OworI3ByYWdtYSBwYWNrKHBvcCkKKworCWJvb2wgb3BlbmNsX3JlZmluZV9lbmRwb2ludF9jbHVzdGVyaXphdGlvbigKKwkJb3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0LAorCQljb25zdCBjbF9ibG9ja19pbmZvX3N0cnVjdCAqcFBpeGVsX2Jsb2NrX2luZm8sCisJCXVpbnQzMl90IHRvdGFsX2NsdXN0ZXJzLAorCQljb25zdCBjbF9lbmRwb2ludF9jbHVzdGVyX3N0cnVjdCAqcENsdXN0ZXJfaW5mbywKKwkJY29uc3QgdWludDMyX3QgKnBTb3J0ZWRfYmxvY2tfaW5kaWNlcywKKwkJdWludDMyX3QqIHBPdXRwdXRfY2x1c3Rlcl9pbmRpY2VzLCAKKwkJYm9vbCBwZXJjZXB0dWFsKTsKKworCS8vIG9wZW5jbF9maW5kX29wdGltYWxfc2VsZWN0b3JfY2x1c3RlcnNfZm9yX2VhY2hfYmxvY2sKKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisJc3RydWN0IGZvc2Nfc2VsZWN0b3Jfc3RydWN0CisJeworCQl1aW50MzJfdCBtX3BhY2tlZF9zZWxlY3RvcnM7CS8vIDR4NCBncmlkIG9mIDItYml0IHNlbGVjdG9ycworCX07CisKKwlzdHJ1Y3QgZm9zY19ibG9ja19zdHJ1Y3QKKwl7CisJCWNvbG9yX3JnYmEgbV9ldGNfY29sb3I1X2ludGVuOyAgLy8gdW5zY2FsZWQgNS1iaXQgYmxvY2sgY29sb3IgaW4gUkdCLCBhbHBoYSBoYXMgYmxvY2sncyBpbnRlbnNpdHkgaW5kZXgKKwkJdWludDMyX3QgbV9maXJzdF9zZWxlY3RvcjsJCS8vIG9mZnNldCBpbnRvIHNlbGVjdG9yIHRhYmxlCisJCXVpbnQzMl90IG1fbnVtX3NlbGVjdG9yczsJCS8vIG51bWJlciBvZiBzZWxlY3RvcnMgdG8gY2hlY2sKKwl9OworCisJc3RydWN0IGZvc2NfcGFyYW1fc3RydWN0CisJeworCQl1aW50MzJfdCBtX3RvdGFsX2Jsb2NrczsKKwkJaW50IG1fcGVyY2VwdHVhbDsKKwl9OworI3ByYWdtYSBwYWNrKHBvcCkKKworCWJvb2wgb3BlbmNsX2ZpbmRfb3B0aW1hbF9zZWxlY3Rvcl9jbHVzdGVyc19mb3JfZWFjaF9ibG9jaygKKwkJb3BlbmNsX2NvbnRleHRfcHRyIHBDb250ZXh0LAorCQljb25zdCBmb3NjX2Jsb2NrX3N0cnVjdCogcElucHV0X2Jsb2NrX2luZm8sCS8vIG9uZSBwZXIgYmxvY2sKKwkJdWludDMyX3QgdG90YWxfaW5wdXRfc2VsZWN0b3JzLAorCQljb25zdCBmb3NjX3NlbGVjdG9yX3N0cnVjdCogcElucHV0X3NlbGVjdG9ycywKKwkJY29uc3QgdWludDMyX3QqIHBTZWxlY3Rvcl9jbHVzdGVyX2luZGljZXMsCisJCXVpbnQzMl90KiBwT3V0cHV0X3NlbGVjdG9yX2NsdXN0ZXJfaW5kaWNlcywgLy8gb25lIHBlciBibG9jaworCQlib29sIHBlcmNlcHR1YWwpOworCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKwlzdHJ1Y3QgZHNfcGFyYW1fc3RydWN0CisJeworCQl1aW50MzJfdCBtX3RvdGFsX2Jsb2NrczsKKwkJaW50IG1fcGVyY2VwdHVhbDsKKwl9OworI3ByYWdtYSBwYWNrKHBvcCkKKworCWJvb2wgb3BlbmNsX2RldGVybWluZV9zZWxlY3RvcnMoCisJCW9wZW5jbF9jb250ZXh0X3B0ciBwQ29udGV4dCwKKwkJY29uc3QgY29sb3JfcmdiYSogcElucHV0X2V0Y19jb2xvcjVfYW5kX2ludGVuLAorCQlldGNfYmxvY2sqIHBPdXRwdXRfYmxvY2tzLAorCQlib29sIHBlcmNlcHR1YWwpOworCit9IC8vIG5hbWVzcGFjZSBiYXNpc3UKZGlmZiAtLWdpdCBhL2VuY29kZXIvYmFzaXN1X3Vhc3RjX2VuYy5jcHAgYi9lbmNvZGVyL2Jhc2lzdV91YXN0Y19lbmMuY3BwCmluZGV4IGNhMmIzMjUuLjI3MWJiYzYgMTAwNjQ0Ci0tLSBhL2VuY29kZXIvYmFzaXN1X3Vhc3RjX2VuYy5jcHAKKysrIGIvZW5jb2Rlci9iYXNpc3VfdWFzdGNfZW5jLmNwcApAQCAtMTMsNyArMTMsMTEgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgImJhc2lzdV91YXN0Y19lbmMuaCIKKworI2lmIEJBU0lTVV9VU0VfQVNUQ19ERUNPTVBSRVNTCiAjaW5jbHVkZSAiYmFzaXN1X2FzdGNfZGVjb21wLmgiCisjZW5kaWYKKwogI2luY2x1ZGUgImJhc2lzdV9ncHVfdGV4dHVyZS5oIgogI2luY2x1ZGUgImJhc2lzdV9iYzdlbmMuaCIKIApAQCAtNTA5LDE0ICs1MTMsMTQgQEAKIAogCQlpZiAocEZvcmNlX3NlbGVjdG9ycyA9PSBudWxscHRyKQogCQl7Ci0JCWludCBzMCA9IGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbMF1dLm1fdW5xdWFudCArIGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbMl1dLm1fdW5xdWFudCArIGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbNF1dLm1fdW5xdWFudDsKLQkJaW50IHMxID0gZ19hc3RjX3VucXVhbnRbZW5kcG9pbnRfcmFuZ2VdW2FzdGNfcmVzdWx0cy5tX2VuZHBvaW50c1sxXV0ubV91bnF1YW50ICsgZ19hc3RjX3VucXVhbnRbZW5kcG9pbnRfcmFuZ2VdW2FzdGNfcmVzdWx0cy5tX2VuZHBvaW50c1szXV0ubV91bnF1YW50ICsgZ19hc3RjX3VucXVhbnRbZW5kcG9pbnRfcmFuZ2VdW2FzdGNfcmVzdWx0cy5tX2VuZHBvaW50c1s1XV0ubV91bnF1YW50OwotCQlpZiAoczEgPCBzMCkKLQkJewotCQkJc3RkOjpzd2FwKGFzdGNfcmVzdWx0cy5tX2VuZHBvaW50c1swXSwgYXN0Y19yZXN1bHRzLm1fZW5kcG9pbnRzWzFdKTsKLQkJCXN0ZDo6c3dhcChhc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbMl0sIGFzdGNfcmVzdWx0cy5tX2VuZHBvaW50c1szXSk7Ci0JCQlzdGQ6OnN3YXAoYXN0Y19yZXN1bHRzLm1fZW5kcG9pbnRzWzRdLCBhc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbNV0pOwotCQkJaW52ZXJ0ID0gdHJ1ZTsKKwkJCWludCBzMCA9IGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbMF1dLm1fdW5xdWFudCArIGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbMl1dLm1fdW5xdWFudCArIGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbNF1dLm1fdW5xdWFudDsKKwkJCWludCBzMSA9IGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbMV1dLm1fdW5xdWFudCArIGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbM11dLm1fdW5xdWFudCArIGdfYXN0Y191bnF1YW50W2VuZHBvaW50X3JhbmdlXVthc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbNV1dLm1fdW5xdWFudDsKKwkJCWlmIChzMSA8IHMwKQorCQkJeworCQkJCXN0ZDo6c3dhcChhc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbMF0sIGFzdGNfcmVzdWx0cy5tX2VuZHBvaW50c1sxXSk7CisJCQkJc3RkOjpzd2FwKGFzdGNfcmVzdWx0cy5tX2VuZHBvaW50c1syXSwgYXN0Y19yZXN1bHRzLm1fZW5kcG9pbnRzWzNdKTsKKwkJCQlzdGQ6OnN3YXAoYXN0Y19yZXN1bHRzLm1fZW5kcG9pbnRzWzRdLCBhc3RjX3Jlc3VsdHMubV9lbmRwb2ludHNbNV0pOworCQkJCWludmVydCA9IHRydWU7CiAJCQl9CiAJCX0KIApAQCAtMzU2Miw3ICszNTY2LDggQEAKIAkJCWJhc2lzdDo6Y29sb3IzMiB0ZW1wX2Jsb2NrX3VucGFja2VkWzRdWzRdOwogCQkJc3VjY2VzcyA9IGJhc2lzdDo6dW5wYWNrX3Vhc3RjKHRlbXBfYmxvY2ssIChiYXNpc3Q6OmNvbG9yMzIgKil0ZW1wX2Jsb2NrX3VucGFja2VkLCBmYWxzZSk7CiAJCQlWQUxJREFURShzdWNjZXNzKTsKLQkJCQkKKworI2lmIEJBU0lTVV9VU0VfQVNUQ19ERUNPTVBSRVNTCiAJCQkvLyBOb3cgcm91bmQgdHJpcCB0byBwYWNrZWQgQVNUQyBhbmQgYmFjaywgdGhlbiBkZWNvZGUgdG8gcGl4ZWxzLgogCQkJdWludDMyX3QgYXN0Y19kYXRhWzRdOwogCQkJCkBAIC0zNTkwLDYgKzM1OTUsNyBAQAogCQkJCQlWQUxJREFURSh0ZW1wX2Jsb2NrX3VucGFja2VkW3ldW3hdLmNbM10gPT0gZGVjb2RlZF91YXN0Y19ibG9ja1t5XVt4XS5hKTsKIAkJCQl9CiAJCQl9CisjZW5kaWYKIAkJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2VuY29kZXIvY3Bwc3BtZF9zc2UuaCBiL2VuY29kZXIvY3Bwc3BtZF9zc2UuaAppbmRleCA5YTk3ZWViLi40YzYxYmFiIDEwMDY0NAotLS0gYS9lbmNvZGVyL2NwcHNwbWRfc3NlLmgKKysrIGIvZW5jb2Rlci9jcHBzcG1kX3NzZS5oCkBAIC0xLDEzICsxLDUgQEAKIC8vIGNwcHNwbWRfc3NlLmgKLS8vIE5vdGUgZm9yIEJhc2lzIFVuaXZlcnNhbDogQWxsIG9mIHRoZSAiY3Bwc3BtZCIgY29kZSBhbmQgaGVhZGVycyBhcmUgT1BUSU9OQUwgdG8gQmFzaXMgVW5pdmVyc2FsLiBpZiBCQVNJU1VfU1VQUE9SVF9TU0UgaXMgMCwgaXQgd2lsbCBuZXZlciBiZSBpbmNsdWRlZCBhbmQgZG9lcyBub3QgaW1wYWN0IGNvbXBpbGF0aW9uLgotLy8gU1NFIDIgb3IgNC4xCi0vLyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTmljb2xhcyBHdWlsbGVtb3QsIEplZmZlcnNvbiBBbXN0dXR6IGluIHRoZSAiQ3BwU1BNRCIgcHJvamVjdC4KLS8vIDQvMjA6IFJpY2hhcmQgR2VsZHJlaWNoOiBNYWNybyBjb250cm9sIGZsb3csIG1vcmUgU0lNRCBpbnN0cnVjdGlvbiBzZXRzLCBvcHRpbWl6YXRpb25zLCBzdXBwb3J0cyB1c2luZyBtdWx0aXBsZSBTSU1EIGluc3RydWN0aW9uIHNldHMgaW4gc2FtZSBleGVjdXRhYmxlLiBTdGlsbCBhIHdvcmsgaW4gcHJvZ3Jlc3MhCi0vLwotLy8gT3JpZ2luYWxseSBDb3B5cmlnaHQgMjAxNiBOaWNvbGFzIEd1aWxsZW1vdAotLy8gQ2hhbmdlZCBmcm9tIHRoZSBNSVQgbGljZW5zZSB0byBBcGFjaGUgMi4wIHdpdGggcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IuCi0vLwotLy8gTW9kaWZpY2F0aW9ucy9lbmhhbmNlbWVudHMgQ29weXJpZ2h0IDIwMjAtMjAyMSBCaW5vbWlhbCBMTEMKKy8vIENvcHlyaWdodCAyMDIwLTIwMjIgQmlub21pYWwgTExDCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMCw2ICsxMiwxMSBAQAogLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisvLyBOb3RlcyBmb3IgQmFzaXMgVW5pdmVyc2FsOgorLy8gQWxsIG9mIHRoZSAiY3Bwc3BtZCIgY29kZSBhbmQgaGVhZGVycyBhcmUgT1BUSU9OQUwgdG8gQmFzaXMgVW5pdmVyc2FsLiBpZiBCQVNJU1VfU1VQUE9SVF9TU0UgaXMgMCwgaXQgd2lsbCBuZXZlciBiZSBpbmNsdWRlZCBhbmQgZG9lcyBub3QgaW1wYWN0IGNvbXBpbGF0aW9uLgorLy8gVGhlIHRlY2huaXF1ZXMgdXNlZCBpbiB0aGlzIGNvZGUgd2VyZSBvcmlnaW5hbGx5IGRlbW9uc3RyYXRlZCBmb3IgQVZYMiBieSBOaWNvbGFzIEd1aWxsZW1vdCwgSmVmZmVyc29uIEFtc3R1dHogaW4gdGhlaXIgIkNwcFNQTUQiIHByb2plY3QuCisvLyBUaGlzIGlzIG5ldyBjb2RlIGZvciB1c2UgaW4gQmFzaXMgVW5pdmVyc2FsLCBhbHRob3VnaCBpdCB1c2VzIHRoZSBzYW1lIGdlbmVyYWwgU1BNRCB0ZWNobmlxdWVzIGluIFNTRSAyLzQuCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTEzMzAsNyArMTMyNyw3IEBACiAJCV9fbTEyOCB0ZW1wID0gX21tX2FkZF9wcyhfbW1fc2h1ZmZsZV9wcyhrMzIxMCwgazMyMTAsIF9NTV9TSFVGRkxFKDAsIDEsIDIsIDMpKSwgazMyMTApOwogCQlyZXR1cm4gX21tX2N2dHNzX2YzMihfbW1fYWRkX3NzKF9tbV9tb3ZlaGxfcHModGVtcCwgdGVtcCksIHRlbXApKTsKIAl9Ci0JCQorCiAJQ1BQU1BNRF9GT1JDRV9JTkxJTkUgaW50IHJlZHVjZV9hZGQodmludCB2KQogCXsKIAkJX19tMTI4aSBrMzIxMCA9IGJsZW5kdl9tYXNrX2VwaTMyKF9tbV9zZXR6ZXJvX3NpMTI4KCksIHYubV92YWx1ZSwgbV9leGVjLm1fbWFzayk7CkBAIC0xNjY4LDE0ICsxNjY1LDE2IEBACiBDUFBTUE1EX0ZPUkNFX0lOTElORSB2aW50IHVuZGVmaW5lZF92aW50KCkgeyByZXR1cm4gdmludHsgX21tX3VuZGVmaW5lZF9zaTEyOCgpIH07IH0KIENQUFNQTURfRk9SQ0VfSU5MSU5FIHZmbG9hdCB1bmRlZmluZWRfdmZsb2F0KCkgeyByZXR1cm4gdmZsb2F0eyBfbW1fdW5kZWZpbmVkX3BzKCkgfTsgfQogCitDUFBTUE1EX0ZPUkNFX0lOTElORSB2aW50IHplcm9fdmludCgpIHsgcmV0dXJuIHZpbnR7IF9tbV9zZXR6ZXJvX3NpMTI4KCkgfTsgfQorQ1BQU1BNRF9GT1JDRV9JTkxJTkUgdmZsb2F0IHplcm9fdmZsb2F0KCkgeyByZXR1cm4gdmZsb2F0eyBfbW1fc2V0emVyb19wcygpIH07IH0KKwogQ1BQU1BNRF9GT1JDRV9JTkxJTkUgdmludCB2aW50X2xhbmVfc2V0KGludCB2MCwgaW50IHYxLCBpbnQgdjIsIGludCB2MykgeyByZXR1cm4gdmludHsgX21tX3NldF9lcGkzMih2MywgdjIsIHYxLCB2MCkgfTsgfQogQ1BQU1BNRF9GT1JDRV9JTkxJTkUgdmZsb2F0IHZmbG9hdF9sYW5lX3NldChmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykgeyByZXR1cm4gdmZsb2F0eyBfbW1fc2V0X3BzKHYzLCB2MiwgdjEsIHYwKSB9OyB9Ci0KIENQUFNQTURfRk9SQ0VfSU5MSU5FIHZpbnQgdmludF9sYW5lX3NldF9yKGludCB2MywgaW50IHYyLCBpbnQgdjEsIGludCB2MCkgeyByZXR1cm4gdmludHsgX21tX3NldF9lcGkzMih2MywgdjIsIHYxLCB2MCkgfTsgfQogQ1BQU1BNRF9GT1JDRV9JTkxJTkUgdmZsb2F0IHZmbG9hdF9sYW5lX3NldF9yKGZsb2F0IHYzLCBmbG9hdCB2MiwgZmxvYXQgdjEsIGZsb2F0IHYwKSB7IHJldHVybiB2ZmxvYXR7IF9tbV9zZXRfcHModjMsIHYyLCB2MSwgdjApIH07IH0KLQogLy8gY29udHJvbCBpcyBhbiA4LWJpdCBpbW1lZGlhdGUgdmFsdWUgY29udGFpbmluZyA0IDItYml0IGluZGljZXMgd2hpY2ggc2h1ZmZsZXMgdGhlIGludDMyJ3MgaW4gZWFjaCAxMjgtYml0IGxhbmUuCiAjZGVmaW5lIFZJTlRfTEFORV9TSFVGRkxFX0VQSTMyKGEsIGNvbnRyb2wpIHZpbnQoX21tX3NodWZmbGVfZXBpMzIoKGEpLm1fdmFsdWUsIGNvbnRyb2wpKQorI2RlZmluZSBWRkxPQVRfTEFORV9TSFVGRkxFX1BTKGEsIGIsIGNvbnRyb2wpIHZmbG9hdChfbW1fc2h1ZmZsZV9wcygoYSkubV92YWx1ZSwgKGIpLm1fdmFsdWUsIGNvbnRyb2wpKQogCiAvLyBjb250cm9sIGlzIGFuIDgtYml0IGltbWVkaWF0ZSB2YWx1ZSBjb250YWluaW5nIDQgMi1iaXQgaW5kaWNlcyB3aGljaCBzaHVmZmxlcyB0aGUgaW50MTYncyBpbiBlaXRoZXIgdGhlIGhpZ2ggb3IgbG93IDY0LWJpdCBsYW5lLgogI2RlZmluZSBWSU5UX0xBTkVfU0hVRkZMRUxPX0VQSTE2KGEsIGNvbnRyb2wpIHZpbnQoX21tX3NodWZmbGVsb19lcGkxNigoYSkubV92YWx1ZSwgY29udHJvbCkpCmRpZmYgLS1naXQgYS9lbmNvZGVyL2pwZ2QuY3BwIGIvZW5jb2Rlci9qcGdkLmNwcAppbmRleCA1NjNmYTc0Li5mZWM4YjcxIDEwMDY0NAotLS0gYS9lbmNvZGVyL2pwZ2QuY3BwCisrKyBiL2VuY29kZXIvanBnZC5jcHAKQEAgLTIzLDE3ICsyMyw2IEBACiAvLyB2MS4wNCwgTWF5LiAxOSwgMjAxMjogQ29kZSB0d2Vha3MgdG8gZml4IFZTMjAwOCBzdGF0aWMgY29kZSBhbmFseXNpcyB3YXJuaW5ncwogLy8gdjIuMDAsIE1hcmNoIDIwLCAyMDIwOiBGdXp6ZWQgd2l0aCB6enVmIGFuZCBhZmwuIEZpeGVkIHNldmVyYWwgaXNzdWVzLCBjb252ZXJ0ZWQgbW9zdCBhc3NlcnQoKSdzIHRvIHJ1bi10aW1lIGNoZWNrcy4gQWRkZWQgY2hyb21hIHVwc2FtcGxpbmcuIFJlbW92ZWQgZnJlcS4gZG9tYWluIHVwc2FtcGxpbmcuIGdjYy9jbGFuZyB3YXJuaW5ncy4KIC8vCi0jaWZkZWYgX01TQ19WRVIKLSNpZm5kZWYgQkFTSVNVX05PX0lURVJBVE9SX0RFQlVHX0xFVkVMCi0jaWYgZGVmaW5lZChfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIF9JVEVSQVRPUl9ERUJVR19MRVZFTCAxCi0jZGVmaW5lIF9TRUNVUkVfU0NMIDEKLSNlbHNlCi0jZGVmaW5lIF9TRUNVUkVfU0NMIDAKLSNkZWZpbmUgX0lURVJBVE9SX0RFQlVHX0xFVkVMIDAKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKIAogI2luY2x1ZGUgImpwZ2QuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4KZGlmZiAtLWdpdCBhL2VuY29kZXIvbG9kZXBuZy5jcHAgYi9lbmNvZGVyL2xvZGVwbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2FkY2Y0Li4wMDAwMDAwCi0tLSBhL2VuY29kZXIvbG9kZXBuZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MDA4ICswLDAgQEAKLS8qCi1Mb2RlUE5HIHZlcnNpb24gMjAxOTAyMTAKLQotQ29weXJpZ2h0IChjKSAyMDA1LTIwMTkgTG9kZSBWYW5kZXZlbm5lCi0KLVRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi13YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLWFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0KLSAgICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLQotICAgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZQotICAgIGRpc3RyaWJ1dGlvbi4KLSovCi0KLS8qCi1UaGUgbWFudWFsIGFuZCBjaGFuZ2Vsb2cgYXJlIGluIHRoZSBoZWFkZXIgZmlsZSAibG9kZXBuZy5oIgotUmVuYW1lIHRoaXMgZmlsZSB0byBsb2RlcG5nLmNwcCB0byB1c2UgaXQgZm9yIEMrKywgb3IgdG8gbG9kZXBuZy5jIHRvIHVzZSBpdCBmb3IgQy4KLSovCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKLSNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQyMDEpCi0KLSNpZm5kZWYgQkFTSVNVX05PX0lURVJBVE9SX0RFQlVHX0xFVkVMCi0jaWYgZGVmaW5lZChfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIF9JVEVSQVRPUl9ERUJVR19MRVZFTCAxCi0jZGVmaW5lIF9TRUNVUkVfU0NMIDEKLSNlbHNlCi0jZGVmaW5lIF9TRUNVUkVfU0NMIDAKLSNkZWZpbmUgX0lURVJBVE9SX0RFQlVHX0xFVkVMIDAKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImxvZGVwbmcuaCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPiAvKiBMT05HX01BWCAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+IC8qIGZpbGUgaGFuZGxpbmcgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4gLyogYWxsb2NhdGlvbnMgKi8KLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMzEwKSAvKlZpc3VhbCBTdHVkaW86IEEgZmV3IHdhcm5pbmcgdHlwZXMgYXJlIG5vdCBkZXNpcmVkIGhlcmUuKi8KLSNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNDQgKSAvKmltcGxpY2l0IGNvbnZlcnNpb25zOiBub3Qgd2FybmVkIGJ5IGdjYyAtV2FsbCAtV2V4dHJhIGFuZCByZXF1aXJlcyB0b28gbXVjaCBjYXN0cyovCi0jcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0OTk2ICkgLypWUyBkb2VzIG5vdCBsaWtlIGZvcGVuLCBidXQgZm9wZW5fcyBpcyBub3Qgc3RhbmRhcmQgQyBzbyB1bnVzYWJsZSBoZXJlKi8KLSNlbmRpZiAvKl9NU0NfVkVSICovCi0KLWNvbnN0IGNoYXIqIExPREVQTkdfVkVSU0lPTl9TVFJJTkcgPSAiMjAxOTAyMTAiOwotCi0vKgotVGhpcyBzb3VyY2UgZmlsZSBpcyBidWlsdCB1cCBpbiB0aGUgZm9sbG93aW5nIGxhcmdlIHBhcnRzLiBUaGUgY29kZSBzZWN0aW9ucwotd2l0aCB0aGUgIkxPREVQTkdfQ09NUElMRV8iICNkZWZpbmVzIGRpdmlkZSB0aGlzIHVwIGZ1cnRoZXIgaW4gYW4gaW50ZXJtaXhlZCB3YXkuCi0tVG9vbHMgZm9yIEMgYW5kIGNvbW1vbiBjb2RlIGZvciBQTkcgYW5kIFpsaWIKLS1DIENvZGUgZm9yIFpsaWIgKGh1ZmZtYW4sIGRlZmxhdGUsIC4uLikKLS1DIENvZGUgZm9yIFBORyAoZmlsZSBmb3JtYXQgY2h1bmtzLCBhZGFtNywgUE5HIGZpbHRlcnMsIGNvbG9yIGNvbnZlcnNpb25zLCAuLi4pCi0tVGhlIEMrKyB3cmFwcGVyIGFyb3VuZCBhbGwgb2YgdGhlIGFib3ZlCi0qLwotCi0vKlRoZSBtYWxsb2MsIHJlYWxsb2MgYW5kIGZyZWUgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSB3aXRoICJsb2RlcG5nXyIgaW4gZnJvbnQKLW9mIHRoZSBuYW1lLCBzbyB0aGF0IHlvdSBjYW4gZWFzaWx5IGNoYW5nZSB0aGVtIHRvIG90aGVycyByZWxhdGVkIHRvIHlvdXIKLXBsYXRmb3JtIGlmIG5lZWRlZC4gRXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb2RlIGNhbGxzIHRoZXNlLiBQYXNzCi0tRExPREVQTkdfTk9fQ09NUElMRV9BTExPQ0FUT1JTIHRvIHRoZSBjb21waWxlciwgb3IgY29tbWVudCBvdXQKLSNkZWZpbmUgTE9ERVBOR19DT01QSUxFX0FMTE9DQVRPUlMgaW4gdGhlIGhlYWRlciwgdG8gZGlzYWJsZSB0aGUgb25lcyBoZXJlIGFuZAotZGVmaW5lIHRoZW0gaW4geW91ciBvd24gcHJvamVjdCdzIHNvdXJjZSBmaWxlcyB3aXRob3V0IG5lZWRpbmcgdG8gY2hhbmdlCi1sb2RlcG5nIHNvdXJjZSBjb2RlLiBEb24ndCBmb3JnZXQgdG8gcmVtb3ZlICJzdGF0aWMiIGlmIHlvdSBjb3B5cGFzdGUgdGhlbQotZnJvbSBoZXJlLiovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQUxMT0NBVE9SUwotc3RhdGljIHZvaWQqIGxvZGVwbmdfbWFsbG9jKHNpemVfdCBzaXplKSB7Ci0jaWZkZWYgTE9ERVBOR19NQVhfQUxMT0MKLSAgaWYoc2l6ZSA+IExPREVQTkdfTUFYX0FMTE9DKSByZXR1cm4gMDsKLSNlbmRpZgotICByZXR1cm4gbWFsbG9jKHNpemUpOwotfQotCi1zdGF0aWMgdm9pZCogbG9kZXBuZ19yZWFsbG9jKHZvaWQqIHB0ciwgc2l6ZV90IG5ld19zaXplKSB7Ci0jaWZkZWYgTE9ERVBOR19NQVhfQUxMT0MKLSAgaWYobmV3X3NpemUgPiBMT0RFUE5HX01BWF9BTExPQykgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgcmV0dXJuIHJlYWxsb2MocHRyLCBuZXdfc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxvZGVwbmdfZnJlZSh2b2lkKiBwdHIpIHsKLSAgZnJlZShwdHIpOwotfQotI2Vsc2UgLypMT0RFUE5HX0NPTVBJTEVfQUxMT0NBVE9SUyovCi12b2lkKiBsb2RlcG5nX21hbGxvYyhzaXplX3Qgc2l6ZSk7Ci12b2lkKiBsb2RlcG5nX3JlYWxsb2Modm9pZCogcHRyLCBzaXplX3QgbmV3X3NpemUpOwotdm9pZCBsb2RlcG5nX2ZyZWUodm9pZCogcHRyKTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTExPQ0FUT1JTKi8KLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0vKiAvLyBUb29scyBmb3IgQywgYW5kIGNvbW1vbiBjb2RlIGZvciBQTkcgYW5kIFpsaWIuICAgICAgICAgICAgICAgICAgICAgICAvLyAqLwotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLSNkZWZpbmUgTE9ERVBOR19NQVgoYSwgYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQotI2RlZmluZSBMT0RFUE5HX01JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0KLS8qCi1PZnRlbiBpbiBjYXNlIG9mIGFuIGVycm9yIGEgdmFsdWUgaXMgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBhbmQgdGhlbiBpdCBicmVha3MKLW91dCBvZiBhIGxvb3AgKHRvIGdvIHRvIHRoZSBjbGVhbnVwIHBoYXNlIG9mIGEgZnVuY3Rpb24pLiBUaGlzIG1hY3JvIGRvZXMgdGhhdC4KLUl0IG1ha2VzIHRoZSBlcnJvciBoYW5kbGluZyBjb2RlIHNob3J0ZXIgYW5kIG1vcmUgcmVhZGFibGUuCi0KLUV4YW1wbGU6IGlmKCF1aXZlY3Rvcl9yZXNpemV2KCZmcmVxdWVuY2llc19sbCwgMjg2LCAwKSkgRVJST1JfQlJFQUsoODMpOwotKi8KLSNkZWZpbmUgQ0VSUk9SX0JSRUFLKGVycm9ydmFyLCBjb2RlKXtcCi0gIGVycm9ydmFyID0gY29kZTtcCi0gIGJyZWFrO1wKLX0KLQotLyp2ZXJzaW9uIG9mIENFUlJPUl9CUkVBSyB0aGF0IGFzc3VtZXMgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHRoZSBlcnJvciB2YXJpYWJsZSBpcyBuYW1lZCAiZXJyb3IiKi8KLSNkZWZpbmUgRVJST1JfQlJFQUsoY29kZSkgQ0VSUk9SX0JSRUFLKGVycm9yLCBjb2RlKQotCi0vKlNldCBlcnJvciB2YXIgdG8gdGhlIGVycm9yIGNvZGUsIGFuZCByZXR1cm4gaXQuKi8KLSNkZWZpbmUgQ0VSUk9SX1JFVFVSTl9FUlJPUihlcnJvcnZhciwgY29kZSl7XAotICBlcnJvcnZhciA9IGNvZGU7XAotICByZXR1cm4gY29kZTtcCi19Ci0KLS8qVHJ5IHRoZSBjb2RlLCBpZiBpdCByZXR1cm5zIGVycm9yLCBhbHNvIHJldHVybiB0aGUgZXJyb3IuKi8KLSNkZWZpbmUgQ0VSUk9SX1RSWV9SRVRVUk4oY2FsbCl7XAotICB1bnNpZ25lZCBlcnJvciA9IGNhbGw7XAotICBpZihlcnJvcikgcmV0dXJuIGVycm9yO1wKLX0KLQotLypTZXQgZXJyb3IgdmFyIHRvIHRoZSBlcnJvciBjb2RlLCBhbmQgcmV0dXJuIGZyb20gdGhlIHZvaWQgZnVuY3Rpb24uKi8KLSNkZWZpbmUgQ0VSUk9SX1JFVFVSTihlcnJvcnZhciwgY29kZSl7XAotICBlcnJvcnZhciA9IGNvZGU7XAotICByZXR1cm47XAotfQotCi0vKgotQWJvdXQgdWl2ZWN0b3IsIHVjdmVjdG9yIGFuZCBzdHJpbmc6Ci0tQWxsIG9mIHRoZW0gd3JhcCBkeW5hbWljIGFycmF5cyBvciB0ZXh0IHN0cmluZ3MgaW4gYSBzaW1pbGFyIHdheS4KLS1Mb2RlUE5HIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gaW4gQysrLiBUaGUgdmVjdG9ycyByZXBsYWNlIHRoZSBzdGQ6OnZlY3RvcnMgdGhhdCB3ZXJlIHVzZWQgaW4gdGhlIEMrKyB2ZXJzaW9uLgotLVRoZSBzdHJpbmcgdG9vbHMgYXJlIG1hZGUgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBjb21waWxlcnMgdGhhdCBkZWNsYXJlIHRoaW5ncyBsaWtlIHN0cm5jYXQgYXMgZGVwcmVjYXRlZC4KLS1UaGV5J3JlIG5vdCB1c2VkIGluIHRoZSBpbnRlcmZhY2UsIG9ubHkgaW50ZXJuYWxseSBpbiB0aGlzIGZpbGUgYXMgc3RhdGljIGZ1bmN0aW9ucy4KLS1BcyB3aXRoIG1hbnkgb3RoZXIgc3RydWN0cyBpbiB0aGlzIGZpbGUsIHRoZSBpbml0IGFuZCBjbGVhbnVwIGZ1bmN0aW9ucyBzZXJ2ZSBhcyBjdG9yIGFuZCBkdG9yLgotKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9aTElCCi0vKmR5bmFtaWMgdmVjdG9yIG9mIHVuc2lnbmVkIGludHMqLwotdHlwZWRlZiBzdHJ1Y3QgdWl2ZWN0b3IgewotICB1bnNpZ25lZCogZGF0YTsKLSAgc2l6ZV90IHNpemU7IC8qc2l6ZSBpbiBudW1iZXIgb2YgdW5zaWduZWQgbG9uZ3MqLwotICBzaXplX3QgYWxsb2NzaXplOyAvKmFsbG9jYXRlZCBzaXplIGluIGJ5dGVzKi8KLX0gdWl2ZWN0b3I7Ci0KLXN0YXRpYyB2b2lkIHVpdmVjdG9yX2NsZWFudXAodm9pZCogcCkgewotICAoKHVpdmVjdG9yKilwKS0+c2l6ZSA9ICgodWl2ZWN0b3IqKXApLT5hbGxvY3NpemUgPSAwOwotICBsb2RlcG5nX2ZyZWUoKCh1aXZlY3RvciopcCktPmRhdGEpOwotICAoKHVpdmVjdG9yKilwKS0+ZGF0YSA9IE5VTEw7Ci19Ci0KLS8qcmV0dXJucyAxIGlmIHN1Y2Nlc3MsIDAgaWYgZmFpbHVyZSA9PT4gbm90aGluZyBkb25lKi8KLXN0YXRpYyB1bnNpZ25lZCB1aXZlY3Rvcl9yZXNlcnZlKHVpdmVjdG9yKiBwLCBzaXplX3QgYWxsb2NzaXplKSB7Ci0gIGlmKGFsbG9jc2l6ZSA+IHAtPmFsbG9jc2l6ZSkgewotICAgIHNpemVfdCBuZXdzaXplID0gKGFsbG9jc2l6ZSA+IHAtPmFsbG9jc2l6ZSAqIDIpID8gYWxsb2NzaXplIDogKGFsbG9jc2l6ZSAqIDMgLyAyKTsKLSAgICB2b2lkKiBkYXRhID0gbG9kZXBuZ19yZWFsbG9jKHAtPmRhdGEsIG5ld3NpemUpOwotICAgIGlmKGRhdGEpIHsKLSAgICAgIHAtPmFsbG9jc2l6ZSA9IG5ld3NpemU7Ci0gICAgICBwLT5kYXRhID0gKHVuc2lnbmVkKilkYXRhOwotICAgIH0KLSAgICBlbHNlIHJldHVybiAwOyAvKmVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSovCi0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qcmV0dXJucyAxIGlmIHN1Y2Nlc3MsIDAgaWYgZmFpbHVyZSA9PT4gbm90aGluZyBkb25lKi8KLXN0YXRpYyB1bnNpZ25lZCB1aXZlY3Rvcl9yZXNpemUodWl2ZWN0b3IqIHAsIHNpemVfdCBzaXplKSB7Ci0gIGlmKCF1aXZlY3Rvcl9yZXNlcnZlKHAsIHNpemUgKiBzaXplb2YodW5zaWduZWQpKSkgcmV0dXJuIDA7Ci0gIHAtPnNpemUgPSBzaXplOwotICByZXR1cm4gMTsgLypzdWNjZXNzKi8KLX0KLQotLypyZXNpemUgYW5kIGdpdmUgYWxsIG5ldyBlbGVtZW50cyB0aGUgdmFsdWUqLwotc3RhdGljIHVuc2lnbmVkIHVpdmVjdG9yX3Jlc2l6ZXYodWl2ZWN0b3IqIHAsIHNpemVfdCBzaXplLCB1bnNpZ25lZCB2YWx1ZSkgewotICBzaXplX3Qgb2xkc2l6ZSA9IHAtPnNpemUsIGk7Ci0gIGlmKCF1aXZlY3Rvcl9yZXNpemUocCwgc2l6ZSkpIHJldHVybiAwOwotICBmb3IoaSA9IG9sZHNpemU7IGkgPCBzaXplOyArK2kpIHAtPmRhdGFbaV0gPSB2YWx1ZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHVpdmVjdG9yX2luaXQodWl2ZWN0b3IqIHApIHsKLSAgcC0+ZGF0YSA9IE5VTEw7Ci0gIHAtPnNpemUgPSBwLT5hbGxvY3NpemUgPSAwOwotfQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0VOQ09ERVIKLS8qcmV0dXJucyAxIGlmIHN1Y2Nlc3MsIDAgaWYgZmFpbHVyZSA9PT4gbm90aGluZyBkb25lKi8KLXN0YXRpYyB1bnNpZ25lZCB1aXZlY3Rvcl9wdXNoX2JhY2sodWl2ZWN0b3IqIHAsIHVuc2lnbmVkIGMpIHsKLSAgaWYoIXVpdmVjdG9yX3Jlc2l6ZShwLCBwLT5zaXplICsgMSkpIHJldHVybiAwOwotICBpZiAoIXAtPmRhdGEpIHJldHVybiAwOwotICBwLT5kYXRhW3AtPnNpemUgLSAxXSA9IGM7Ci0gIHJldHVybiAxOwotfQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX1pMSUIqLwotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotLypkeW5hbWljIHZlY3RvciBvZiB1bnNpZ25lZCBjaGFycyovCi10eXBlZGVmIHN0cnVjdCB1Y3ZlY3RvciB7Ci0gIHVuc2lnbmVkIGNoYXIqIGRhdGE7Ci0gIHNpemVfdCBzaXplOyAvKnVzZWQgc2l6ZSovCi0gIHNpemVfdCBhbGxvY3NpemU7IC8qYWxsb2NhdGVkIHNpemUqLwotfSB1Y3ZlY3RvcjsKLQotLypyZXR1cm5zIDEgaWYgc3VjY2VzcywgMCBpZiBmYWlsdXJlID09PiBub3RoaW5nIGRvbmUqLwotc3RhdGljIHVuc2lnbmVkIHVjdmVjdG9yX3Jlc2VydmUodWN2ZWN0b3IqIHAsIHNpemVfdCBhbGxvY3NpemUpIHsKLSAgaWYoYWxsb2NzaXplID4gcC0+YWxsb2NzaXplKSB7Ci0gICAgc2l6ZV90IG5ld3NpemUgPSAoYWxsb2NzaXplID4gcC0+YWxsb2NzaXplICogMikgPyBhbGxvY3NpemUgOiAoYWxsb2NzaXplICogMyAvIDIpOwotICAgIHZvaWQqIGRhdGEgPSBsb2RlcG5nX3JlYWxsb2MocC0+ZGF0YSwgbmV3c2l6ZSk7Ci0gICAgaWYoZGF0YSkgewotICAgICAgcC0+YWxsb2NzaXplID0gbmV3c2l6ZTsKLSAgICAgIHAtPmRhdGEgPSAodW5zaWduZWQgY2hhciopZGF0YTsKLSAgICB9Ci0gICAgZWxzZSByZXR1cm4gMDsgLyplcnJvcjogbm90IGVub3VnaCBtZW1vcnkqLwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vKnJldHVybnMgMSBpZiBzdWNjZXNzLCAwIGlmIGZhaWx1cmUgPT0+IG5vdGhpbmcgZG9uZSovCi1zdGF0aWMgdW5zaWduZWQgdWN2ZWN0b3JfcmVzaXplKHVjdmVjdG9yKiBwLCBzaXplX3Qgc2l6ZSkgewotICBpZighdWN2ZWN0b3JfcmVzZXJ2ZShwLCBzaXplICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSkgcmV0dXJuIDA7Ci0gIHAtPnNpemUgPSBzaXplOwotICByZXR1cm4gMTsgLypzdWNjZXNzKi8KLX0KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9QTkcKLQotc3RhdGljIHZvaWQgdWN2ZWN0b3JfY2xlYW51cCh2b2lkKiBwKSB7Ci0gICgodWN2ZWN0b3IqKXApLT5zaXplID0gKCh1Y3ZlY3RvciopcCktPmFsbG9jc2l6ZSA9IDA7Ci0gIGxvZGVwbmdfZnJlZSgoKHVjdmVjdG9yKilwKS0+ZGF0YSk7Ci0gICgodWN2ZWN0b3IqKXApLT5kYXRhID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgdWN2ZWN0b3JfaW5pdCh1Y3ZlY3RvciogcCkgewotICBwLT5kYXRhID0gTlVMTDsKLSAgcC0+c2l6ZSA9IHAtPmFsbG9jc2l6ZSA9IDA7Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfUE5HKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9aTElCCi0vKnlvdSBjYW4gYm90aCBjb252ZXJ0IGZyb20gdmVjdG9yIHRvIGJ1ZmZlciZzaXplIGFuZCB2aWNhIHZlcnNhLiBJZiB5b3UgdXNlCi1pbml0X2J1ZmZlciB0byB0YWtlIG92ZXIgYSBidWZmZXIgYW5kIHNpemUsIGl0IGlzIG5vdCBuZWVkZWQgdG8gdXNlIGNsZWFudXAqLwotc3RhdGljIHZvaWQgdWN2ZWN0b3JfaW5pdF9idWZmZXIodWN2ZWN0b3IqIHAsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgcC0+ZGF0YSA9IGJ1ZmZlcjsKLSAgcC0+YWxsb2NzaXplID0gcC0+c2l6ZSA9IHNpemU7Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfWkxJQiovCi0KLSNpZiAoZGVmaW5lZChMT0RFUE5HX0NPTVBJTEVfUE5HKSAmJiBkZWZpbmVkKExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKSkgfHwgZGVmaW5lZChMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUikKLS8qcmV0dXJucyAxIGlmIHN1Y2Nlc3MsIDAgaWYgZmFpbHVyZSA9PT4gbm90aGluZyBkb25lKi8KLXN0YXRpYyB1bnNpZ25lZCB1Y3ZlY3Rvcl9wdXNoX2JhY2sodWN2ZWN0b3IqIHAsIHVuc2lnbmVkIGNoYXIgYykgewotICBpZighdWN2ZWN0b3JfcmVzaXplKHAsIHAtPnNpemUgKyAxKSkgcmV0dXJuIDA7Ci0gIHAtPmRhdGFbcC0+c2l6ZSAtIDFdID0gYzsKLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYgLypkZWZpbmVkKExPREVQTkdfQ09NUElMRV9QTkcpIHx8IGRlZmluZWQoTE9ERVBOR19DT01QSUxFX0VOQ09ERVIpKi8KLQotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX1BORwotI2lmZGVmIExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTCi0KLS8qZnJlZSBzdHJpbmcgcG9pbnRlciBhbmQgc2V0IGl0IHRvIE5VTEwqLwotc3RhdGljIHZvaWQgc3RyaW5nX2NsZWFudXAoY2hhcioqIG91dCkgewotICBsb2RlcG5nX2ZyZWUoKm91dCk7Ci0gICpvdXQgPSBOVUxMOwotfQotCi0vKiBkeW5hbWljYWxseSBhbGxvY2F0ZXMgYSBuZXcgc3RyaW5nIHdpdGggYSBjb3B5IG9mIHRoZSBudWxsIHRlcm1pbmF0ZWQgaW5wdXQgdGV4dCAqLwotc3RhdGljIGNoYXIqIGFsbG9jX3N0cmluZyhjb25zdCBjaGFyKiBpbikgewotICBzaXplX3QgaW5zaXplID0gc3RybGVuKGluKTsKLSAgY2hhciogb3V0ID0gKGNoYXIqKWxvZGVwbmdfbWFsbG9jKGluc2l6ZSArIDEpOwotICBpZihvdXQpIHsKLSAgICBzaXplX3QgaTsKLSAgICBmb3IoaSA9IDA7IGkgIT0gaW5zaXplOyArK2kpIHsKLSAgICAgIG91dFtpXSA9IGluW2ldOwotICAgIH0KLSAgICBvdXRbaV0gPSAwOwotICB9Ci0gIHJldHVybiBvdXQ7Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfUE5HKi8KLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotdW5zaWduZWQgbG9kZXBuZ19yZWFkMzJiaXRJbnQoY29uc3QgdW5zaWduZWQgY2hhciogYnVmZmVyKSB7Ci0gIHJldHVybiAodW5zaWduZWQpKChidWZmZXJbMF0gPDwgMjQpIHwgKGJ1ZmZlclsxXSA8PCAxNikgfCAoYnVmZmVyWzJdIDw8IDgpIHwgYnVmZmVyWzNdKTsKLX0KLQotI2lmIGRlZmluZWQoTE9ERVBOR19DT01QSUxFX1BORykgfHwgZGVmaW5lZChMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUikKLS8qYnVmZmVyIG11c3QgaGF2ZSBhdCBsZWFzdCA0IGFsbG9jYXRlZCBieXRlcyBhdmFpbGFibGUqLwotc3RhdGljIHZvaWQgbG9kZXBuZ19zZXQzMmJpdEludCh1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIHZhbHVlKSB7Ci0gIGJ1ZmZlclswXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gMjQpICYgMHhmZik7Ci0gIGJ1ZmZlclsxXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gMTYpICYgMHhmZik7Ci0gIGJ1ZmZlclsyXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gIDgpICYgMHhmZik7Ci0gIGJ1ZmZlclszXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgICAgICApICYgMHhmZik7Ci19Ci0jZW5kaWYgLypkZWZpbmVkKExPREVQTkdfQ09NUElMRV9QTkcpIHx8IGRlZmluZWQoTE9ERVBOR19DT01QSUxFX0VOQ09ERVIpKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi1zdGF0aWMgdm9pZCBsb2RlcG5nX2FkZDMyYml0SW50KHVjdmVjdG9yKiBidWZmZXIsIHVuc2lnbmVkIHZhbHVlKSB7Ci0gIHVjdmVjdG9yX3Jlc2l6ZShidWZmZXIsIGJ1ZmZlci0+c2l6ZSArIDQpOyAvKnRvZG86IGdpdmUgZXJyb3IgaWYgcmVzaXplIGZhaWxlZCovCi0gIGxvZGVwbmdfc2V0MzJiaXRJbnQoJmJ1ZmZlci0+ZGF0YVtidWZmZXItPnNpemUgLSA0XSwgdmFsdWUpOwotfQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLyBGaWxlIElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRElTSwotCi0vKiByZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiBUaGlzIHNob3VsZCBiZSBwdXJlIEMgY29tcGF0aWJsZSwgc28gbm8gZnN0YXQuICovCi1zdGF0aWMgbG9uZyBsb2RlcG5nX2ZpbGVzaXplKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gIEZJTEUqIGZpbGU7Ci0gIGxvbmcgc2l6ZTsKLSAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKLSAgaWYoIWZpbGUpIHJldHVybiAtMTsKLQotICBpZihmc2VlayhmaWxlLCAwLCBTRUVLX0VORCkgIT0gMCkgewotICAgIGZjbG9zZShmaWxlKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzaXplID0gZnRlbGwoZmlsZSk7Ci0gIC8qIEl0IG1heSBnaXZlIExPTkdfTUFYIGFzIGRpcmVjdG9yeSBzaXplLCB0aGlzIGlzIGludmFsaWQgZm9yIHVzLiAqLwotICBpZihzaXplID09IExPTkdfTUFYKSBzaXplID0gLTE7Ci0KLSAgZmNsb3NlKGZpbGUpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogbG9hZCBmaWxlIGludG8gYnVmZmVyIHRoYXQgYWxyZWFkeSBoYXMgdGhlIGNvcnJlY3QgYWxsb2NhdGVkIHNpemUuIFJldHVybnMgZXJyb3IgY29kZS4qLwotc3RhdGljIHVuc2lnbmVkIGxvZGVwbmdfYnVmZmVyX2ZpbGUodW5zaWduZWQgY2hhciogb3V0LCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgRklMRSogZmlsZTsKLSAgc2l6ZV90IHJlYWRzaXplOwotICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwotICBpZighZmlsZSkgcmV0dXJuIDc4OwotCi0gIHJlYWRzaXplID0gZnJlYWQob3V0LCAxLCBzaXplLCBmaWxlKTsKLSAgZmNsb3NlKGZpbGUpOwotCi0gIGlmIChyZWFkc2l6ZSAhPSBzaXplKSByZXR1cm4gNzg7Ci0gIHJldHVybiAwOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2xvYWRfZmlsZSh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gIGxvbmcgc2l6ZSA9IGxvZGVwbmdfZmlsZXNpemUoZmlsZW5hbWUpOwotICBpZiAoc2l6ZSA8IDApIHJldHVybiA3ODsKLSAgKm91dHNpemUgPSAoc2l6ZV90KXNpemU7Ci0KLSAgKm91dCA9ICh1bnNpZ25lZCBjaGFyKilsb2RlcG5nX21hbGxvYygoc2l6ZV90KXNpemUpOwotICBpZighKCpvdXQpICYmIHNpemUgPiAwKSByZXR1cm4gODM7IC8qdGhlIGFib3ZlIG1hbGxvYyBmYWlsZWQqLwotCi0gIHJldHVybiBsb2RlcG5nX2J1ZmZlcl9maWxlKCpvdXQsIChzaXplX3Qpc2l6ZSwgZmlsZW5hbWUpOwotfQotCi0vKndyaXRlIGdpdmVuIGJ1ZmZlciB0byB0aGUgZmlsZSwgb3ZlcndyaXRpbmcgdGhlIGZpbGUsIGl0IGRvZXNuJ3QgYXBwZW5kIHRvIGl0LiovCi11bnNpZ25lZCBsb2RlcG5nX3NhdmVfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHNpemVfdCBidWZmZXJzaXplLCBjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICBGSUxFKiBmaWxlOwotICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIgKTsKLSAgaWYoIWZpbGUpIHJldHVybiA3OTsKLSAgZndyaXRlKGJ1ZmZlciwgMSwgYnVmZmVyc2l6ZSwgZmlsZSk7Ci0gIGZjbG9zZShmaWxlKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9ESVNLKi8KLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0vKiAvLyBFbmQgb2YgY29tbW9uIGNvZGUgYW5kIHRvb2xzLiBCZWdpbiBvZiBabGliIHJlbGF0ZWQgY29kZS4gICAgICAgICAgICAvLyAqLwotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfWkxJQgotI2lmZGVmIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi0vKlRPRE86IHRoaXMgaWdub3JlcyBwb3RlbnRpYWwgb3V0IG9mIG1lbW9yeSBlcnJvcnMqLwotI2RlZmluZSBhZGRCaXRUb1N0cmVhbSgvKnNpemVfdCoqLyBiaXRwb2ludGVyLCAvKnVjdmVjdG9yKiovIGJpdHN0cmVhbSwgLyp1bnNpZ25lZCBjaGFyKi8gYml0KXtcCi0gIC8qYWRkIGEgbmV3IGJ5dGUgYXQgdGhlIGVuZCovXAotICBpZigoKCpiaXRwb2ludGVyKSAmIDcpID09IDApIHVjdmVjdG9yX3B1c2hfYmFjayhiaXRzdHJlYW0sICh1bnNpZ25lZCBjaGFyKTApO1wKLSAgLyplYXJsaWVyIGJpdCBvZiBodWZmbWFuIGNvZGUgaXMgaW4gYSBsZXNzZXIgc2lnbmlmaWNhbnQgYml0IG9mIGFuIGVhcmxpZXIgYnl0ZSovXAotICAoYml0c3RyZWFtLT5kYXRhW2JpdHN0cmVhbS0+c2l6ZSAtIDFdKSB8PSAoYml0IDw8ICgoKmJpdHBvaW50ZXIpICYgMHg3KSk7XAotICArKygqYml0cG9pbnRlcik7XAotfQotCi1zdGF0aWMgdm9pZCBhZGRCaXRzVG9TdHJlYW0oc2l6ZV90KiBiaXRwb2ludGVyLCB1Y3ZlY3RvciogYml0c3RyZWFtLCB1bnNpZ25lZCB2YWx1ZSwgc2l6ZV90IG5iaXRzKSB7Ci0gIHNpemVfdCBpOwotICBmb3IoaSA9IDA7IGkgIT0gbmJpdHM7ICsraSkgYWRkQml0VG9TdHJlYW0oYml0cG9pbnRlciwgYml0c3RyZWFtLCAodW5zaWduZWQgY2hhcikoKHZhbHVlID4+IGkpICYgMSkpOwotfQotCi1zdGF0aWMgdm9pZCBhZGRCaXRzVG9TdHJlYW1SZXZlcnNlZChzaXplX3QqIGJpdHBvaW50ZXIsIHVjdmVjdG9yKiBiaXRzdHJlYW0sIHVuc2lnbmVkIHZhbHVlLCBzaXplX3QgbmJpdHMpIHsKLSAgc2l6ZV90IGk7Ci0gIGZvcihpID0gMDsgaSAhPSBuYml0czsgKytpKSBhZGRCaXRUb1N0cmVhbShiaXRwb2ludGVyLCBiaXRzdHJlYW0sICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gKG5iaXRzIC0gMSAtIGkpKSAmIDEpKTsKLX0KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9FTkNPREVSKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ERUNPREVSCi0KLSNkZWZpbmUgUkVBREJJVChiaXRwb2ludGVyLCBiaXRzdHJlYW0pICgoYml0c3RyZWFtW2JpdHBvaW50ZXIgPj4gM10gPj4gKGJpdHBvaW50ZXIgJiAweDcpKSAmICh1bnNpZ25lZCBjaGFyKTEpCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRCaXRGcm9tU3RyZWFtKHNpemVfdCogYml0cG9pbnRlciwgY29uc3QgdW5zaWduZWQgY2hhciogYml0c3RyZWFtKSB7Ci0gIHVuc2lnbmVkIGNoYXIgcmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIpKFJFQURCSVQoKmJpdHBvaW50ZXIsIGJpdHN0cmVhbSkpOwotICArKygqYml0cG9pbnRlcik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCByZWFkQml0c0Zyb21TdHJlYW0oc2l6ZV90KiBiaXRwb2ludGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBiaXRzdHJlYW0sIHNpemVfdCBuYml0cykgewotICB1bnNpZ25lZCByZXN1bHQgPSAwLCBpOwotICBmb3IoaSA9IDA7IGkgIT0gbmJpdHM7ICsraSkgewotICAgIHJlc3VsdCArPSAoKHVuc2lnbmVkKVJFQURCSVQoKmJpdHBvaW50ZXIsIGJpdHN0cmVhbSkpIDw8IGk7Ci0gICAgKysoKmJpdHBvaW50ZXIpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiovCi0KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0vKiAvIERlZmxhdGUgLSBIdWZmbWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAqLwotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotI2RlZmluZSBGSVJTVF9MRU5HVEhfQ09ERV9JTkRFWCAyNTcKLSNkZWZpbmUgTEFTVF9MRU5HVEhfQ09ERV9JTkRFWCAyODUKLS8qMjU2IGxpdGVyYWxzLCB0aGUgZW5kIGNvZGUsIHNvbWUgbGVuZ3RoIGNvZGVzLCBhbmQgMiB1bnVzZWQgY29kZXMqLwotI2RlZmluZSBOVU1fREVGTEFURV9DT0RFX1NZTUJPTFMgMjg4Ci0vKnRoZSBkaXN0YW5jZSBjb2RlcyBoYXZlIHRoZWlyIG93biBzeW1ib2xzLCAzMCB1c2VkLCAyIHVudXNlZCovCi0jZGVmaW5lIE5VTV9ESVNUQU5DRV9TWU1CT0xTIDMyCi0vKnRoZSBjb2RlIGxlbmd0aCBjb2Rlcy4gMC0xNTogY29kZSBsZW5ndGhzLCAxNjogY29weSBwcmV2aW91cyAzLTYgdGltZXMsIDE3OiAzLTEwIHplcm9zLCAxODogMTEtMTM4IHplcm9zKi8KLSNkZWZpbmUgTlVNX0NPREVfTEVOR1RIX0NPREVTIDE5Ci0KLS8qdGhlIGJhc2UgbGVuZ3RocyByZXByZXNlbnRlZCBieSBjb2RlcyAyNTctMjg1Ki8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBMRU5HVEhCQVNFWzI5XQotICA9IHszLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLCAzNSwgNDMsIDUxLCA1OSwKLSAgICAgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OH07Ci0KLS8qdGhlIGV4dHJhIGJpdHMgdXNlZCBieSBjb2RlcyAyNTctMjg1IChhZGRlZCB0byBiYXNlIGxlbmd0aCkqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIExFTkdUSEVYVFJBWzI5XQotICA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywKLSAgICAgIDQsICA0LCAgNCwgICA0LCAgIDUsICAgNSwgICA1LCAgIDUsICAgMH07Ci0KLS8qdGhlIGJhc2UgYmFja3dhcmRzIGRpc3RhbmNlcyAodGhlIGJpdHMgb2YgZGlzdGFuY2UgY29kZXMgYXBwZWFyIGFmdGVyIGxlbmd0aCBjb2RlcyBhbmQgdXNlIHRoZWlyIG93biBodWZmbWFuIHRyZWUpKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBESVNUQU5DRUJBU0VbMzBdCi0gID0gezEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywgMjU3LCAzODUsIDUxMywKLSAgICAgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LCA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKLQotLyp0aGUgZXh0cmEgYml0cyBvZiBiYWNrd2FyZHMgZGlzdGFuY2VzIChhZGRlZCB0byBiYXNlKSovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgRElTVEFOQ0VFWFRSQVszMF0KLSAgPSB7MCwgMCwgMCwgMCwgMSwgMSwgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICAgNiwgICA2LCAgIDcsICAgNywgICA4LAotICAgICAgIDgsICAgIDksICAgIDksICAgMTAsICAgMTAsICAgMTEsICAgMTEsICAgMTIsICAgIDEyLCAgICAxMywgICAgMTN9OwotCi0vKnRoZSBvcmRlciBpbiB3aGljaCAiY29kZSBsZW5ndGggYWxwaGFiZXQgY29kZSBsZW5ndGhzIiBhcmUgc3RvcmVkLCBvdXQgb2YgdGhpcwotdGhlIGh1ZmZtYW4gdHJlZSBvZiB0aGUgZHluYW1pYyBodWZmbWFuIHRyZWUgbGVuZ3RocyBpcyBnZW5lcmF0ZWQqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIENMQ0xfT1JERVJbTlVNX0NPREVfTEVOR1RIX0NPREVTXQotICA9IHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotLyoKLUh1ZmZtYW4gdHJlZSBzdHJ1Y3QsIGNvbnRhaW5pbmcgbXVsdGlwbGUgcmVwcmVzZW50YXRpb25zIG9mIHRoZSB0cmVlCi0qLwotdHlwZWRlZiBzdHJ1Y3QgSHVmZm1hblRyZWUgewotICB1bnNpZ25lZCogdHJlZTJkOwotICB1bnNpZ25lZCogdHJlZTFkOwotICB1bnNpZ25lZCogbGVuZ3RoczsgLyp0aGUgbGVuZ3RocyBvZiB0aGUgY29kZXMgb2YgdGhlIDFkLXRyZWUqLwotICB1bnNpZ25lZCBtYXhiaXRsZW47IC8qbWF4aW11bSBudW1iZXIgb2YgYml0cyBhIHNpbmdsZSBjb2RlIGNhbiBnZXQqLwotICB1bnNpZ25lZCBudW1jb2RlczsgLypudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgYWxwaGFiZXQgPSBudW1iZXIgb2YgY29kZXMqLwotfSBIdWZmbWFuVHJlZTsKLQotLypmdW5jdGlvbiB1c2VkIGZvciBkZWJ1ZyBwdXJwb3NlcyB0byBkcmF3IHRoZSB0cmVlIGluIGFzY2lpIGFydCB3aXRoIEMrKyovCi0vKgotc3RhdGljIHZvaWQgSHVmZm1hblRyZWVfZHJhdyhIdWZmbWFuVHJlZSogdHJlZSkgewotICBzdGQ6OmNvdXQgPDwgInRyZWUuIGxlbmd0aDogIiA8PCB0cmVlLT5udW1jb2RlcyA8PCAiIG1heGJpdGxlbjogIiA8PCB0cmVlLT5tYXhiaXRsZW4gPDwgc3RkOjplbmRsOwotICBmb3Ioc2l6ZV90IGkgPSAwOyBpICE9IHRyZWUtPnRyZWUxZC5zaXplOyArK2kpIHsKLSAgICBpZih0cmVlLT5sZW5ndGhzLmRhdGFbaV0pCi0gICAgICBzdGQ6OmNvdXQgPDwgaSA8PCAiICIgPDwgdHJlZS0+dHJlZTFkLmRhdGFbaV0gPDwgIiAiIDw8IHRyZWUtPmxlbmd0aHMuZGF0YVtpXSA8PCBzdGQ6OmVuZGw7Ci0gIH0KLSAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKLX0qLwotCi1zdGF0aWMgdm9pZCBIdWZmbWFuVHJlZV9pbml0KEh1ZmZtYW5UcmVlKiB0cmVlKSB7Ci0gIHRyZWUtPnRyZWUyZCA9IDA7Ci0gIHRyZWUtPnRyZWUxZCA9IDA7Ci0gIHRyZWUtPmxlbmd0aHMgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBIdWZmbWFuVHJlZV9jbGVhbnVwKEh1ZmZtYW5UcmVlKiB0cmVlKSB7Ci0gIGxvZGVwbmdfZnJlZSh0cmVlLT50cmVlMmQpOwotICBsb2RlcG5nX2ZyZWUodHJlZS0+dHJlZTFkKTsKLSAgbG9kZXBuZ19mcmVlKHRyZWUtPmxlbmd0aHMpOwotfQotCi0vKnRoZSB0cmVlIHJlcHJlc2VudGF0aW9uIHVzZWQgYnkgdGhlIGRlY29kZXIuIHJldHVybiB2YWx1ZSBpcyBlcnJvciovCi1zdGF0aWMgdW5zaWduZWQgSHVmZm1hblRyZWVfbWFrZTJEVHJlZShIdWZmbWFuVHJlZSogdHJlZSkgewotICB1bnNpZ25lZCBub2RlZmlsbGVkID0gMDsgLyp1cCB0byB3aGljaCBub2RlIGl0IGlzIGZpbGxlZCovCi0gIHVuc2lnbmVkIHRyZWVwb3MgPSAwOyAvKnBvc2l0aW9uIGluIHRoZSB0cmVlICgxIG9mIHRoZSBudW1jb2RlcyBjb2x1bW5zKSovCi0gIHVuc2lnbmVkIG4sIGk7Ci0KLSAgdHJlZS0+dHJlZTJkID0gKHVuc2lnbmVkKilsb2RlcG5nX21hbGxvYyh0cmVlLT5udW1jb2RlcyAqIDIgKiBzaXplb2YodW5zaWduZWQpKTsKLSAgaWYoIXRyZWUtPnRyZWUyZCkgcmV0dXJuIDgzOyAvKmFsbG9jIGZhaWwqLwotCi0gIC8qCi0gIGNvbnZlcnQgdHJlZTFkW10gdG8gdHJlZTJkW11bXS4gSW4gdGhlIDJEIGFycmF5LCBhIHZhbHVlIG9mIDMyNzY3IG1lYW5zCi0gIHVuaW5pdGVkLCBhIHZhbHVlID49IG51bWNvZGVzIGlzIGFuIGFkZHJlc3MgdG8gYW5vdGhlciBiaXQsIGEgdmFsdWUgPCBudW1jb2RlcwotICBpcyBhIGNvZGUuIFRoZSAyIHJvd3MgYXJlIHRoZSAyIHBvc3NpYmxlIGJpdCB2YWx1ZXMgKDAgb3IgMSksIHRoZXJlIGFyZSBhcwotICBtYW55IGNvbHVtbnMgYXMgY29kZXMgLSAxLgotICBBIGdvb2QgaHVmZm1hbiB0cmVlIGhhcyBOICogMiAtIDEgbm9kZXMsIG9mIHdoaWNoIE4gLSAxIGFyZSBpbnRlcm5hbCBub2Rlcy4KLSAgSGVyZSwgdGhlIGludGVybmFsIG5vZGVzIGFyZSBzdG9yZWQgKHdoYXQgdGhlaXIgMCBhbmQgMSBvcHRpb24gcG9pbnQgdG8pLgotICBUaGVyZSBpcyBvbmx5IG1lbW9yeSBmb3Igc3VjaCBnb29kIHRyZWUgY3VycmVudGx5LCBpZiB0aGVyZSBhcmUgbW9yZSBub2RlcwotICAoZHVlIHRvIHRvbyBsb25nIGxlbmd0aCBjb2RlcyksIGVycm9yIDU1IHdpbGwgaGFwcGVuCi0gICovCi0gIGZvcihuID0gMDsgbiA8IHRyZWUtPm51bWNvZGVzICogMjsgKytuKSB7Ci0gICAgdHJlZS0+dHJlZTJkW25dID0gMzI3Njc7IC8qMzI3NjcgaGVyZSBtZWFucyB0aGUgdHJlZTJkIGlzbid0IGZpbGxlZCB0aGVyZSB5ZXQqLwotICB9Ci0KLSAgZm9yKG4gPSAwOyBuIDwgdHJlZS0+bnVtY29kZXM7ICsrbikgLyp0aGUgY29kZXMqLyB7Ci0gICAgZm9yKGkgPSAwOyBpICE9IHRyZWUtPmxlbmd0aHNbbl07ICsraSkgLyp0aGUgYml0cyBmb3IgdGhpcyBjb2RlKi8gewotICAgICAgdW5zaWduZWQgY2hhciBiaXQgPSAodW5zaWduZWQgY2hhcikoKHRyZWUtPnRyZWUxZFtuXSA+PiAodHJlZS0+bGVuZ3Roc1tuXSAtIGkgLSAxKSkgJiAxKTsKLSAgICAgIC8qb3ZlcnN1YnNjcmliZWQsIHNlZSBjb21tZW50IGluIGxvZGVwbmdfZXJyb3JfdGV4dCovCi0gICAgICBpZih0cmVlcG9zID4gMjE0NzQ4MzY0NyB8fCB0cmVlcG9zICsgMiA+IHRyZWUtPm51bWNvZGVzKSByZXR1cm4gNTU7Ci0gICAgICBpZih0cmVlLT50cmVlMmRbMiAqIHRyZWVwb3MgKyBiaXRdID09IDMyNzY3KSAvKm5vdCB5ZXQgZmlsbGVkIGluKi8gewotICAgICAgICBpZihpICsgMSA9PSB0cmVlLT5sZW5ndGhzW25dKSAvKmxhc3QgYml0Ki8gewotICAgICAgICAgIHRyZWUtPnRyZWUyZFsyICogdHJlZXBvcyArIGJpdF0gPSBuOyAvKnB1dCB0aGUgY3VycmVudCBjb2RlIGluIGl0Ki8KLSAgICAgICAgICB0cmVlcG9zID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKnB1dCBhZGRyZXNzIG9mIHRoZSBuZXh0IHN0ZXAgaW4gaGVyZSwgZmlyc3QgdGhhdCBhZGRyZXNzIGhhcyB0byBiZSBmb3VuZCBvZiBjb3Vyc2UKLSAgICAgICAgICAoaXQncyBqdXN0IG5vZGVmaWxsZWQgKyAxKS4uLiovCi0gICAgICAgICAgKytub2RlZmlsbGVkOwotICAgICAgICAgIC8qYWRkcmVzc2VzIGVuY29kZWQgd2l0aCBudW1jb2RlcyBhZGRlZCB0byBpdCovCi0gICAgICAgICAgdHJlZS0+dHJlZTJkWzIgKiB0cmVlcG9zICsgYml0XSA9IG5vZGVmaWxsZWQgKyB0cmVlLT5udW1jb2RlczsKLSAgICAgICAgICB0cmVlcG9zID0gbm9kZWZpbGxlZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB0cmVlcG9zID0gdHJlZS0+dHJlZTJkWzIgKiB0cmVlcG9zICsgYml0XSAtIHRyZWUtPm51bWNvZGVzOwotICAgIH0KLSAgfQotCi0gIGZvcihuID0gMDsgbiA8IHRyZWUtPm51bWNvZGVzICogMjsgKytuKSB7Ci0gICAgaWYodHJlZS0+dHJlZTJkW25dID09IDMyNzY3KSB0cmVlLT50cmVlMmRbbl0gPSAwOyAvKnJlbW92ZSBwb3NzaWJsZSByZW1haW5pbmcgMzI3NjcncyovCi0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyoKLVNlY29uZCBzdGVwIGZvciB0aGUgLi4ubWFrZUZyb21MZW5ndGhzIGFuZCAuLi5tYWtlRnJvbUZyZXF1ZW5jaWVzIGZ1bmN0aW9ucy4KLW51bWNvZGVzLCBsZW5ndGhzIGFuZCBtYXhiaXRsZW4gbXVzdCBhbHJlYWR5IGJlIGZpbGxlZCBpbiBjb3JyZWN0bHkuIHJldHVybgotdmFsdWUgaXMgZXJyb3IuCi0qLwotc3RhdGljIHVuc2lnbmVkIEh1ZmZtYW5UcmVlX21ha2VGcm9tTGVuZ3RoczIoSHVmZm1hblRyZWUqIHRyZWUpIHsKLSAgdWl2ZWN0b3IgYmxjb3VudDsKLSAgdWl2ZWN0b3IgbmV4dGNvZGU7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgdW5zaWduZWQgYml0cywgbjsKLQotICB1aXZlY3Rvcl9pbml0KCZibGNvdW50KTsKLSAgdWl2ZWN0b3JfaW5pdCgmbmV4dGNvZGUpOwotCi0gIHRyZWUtPnRyZWUxZCA9ICh1bnNpZ25lZCopbG9kZXBuZ19tYWxsb2ModHJlZS0+bnVtY29kZXMgKiBzaXplb2YodW5zaWduZWQpKTsKLSAgaWYoIXRyZWUtPnRyZWUxZCkgZXJyb3IgPSA4MzsgLyphbGxvYyBmYWlsKi8KLQotICBpZighdWl2ZWN0b3JfcmVzaXpldigmYmxjb3VudCwgdHJlZS0+bWF4Yml0bGVuICsgMSwgMCkKLSAgfHwgIXVpdmVjdG9yX3Jlc2l6ZXYoJm5leHRjb2RlLCB0cmVlLT5tYXhiaXRsZW4gKyAxLCAwKSkKLSAgICBlcnJvciA9IDgzOyAvKmFsbG9jIGZhaWwqLwotCi0gIGlmKCFlcnJvcikgewotICAgIC8qc3RlcCAxOiBjb3VudCBudW1iZXIgb2YgaW5zdGFuY2VzIG9mIGVhY2ggY29kZSBsZW5ndGgqLwotICAgIGZvcihiaXRzID0gMDsgYml0cyAhPSB0cmVlLT5udW1jb2RlczsgKytiaXRzKSArK2JsY291bnQuZGF0YVt0cmVlLT5sZW5ndGhzW2JpdHNdXTsKLSAgICAvKnN0ZXAgMjogZ2VuZXJhdGUgdGhlIG5leHRjb2RlIHZhbHVlcyovCi0gICAgZm9yKGJpdHMgPSAxOyBiaXRzIDw9IHRyZWUtPm1heGJpdGxlbjsgKytiaXRzKSB7Ci0gICAgICBuZXh0Y29kZS5kYXRhW2JpdHNdID0gKG5leHRjb2RlLmRhdGFbYml0cyAtIDFdICsgYmxjb3VudC5kYXRhW2JpdHMgLSAxXSkgPDwgMTsKLSAgICB9Ci0gICAgLypzdGVwIDM6IGdlbmVyYXRlIGFsbCB0aGUgY29kZXMqLwotICAgIGZvcihuID0gMDsgbiAhPSB0cmVlLT5udW1jb2RlczsgKytuKSB7Ci0gICAgICBpZih0cmVlLT5sZW5ndGhzW25dICE9IDApIHRyZWUtPnRyZWUxZFtuXSA9IG5leHRjb2RlLmRhdGFbdHJlZS0+bGVuZ3Roc1tuXV0rKzsKLSAgICB9Ci0gIH0KLQotICB1aXZlY3Rvcl9jbGVhbnVwKCZibGNvdW50KTsKLSAgdWl2ZWN0b3JfY2xlYW51cCgmbmV4dGNvZGUpOwotCi0gIGlmKCFlcnJvcikgcmV0dXJuIEh1ZmZtYW5UcmVlX21ha2UyRFRyZWUodHJlZSk7Ci0gIGVsc2UgcmV0dXJuIGVycm9yOwotfQotCi0vKgotZ2l2ZW4gdGhlIGNvZGUgbGVuZ3RocyAoYXMgc3RvcmVkIGluIHRoZSBQTkcgZmlsZSksIGdlbmVyYXRlIHRoZSB0cmVlIGFzIGRlZmluZWQKLWJ5IERlZmxhdGUuIG1heGJpdGxlbiBpcyB0aGUgbWF4aW11bSBiaXRzIHRoYXQgYSBjb2RlIGluIHRoZSB0cmVlIGNhbiBoYXZlLgotcmV0dXJuIHZhbHVlIGlzIGVycm9yLgotKi8KLXN0YXRpYyB1bnNpZ25lZCBIdWZmbWFuVHJlZV9tYWtlRnJvbUxlbmd0aHMoSHVmZm1hblRyZWUqIHRyZWUsIGNvbnN0IHVuc2lnbmVkKiBiaXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1jb2RlcywgdW5zaWduZWQgbWF4Yml0bGVuKSB7Ci0gIHVuc2lnbmVkIGk7Ci0gIHRyZWUtPmxlbmd0aHMgPSAodW5zaWduZWQqKWxvZGVwbmdfbWFsbG9jKG51bWNvZGVzICogc2l6ZW9mKHVuc2lnbmVkKSk7Ci0gIGlmKCF0cmVlLT5sZW5ndGhzKSByZXR1cm4gODM7IC8qYWxsb2MgZmFpbCovCi0gIGZvcihpID0gMDsgaSAhPSBudW1jb2RlczsgKytpKSB0cmVlLT5sZW5ndGhzW2ldID0gYml0bGVuW2ldOwotICB0cmVlLT5udW1jb2RlcyA9ICh1bnNpZ25lZCludW1jb2RlczsgLypudW1iZXIgb2Ygc3ltYm9scyovCi0gIHRyZWUtPm1heGJpdGxlbiA9IG1heGJpdGxlbjsKLSAgcmV0dXJuIEh1ZmZtYW5UcmVlX21ha2VGcm9tTGVuZ3RoczIodHJlZSk7Ci19Ci0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUgotCi0vKkJQTTogQm91bmRhcnkgUGFja2FnZSBNZXJnZSwgc2VlICJBIEZhc3QgYW5kIFNwYWNlLUVjb25vbWljYWwgQWxnb3JpdGhtIGZvciBMZW5ndGgtTGltaXRlZCBDb2RpbmciLAotSnlya2kgS2F0YWphaW5lbiwgQWxpc3RhaXIgTW9mZmF0LCBBbmRyZXcgVHVycGluLCAxOTk1LiovCi0KLS8qY2hhaW4gbm9kZSBmb3IgYm91bmRhcnkgcGFja2FnZSBtZXJnZSovCi10eXBlZGVmIHN0cnVjdCBCUE1Ob2RlIHsKLSAgaW50IHdlaWdodDsgLyp0aGUgc3VtIG9mIGFsbCB3ZWlnaHRzIGluIHRoaXMgY2hhaW4qLwotICB1bnNpZ25lZCBpbmRleDsgLyppbmRleCBvZiB0aGlzIGxlYWYgbm9kZSAoY2FsbGVkICJjb3VudCIgaW4gdGhlIHBhcGVyKSovCi0gIHN0cnVjdCBCUE1Ob2RlKiB0YWlsOyAvKnRoZSBuZXh0IG5vZGVzIGluIHRoaXMgY2hhaW4gKG51bGwgaWYgbGFzdCkqLwotICBpbnQgaW5fdXNlOwotfSBCUE1Ob2RlOwotCi0vKmxpc3RzIG9mIGNoYWlucyovCi10eXBlZGVmIHN0cnVjdCBCUE1MaXN0cyB7Ci0gIC8qbWVtb3J5IHBvb2wqLwotICB1bnNpZ25lZCBtZW1zaXplOwotICBCUE1Ob2RlKiBtZW1vcnk7Ci0gIHVuc2lnbmVkIG51bWZyZWU7Ci0gIHVuc2lnbmVkIG5leHRmcmVlOwotICBCUE1Ob2RlKiogZnJlZWxpc3Q7Ci0gIC8qdHdvIGhlYWRzIG9mIGxvb2thaGVhZCBjaGFpbnMgcGVyIGxpc3QqLwotICB1bnNpZ25lZCBsaXN0c2l6ZTsKLSAgQlBNTm9kZSoqIGNoYWluczA7Ci0gIEJQTU5vZGUqKiBjaGFpbnMxOwotfSBCUE1MaXN0czsKLQotLypjcmVhdGVzIGEgbmV3IGNoYWluIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycywgZnJvbSB0aGUgbWVtb3J5IGluIHRoZSBsaXN0cyAqLwotc3RhdGljIEJQTU5vZGUqIGJwbW5vZGVfY3JlYXRlKEJQTUxpc3RzKiBsaXN0cywgaW50IHdlaWdodCwgdW5zaWduZWQgaW5kZXgsIEJQTU5vZGUqIHRhaWwpIHsKLSAgdW5zaWduZWQgaTsKLSAgQlBNTm9kZSogcmVzdWx0OwotCi0gIC8qbWVtb3J5IGZ1bGwsIHNvIGdhcmJhZ2UgY29sbGVjdCovCi0gIGlmKGxpc3RzLT5uZXh0ZnJlZSA+PSBsaXN0cy0+bnVtZnJlZSkgewotICAgIC8qbWFyayBvbmx5IHRob3NlIHRoYXQgYXJlIGluIHVzZSovCi0gICAgZm9yKGkgPSAwOyBpICE9IGxpc3RzLT5tZW1zaXplOyArK2kpIGxpc3RzLT5tZW1vcnlbaV0uaW5fdXNlID0gMDsKLSAgICBmb3IoaSA9IDA7IGkgIT0gbGlzdHMtPmxpc3RzaXplOyArK2kpIHsKLSAgICAgIEJQTU5vZGUqIG5vZGU7Ci0gICAgICBmb3Iobm9kZSA9IGxpc3RzLT5jaGFpbnMwW2ldOyBub2RlICE9IDA7IG5vZGUgPSBub2RlLT50YWlsKSBub2RlLT5pbl91c2UgPSAxOwotICAgICAgZm9yKG5vZGUgPSBsaXN0cy0+Y2hhaW5zMVtpXTsgbm9kZSAhPSAwOyBub2RlID0gbm9kZS0+dGFpbCkgbm9kZS0+aW5fdXNlID0gMTsKLSAgICB9Ci0gICAgLypjb2xsZWN0IHRob3NlIHRoYXQgYXJlIGZyZWUqLwotICAgIGxpc3RzLT5udW1mcmVlID0gMDsKLSAgICBmb3IoaSA9IDA7IGkgIT0gbGlzdHMtPm1lbXNpemU7ICsraSkgewotICAgICAgaWYoIWxpc3RzLT5tZW1vcnlbaV0uaW5fdXNlKSBsaXN0cy0+ZnJlZWxpc3RbbGlzdHMtPm51bWZyZWUrK10gPSAmbGlzdHMtPm1lbW9yeVtpXTsKLSAgICB9Ci0gICAgbGlzdHMtPm5leHRmcmVlID0gMDsKLSAgfQotCi0gIHJlc3VsdCA9IGxpc3RzLT5mcmVlbGlzdFtsaXN0cy0+bmV4dGZyZWUrK107Ci0gIHJlc3VsdC0+d2VpZ2h0ID0gd2VpZ2h0OwotICByZXN1bHQtPmluZGV4ID0gaW5kZXg7Ci0gIHJlc3VsdC0+dGFpbCA9IHRhaWw7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qc29ydCB0aGUgbGVhdmVzIHdpdGggc3RhYmxlIG1lcmdlc29ydCovCi1zdGF0aWMgdm9pZCBicG1ub2RlX3NvcnQoQlBNTm9kZSogbGVhdmVzLCBzaXplX3QgbnVtKSB7Ci0gIEJQTU5vZGUqIG1lbSA9IChCUE1Ob2RlKilsb2RlcG5nX21hbGxvYyhzaXplb2YoKmxlYXZlcykgKiBudW0pOwotICBzaXplX3Qgd2lkdGgsIGNvdW50ZXIgPSAwOwotICBmb3Iod2lkdGggPSAxOyB3aWR0aCA8IG51bTsgd2lkdGggKj0gMikgewotICAgIEJQTU5vZGUqIGEgPSAoY291bnRlciAmIDEpID8gbWVtIDogbGVhdmVzOwotICAgIEJQTU5vZGUqIGIgPSAoY291bnRlciAmIDEpID8gbGVhdmVzIDogbWVtOwotICAgIHNpemVfdCBwOwotICAgIGZvcihwID0gMDsgcCA8IG51bTsgcCArPSAyICogd2lkdGgpIHsKLSAgICAgIHNpemVfdCBxID0gKHAgKyB3aWR0aCA+IG51bSkgPyBudW0gOiAocCArIHdpZHRoKTsKLSAgICAgIHNpemVfdCByID0gKHAgKyAyICogd2lkdGggPiBudW0pID8gbnVtIDogKHAgKyAyICogd2lkdGgpOwotICAgICAgc2l6ZV90IGkgPSBwLCBqID0gcSwgazsKLSAgICAgIGZvcihrID0gcDsgayA8IHI7IGsrKykgewotICAgICAgICBpZihpIDwgcSAmJiAoaiA+PSByIHx8IGFbaV0ud2VpZ2h0IDw9IGFbal0ud2VpZ2h0KSkgYltrXSA9IGFbaSsrXTsKLSAgICAgICAgZWxzZSBiW2tdID0gYVtqKytdOwotICAgICAgfQotICAgIH0KLSAgICBjb3VudGVyKys7Ci0gIH0KLSAgaWYoY291bnRlciAmIDEpIG1lbWNweShsZWF2ZXMsIG1lbSwgc2l6ZW9mKCpsZWF2ZXMpICogbnVtKTsKLSAgbG9kZXBuZ19mcmVlKG1lbSk7Ci19Ci0KLS8qQm91bmRhcnkgUGFja2FnZSBNZXJnZSBzdGVwLCBudW1wcmVzZW50IGlzIHRoZSBhbW91bnQgb2YgbGVhdmVzLCBhbmQgYyBpcyB0aGUgY3VycmVudCBjaGFpbi4qLwotc3RhdGljIHZvaWQgYm91bmRhcnlQTShCUE1MaXN0cyogbGlzdHMsIEJQTU5vZGUqIGxlYXZlcywgc2l6ZV90IG51bXByZXNlbnQsIGludCBjLCBpbnQgbnVtKSB7Ci0gIHVuc2lnbmVkIGxhc3RpbmRleCA9IGxpc3RzLT5jaGFpbnMxW2NdLT5pbmRleDsKLQotICBpZihjID09IDApIHsKLSAgICBpZihsYXN0aW5kZXggPj0gbnVtcHJlc2VudCkgcmV0dXJuOwotICAgIGxpc3RzLT5jaGFpbnMwW2NdID0gbGlzdHMtPmNoYWluczFbY107Ci0gICAgbGlzdHMtPmNoYWluczFbY10gPSBicG1ub2RlX2NyZWF0ZShsaXN0cywgbGVhdmVzW2xhc3RpbmRleF0ud2VpZ2h0LCBsYXN0aW5kZXggKyAxLCAwKTsKLSAgfSBlbHNlIHsKLSAgICAvKnN1bSBvZiB0aGUgd2VpZ2h0cyBvZiB0aGUgaGVhZCBub2RlcyBvZiB0aGUgcHJldmlvdXMgbG9va2FoZWFkIGNoYWlucy4qLwotICAgIGludCBzdW0gPSBsaXN0cy0+Y2hhaW5zMFtjIC0gMV0tPndlaWdodCArIGxpc3RzLT5jaGFpbnMxW2MgLSAxXS0+d2VpZ2h0OwotICAgIGxpc3RzLT5jaGFpbnMwW2NdID0gbGlzdHMtPmNoYWluczFbY107Ci0gICAgaWYobGFzdGluZGV4IDwgbnVtcHJlc2VudCAmJiBzdW0gPiBsZWF2ZXNbbGFzdGluZGV4XS53ZWlnaHQpIHsKLSAgICAgIGxpc3RzLT5jaGFpbnMxW2NdID0gYnBtbm9kZV9jcmVhdGUobGlzdHMsIGxlYXZlc1tsYXN0aW5kZXhdLndlaWdodCwgbGFzdGluZGV4ICsgMSwgbGlzdHMtPmNoYWluczFbY10tPnRhaWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsaXN0cy0+Y2hhaW5zMVtjXSA9IGJwbW5vZGVfY3JlYXRlKGxpc3RzLCBzdW0sIGxhc3RpbmRleCwgbGlzdHMtPmNoYWluczFbYyAtIDFdKTsKLSAgICAvKmluIHRoZSBlbmQgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgY2hhaW4gb2YgdGhlIGxhc3QgbGlzdCwgc28gbm8KLSAgICBuZWVkIHRvIHJlY3Vyc2UgaWYgd2UncmUgYXQgdGhlIGxhc3Qgb25lICh0aGlzIGdpdmVzIG1lYXN1cmFibGUgc3BlZWR1cCkqLwotICAgIGlmKG51bSArIDEgPCAoaW50KSgyICogbnVtcHJlc2VudCAtIDIpKSB7Ci0gICAgICBib3VuZGFyeVBNKGxpc3RzLCBsZWF2ZXMsIG51bXByZXNlbnQsIGMgLSAxLCBudW0pOwotICAgICAgYm91bmRhcnlQTShsaXN0cywgbGVhdmVzLCBudW1wcmVzZW50LCBjIC0gMSwgbnVtKTsKLSAgICB9Ci0gIH0KLX0KLQotdW5zaWduZWQgbG9kZXBuZ19odWZmbWFuX2NvZGVfbGVuZ3Rocyh1bnNpZ25lZCogbGVuZ3RocywgY29uc3QgdW5zaWduZWQqIGZyZXF1ZW5jaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtY29kZXMsIHVuc2lnbmVkIG1heGJpdGxlbikgewotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0gIHVuc2lnbmVkIGk7Ci0gIHNpemVfdCBudW1wcmVzZW50ID0gMDsgLypudW1iZXIgb2Ygc3ltYm9scyB3aXRoIG5vbi16ZXJvIGZyZXF1ZW5jeSovCi0gIEJQTU5vZGUqIGxlYXZlczsgLyp0aGUgc3ltYm9scywgb25seSB0aG9zZSB3aXRoID4gMCBmcmVxdWVuY3kqLwotCi0gIGlmKG51bWNvZGVzID09IDApIHJldHVybiA4MDsgLyplcnJvcjogYSB0cmVlIG9mIDAgc3ltYm9scyBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgbWFkZSovCi0gIGlmKCgxdSA8PCBtYXhiaXRsZW4pIDwgKHVuc2lnbmVkKW51bWNvZGVzKSByZXR1cm4gODA7IC8qZXJyb3I6IHJlcHJlc2VudCBhbGwgc3ltYm9scyovCi0KLSAgbGVhdmVzID0gKEJQTU5vZGUqKWxvZGVwbmdfbWFsbG9jKG51bWNvZGVzICogc2l6ZW9mKCpsZWF2ZXMpKTsKLSAgaWYoIWxlYXZlcykgcmV0dXJuIDgzOyAvKmFsbG9jIGZhaWwqLwotCi0gIGZvcihpID0gMDsgaSAhPSBudW1jb2RlczsgKytpKSB7Ci0gICAgaWYoZnJlcXVlbmNpZXNbaV0gPiAwKSB7Ci0gICAgICBsZWF2ZXNbbnVtcHJlc2VudF0ud2VpZ2h0ID0gKGludClmcmVxdWVuY2llc1tpXTsKLSAgICAgIGxlYXZlc1tudW1wcmVzZW50XS5pbmRleCA9IGk7Ci0gICAgICArK251bXByZXNlbnQ7Ci0gICAgfQotICB9Ci0KLSAgZm9yKGkgPSAwOyBpICE9IG51bWNvZGVzOyArK2kpIGxlbmd0aHNbaV0gPSAwOwotCi0gIC8qZW5zdXJlIGF0IGxlYXN0IHR3byBwcmVzZW50IHN5bWJvbHMuIFRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgc3ltYm9sCi0gIGFjY29yZGluZyB0byBSRkMgMTk1MSBzZWN0aW9uIDMuMi43LiBTb21lIGRlY29kZXJzIGluY29ycmVjdGx5IHJlcXVpcmUgdHdvLiBUbwotICBtYWtlIHRoZXNlIHdvcmsgYXMgd2VsbCBlbnN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBzeW1ib2xzLiBUaGUKLSAgUGFja2FnZS1NZXJnZSBjb2RlIGJlbG93IGFsc28gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBpZiB0aGVyZSdzIG9ubHkgb25lCi0gIHN5bWJvbCwgaXQnZCBnaXZlIGl0IHRoZSB0aGVvcml0aWNhbCAwIGJpdHMgYnV0IGluIHByYWN0aWNlIHpsaWIgd2FudHMgMSBiaXQqLwotICBpZihudW1wcmVzZW50ID09IDApIHsKLSAgICBsZW5ndGhzWzBdID0gbGVuZ3Roc1sxXSA9IDE7IC8qbm90ZSB0aGF0IGZvciBSRkMgMTk1MSBzZWN0aW9uIDMuMi43LCBvbmx5IGxlbmd0aHNbMF0gPSAxIGlzIG5lZWRlZCovCi0gIH0gZWxzZSBpZihudW1wcmVzZW50ID09IDEpIHsKLSAgICBsZW5ndGhzW2xlYXZlc1swXS5pbmRleF0gPSAxOwotICAgIGxlbmd0aHNbbGVhdmVzWzBdLmluZGV4ID09IDAgPyAxIDogMF0gPSAxOwotICB9IGVsc2UgewotICAgIEJQTUxpc3RzIGxpc3RzOwotICAgIEJQTU5vZGUqIG5vZGU7Ci0KLSAgICBicG1ub2RlX3NvcnQobGVhdmVzLCBudW1wcmVzZW50KTsKLQotICAgIGxpc3RzLmxpc3RzaXplID0gbWF4Yml0bGVuOwotICAgIGxpc3RzLm1lbXNpemUgPSAyICogbWF4Yml0bGVuICogKG1heGJpdGxlbiArIDEpOwotICAgIGxpc3RzLm5leHRmcmVlID0gMDsKLSAgICBsaXN0cy5udW1mcmVlID0gbGlzdHMubWVtc2l6ZTsKLSAgICBsaXN0cy5tZW1vcnkgPSAoQlBNTm9kZSopbG9kZXBuZ19tYWxsb2MobGlzdHMubWVtc2l6ZSAqIHNpemVvZigqbGlzdHMubWVtb3J5KSk7Ci0gICAgbGlzdHMuZnJlZWxpc3QgPSAoQlBNTm9kZSoqKWxvZGVwbmdfbWFsbG9jKGxpc3RzLm1lbXNpemUgKiBzaXplb2YoQlBNTm9kZSopKTsKLSAgICBsaXN0cy5jaGFpbnMwID0gKEJQTU5vZGUqKilsb2RlcG5nX21hbGxvYyhsaXN0cy5saXN0c2l6ZSAqIHNpemVvZihCUE1Ob2RlKikpOwotICAgIGxpc3RzLmNoYWluczEgPSAoQlBNTm9kZSoqKWxvZGVwbmdfbWFsbG9jKGxpc3RzLmxpc3RzaXplICogc2l6ZW9mKEJQTU5vZGUqKSk7Ci0gICAgaWYoIWxpc3RzLm1lbW9yeSB8fCAhbGlzdHMuZnJlZWxpc3QgfHwgIWxpc3RzLmNoYWluczAgfHwgIWxpc3RzLmNoYWluczEpIGVycm9yID0gODM7IC8qYWxsb2MgZmFpbCovCi0KLSAgICBpZighZXJyb3IpIHsKLSAgICAgIGZvcihpID0gMDsgaSAhPSBsaXN0cy5tZW1zaXplOyArK2kpIGxpc3RzLmZyZWVsaXN0W2ldID0gJmxpc3RzLm1lbW9yeVtpXTsKLQotICAgICAgYnBtbm9kZV9jcmVhdGUoJmxpc3RzLCBsZWF2ZXNbMF0ud2VpZ2h0LCAxLCAwKTsKLSAgICAgIGJwbW5vZGVfY3JlYXRlKCZsaXN0cywgbGVhdmVzWzFdLndlaWdodCwgMiwgMCk7Ci0KLSAgICAgIGZvcihpID0gMDsgaSAhPSBsaXN0cy5saXN0c2l6ZTsgKytpKSB7Ci0gICAgICAgIGxpc3RzLmNoYWluczBbaV0gPSAmbGlzdHMubWVtb3J5WzBdOwotICAgICAgICBsaXN0cy5jaGFpbnMxW2ldID0gJmxpc3RzLm1lbW9yeVsxXTsKLSAgICAgIH0KLQotICAgICAgLyplYWNoIGJvdW5kYXJ5UE0gY2FsbCBhZGRzIG9uZSBjaGFpbiB0byB0aGUgbGFzdCBsaXN0LCBhbmQgd2UgbmVlZCAyICogbnVtcHJlc2VudCAtIDIgY2hhaW5zLiovCi0gICAgICBmb3IoaSA9IDI7IGkgIT0gMiAqIG51bXByZXNlbnQgLSAyOyArK2kpIGJvdW5kYXJ5UE0oJmxpc3RzLCBsZWF2ZXMsIG51bXByZXNlbnQsIChpbnQpbWF4Yml0bGVuIC0gMSwgKGludClpKTsKLQotICAgICAgZm9yKG5vZGUgPSBsaXN0cy5jaGFpbnMxW21heGJpdGxlbiAtIDFdOyBub2RlOyBub2RlID0gbm9kZS0+dGFpbCkgewotICAgICAgICBmb3IoaSA9IDA7IGkgIT0gbm9kZS0+aW5kZXg7ICsraSkgKytsZW5ndGhzW2xlYXZlc1tpXS5pbmRleF07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbG9kZXBuZ19mcmVlKGxpc3RzLm1lbW9yeSk7Ci0gICAgbG9kZXBuZ19mcmVlKGxpc3RzLmZyZWVsaXN0KTsKLSAgICBsb2RlcG5nX2ZyZWUobGlzdHMuY2hhaW5zMCk7Ci0gICAgbG9kZXBuZ19mcmVlKGxpc3RzLmNoYWluczEpOwotICB9Ci0KLSAgbG9kZXBuZ19mcmVlKGxlYXZlcyk7Ci0gIHJldHVybiBlcnJvcjsKLX0KLQotLypDcmVhdGUgdGhlIEh1ZmZtYW4gdHJlZSBnaXZlbiB0aGUgc3ltYm9sIGZyZXF1ZW5jaWVzKi8KLXN0YXRpYyB1bnNpZ25lZCBIdWZmbWFuVHJlZV9tYWtlRnJvbUZyZXF1ZW5jaWVzKEh1ZmZtYW5UcmVlKiB0cmVlLCBjb25zdCB1bnNpZ25lZCogZnJlcXVlbmNpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWluY29kZXMsIHNpemVfdCBudW1jb2RlcywgdW5zaWduZWQgbWF4Yml0bGVuKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgd2hpbGUoIWZyZXF1ZW5jaWVzW251bWNvZGVzIC0gMV0gJiYgbnVtY29kZXMgPiBtaW5jb2RlcykgLS1udW1jb2RlczsgLyp0cmltIHplcm9lcyovCi0gIHRyZWUtPm1heGJpdGxlbiA9IG1heGJpdGxlbjsKLSAgdHJlZS0+bnVtY29kZXMgPSAodW5zaWduZWQpbnVtY29kZXM7IC8qbnVtYmVyIG9mIHN5bWJvbHMqLwotICB0cmVlLT5sZW5ndGhzID0gKHVuc2lnbmVkKilsb2RlcG5nX3JlYWxsb2ModHJlZS0+bGVuZ3RocywgbnVtY29kZXMgKiBzaXplb2YodW5zaWduZWQpKTsKLSAgaWYoIXRyZWUtPmxlbmd0aHMpIHJldHVybiA4MzsgLyphbGxvYyBmYWlsKi8KLSAgLyppbml0aWFsaXplIGFsbCBsZW5ndGhzIHRvIDAqLwotICBtZW1zZXQodHJlZS0+bGVuZ3RocywgMCwgbnVtY29kZXMgKiBzaXplb2YodW5zaWduZWQpKTsKLQotICBlcnJvciA9IGxvZGVwbmdfaHVmZm1hbl9jb2RlX2xlbmd0aHModHJlZS0+bGVuZ3RocywgZnJlcXVlbmNpZXMsIG51bWNvZGVzLCBtYXhiaXRsZW4pOwotICBpZighZXJyb3IpIGVycm9yID0gSHVmZm1hblRyZWVfbWFrZUZyb21MZW5ndGhzMih0cmVlKTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdW5zaWduZWQgSHVmZm1hblRyZWVfZ2V0Q29kZShjb25zdCBIdWZmbWFuVHJlZSogdHJlZSwgdW5zaWduZWQgaW5kZXgpIHsKLSAgcmV0dXJuIHRyZWUtPnRyZWUxZFtpbmRleF07Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBIdWZmbWFuVHJlZV9nZXRMZW5ndGgoY29uc3QgSHVmZm1hblRyZWUqIHRyZWUsIHVuc2lnbmVkIGluZGV4KSB7Ci0gIHJldHVybiB0cmVlLT5sZW5ndGhzW2luZGV4XTsKLX0KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9FTkNPREVSKi8KLQotLypnZXQgdGhlIGxpdGVyYWwgYW5kIGxlbmd0aCBjb2RlIHRyZWUgb2YgYSBkZWZsYXRlZCBibG9jayB3aXRoIGZpeGVkIHRyZWUsIGFzIHBlciB0aGUgZGVmbGF0ZSBzcGVjaWZpY2F0aW9uKi8KLXN0YXRpYyB1bnNpZ25lZCBnZW5lcmF0ZUZpeGVkTGl0TGVuVHJlZShIdWZmbWFuVHJlZSogdHJlZSkgewotICB1bnNpZ25lZCBpLCBlcnJvciA9IDA7Ci0gIHVuc2lnbmVkKiBiaXRsZW4gPSAodW5zaWduZWQqKWxvZGVwbmdfbWFsbG9jKE5VTV9ERUZMQVRFX0NPREVfU1lNQk9MUyAqIHNpemVvZih1bnNpZ25lZCkpOwotICBpZighYml0bGVuKSByZXR1cm4gODM7IC8qYWxsb2MgZmFpbCovCi0KLSAgLyoyODggcG9zc2libGUgY29kZXM6IDAtMjU1PWxpdGVyYWxzLCAyNTY9ZW5kY29kZSwgMjU3LTI4NT1sZW5ndGhjb2RlcywgMjg2LTI4Nz11bnVzZWQqLwotICBmb3IoaSA9ICAgMDsgaSA8PSAxNDM7ICsraSkgYml0bGVuW2ldID0gODsKLSAgZm9yKGkgPSAxNDQ7IGkgPD0gMjU1OyArK2kpIGJpdGxlbltpXSA9IDk7Ci0gIGZvcihpID0gMjU2OyBpIDw9IDI3OTsgKytpKSBiaXRsZW5baV0gPSA3OwotICBmb3IoaSA9IDI4MDsgaSA8PSAyODc7ICsraSkgYml0bGVuW2ldID0gODsKLQotICBlcnJvciA9IEh1ZmZtYW5UcmVlX21ha2VGcm9tTGVuZ3Rocyh0cmVlLCBiaXRsZW4sIE5VTV9ERUZMQVRFX0NPREVfU1lNQk9MUywgMTUpOwotCi0gIGxvZGVwbmdfZnJlZShiaXRsZW4pOwotICByZXR1cm4gZXJyb3I7Ci19Ci0KLS8qZ2V0IHRoZSBkaXN0YW5jZSBjb2RlIHRyZWUgb2YgYSBkZWZsYXRlZCBibG9jayB3aXRoIGZpeGVkIHRyZWUsIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVmbGF0ZSBzcGVjaWZpY2F0aW9uKi8KLXN0YXRpYyB1bnNpZ25lZCBnZW5lcmF0ZUZpeGVkRGlzdGFuY2VUcmVlKEh1ZmZtYW5UcmVlKiB0cmVlKSB7Ci0gIHVuc2lnbmVkIGksIGVycm9yID0gMDsKLSAgdW5zaWduZWQqIGJpdGxlbiA9ICh1bnNpZ25lZCopbG9kZXBuZ19tYWxsb2MoTlVNX0RJU1RBTkNFX1NZTUJPTFMgKiBzaXplb2YodW5zaWduZWQpKTsKLSAgaWYoIWJpdGxlbikgcmV0dXJuIDgzOyAvKmFsbG9jIGZhaWwqLwotCi0gIC8qdGhlcmUgYXJlIDMyIGRpc3RhbmNlIGNvZGVzLCBidXQgMzAtMzEgYXJlIHVudXNlZCovCi0gIGZvcihpID0gMDsgaSAhPSBOVU1fRElTVEFOQ0VfU1lNQk9MUzsgKytpKSBiaXRsZW5baV0gPSA1OwotICBlcnJvciA9IEh1ZmZtYW5UcmVlX21ha2VGcm9tTGVuZ3Rocyh0cmVlLCBiaXRsZW4sIE5VTV9ESVNUQU5DRV9TWU1CT0xTLCAxNSk7Ci0KLSAgbG9kZXBuZ19mcmVlKGJpdGxlbik7Ci0gIHJldHVybiBlcnJvcjsKLX0KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ERUNPREVSCi0KLS8qCi1yZXR1cm5zIHRoZSBjb2RlLCBvciAodW5zaWduZWQpKC0xKSBpZiBlcnJvciBoYXBwZW5lZAotaW5iaXRsZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgY29tcGxldGUgYnVmZmVyLCBpbiBiaXRzIChzbyBpdHMgYnl0ZSBsZW5ndGggdGltZXMgOCkKLSovCi1zdGF0aWMgdW5zaWduZWQgaHVmZm1hbkRlY29kZVN5bWJvbChjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgc2l6ZV90KiBicCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh1ZmZtYW5UcmVlKiBjb2RldHJlZSwgc2l6ZV90IGluYml0bGVuZ3RoKSB7Ci0gIHVuc2lnbmVkIHRyZWVwb3MgPSAwLCBjdDsKLSAgZm9yKDs7KSB7Ci0gICAgaWYoKmJwID49IGluYml0bGVuZ3RoKSByZXR1cm4gKHVuc2lnbmVkKSgtMSk7IC8qZXJyb3I6IGVuZCBvZiBpbnB1dCBtZW1vcnkgcmVhY2hlZCB3aXRob3V0IGVuZGNvZGUqLwotICAgIC8qCi0gICAgZGVjb2RlIHRoZSBzeW1ib2wgZnJvbSB0aGUgdHJlZS4gVGhlICJyZWFkQml0RnJvbVN0cmVhbSIgY29kZSBpcyBpbmxpbmVkIGluCi0gICAgdGhlIGV4cHJlc3Npb24gYmVsb3cgYmVjYXVzZSB0aGlzIGlzIHRoZSBiaWdnZXN0IGJvdHRsZW5lY2sgd2hpbGUgZGVjb2RpbmcKLSAgICAqLwotICAgIGN0ID0gY29kZXRyZWUtPnRyZWUyZFsodHJlZXBvcyA8PCAxKSArIFJFQURCSVQoKmJwLCBpbildOwotICAgICsrKCpicCk7Ci0gICAgaWYoY3QgPCBjb2RldHJlZS0+bnVtY29kZXMpIHJldHVybiBjdDsgLyp0aGUgc3ltYm9sIGlzIGRlY29kZWQsIHJldHVybiBpdCovCi0gICAgZWxzZSB0cmVlcG9zID0gY3QgLSBjb2RldHJlZS0+bnVtY29kZXM7IC8qc3ltYm9sIG5vdCB5ZXQgZGVjb2RlZCwgaW5zdGVhZCBtb3ZlIHRyZWUgcG9zaXRpb24qLwotCi0gICAgaWYodHJlZXBvcyA+PSBjb2RldHJlZS0+bnVtY29kZXMpIHJldHVybiAodW5zaWduZWQpKC0xKTsgLyplcnJvcjogaXQgYXBwZWFyZWQgb3V0c2lkZSB0aGUgY29kZXRyZWUqLwotICB9Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLyBJbmZsYXRvciAoRGVjb21wcmVzc29yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLS8qZ2V0IHRoZSB0cmVlIG9mIGEgZGVmbGF0ZWQgYmxvY2sgd2l0aCBmaXhlZCB0cmVlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGRlZmxhdGUgc3BlY2lmaWNhdGlvbiovCi1zdGF0aWMgdm9pZCBnZXRUcmVlSW5mbGF0ZUZpeGVkKEh1ZmZtYW5UcmVlKiB0cmVlX2xsLCBIdWZmbWFuVHJlZSogdHJlZV9kKSB7Ci0gIC8qVE9ETzogY2hlY2sgZm9yIG91dCBvZiBtZW1vcnkgZXJyb3JzKi8KLSAgZ2VuZXJhdGVGaXhlZExpdExlblRyZWUodHJlZV9sbCk7Ci0gIGdlbmVyYXRlRml4ZWREaXN0YW5jZVRyZWUodHJlZV9kKTsKLX0KLQotLypnZXQgdGhlIHRyZWUgb2YgYSBkZWZsYXRlZCBibG9jayB3aXRoIGR5bmFtaWMgdHJlZSwgdGhlIHRyZWUgaXRzZWxmIGlzIGFsc28gSHVmZm1hbiBjb21wcmVzc2VkIHdpdGggYSBrbm93biB0cmVlKi8KLXN0YXRpYyB1bnNpZ25lZCBnZXRUcmVlSW5mbGF0ZUR5bmFtaWMoSHVmZm1hblRyZWUqIHRyZWVfbGwsIEh1ZmZtYW5UcmVlKiB0cmVlX2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QqIGJwLCBzaXplX3QgaW5sZW5ndGgpIHsKLSAgLyptYWtlIHN1cmUgdGhhdCBsZW5ndGggdmFsdWVzIHRoYXQgYXJlbid0IGZpbGxlZCBpbiB3aWxsIGJlIDAsIG9yIGEgd3JvbmcgdHJlZSB3aWxsIGJlIGdlbmVyYXRlZCovCi0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgdW5zaWduZWQgbiwgSExJVCwgSERJU1QsIEhDTEVOLCBpOwotICBzaXplX3QgaW5iaXRsZW5ndGggPSBpbmxlbmd0aCAqIDg7Ci0KLSAgLypzZWUgY29tbWVudHMgaW4gZGVmbGF0ZUR5bmFtaWMgZm9yIGV4cGxhbmF0aW9uIG9mIHRoZSBjb250ZXh0IGFuZCB0aGVzZSB2YXJpYWJsZXMsIGl0IGlzIGFuYWxvZ291cyovCi0gIHVuc2lnbmVkKiBiaXRsZW5fbGwgPSAwOyAvKmxpdCxsZW4gY29kZSBsZW5ndGhzKi8KLSAgdW5zaWduZWQqIGJpdGxlbl9kID0gMDsgLypkaXN0IGNvZGUgbGVuZ3RocyovCi0gIC8qY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICgiY2xjbCIpLCB0aGUgYml0IGxlbmd0aHMgb2YgdGhlIGh1ZmZtYW4gdHJlZSB1c2VkIHRvIGNvbXByZXNzIGJpdGxlbl9sbCBhbmQgYml0bGVuX2QqLwotICB1bnNpZ25lZCogYml0bGVuX2NsID0gMDsKLSAgSHVmZm1hblRyZWUgdHJlZV9jbDsgLyp0aGUgY29kZSB0cmVlIGZvciBjb2RlIGxlbmd0aCBjb2RlcyAodGhlIGh1ZmZtYW4gdHJlZSBmb3IgY29tcHJlc3NlZCBodWZmbWFuIHRyZWVzKSovCi0KLSAgaWYoKCpicCkgKyAxNCA+IChpbmxlbmd0aCA8PCAzKSkgcmV0dXJuIDQ5OyAvKmVycm9yOiB0aGUgYml0IHBvaW50ZXIgaXMgb3Igd2lsbCBnbyBwYXN0IHRoZSBtZW1vcnkqLwotCi0gIC8qbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICsgMjU3LiBVbmxpa2UgdGhlIHNwZWMsIHRoZSB2YWx1ZSAyNTcgaXMgYWRkZWQgdG8gaXQgaGVyZSBhbHJlYWR5Ki8KLSAgSExJVCA9ICByZWFkQml0c0Zyb21TdHJlYW0oYnAsIGluLCA1KSArIDI1NzsKLSAgLypudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMuIFVubGlrZSB0aGUgc3BlYywgdGhlIHZhbHVlIDEgaXMgYWRkZWQgdG8gaXQgaGVyZSBhbHJlYWR5Ki8KLSAgSERJU1QgPSByZWFkQml0c0Zyb21TdHJlYW0oYnAsIGluLCA1KSArIDE7Ci0gIC8qbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGVzLiBVbmxpa2UgdGhlIHNwZWMsIHRoZSB2YWx1ZSA0IGlzIGFkZGVkIHRvIGl0IGhlcmUgYWxyZWFkeSovCi0gIEhDTEVOID0gcmVhZEJpdHNGcm9tU3RyZWFtKGJwLCBpbiwgNCkgKyA0OwotCi0gIGlmKCgqYnApICsgSENMRU4gKiAzID4gKGlubGVuZ3RoIDw8IDMpKSByZXR1cm4gNTA7IC8qZXJyb3I6IHRoZSBiaXQgcG9pbnRlciBpcyBvciB3aWxsIGdvIHBhc3QgdGhlIG1lbW9yeSovCi0KLSAgSHVmZm1hblRyZWVfaW5pdCgmdHJlZV9jbCk7Ci0KLSAgd2hpbGUoIWVycm9yKSB7Ci0gICAgLypyZWFkIHRoZSBjb2RlIGxlbmd0aCBjb2RlcyBvdXQgb2YgMyAqIChhbW91bnQgb2YgY29kZSBsZW5ndGggY29kZXMpIGJpdHMqLwotCi0gICAgYml0bGVuX2NsID0gKHVuc2lnbmVkKilsb2RlcG5nX21hbGxvYyhOVU1fQ09ERV9MRU5HVEhfQ09ERVMgKiBzaXplb2YodW5zaWduZWQpKTsKLSAgICBpZighYml0bGVuX2NsKSBFUlJPUl9CUkVBSyg4MyAvKmFsbG9jIGZhaWwqLyk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgIT0gTlVNX0NPREVfTEVOR1RIX0NPREVTOyArK2kpIHsKLSAgICAgIGlmKGkgPCBIQ0xFTikgYml0bGVuX2NsW0NMQ0xfT1JERVJbaV1dID0gcmVhZEJpdHNGcm9tU3RyZWFtKGJwLCBpbiwgMyk7Ci0gICAgICBlbHNlIGJpdGxlbl9jbFtDTENMX09SREVSW2ldXSA9IDA7IC8qaWYgbm90LCBpdCBtdXN0IHN0YXkgMCovCi0gICAgfQotCi0gICAgZXJyb3IgPSBIdWZmbWFuVHJlZV9tYWtlRnJvbUxlbmd0aHMoJnRyZWVfY2wsIGJpdGxlbl9jbCwgTlVNX0NPREVfTEVOR1RIX0NPREVTLCA3KTsKLSAgICBpZihlcnJvcikgYnJlYWs7Ci0KLSAgICAvKm5vdyB3ZSBjYW4gdXNlIHRoaXMgdHJlZSB0byByZWFkIHRoZSBsZW5ndGhzIGZvciB0aGUgdHJlZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4qLwotICAgIGJpdGxlbl9sbCA9ICh1bnNpZ25lZCopbG9kZXBuZ19tYWxsb2MoTlVNX0RFRkxBVEVfQ09ERV9TWU1CT0xTICogc2l6ZW9mKHVuc2lnbmVkKSk7Ci0gICAgYml0bGVuX2QgPSAodW5zaWduZWQqKWxvZGVwbmdfbWFsbG9jKE5VTV9ESVNUQU5DRV9TWU1CT0xTICogc2l6ZW9mKHVuc2lnbmVkKSk7Ci0gICAgaWYoIWJpdGxlbl9sbCB8fCAhYml0bGVuX2QpIEVSUk9SX0JSRUFLKDgzIC8qYWxsb2MgZmFpbCovKTsKLSAgICBmb3IoaSA9IDA7IGkgIT0gTlVNX0RFRkxBVEVfQ09ERV9TWU1CT0xTOyArK2kpIGJpdGxlbl9sbFtpXSA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpICE9IE5VTV9ESVNUQU5DRV9TWU1CT0xTOyArK2kpIGJpdGxlbl9kW2ldID0gMDsKLQotICAgIC8qaSBpcyB0aGUgY3VycmVudCBzeW1ib2wgd2UncmUgcmVhZGluZyBpbiB0aGUgcGFydCB0aGF0IGNvbnRhaW5zIHRoZSBjb2RlIGxlbmd0aHMgb2YgbGl0L2xlbiBhbmQgZGlzdCBjb2RlcyovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUoaSA8IEhMSVQgKyBIRElTVCkgewotICAgICAgdW5zaWduZWQgY29kZSA9IGh1ZmZtYW5EZWNvZGVTeW1ib2woaW4sIGJwLCAmdHJlZV9jbCwgaW5iaXRsZW5ndGgpOwotICAgICAgaWYoY29kZSA8PSAxNSkgLyphIGxlbmd0aCBjb2RlKi8gewotICAgICAgICBpZihpIDwgSExJVCkgYml0bGVuX2xsW2ldID0gY29kZTsKLSAgICAgICAgZWxzZSBiaXRsZW5fZFtpIC0gSExJVF0gPSBjb2RlOwotICAgICAgICArK2k7Ci0gICAgICB9IGVsc2UgaWYoY29kZSA9PSAxNikgLypyZXBlYXQgcHJldmlvdXMqLyB7Ci0gICAgICAgIHVuc2lnbmVkIHJlcGxlbmd0aCA9IDM7IC8qcmVhZCBpbiB0aGUgMiBiaXRzIHRoYXQgaW5kaWNhdGUgcmVwZWF0IGxlbmd0aCAoMy02KSovCi0gICAgICAgIHVuc2lnbmVkIHZhbHVlOyAvKnNldCB2YWx1ZSB0byB0aGUgcHJldmlvdXMgY29kZSovCi0KLSAgICAgICAgaWYoaSA9PSAwKSBFUlJPUl9CUkVBSyg1NCk7IC8qY2FuJ3QgcmVwZWF0IHByZXZpb3VzIGlmIGkgaXMgMCovCi0KLSAgICAgICAgaWYoKCpicCArIDIpID4gaW5iaXRsZW5ndGgpIEVSUk9SX0JSRUFLKDUwKTsgLyplcnJvciwgYml0IHBvaW50ZXIganVtcHMgcGFzdCBtZW1vcnkqLwotICAgICAgICByZXBsZW5ndGggKz0gcmVhZEJpdHNGcm9tU3RyZWFtKGJwLCBpbiwgMik7Ci0KLSAgICAgICAgaWYoaSA8IEhMSVQgKyAxKSB2YWx1ZSA9IGJpdGxlbl9sbFtpIC0gMV07Ci0gICAgICAgIGVsc2UgdmFsdWUgPSBiaXRsZW5fZFtpIC0gSExJVCAtIDFdOwotICAgICAgICAvKnJlcGVhdCB0aGlzIHZhbHVlIGluIHRoZSBuZXh0IGxlbmd0aHMqLwotICAgICAgICBmb3IobiA9IDA7IG4gPCByZXBsZW5ndGg7ICsrbikgewotICAgICAgICAgIGlmKGkgPj0gSExJVCArIEhESVNUKSBFUlJPUl9CUkVBSygxMyk7IC8qZXJyb3I6IGkgaXMgbGFyZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBjb2RlcyovCi0gICAgICAgICAgaWYoaSA8IEhMSVQpIGJpdGxlbl9sbFtpXSA9IHZhbHVlOwotICAgICAgICAgIGVsc2UgYml0bGVuX2RbaSAtIEhMSVRdID0gdmFsdWU7Ci0gICAgICAgICAgKytpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYoY29kZSA9PSAxNykgLypyZXBlYXQgIjAiIDMtMTAgdGltZXMqLyB7Ci0gICAgICAgIHVuc2lnbmVkIHJlcGxlbmd0aCA9IDM7IC8qcmVhZCBpbiB0aGUgYml0cyB0aGF0IGluZGljYXRlIHJlcGVhdCBsZW5ndGgqLwotICAgICAgICBpZigoKmJwICsgMykgPiBpbmJpdGxlbmd0aCkgRVJST1JfQlJFQUsoNTApOyAvKmVycm9yLCBiaXQgcG9pbnRlciBqdW1wcyBwYXN0IG1lbW9yeSovCi0gICAgICAgIHJlcGxlbmd0aCArPSByZWFkQml0c0Zyb21TdHJlYW0oYnAsIGluLCAzKTsKLQotICAgICAgICAvKnJlcGVhdCB0aGlzIHZhbHVlIGluIHRoZSBuZXh0IGxlbmd0aHMqLwotICAgICAgICBmb3IobiA9IDA7IG4gPCByZXBsZW5ndGg7ICsrbikgewotICAgICAgICAgIGlmKGkgPj0gSExJVCArIEhESVNUKSBFUlJPUl9CUkVBSygxNCk7IC8qZXJyb3I6IGkgaXMgbGFyZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBjb2RlcyovCi0KLSAgICAgICAgICBpZihpIDwgSExJVCkgYml0bGVuX2xsW2ldID0gMDsKLSAgICAgICAgICBlbHNlIGJpdGxlbl9kW2kgLSBITElUXSA9IDA7Ci0gICAgICAgICAgKytpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYoY29kZSA9PSAxOCkgLypyZXBlYXQgIjAiIDExLTEzOCB0aW1lcyovIHsKLSAgICAgICAgdW5zaWduZWQgcmVwbGVuZ3RoID0gMTE7IC8qcmVhZCBpbiB0aGUgYml0cyB0aGF0IGluZGljYXRlIHJlcGVhdCBsZW5ndGgqLwotICAgICAgICBpZigoKmJwICsgNykgPiBpbmJpdGxlbmd0aCkgRVJST1JfQlJFQUsoNTApOyAvKmVycm9yLCBiaXQgcG9pbnRlciBqdW1wcyBwYXN0IG1lbW9yeSovCi0gICAgICAgIHJlcGxlbmd0aCArPSByZWFkQml0c0Zyb21TdHJlYW0oYnAsIGluLCA3KTsKLQotICAgICAgICAvKnJlcGVhdCB0aGlzIHZhbHVlIGluIHRoZSBuZXh0IGxlbmd0aHMqLwotICAgICAgICBmb3IobiA9IDA7IG4gPCByZXBsZW5ndGg7ICsrbikgewotICAgICAgICAgIGlmKGkgPj0gSExJVCArIEhESVNUKSBFUlJPUl9CUkVBSygxNSk7IC8qZXJyb3I6IGkgaXMgbGFyZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBjb2RlcyovCi0KLSAgICAgICAgICBpZihpIDwgSExJVCkgYml0bGVuX2xsW2ldID0gMDsKLSAgICAgICAgICBlbHNlIGJpdGxlbl9kW2kgLSBITElUXSA9IDA7Ci0gICAgICAgICAgKytpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgLyppZihjb2RlID09ICh1bnNpZ25lZCkoLTEpKSovIC8qaHVmZm1hbkRlY29kZVN5bWJvbCByZXR1cm5zICh1bnNpZ25lZCkoLTEpIGluIGNhc2Ugb2YgZXJyb3IqLyB7Ci0gICAgICAgIGlmKGNvZGUgPT0gKHVuc2lnbmVkKSgtMSkpIHsKLSAgICAgICAgICAvKnJldHVybiBlcnJvciBjb2RlIDEwIG9yIDExIGRlcGVuZGluZyBvbiB0aGUgc2l0dWF0aW9uIHRoYXQgaGFwcGVuZWQgaW4gaHVmZm1hbkRlY29kZVN5bWJvbAotICAgICAgICAgICgxMD1ubyBlbmRjb2RlLCAxMT13cm9uZyBqdW1wIG91dHNpZGUgb2YgdHJlZSkqLwotICAgICAgICAgIGVycm9yID0gKCpicCkgPiBpbmJpdGxlbmd0aCA/IDEwIDogMTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBlcnJvciA9IDE2OyAvKnVuZXhpc3RpbmcgY29kZSwgdGhpcyBjYW4gbmV2ZXIgaGFwcGVuKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmKGVycm9yKSBicmVhazsKLQotICAgIGlmKGJpdGxlbl9sbFsyNTZdID09IDApIEVSUk9SX0JSRUFLKDY0KTsgLyp0aGUgbGVuZ3RoIG9mIHRoZSBlbmQgY29kZSAyNTYgbXVzdCBiZSBsYXJnZXIgdGhhbiAwKi8KLQotICAgIC8qbm93IHdlJ3ZlIGZpbmFsbHkgZ290IEhMSVQgYW5kIEhESVNULCBzbyBnZW5lcmF0ZSB0aGUgY29kZSB0cmVlcywgYW5kIHRoZSBmdW5jdGlvbiBpcyBkb25lKi8KLSAgICBlcnJvciA9IEh1ZmZtYW5UcmVlX21ha2VGcm9tTGVuZ3Rocyh0cmVlX2xsLCBiaXRsZW5fbGwsIE5VTV9ERUZMQVRFX0NPREVfU1lNQk9MUywgMTUpOwotICAgIGlmKGVycm9yKSBicmVhazsKLSAgICBlcnJvciA9IEh1ZmZtYW5UcmVlX21ha2VGcm9tTGVuZ3Rocyh0cmVlX2QsIGJpdGxlbl9kLCBOVU1fRElTVEFOQ0VfU1lNQk9MUywgMTUpOwotCi0gICAgYnJlYWs7IC8qZW5kIG9mIGVycm9yLXdoaWxlKi8KLSAgfQotCi0gIGxvZGVwbmdfZnJlZShiaXRsZW5fY2wpOwotICBsb2RlcG5nX2ZyZWUoYml0bGVuX2xsKTsKLSAgbG9kZXBuZ19mcmVlKGJpdGxlbl9kKTsKLSAgSHVmZm1hblRyZWVfY2xlYW51cCgmdHJlZV9jbCk7Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0vKmluZmxhdGUgYSBibG9jayB3aXRoIGR5bmFtaWMgb2YgZml4ZWQgSHVmZm1hbiB0cmVlKi8KLXN0YXRpYyB1bnNpZ25lZCBpbmZsYXRlSHVmZm1hbkJsb2NrKHVjdmVjdG9yKiBvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QqIGJwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBwb3MsIHNpemVfdCBpbmxlbmd0aCwgdW5zaWduZWQgYnR5cGUpIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICBIdWZmbWFuVHJlZSB0cmVlX2xsOyAvKnRoZSBodWZmbWFuIHRyZWUgZm9yIGxpdGVyYWwgYW5kIGxlbmd0aCBjb2RlcyovCi0gIEh1ZmZtYW5UcmVlIHRyZWVfZDsgLyp0aGUgaHVmZm1hbiB0cmVlIGZvciBkaXN0YW5jZSBjb2RlcyovCi0gIHNpemVfdCBpbmJpdGxlbmd0aCA9IGlubGVuZ3RoICogODsKLQotICBIdWZmbWFuVHJlZV9pbml0KCZ0cmVlX2xsKTsKLSAgSHVmZm1hblRyZWVfaW5pdCgmdHJlZV9kKTsKLQotICBpZihidHlwZSA9PSAxKSBnZXRUcmVlSW5mbGF0ZUZpeGVkKCZ0cmVlX2xsLCAmdHJlZV9kKTsKLSAgZWxzZSBpZihidHlwZSA9PSAyKSBlcnJvciA9IGdldFRyZWVJbmZsYXRlRHluYW1pYygmdHJlZV9sbCwgJnRyZWVfZCwgaW4sIGJwLCBpbmxlbmd0aCk7Ci0KLSAgd2hpbGUoIWVycm9yKSAvKmRlY29kZSBhbGwgc3ltYm9scyB1bnRpbCBlbmQgcmVhY2hlZCwgYnJlYWtzIGF0IGVuZCBjb2RlKi8gewotICAgIC8qY29kZV9sbCBpcyBsaXRlcmFsLCBsZW5ndGggb3IgZW5kIGNvZGUqLwotICAgIHVuc2lnbmVkIGNvZGVfbGwgPSBodWZmbWFuRGVjb2RlU3ltYm9sKGluLCBicCwgJnRyZWVfbGwsIGluYml0bGVuZ3RoKTsKLSAgICBpZihjb2RlX2xsIDw9IDI1NSkgLypsaXRlcmFsIHN5bWJvbCovIHsKLSAgICAgIC8qdWN2ZWN0b3JfcHVzaF9iYWNrIHdvdWxkIGRvIHRoZSBzYW1lLCBidXQgZm9yIHNvbWUgcmVhc29uIHRoZSB0d28gbGluZXMgYmVsb3cgcnVuIDEwJSBmYXN0ZXIqLwotICAgICAgaWYoIXVjdmVjdG9yX3Jlc2l6ZShvdXQsICgqcG9zKSArIDEpKSBFUlJPUl9CUkVBSyg4MyAvKmFsbG9jIGZhaWwqLyk7Ci0gICAgICBvdXQtPmRhdGFbKnBvc10gPSAodW5zaWduZWQgY2hhciljb2RlX2xsOwotICAgICAgKysoKnBvcyk7Ci0gICAgfSBlbHNlIGlmKGNvZGVfbGwgPj0gRklSU1RfTEVOR1RIX0NPREVfSU5ERVggJiYgY29kZV9sbCA8PSBMQVNUX0xFTkdUSF9DT0RFX0lOREVYKSAvKmxlbmd0aCBjb2RlKi8gewotICAgICAgdW5zaWduZWQgY29kZV9kLCBkaXN0YW5jZTsKLSAgICAgIHVuc2lnbmVkIG51bWV4dHJhYml0c19sLCBudW1leHRyYWJpdHNfZDsgLypleHRyYSBiaXRzIGZvciBsZW5ndGggYW5kIGRpc3RhbmNlKi8KLSAgICAgIHNpemVfdCBzdGFydCwgZm9yd2FyZCwgYmFja3dhcmQsIGxlbmd0aDsKLQotICAgICAgLypwYXJ0IDE6IGdldCBsZW5ndGggYmFzZSovCi0gICAgICBsZW5ndGggPSBMRU5HVEhCQVNFW2NvZGVfbGwgLSBGSVJTVF9MRU5HVEhfQ09ERV9JTkRFWF07Ci0KLSAgICAgIC8qcGFydCAyOiBnZXQgZXh0cmEgYml0cyBhbmQgYWRkIHRoZSB2YWx1ZSBvZiB0aGF0IHRvIGxlbmd0aCovCi0gICAgICBudW1leHRyYWJpdHNfbCA9IExFTkdUSEVYVFJBW2NvZGVfbGwgLSBGSVJTVF9MRU5HVEhfQ09ERV9JTkRFWF07Ci0gICAgICBpZigoKmJwICsgbnVtZXh0cmFiaXRzX2wpID4gaW5iaXRsZW5ndGgpIEVSUk9SX0JSRUFLKDUxKTsgLyplcnJvciwgYml0IHBvaW50ZXIgd2lsbCBqdW1wIHBhc3QgbWVtb3J5Ki8KLSAgICAgIGxlbmd0aCArPSByZWFkQml0c0Zyb21TdHJlYW0oYnAsIGluLCBudW1leHRyYWJpdHNfbCk7Ci0KLSAgICAgIC8qcGFydCAzOiBnZXQgZGlzdGFuY2UgY29kZSovCi0gICAgICBjb2RlX2QgPSBodWZmbWFuRGVjb2RlU3ltYm9sKGluLCBicCwgJnRyZWVfZCwgaW5iaXRsZW5ndGgpOwotICAgICAgaWYoY29kZV9kID4gMjkpIHsKLSAgICAgICAgaWYoY29kZV9kID09ICh1bnNpZ25lZCkoLTEpKSAvKmh1ZmZtYW5EZWNvZGVTeW1ib2wgcmV0dXJucyAodW5zaWduZWQpKC0xKSBpbiBjYXNlIG9mIGVycm9yKi8gewotICAgICAgICAgIC8qcmV0dXJuIGVycm9yIGNvZGUgMTAgb3IgMTEgZGVwZW5kaW5nIG9uIHRoZSBzaXR1YXRpb24gdGhhdCBoYXBwZW5lZCBpbiBodWZmbWFuRGVjb2RlU3ltYm9sCi0gICAgICAgICAgKDEwPW5vIGVuZGNvZGUsIDExPXdyb25nIGp1bXAgb3V0c2lkZSBvZiB0cmVlKSovCi0gICAgICAgICAgZXJyb3IgPSAoKmJwKSA+IGlubGVuZ3RoICogOCA/IDEwIDogMTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBlcnJvciA9IDE4OyAvKmVycm9yOiBpbnZhbGlkIGRpc3RhbmNlIGNvZGUgKDMwLTMxIGFyZSBuZXZlciB1c2VkKSovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGlzdGFuY2UgPSBESVNUQU5DRUJBU0VbY29kZV9kXTsKLQotICAgICAgLypwYXJ0IDQ6IGdldCBleHRyYSBiaXRzIGZyb20gZGlzdGFuY2UqLwotICAgICAgbnVtZXh0cmFiaXRzX2QgPSBESVNUQU5DRUVYVFJBW2NvZGVfZF07Ci0gICAgICBpZigoKmJwICsgbnVtZXh0cmFiaXRzX2QpID4gaW5iaXRsZW5ndGgpIEVSUk9SX0JSRUFLKDUxKTsgLyplcnJvciwgYml0IHBvaW50ZXIgd2lsbCBqdW1wIHBhc3QgbWVtb3J5Ki8KLSAgICAgIGRpc3RhbmNlICs9IHJlYWRCaXRzRnJvbVN0cmVhbShicCwgaW4sIG51bWV4dHJhYml0c19kKTsKLQotICAgICAgLypwYXJ0IDU6IGZpbGwgaW4gYWxsIHRoZSBvdXRbbl0gdmFsdWVzIGJhc2VkIG9uIHRoZSBsZW5ndGggYW5kIGRpc3QqLwotICAgICAgc3RhcnQgPSAoKnBvcyk7Ci0gICAgICBpZihkaXN0YW5jZSA+IHN0YXJ0KSBFUlJPUl9CUkVBSyg1Mik7IC8qdG9vIGxvbmcgYmFja3dhcmQgZGlzdGFuY2UqLwotICAgICAgYmFja3dhcmQgPSBzdGFydCAtIGRpc3RhbmNlOwotCi0gICAgICBpZighdWN2ZWN0b3JfcmVzaXplKG91dCwgKCpwb3MpICsgbGVuZ3RoKSkgRVJST1JfQlJFQUsoODMgLyphbGxvYyBmYWlsKi8pOwotICAgICAgaWYgKGRpc3RhbmNlIDwgbGVuZ3RoKSB7Ci0gICAgICAgIGZvcihmb3J3YXJkID0gMDsgZm9yd2FyZCA8IGxlbmd0aDsgKytmb3J3YXJkKSB7Ci0gICAgICAgICAgb3V0LT5kYXRhWygqcG9zKSsrXSA9IG91dC0+ZGF0YVtiYWNrd2FyZCsrXTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWVtY3B5KG91dC0+ZGF0YSArICpwb3MsIG91dC0+ZGF0YSArIGJhY2t3YXJkLCBsZW5ndGgpOwotICAgICAgICAqcG9zICs9IGxlbmd0aDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYoY29kZV9sbCA9PSAyNTYpIHsKLSAgICAgIGJyZWFrOyAvKmVuZCBjb2RlLCBicmVhayB0aGUgbG9vcCovCi0gICAgfSBlbHNlIC8qaWYoY29kZSA9PSAodW5zaWduZWQpKC0xKSkqLyAvKmh1ZmZtYW5EZWNvZGVTeW1ib2wgcmV0dXJucyAodW5zaWduZWQpKC0xKSBpbiBjYXNlIG9mIGVycm9yKi8gewotICAgICAgLypyZXR1cm4gZXJyb3IgY29kZSAxMCBvciAxMSBkZXBlbmRpbmcgb24gdGhlIHNpdHVhdGlvbiB0aGF0IGhhcHBlbmVkIGluIGh1ZmZtYW5EZWNvZGVTeW1ib2wKLSAgICAgICgxMD1ubyBlbmRjb2RlLCAxMT13cm9uZyBqdW1wIG91dHNpZGUgb2YgdHJlZSkqLwotICAgICAgZXJyb3IgPSAoKCpicCkgPiBpbmxlbmd0aCAqIDgpID8gMTAgOiAxMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIEh1ZmZtYW5UcmVlX2NsZWFudXAoJnRyZWVfbGwpOwotICBIdWZmbWFuVHJlZV9jbGVhbnVwKCZ0cmVlX2QpOwotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGluZmxhdGVOb0NvbXByZXNzaW9uKHVjdmVjdG9yKiBvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QqIGJwLCBzaXplX3QqIHBvcywgc2l6ZV90IGlubGVuZ3RoKSB7Ci0gIHNpemVfdCBwOwotICB1bnNpZ25lZCBMRU4sIE5MRU4sIG4sIGVycm9yID0gMDsKLQotICAvKmdvIHRvIGZpcnN0IGJvdW5kYXJ5IG9mIGJ5dGUqLwotICB3aGlsZSgoKCpicCkgJiAweDcpICE9IDApICsrKCpicCk7Ci0gIHAgPSAoKmJwKSAvIDg7IC8qYnl0ZSBwb3NpdGlvbiovCi0KLSAgLypyZWFkIExFTiAoMiBieXRlcykgYW5kIE5MRU4gKDIgYnl0ZXMpKi8KLSAgaWYocCArIDQgPj0gaW5sZW5ndGgpIHJldHVybiA1MjsgLyplcnJvciwgYml0IHBvaW50ZXIgd2lsbCBqdW1wIHBhc3QgbWVtb3J5Ki8KLSAgTEVOID0gaW5bcF0gKyAyNTZ1ICogaW5bcCArIDFdOyBwICs9IDI7Ci0gIE5MRU4gPSBpbltwXSArIDI1NnUgKiBpbltwICsgMV07IHAgKz0gMjsKLQotICAvKmNoZWNrIGlmIDE2LWJpdCBOTEVOIGlzIHJlYWxseSB0aGUgb25lJ3MgY29tcGxlbWVudCBvZiBMRU4qLwotICBpZihMRU4gKyBOTEVOICE9IDY1NTM1KSByZXR1cm4gMjE7IC8qZXJyb3I6IE5MRU4gaXMgbm90IG9uZSdzIGNvbXBsZW1lbnQgb2YgTEVOKi8KLQotICBpZighdWN2ZWN0b3JfcmVzaXplKG91dCwgKCpwb3MpICsgTEVOKSkgcmV0dXJuIDgzOyAvKmFsbG9jIGZhaWwqLwotCi0gIC8qcmVhZCB0aGUgbGl0ZXJhbCBkYXRhOiBMRU4gYnl0ZXMgYXJlIG5vdyBzdG9yZWQgaW4gdGhlIG91dCBidWZmZXIqLwotICBpZihwICsgTEVOID4gaW5sZW5ndGgpIHJldHVybiAyMzsgLyplcnJvcjogcmVhZGluZyBvdXRzaWRlIG9mIGluIGJ1ZmZlciovCi0gIGZvcihuID0gMDsgbiA8IExFTjsgKytuKSBvdXQtPmRhdGFbKCpwb3MpKytdID0gaW5bcCsrXTsKLQotICAoKmJwKSA9IHAgKiA4OwotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvZGVwbmdfaW5mbGF0ZXYodWN2ZWN0b3IqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyogc2V0dGluZ3MpIHsKLSAgLypiaXQgcG9pbnRlciBpbiB0aGUgImluIiBkYXRhLCBjdXJyZW50IGJ5dGUgaXMgYnAgPj4gMywgY3VycmVudCBiaXQgaXMgYnAgJiAweDcgKGZyb20gbHNiIHRvIG1zYiBvZiB0aGUgYnl0ZSkqLwotICBzaXplX3QgYnAgPSAwOwotICB1bnNpZ25lZCBCRklOQUwgPSAwOwotICBzaXplX3QgcG9zID0gMDsgLypieXRlIHBvc2l0aW9uIGluIHRoZSBvdXQgYnVmZmVyKi8KLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotCi0gICh2b2lkKXNldHRpbmdzOwotCi0gIHdoaWxlKCFCRklOQUwpIHsKLSAgICB1bnNpZ25lZCBCVFlQRTsKLSAgICBpZihicCArIDIgPj0gaW5zaXplICogOCkgcmV0dXJuIDUyOyAvKmVycm9yLCBiaXQgcG9pbnRlciB3aWxsIGp1bXAgcGFzdCBtZW1vcnkqLwotICAgIEJGSU5BTCA9IHJlYWRCaXRGcm9tU3RyZWFtKCZicCwgaW4pOwotICAgIEJUWVBFID0gMXUgKiByZWFkQml0RnJvbVN0cmVhbSgmYnAsIGluKTsKLSAgICBCVFlQRSArPSAydSAqIHJlYWRCaXRGcm9tU3RyZWFtKCZicCwgaW4pOwotCi0gICAgaWYoQlRZUEUgPT0gMykgcmV0dXJuIDIwOyAvKmVycm9yOiBpbnZhbGlkIEJUWVBFKi8KLSAgICBlbHNlIGlmKEJUWVBFID09IDApIGVycm9yID0gaW5mbGF0ZU5vQ29tcHJlc3Npb24ob3V0LCBpbiwgJmJwLCAmcG9zLCBpbnNpemUpOyAvKm5vIGNvbXByZXNzaW9uKi8KLSAgICBlbHNlIGVycm9yID0gaW5mbGF0ZUh1ZmZtYW5CbG9jayhvdXQsIGluLCAmYnAsICZwb3MsIGluc2l6ZSwgQlRZUEUpOyAvKmNvbXByZXNzaW9uLCBCVFlQRSAwMSBvciAxMCovCi0KLSAgICBpZihlcnJvcikgcmV0dXJuIGVycm9yOwotICB9Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2luZmxhdGUodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdEZWNvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKSB7Ci0gIHVuc2lnbmVkIGVycm9yOwotICB1Y3ZlY3RvciB2OwotICB1Y3ZlY3Rvcl9pbml0X2J1ZmZlcigmdiwgKm91dCwgKm91dHNpemUpOwotICBlcnJvciA9IGxvZGVwbmdfaW5mbGF0ZXYoJnYsIGluLCBpbnNpemUsIHNldHRpbmdzKTsKLSAgKm91dCA9IHYuZGF0YTsKLSAgKm91dHNpemUgPSB2LnNpemU7Ci0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGluZmxhdGUodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpbnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HRGVjb21wcmVzc1NldHRpbmdzKiBzZXR0aW5ncykgewotICBpZihzZXR0aW5ncy0+Y3VzdG9tX2luZmxhdGUpIHsKLSAgICByZXR1cm4gc2V0dGluZ3MtPmN1c3RvbV9pbmZsYXRlKG91dCwgb3V0c2l6ZSwgaW4sIGluc2l6ZSwgc2V0dGluZ3MpOwotICB9IGVsc2UgewotICAgIHJldHVybiBsb2RlcG5nX2luZmxhdGUob3V0LCBvdXRzaXplLCBpbiwgaW5zaXplLCBzZXR0aW5ncyk7Ci0gIH0KLX0KLQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RFQ09ERVIqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0VOQ09ERVIKLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8gRGVmbGF0b3IgKENvbXByZXNzb3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICovCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9TVVBQT1JURURfREVGTEFURV9MRU5HVEggPSAyNTg7Ci0KLS8qYml0bGVuIGlzIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvZGUqLwotc3RhdGljIHZvaWQgYWRkSHVmZm1hblN5bWJvbChzaXplX3QqIGJwLCB1Y3ZlY3RvciogY29tcHJlc3NlZCwgdW5zaWduZWQgY29kZSwgdW5zaWduZWQgYml0bGVuKSB7Ci0gIGFkZEJpdHNUb1N0cmVhbVJldmVyc2VkKGJwLCBjb21wcmVzc2VkLCBjb2RlLCBiaXRsZW4pOwotfQotCi0vKnNlYXJjaCB0aGUgaW5kZXggaW4gdGhlIGFycmF5LCB0aGF0IGhhcyB0aGUgbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLAotZ2l2ZW4gYXJyYXkgbXVzdCBiZSBzb3J0ZWQgKGlmIG5vIHZhbHVlIGlzIHNtYWxsZXIsIGl0IHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGFycmF5KSovCi1zdGF0aWMgc2l6ZV90IHNlYXJjaENvZGVJbmRleChjb25zdCB1bnNpZ25lZCogYXJyYXksIHNpemVfdCBhcnJheV9zaXplLCBzaXplX3QgdmFsdWUpIHsKLSAgLypiaW5hcnkgc2VhcmNoIChvbmx5IHNtYWxsIGdhaW4gb3ZlciBsaW5lYXIpLiBUT0RPOiB1c2UgQ1BVIGxvZzIgaW5zdHJ1Y3Rpb24gZm9yIGdldHRpbmcgc3ltYm9scyBpbnN0ZWFkKi8KLSAgc2l6ZV90IGxlZnQgPSAxOwotICBzaXplX3QgcmlnaHQgPSBhcnJheV9zaXplIC0gMTsKLQotICB3aGlsZShsZWZ0IDw9IHJpZ2h0KSB7Ci0gICAgc2l6ZV90IG1pZCA9IChsZWZ0ICsgcmlnaHQpID4+IDE7Ci0gICAgaWYgKGFycmF5W21pZF0gPj0gdmFsdWUpIHJpZ2h0ID0gbWlkIC0gMTsKLSAgICBlbHNlIGxlZnQgPSBtaWQgKyAxOwotICB9Ci0gIGlmKGxlZnQgPj0gYXJyYXlfc2l6ZSB8fCBhcnJheVtsZWZ0XSA+IHZhbHVlKSBsZWZ0LS07Ci0gIHJldHVybiBsZWZ0OwotfQotCi1zdGF0aWMgdm9pZCBhZGRMZW5ndGhEaXN0YW5jZSh1aXZlY3RvciogdmFsdWVzLCBzaXplX3QgbGVuZ3RoLCBzaXplX3QgZGlzdGFuY2UpIHsKLSAgLyp2YWx1ZXMgaW4gZW5jb2RlZCB2ZWN0b3IgYXJlIHRob3NlIHVzZWQgYnkgZGVmbGF0ZToKLSAgMC0yNTU6IGxpdGVyYWwgYnl0ZXMKLSAgMjU2OiBlbmQKLSAgMjU3LTI4NTogbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgKGxlbmd0aCBjb2RlLCBmb2xsb3dlZCBieSBleHRyYSBsZW5ndGggYml0cywgZGlzdGFuY2UgY29kZSwgZXh0cmEgZGlzdGFuY2UgYml0cykKLSAgMjg2LTI4NzogaW52YWxpZCovCi0KLSAgdW5zaWduZWQgbGVuZ3RoX2NvZGUgPSAodW5zaWduZWQpc2VhcmNoQ29kZUluZGV4KExFTkdUSEJBU0UsIDI5LCBsZW5ndGgpOwotICB1bnNpZ25lZCBleHRyYV9sZW5ndGggPSAodW5zaWduZWQpKGxlbmd0aCAtIExFTkdUSEJBU0VbbGVuZ3RoX2NvZGVdKTsKLSAgdW5zaWduZWQgZGlzdF9jb2RlID0gKHVuc2lnbmVkKXNlYXJjaENvZGVJbmRleChESVNUQU5DRUJBU0UsIDMwLCBkaXN0YW5jZSk7Ci0gIHVuc2lnbmVkIGV4dHJhX2Rpc3RhbmNlID0gKHVuc2lnbmVkKShkaXN0YW5jZSAtIERJU1RBTkNFQkFTRVtkaXN0X2NvZGVdKTsKLQotICB1aXZlY3Rvcl9wdXNoX2JhY2sodmFsdWVzLCBsZW5ndGhfY29kZSArIEZJUlNUX0xFTkdUSF9DT0RFX0lOREVYKTsKLSAgdWl2ZWN0b3JfcHVzaF9iYWNrKHZhbHVlcywgZXh0cmFfbGVuZ3RoKTsKLSAgdWl2ZWN0b3JfcHVzaF9iYWNrKHZhbHVlcywgZGlzdF9jb2RlKTsKLSAgdWl2ZWN0b3JfcHVzaF9iYWNrKHZhbHVlcywgZXh0cmFfZGlzdGFuY2UpOwotfQotCi0vKjMgYnl0ZXMgb2YgZGF0YSBnZXQgZW5jb2RlZCBpbnRvIHR3byBieXRlcy4gVGhlIGhhc2ggY2Fubm90IHVzZSBtb3JlIHRoYW4gMwotYnl0ZXMgYXMgaW5wdXQgYmVjYXVzZSAzIGlzIHRoZSBtaW5pbXVtIG1hdGNoIGxlbmd0aCBmb3IgZGVmbGF0ZSovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgSEFTSF9OVU1fVkFMVUVTID0gNjU1MzY7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgSEFTSF9CSVRfTUFTSyA9IDY1NTM1OyAvKkhBU0hfTlVNX1ZBTFVFUyAtIDEsIGJ1dCBDOTAgZG9lcyBub3QgbGlrZSB0aGF0IGFzIGluaXRpYWxpemVyKi8KLQotdHlwZWRlZiBzdHJ1Y3QgSGFzaCB7Ci0gIGludCogaGVhZDsgLypoYXNoIHZhbHVlIHRvIGhlYWQgY2lyY3VsYXIgcG9zIC0gY2FuIGJlIG91dGRhdGVkIGlmIHdlbnQgYXJvdW5kIHdpbmRvdyovCi0gIC8qY2lyY3VsYXIgcG9zIHRvIHByZXYgY2lyY3VsYXIgcG9zKi8KLSAgdW5zaWduZWQgc2hvcnQqIGNoYWluOwotICBpbnQqIHZhbDsgLypjaXJjdWxhciBwb3MgdG8gaGFzaCB2YWx1ZSovCi0KLSAgLypUT0RPOiBkbyB0aGlzIG5vdCBvbmx5IGZvciB6ZXJvcyBidXQgZm9yIGFueSByZXBlYXRlZCBieXRlLiBIb3dldmVyIGZvciBQTkcKLSAgaXQncyBhbHdheXMgZ29pbmcgdG8gYmUgdGhlIHplcm9zIHRoYXQgZG9taW5hdGUsIHNvIG5vdCBpbXBvcnRhbnQgZm9yIFBORyovCi0gIGludCogaGVhZHo7IC8qc2ltaWxhciB0byBoZWFkLCBidXQgZm9yIGNoYWlueiovCi0gIHVuc2lnbmVkIHNob3J0KiBjaGFpbno7IC8qdGhvc2Ugd2l0aCBzYW1lIGFtb3VudCBvZiB6ZXJvcyovCi0gIHVuc2lnbmVkIHNob3J0KiB6ZXJvczsgLypsZW5ndGggb2YgemVyb3Mgc3RyZWFrLCB1c2VkIGFzIGEgc2Vjb25kIGhhc2ggY2hhaW4qLwotfSBIYXNoOwotCi1zdGF0aWMgdW5zaWduZWQgaGFzaF9pbml0KEhhc2gqIGhhc2gsIHVuc2lnbmVkIHdpbmRvd3NpemUpIHsKLSAgdW5zaWduZWQgaTsKLSAgaGFzaC0+aGVhZCA9IChpbnQqKWxvZGVwbmdfbWFsbG9jKHNpemVvZihpbnQpICogSEFTSF9OVU1fVkFMVUVTKTsKLSAgaGFzaC0+dmFsID0gKGludCopbG9kZXBuZ19tYWxsb2Moc2l6ZW9mKGludCkgKiB3aW5kb3dzaXplKTsKLSAgaGFzaC0+Y2hhaW4gPSAodW5zaWduZWQgc2hvcnQqKWxvZGVwbmdfbWFsbG9jKHNpemVvZih1bnNpZ25lZCBzaG9ydCkgKiB3aW5kb3dzaXplKTsKLQotICBoYXNoLT56ZXJvcyA9ICh1bnNpZ25lZCBzaG9ydCopbG9kZXBuZ19tYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIHdpbmRvd3NpemUpOwotICBoYXNoLT5oZWFkeiA9IChpbnQqKWxvZGVwbmdfbWFsbG9jKHNpemVvZihpbnQpICogKE1BWF9TVVBQT1JURURfREVGTEFURV9MRU5HVEggKyAxKSk7Ci0gIGhhc2gtPmNoYWlueiA9ICh1bnNpZ25lZCBzaG9ydCopbG9kZXBuZ19tYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIHdpbmRvd3NpemUpOwotCi0gIGlmKCFoYXNoLT5oZWFkIHx8ICFoYXNoLT5jaGFpbiB8fCAhaGFzaC0+dmFsICB8fCAhaGFzaC0+aGVhZHp8fCAhaGFzaC0+Y2hhaW56IHx8ICFoYXNoLT56ZXJvcykgewotICAgIHJldHVybiA4MzsgLyphbGxvYyBmYWlsKi8KLSAgfQotCi0gIC8qaW5pdGlhbGl6ZSBoYXNoIHRhYmxlKi8KLSAgZm9yKGkgPSAwOyBpICE9IEhBU0hfTlVNX1ZBTFVFUzsgKytpKSBoYXNoLT5oZWFkW2ldID0gLTE7Ci0gIGZvcihpID0gMDsgaSAhPSB3aW5kb3dzaXplOyArK2kpIGhhc2gtPnZhbFtpXSA9IC0xOwotICBmb3IoaSA9IDA7IGkgIT0gd2luZG93c2l6ZTsgKytpKSBoYXNoLT5jaGFpbltpXSA9IGk7IC8qc2FtZSB2YWx1ZSBhcyBpbmRleCBpbmRpY2F0ZXMgdW5pbml0aWFsaXplZCovCi0KLSAgZm9yKGkgPSAwOyBpIDw9IE1BWF9TVVBQT1JURURfREVGTEFURV9MRU5HVEg7ICsraSkgaGFzaC0+aGVhZHpbaV0gPSAtMTsKLSAgZm9yKGkgPSAwOyBpICE9IHdpbmRvd3NpemU7ICsraSkgaGFzaC0+Y2hhaW56W2ldID0gaTsgLypzYW1lIHZhbHVlIGFzIGluZGV4IGluZGljYXRlcyB1bmluaXRpYWxpemVkKi8KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaGFzaF9jbGVhbnVwKEhhc2gqIGhhc2gpIHsKLSAgbG9kZXBuZ19mcmVlKGhhc2gtPmhlYWQpOwotICBsb2RlcG5nX2ZyZWUoaGFzaC0+dmFsKTsKLSAgbG9kZXBuZ19mcmVlKGhhc2gtPmNoYWluKTsKLQotICBsb2RlcG5nX2ZyZWUoaGFzaC0+emVyb3MpOwotICBsb2RlcG5nX2ZyZWUoaGFzaC0+aGVhZHopOwotICBsb2RlcG5nX2ZyZWUoaGFzaC0+Y2hhaW56KTsKLX0KLQotCi0KLXN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBzaXplLCBzaXplX3QgcG9zKSB7Ci0gIHVuc2lnbmVkIHJlc3VsdCA9IDA7Ci0gIGlmKHBvcyArIDIgPCBzaXplKSB7Ci0gICAgLypBIHNpbXBsZSBzaGlmdCBhbmQgeG9yIGhhc2ggaXMgdXNlZC4gU2luY2UgdGhlIGRhdGEgb2YgUE5HcyBpcyBkb21pbmF0ZWQKLSAgICBieSB6ZXJvZXMgZHVlIHRvIHRoZSBmaWx0ZXJzLCBhIGJldHRlciBoYXNoIGRvZXMgbm90IGhhdmUgYSBzaWduaWZpY2FudAotICAgIGVmZmVjdCBvbiBzcGVlZCBpbiB0cmF2ZXJzaW5nIHRoZSBjaGFpbiwgYW5kIGNhdXNlcyBtb3JlIHRpbWUgc3BlbmQgb24KLSAgICBjYWxjdWxhdGluZyB0aGUgaGFzaC4qLwotICAgIHJlc3VsdCBePSAodW5zaWduZWQpKGRhdGFbcG9zICsgMF0gPDwgMHUpOwotICAgIHJlc3VsdCBePSAodW5zaWduZWQpKGRhdGFbcG9zICsgMV0gPDwgNHUpOwotICAgIHJlc3VsdCBePSAodW5zaWduZWQpKGRhdGFbcG9zICsgMl0gPDwgOHUpOwotICB9IGVsc2UgewotICAgIHNpemVfdCBhbW91bnQsIGk7Ci0gICAgaWYocG9zID49IHNpemUpIHJldHVybiAwOwotICAgIGFtb3VudCA9IHNpemUgLSBwb3M7Ci0gICAgZm9yKGkgPSAwOyBpICE9IGFtb3VudDsgKytpKSByZXN1bHQgXj0gKHVuc2lnbmVkKShkYXRhW3BvcyArIGldIDw8IChpICogOHUpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0ICYgSEFTSF9CSVRfTUFTSzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNvdW50WmVyb3MoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IHNpemUsIHNpemVfdCBwb3MpIHsKLSAgY29uc3QgdW5zaWduZWQgY2hhciogc3RhcnQgPSBkYXRhICsgcG9zOwotICBjb25zdCB1bnNpZ25lZCBjaGFyKiBlbmQgPSBzdGFydCArIE1BWF9TVVBQT1JURURfREVGTEFURV9MRU5HVEg7Ci0gIGlmKGVuZCA+IGRhdGEgKyBzaXplKSBlbmQgPSBkYXRhICsgc2l6ZTsKLSAgZGF0YSA9IHN0YXJ0OwotICB3aGlsZShkYXRhICE9IGVuZCAmJiAqZGF0YSA9PSAwKSArK2RhdGE7Ci0gIC8qc3VidHJhY3RpbmcgdHdvIGFkZHJlc3NlcyByZXR1cm5lZCBhcyAzMi1iaXQgbnVtYmVyIChtYXggdmFsdWUgaXMgTUFYX1NVUFBPUlRFRF9ERUZMQVRFX0xFTkdUSCkqLwotICByZXR1cm4gKHVuc2lnbmVkKShkYXRhIC0gc3RhcnQpOwotfQotCi0vKndwb3MgPSBwb3MgJiAod2luZG93c2l6ZSAtIDEpKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZUhhc2hDaGFpbihIYXNoKiBoYXNoLCBzaXplX3Qgd3BvcywgdW5zaWduZWQgaGFzaHZhbCwgdW5zaWduZWQgc2hvcnQgbnVtemVyb3MpIHsKLSAgaGFzaC0+dmFsW3dwb3NdID0gKGludCloYXNodmFsOwotICBpZihoYXNoLT5oZWFkW2hhc2h2YWxdICE9IC0xKSBoYXNoLT5jaGFpblt3cG9zXSA9IGhhc2gtPmhlYWRbaGFzaHZhbF07Ci0gIGhhc2gtPmhlYWRbaGFzaHZhbF0gPSAoaW50KXdwb3M7Ci0KLSAgaGFzaC0+emVyb3Nbd3Bvc10gPSBudW16ZXJvczsKLSAgaWYoaGFzaC0+aGVhZHpbbnVtemVyb3NdICE9IC0xKSBoYXNoLT5jaGFpbnpbd3Bvc10gPSBoYXNoLT5oZWFkeltudW16ZXJvc107Ci0gIGhhc2gtPmhlYWR6W251bXplcm9zXSA9IChpbnQpd3BvczsKLX0KLQotLyoKLUxaNzctZW5jb2RlIHRoZSBkYXRhLiBSZXR1cm4gdmFsdWUgaXMgZXJyb3IgY29kZS4gVGhlIGlucHV0IGFyZSByYXcgYnl0ZXMsIHRoZSBvdXRwdXQKLWlzIGluIHRoZSBmb3JtIG9mIHVuc2lnbmVkIGludGVnZXJzIHdpdGggY29kZXMgcmVwcmVzZW50aW5nIGZvciBleGFtcGxlIGxpdGVyYWwgYnl0ZXMsIG9yCi1sZW5ndGgvZGlzdGFuY2UgcGFpcnMuCi1JdCB1c2VzIGEgaGFzaCB0YWJsZSB0ZWNobmlxdWUgdG8gbGV0IGl0IGVuY29kZSBmYXN0ZXIuIFdoZW4gZG9pbmcgTFo3NyBlbmNvZGluZywgYQotc2xpZGluZyB3aW5kb3cgKG9mIHdpbmRvd3NpemUpIGlzIHVzZWQsIGFuZCBhbGwgcGFzdCBieXRlcyBpbiB0aGF0IHdpbmRvdyBjYW4gYmUgdXNlZCBhcwotdGhlICJkaWN0aW9uYXJ5Ii4gQSBicnV0ZSBmb3JjZSBzZWFyY2ggdGhyb3VnaCBhbGwgcG9zc2libGUgZGlzdGFuY2VzIHdvdWxkIGJlIHNsb3csIGFuZAotdGhpcyBoYXNoIHRlY2huaXF1ZSBpcyBvbmUgb3V0IG9mIHNldmVyYWwgd2F5cyB0byBzcGVlZCB0aGlzIHVwLgotKi8KLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVMWjc3KHVpdmVjdG9yKiBvdXQsIEhhc2gqIGhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgc2l6ZV90IGlucG9zLCBzaXplX3QgaW5zaXplLCB1bnNpZ25lZCB3aW5kb3dzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWlubWF0Y2gsIHVuc2lnbmVkIG5pY2VtYXRjaCwgdW5zaWduZWQgbGF6eW1hdGNoaW5nKSB7Ci0gIHNpemVfdCBwb3M7Ci0gIHVuc2lnbmVkIGksIGVycm9yID0gMDsKLSAgLypmb3IgbGFyZ2Ugd2luZG93IGxlbmd0aHMsIGFzc3VtZSB0aGUgdXNlciB3YW50cyBubyBjb21wcmVzc2lvbiBsb3NzLiBPdGhlcndpc2UsIG1heCBoYXNoIGNoYWluIGxlbmd0aCBzcGVlZHVwLiovCi0gIHVuc2lnbmVkIG1heGNoYWlubGVuZ3RoID0gd2luZG93c2l6ZSA+PSA4MTkyID8gd2luZG93c2l6ZSA6IHdpbmRvd3NpemUgLyA4OwotICB1bnNpZ25lZCBtYXhsYXp5bWF0Y2ggPSB3aW5kb3dzaXplID49IDgxOTIgPyBNQVhfU1VQUE9SVEVEX0RFRkxBVEVfTEVOR1RIIDogNjQ7Ci0KLSAgdW5zaWduZWQgdXNlemVyb3MgPSAxOyAvKm5vdCBzdXJlIGlmIHNldHRpbmcgaXQgdG8gZmFsc2UgZm9yIHdpbmRvd3NpemUgPCA4MTkyIGlzIGJldHRlciBvciB3b3JzZSovCi0gIHVuc2lnbmVkIG51bXplcm9zID0gMDsKLQotICB1bnNpZ25lZCBvZmZzZXQ7IC8qdGhlIG9mZnNldCByZXByZXNlbnRzIHRoZSBkaXN0YW5jZSBpbiBMWjc3IHRlcm1pbm9sb2d5Ki8KLSAgdW5zaWduZWQgbGVuZ3RoOwotICB1bnNpZ25lZCBsYXp5ID0gMDsKLSAgdW5zaWduZWQgbGF6eWxlbmd0aCA9IDAsIGxhenlvZmZzZXQgPSAwOwotICB1bnNpZ25lZCBoYXNodmFsOwotICB1bnNpZ25lZCBjdXJyZW50X29mZnNldCwgY3VycmVudF9sZW5ndGg7Ci0gIHVuc2lnbmVkIHByZXZfb2Zmc2V0OwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpsYXN0cHRyLCAqZm9yZXB0ciwgKmJhY2twdHI7Ci0gIHVuc2lnbmVkIGhhc2hwb3M7Ci0KLSAgaWYod2luZG93c2l6ZSA9PSAwIHx8IHdpbmRvd3NpemUgPiAzMjc2OCkgcmV0dXJuIDYwOyAvKmVycm9yOiB3aW5kb3dzaXplIHNtYWxsZXIvbGFyZ2VyIHRoYW4gYWxsb3dlZCovCi0gIGlmKCh3aW5kb3dzaXplICYgKHdpbmRvd3NpemUgLSAxKSkgIT0gMCkgcmV0dXJuIDkwOyAvKmVycm9yOiBtdXN0IGJlIHBvd2VyIG9mIHR3byovCi0KLSAgaWYobmljZW1hdGNoID4gTUFYX1NVUFBPUlRFRF9ERUZMQVRFX0xFTkdUSCkgbmljZW1hdGNoID0gTUFYX1NVUFBPUlRFRF9ERUZMQVRFX0xFTkdUSDsKLQotICBmb3IocG9zID0gaW5wb3M7IHBvcyA8IGluc2l6ZTsgKytwb3MpIHsKLSAgICBzaXplX3Qgd3BvcyA9IHBvcyAmICh3aW5kb3dzaXplIC0gMSk7IC8qcG9zaXRpb24gZm9yIGluICdjaXJjdWxhcicgaGFzaCBidWZmZXJzKi8KLSAgICB1bnNpZ25lZCBjaGFpbmxlbmd0aCA9IDA7Ci0KLSAgICBoYXNodmFsID0gZ2V0SGFzaChpbiwgaW5zaXplLCBwb3MpOwotCi0gICAgaWYodXNlemVyb3MgJiYgaGFzaHZhbCA9PSAwKSB7Ci0gICAgICBpZihudW16ZXJvcyA9PSAwKSBudW16ZXJvcyA9IGNvdW50WmVyb3MoaW4sIGluc2l6ZSwgcG9zKTsKLSAgICAgIGVsc2UgaWYocG9zICsgbnVtemVyb3MgPiBpbnNpemUgfHwgaW5bcG9zICsgbnVtemVyb3MgLSAxXSAhPSAwKSAtLW51bXplcm9zOwotICAgIH0gZWxzZSB7Ci0gICAgICBudW16ZXJvcyA9IDA7Ci0gICAgfQotCi0gICAgdXBkYXRlSGFzaENoYWluKGhhc2gsIHdwb3MsIGhhc2h2YWwsIG51bXplcm9zKTsKLQotICAgIC8qdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IGZvdW5kIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiovCi0gICAgbGVuZ3RoID0gMDsKLSAgICBvZmZzZXQgPSAwOwotCi0gICAgaGFzaHBvcyA9IGhhc2gtPmNoYWluW3dwb3NdOwotCi0gICAgbGFzdHB0ciA9ICZpbltpbnNpemUgPCBwb3MgKyBNQVhfU1VQUE9SVEVEX0RFRkxBVEVfTEVOR1RIID8gaW5zaXplIDogcG9zICsgTUFYX1NVUFBPUlRFRF9ERUZMQVRFX0xFTkdUSF07Ci0KLSAgICAvKnNlYXJjaCBmb3IgdGhlIGxvbmdlc3Qgc3RyaW5nKi8KLSAgICBwcmV2X29mZnNldCA9IDA7Ci0gICAgZm9yKDs7KSB7Ci0gICAgICBpZihjaGFpbmxlbmd0aCsrID49IG1heGNoYWlubGVuZ3RoKSBicmVhazsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ID0gKHVuc2lnbmVkKShoYXNocG9zIDw9IHdwb3MgPyB3cG9zIC0gaGFzaHBvcyA6IHdwb3MgLSBoYXNocG9zICsgd2luZG93c2l6ZSk7Ci0KLSAgICAgIGlmKGN1cnJlbnRfb2Zmc2V0IDwgcHJldl9vZmZzZXQpIGJyZWFrOyAvKnN0b3Agd2hlbiB3ZW50IGNvbXBsZXRlbHkgYXJvdW5kIHRoZSBjaXJjdWxhciBidWZmZXIqLwotICAgICAgcHJldl9vZmZzZXQgPSBjdXJyZW50X29mZnNldDsKLSAgICAgIGlmKGN1cnJlbnRfb2Zmc2V0ID4gMCkgewotICAgICAgICAvKnRlc3QgdGhlIG5leHQgY2hhcmFjdGVycyovCi0gICAgICAgIGZvcmVwdHIgPSAmaW5bcG9zXTsKLSAgICAgICAgYmFja3B0ciA9ICZpbltwb3MgLSBjdXJyZW50X29mZnNldF07Ci0KLSAgICAgICAgLypjb21tb24gY2FzZSBpbiBQTkdzIGlzIGxvdHMgb2YgemVyb3MuIFF1aWNrbHkgc2tpcCBvdmVyIHRoZW0gYXMgYSBzcGVlZHVwKi8KLSAgICAgICAgaWYobnVtemVyb3MgPj0gMykgewotICAgICAgICAgIHVuc2lnbmVkIHNraXAgPSBoYXNoLT56ZXJvc1toYXNocG9zXTsKLSAgICAgICAgICBpZihza2lwID4gbnVtemVyb3MpIHNraXAgPSBudW16ZXJvczsKLSAgICAgICAgICBiYWNrcHRyICs9IHNraXA7Ci0gICAgICAgICAgZm9yZXB0ciArPSBza2lwOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUoZm9yZXB0ciAhPSBsYXN0cHRyICYmICpiYWNrcHRyID09ICpmb3JlcHRyKSAvKm1heGltdW0gc3VwcG9ydGVkIGxlbmd0aCBieSBkZWZsYXRlIGlzIG1heCBsZW5ndGgqLyB7Ci0gICAgICAgICAgKytiYWNrcHRyOwotICAgICAgICAgICsrZm9yZXB0cjsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50X2xlbmd0aCA9ICh1bnNpZ25lZCkoZm9yZXB0ciAtICZpbltwb3NdKTsKLQotICAgICAgICBpZihjdXJyZW50X2xlbmd0aCA+IGxlbmd0aCkgewotICAgICAgICAgIGxlbmd0aCA9IGN1cnJlbnRfbGVuZ3RoOyAvKnRoZSBsb25nZXN0IGxlbmd0aCovCi0gICAgICAgICAgb2Zmc2V0ID0gY3VycmVudF9vZmZzZXQ7IC8qdGhlIG9mZnNldCB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhpcyBsb25nZXN0IGxlbmd0aCovCi0gICAgICAgICAgLypqdW1wIG91dCBvbmNlIGEgbGVuZ3RoIG9mIG1heCBsZW5ndGggaXMgZm91bmQgKHNwZWVkIGdhaW4pLiBUaGlzIGFsc28ganVtcHMKLSAgICAgICAgICBvdXQgaWYgbGVuZ3RoIGlzIE1BWF9TVVBQT1JURURfREVGTEFURV9MRU5HVEgqLwotICAgICAgICAgIGlmKGN1cnJlbnRfbGVuZ3RoID49IG5pY2VtYXRjaCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoaGFzaHBvcyA9PSBoYXNoLT5jaGFpbltoYXNocG9zXSkgYnJlYWs7Ci0KLSAgICAgIGlmKG51bXplcm9zID49IDMgJiYgbGVuZ3RoID4gbnVtemVyb3MpIHsKLSAgICAgICAgaGFzaHBvcyA9IGhhc2gtPmNoYWlueltoYXNocG9zXTsKLSAgICAgICAgaWYoaGFzaC0+emVyb3NbaGFzaHBvc10gIT0gbnVtemVyb3MpIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaGFzaHBvcyA9IGhhc2gtPmNoYWluW2hhc2hwb3NdOwotICAgICAgICAvKm91dGRhdGVkIGhhc2ggdmFsdWUsIGhhcHBlbnMgaWYgcGFydGljdWxhciB2YWx1ZSB3YXMgbm90IGVuY291bnRlcmVkIGluIHdob2xlIGxhc3Qgd2luZG93Ki8KLSAgICAgICAgaWYoaGFzaC0+dmFsW2hhc2hwb3NdICE9IChpbnQpaGFzaHZhbCkgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYobGF6eW1hdGNoaW5nKSB7Ci0gICAgICBpZighbGF6eSAmJiBsZW5ndGggPj0gMyAmJiBsZW5ndGggPD0gbWF4bGF6eW1hdGNoICYmIGxlbmd0aCA8IE1BWF9TVVBQT1JURURfREVGTEFURV9MRU5HVEgpIHsKLSAgICAgICAgbGF6eSA9IDE7Ci0gICAgICAgIGxhenlsZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgIGxhenlvZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGNvbnRpbnVlOyAvKnRyeSB0aGUgbmV4dCBieXRlKi8KLSAgICAgIH0KLSAgICAgIGlmKGxhenkpIHsKLSAgICAgICAgbGF6eSA9IDA7Ci0gICAgICAgIGlmKHBvcyA9PSAwKSBFUlJPUl9CUkVBSyg4MSk7Ci0gICAgICAgIGlmKGxlbmd0aCA+IGxhenlsZW5ndGggKyAxKSB7Ci0gICAgICAgICAgLypwdXNoIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgYXMgbGl0ZXJhbCovCi0gICAgICAgICAgaWYoIXVpdmVjdG9yX3B1c2hfYmFjayhvdXQsIGluW3BvcyAtIDFdKSkgRVJST1JfQlJFQUsoODMgLyphbGxvYyBmYWlsKi8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGxlbmd0aCA9IGxhenlsZW5ndGg7Ci0gICAgICAgICAgb2Zmc2V0ID0gbGF6eW9mZnNldDsKLSAgICAgICAgICBoYXNoLT5oZWFkW2hhc2h2YWxdID0gLTE7IC8qdGhlIHNhbWUgaGFzaGNoYWluIHVwZGF0ZSB3aWxsIGJlIGRvbmUsIHRoaXMgZW5zdXJlcyBubyB3cm9uZyBhbHRlcmF0aW9uKi8KLSAgICAgICAgICBoYXNoLT5oZWFkeltudW16ZXJvc10gPSAtMTsgLyppZGVtKi8KLSAgICAgICAgICAtLXBvczsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZihsZW5ndGggPj0gMyAmJiBvZmZzZXQgPiB3aW5kb3dzaXplKSBFUlJPUl9CUkVBSyg4NiAvKnRvbyBiaWcgKG9yIG92ZXJmbG93biBuZWdhdGl2ZSkgb2Zmc2V0Ki8pOwotCi0gICAgLyplbmNvZGUgaXQgYXMgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgb3IgbGl0ZXJhbCB2YWx1ZSovCi0gICAgaWYobGVuZ3RoIDwgMykgLypvbmx5IGxlbmd0aHMgb2YgMyBvciBoaWdoZXIgYXJlIHN1cHBvcnRlZCBhcyBsZW5ndGgvZGlzdGFuY2UgcGFpciovIHsKLSAgICAgIGlmKCF1aXZlY3Rvcl9wdXNoX2JhY2sob3V0LCBpbltwb3NdKSkgRVJST1JfQlJFQUsoODMgLyphbGxvYyBmYWlsKi8pOwotICAgIH0gZWxzZSBpZihsZW5ndGggPCBtaW5tYXRjaCB8fCAobGVuZ3RoID09IDMgJiYgb2Zmc2V0ID4gNDA5NikpIHsKLSAgICAgIC8qY29tcGVuc2F0ZSBmb3IgdGhlIGZhY3QgdGhhdCBsb25nZXIgb2Zmc2V0cyBoYXZlIG1vcmUgZXh0cmEgYml0cywgYQotICAgICAgbGVuZ3RoIG9mIG9ubHkgMyBtYXkgYmUgbm90IHdvcnRoIGl0IHRoZW4qLwotICAgICAgaWYoIXVpdmVjdG9yX3B1c2hfYmFjayhvdXQsIGluW3Bvc10pKSBFUlJPUl9CUkVBSyg4MyAvKmFsbG9jIGZhaWwqLyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFkZExlbmd0aERpc3RhbmNlKG91dCwgbGVuZ3RoLCBvZmZzZXQpOwotICAgICAgZm9yKGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgICAgKytwb3M7Ci0gICAgICAgIHdwb3MgPSBwb3MgJiAod2luZG93c2l6ZSAtIDEpOwotICAgICAgICBoYXNodmFsID0gZ2V0SGFzaChpbiwgaW5zaXplLCBwb3MpOwotICAgICAgICBpZih1c2V6ZXJvcyAmJiBoYXNodmFsID09IDApIHsKLSAgICAgICAgICBpZihudW16ZXJvcyA9PSAwKSBudW16ZXJvcyA9IGNvdW50WmVyb3MoaW4sIGluc2l6ZSwgcG9zKTsKLSAgICAgICAgICBlbHNlIGlmKHBvcyArIG51bXplcm9zID4gaW5zaXplIHx8IGluW3BvcyArIG51bXplcm9zIC0gMV0gIT0gMCkgLS1udW16ZXJvczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBudW16ZXJvcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlSGFzaENoYWluKGhhc2gsIHdwb3MsIGhhc2h2YWwsIG51bXplcm9zKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gLyplbmQgb2YgdGhlIGxvb3AgdGhyb3VnaCBlYWNoIGNoYXJhY3RlciBvZiBpbnB1dCovCi0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotc3RhdGljIHVuc2lnbmVkIGRlZmxhdGVOb0NvbXByZXNzaW9uKHVjdmVjdG9yKiBvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhc2l6ZSkgewotICAvKm5vbiBjb21wcmVzc2VkIGRlZmxhdGUgYmxvY2sgZGF0YTogMSBiaXQgQkZJTkFMLDIgYml0cyBCVFlQRSwoNSBiaXRzKTogaXQganVtcHMgdG8gc3RhcnQgb2YgbmV4dCBieXRlLAotICAyIGJ5dGVzIExFTiwgMiBieXRlcyBOTEVOLCBMRU4gYnl0ZXMgbGl0ZXJhbCBEQVRBKi8KLQotICBzaXplX3QgaSwgaiwgbnVtZGVmbGF0ZWJsb2NrcyA9IChkYXRhc2l6ZSArIDY1NTM0KSAvIDY1NTM1OwotICB1bnNpZ25lZCBkYXRhcG9zID0gMDsKLSAgZm9yKGkgPSAwOyBpICE9IG51bWRlZmxhdGVibG9ja3M7ICsraSkgewotICAgIHVuc2lnbmVkIEJGSU5BTCwgQlRZUEUsIExFTiwgTkxFTjsKLSAgICB1bnNpZ25lZCBjaGFyIGZpcnN0Ynl0ZTsKLQotICAgIEJGSU5BTCA9IChpID09IG51bWRlZmxhdGVibG9ja3MgLSAxKTsKLSAgICBCVFlQRSA9IDA7Ci0KLSAgICBmaXJzdGJ5dGUgPSAodW5zaWduZWQgY2hhcikoQkZJTkFMICsgKChCVFlQRSAmIDEpIDw8IDEpICsgKChCVFlQRSAmIDIpIDw8IDEpKTsKLSAgICB1Y3ZlY3Rvcl9wdXNoX2JhY2sob3V0LCBmaXJzdGJ5dGUpOwotCi0gICAgTEVOID0gNjU1MzU7Ci0gICAgaWYoZGF0YXNpemUgLSBkYXRhcG9zIDwgNjU1MzUpIExFTiA9ICh1bnNpZ25lZClkYXRhc2l6ZSAtIGRhdGFwb3M7Ci0gICAgTkxFTiA9IDY1NTM1IC0gTEVOOwotCi0gICAgdWN2ZWN0b3JfcHVzaF9iYWNrKG91dCwgKHVuc2lnbmVkIGNoYXIpKExFTiAmIDI1NSkpOwotICAgIHVjdmVjdG9yX3B1c2hfYmFjayhvdXQsICh1bnNpZ25lZCBjaGFyKShMRU4gPj4gOCkpOwotICAgIHVjdmVjdG9yX3B1c2hfYmFjayhvdXQsICh1bnNpZ25lZCBjaGFyKShOTEVOICYgMjU1KSk7Ci0gICAgdWN2ZWN0b3JfcHVzaF9iYWNrKG91dCwgKHVuc2lnbmVkIGNoYXIpKE5MRU4gPj4gOCkpOwotCi0gICAgLypEZWNvbXByZXNzZWQgZGF0YSovCi0gICAgZm9yKGogPSAwOyBqIDwgNjU1MzUgJiYgZGF0YXBvcyA8IGRhdGFzaXplOyArK2opIHsKLSAgICAgIHVjdmVjdG9yX3B1c2hfYmFjayhvdXQsIGRhdGFbZGF0YXBvcysrXSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi13cml0ZSB0aGUgbHo3Ny1lbmNvZGVkIGRhdGEsIHdoaWNoIGhhcyBsaXQsIGxlbiBhbmQgZGlzdCBjb2RlcywgdG8gY29tcHJlc3NlZCBzdHJlYW0gdXNpbmcgaHVmZm1hbiB0cmVlcy4KLXRyZWVfbGw6IHRoZSB0cmVlIGZvciBsaXQgYW5kIGxlbiBjb2Rlcy4KLXRyZWVfZDogdGhlIHRyZWUgZm9yIGRpc3RhbmNlIGNvZGVzLgotKi8KLXN0YXRpYyB2b2lkIHdyaXRlTFo3N2RhdGEoc2l6ZV90KiBicCwgdWN2ZWN0b3IqIG91dCwgY29uc3QgdWl2ZWN0b3IqIGx6NzdfZW5jb2RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHVmZm1hblRyZWUqIHRyZWVfbGwsIGNvbnN0IEh1ZmZtYW5UcmVlKiB0cmVlX2QpIHsKLSAgc2l6ZV90IGkgPSAwOwotICBmb3IoaSA9IDA7IGkgIT0gbHo3N19lbmNvZGVkLT5zaXplOyArK2kpIHsKLSAgICB1bnNpZ25lZCB2YWwgPSBsejc3X2VuY29kZWQtPmRhdGFbaV07Ci0gICAgYWRkSHVmZm1hblN5bWJvbChicCwgb3V0LCBIdWZmbWFuVHJlZV9nZXRDb2RlKHRyZWVfbGwsIHZhbCksIEh1ZmZtYW5UcmVlX2dldExlbmd0aCh0cmVlX2xsLCB2YWwpKTsKLSAgICBpZih2YWwgPiAyNTYpIC8qZm9yIGEgbGVuZ3RoIGNvZGUsIDMgbW9yZSB0aGluZ3MgaGF2ZSB0byBiZSBhZGRlZCovIHsKLSAgICAgIHVuc2lnbmVkIGxlbmd0aF9pbmRleCA9IHZhbCAtIEZJUlNUX0xFTkdUSF9DT0RFX0lOREVYOwotICAgICAgdW5zaWduZWQgbl9sZW5ndGhfZXh0cmFfYml0cyA9IExFTkdUSEVYVFJBW2xlbmd0aF9pbmRleF07Ci0gICAgICB1bnNpZ25lZCBsZW5ndGhfZXh0cmFfYml0cyA9IGx6NzdfZW5jb2RlZC0+ZGF0YVsrK2ldOwotCi0gICAgICB1bnNpZ25lZCBkaXN0YW5jZV9jb2RlID0gbHo3N19lbmNvZGVkLT5kYXRhWysraV07Ci0KLSAgICAgIHVuc2lnbmVkIGRpc3RhbmNlX2luZGV4ID0gZGlzdGFuY2VfY29kZTsKLSAgICAgIHVuc2lnbmVkIG5fZGlzdGFuY2VfZXh0cmFfYml0cyA9IERJU1RBTkNFRVhUUkFbZGlzdGFuY2VfaW5kZXhdOwotICAgICAgdW5zaWduZWQgZGlzdGFuY2VfZXh0cmFfYml0cyA9IGx6NzdfZW5jb2RlZC0+ZGF0YVsrK2ldOwotCi0gICAgICBhZGRCaXRzVG9TdHJlYW0oYnAsIG91dCwgbGVuZ3RoX2V4dHJhX2JpdHMsIG5fbGVuZ3RoX2V4dHJhX2JpdHMpOwotICAgICAgYWRkSHVmZm1hblN5bWJvbChicCwgb3V0LCBIdWZmbWFuVHJlZV9nZXRDb2RlKHRyZWVfZCwgZGlzdGFuY2VfY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlX2dldExlbmd0aCh0cmVlX2QsIGRpc3RhbmNlX2NvZGUpKTsKLSAgICAgIGFkZEJpdHNUb1N0cmVhbShicCwgb3V0LCBkaXN0YW5jZV9leHRyYV9iaXRzLCBuX2Rpc3RhbmNlX2V4dHJhX2JpdHMpOwotICAgIH0KLSAgfQotfQotCi0vKkRlZmxhdGUgZm9yIGEgYmxvY2sgb2YgdHlwZSAiZHluYW1pYyIsIHRoYXQgaXMsIHdpdGggZnJlZWx5LCBvcHRpbWFsbHksIGNyZWF0ZWQgaHVmZm1hbiB0cmVlcyovCi1zdGF0aWMgdW5zaWduZWQgZGVmbGF0ZUR5bmFtaWModWN2ZWN0b3IqIG91dCwgc2l6ZV90KiBicCwgSGFzaCogaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBzaXplX3QgZGF0YXBvcywgc2l6ZV90IGRhdGFlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzLCB1bnNpZ25lZCBmaW5hbCkgewotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0KLSAgLyoKLSAgQSBibG9jayBpcyBjb21wcmVzc2VkIGFzIGZvbGxvd3M6IFRoZSBQTkcgZGF0YSBpcyBsejc3IGVuY29kZWQsIHJlc3VsdGluZyBpbgotICBsaXRlcmFsIGJ5dGVzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMuIFRoaXMgaXMgdGhlbiBodWZmbWFuIGNvbXByZXNzZWQgd2l0aAotICB0d28gaHVmZm1hbiB0cmVlcy4gT25lIGh1ZmZtYW4gdHJlZSBpcyB1c2VkIGZvciB0aGUgbGl0IGFuZCBsZW4gdmFsdWVzICgibGwiKSwKLSAgYW5vdGhlciBodWZmbWFuIHRyZWUgaXMgdXNlZCBmb3IgdGhlIGRpc3QgdmFsdWVzICgiZCIpLiBUaGVzZSB0d28gdHJlZXMgYXJlCi0gIHN0b3JlZCB1c2luZyB0aGVpciBjb2RlIGxlbmd0aHMsIGFuZCB0byBjb21wcmVzcyBldmVuIG1vcmUgdGhlc2UgY29kZSBsZW5ndGhzCi0gIGFyZSBhbHNvIHJ1bi1sZW5ndGggZW5jb2RlZCBhbmQgaHVmZm1hbiBjb21wcmVzc2VkLiBUaGlzIGdpdmVzIGEgaHVmZm1hbiB0cmVlCi0gIG9mIGNvZGUgbGVuZ3RocyAiY2wiLiBUaGUgY29kZSBsZW5naHRzIHVzZWQgdG8gZGVzY3JpYmUgdGhpcyB0aGlyZCB0cmVlIGFyZQotICB0aGUgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICgiY2xjbCIpLgotICAqLwotCi0gIC8qVGhlIGx6NzcgZW5jb2RlZCBkYXRhLCByZXByZXNlbnRlZCB3aXRoIGludGVnZXJzIHNpbmNlIHRoZXJlIHdpbGwgYWxzbyBiZSBsZW5ndGggYW5kIGRpc3RhbmNlIGNvZGVzIGluIGl0Ki8KLSAgdWl2ZWN0b3IgbHo3N19lbmNvZGVkOwotICBIdWZmbWFuVHJlZSB0cmVlX2xsOyAvKnRyZWUgZm9yIGxpdCxsZW4gdmFsdWVzKi8KLSAgSHVmZm1hblRyZWUgdHJlZV9kOyAvKnRyZWUgZm9yIGRpc3RhbmNlIGNvZGVzKi8KLSAgSHVmZm1hblRyZWUgdHJlZV9jbDsgLyp0cmVlIGZvciBlbmNvZGluZyB0aGUgY29kZSBsZW5ndGhzIHJlcHJlc2VudGluZyB0cmVlX2xsIGFuZCB0cmVlX2QqLwotICB1aXZlY3RvciBmcmVxdWVuY2llc19sbDsgLypmcmVxdWVuY3kgb2YgbGl0LGxlbiBjb2RlcyovCi0gIHVpdmVjdG9yIGZyZXF1ZW5jaWVzX2Q7IC8qZnJlcXVlbmN5IG9mIGRpc3QgY29kZXMqLwotICB1aXZlY3RvciBmcmVxdWVuY2llc19jbDsgLypmcmVxdWVuY3kgb2YgY29kZSBsZW5ndGggY29kZXMqLwotICB1aXZlY3RvciBiaXRsZW5fbGxkOyAvKmxpdCxsZW4sZGlzdCBjb2RlIGxlbmdodHMgKGludCBiaXRzKSwgbGl0ZXJhbGx5ICh3aXRob3V0IHJlcGVhdCBjb2RlcykuKi8KLSAgdWl2ZWN0b3IgYml0bGVuX2xsZF9lOyAvKmJpdGxlbl9sbGQgZW5jb2RlZCB3aXRoIHJlcGVhdCBjb2RlcyAodGhpcyBpcyBhIHJ1ZGVtdGFyeSBydW4gbGVuZ3RoIGNvbXByZXNzaW9uKSovCi0gIC8qYml0bGVuX2NsIGlzIHRoZSBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKCJjbGNsIikuIFRoZSBiaXQgbGVuZ3RocyBvZiBjb2RlcyB0byByZXByZXNlbnQgdHJlZV9jbAotICAodGhlc2UgYXJlIHdyaXR0ZW4gYXMgaXMgaW4gdGhlIGZpbGUsIGl0IHdvdWxkIGJlIGNyYXp5IHRvIGNvbXByZXNzIHRoZXNlIHVzaW5nIHlldCBhbm90aGVyIGh1ZmZtYW4KLSAgdHJlZSB0aGF0IG5lZWRzIHRvIGJlIHJlcHJlc2VudGVkIGJ5IHlldCBhbm90aGVyIHNldCBvZiBjb2RlIGxlbmd0aHMpKi8KLSAgdWl2ZWN0b3IgYml0bGVuX2NsOwotICBzaXplX3QgZGF0YXNpemUgPSBkYXRhZW5kIC0gZGF0YXBvczsKLQotICAvKgotICBEdWUgdG8gdGhlIGh1ZmZtYW4gY29tcHJlc3Npb24gb2YgaHVmZm1hbiB0cmVlIHJlcHJlc2VudGF0aW9ucyAoInR3byBsZXZlbHMiKSwgdGhlcmUgYXJlIHNvbWUgYW5vbG9naWVzOgotICBiaXRsZW5fbGxkIGlzIHRvIHRyZWVfY2wgd2hhdCBkYXRhIGlzIHRvIHRyZWVfbGwgYW5kIHRyZWVfZC4KLSAgYml0bGVuX2xsZF9lIGlzIHRvIGJpdGxlbl9sbGQgd2hhdCBsejc3X2VuY29kZWQgaXMgdG8gZGF0YS4KLSAgYml0bGVuX2NsIGlzIHRvIGJpdGxlbl9sbGRfZSB3aGF0IGJpdGxlbl9sbGQgaXMgdG8gbHo3N19lbmNvZGVkLgotICAqLwotCi0gIHVuc2lnbmVkIEJGSU5BTCA9IGZpbmFsOwotICBzaXplX3QgbnVtY29kZXNfbGwsIG51bWNvZGVzX2QsIGk7Ci0gIHVuc2lnbmVkIEhMSVQsIEhESVNULCBIQ0xFTjsKLQotICB1aXZlY3Rvcl9pbml0KCZsejc3X2VuY29kZWQpOwotICBIdWZmbWFuVHJlZV9pbml0KCZ0cmVlX2xsKTsKLSAgSHVmZm1hblRyZWVfaW5pdCgmdHJlZV9kKTsKLSAgSHVmZm1hblRyZWVfaW5pdCgmdHJlZV9jbCk7Ci0gIHVpdmVjdG9yX2luaXQoJmZyZXF1ZW5jaWVzX2xsKTsKLSAgdWl2ZWN0b3JfaW5pdCgmZnJlcXVlbmNpZXNfZCk7Ci0gIHVpdmVjdG9yX2luaXQoJmZyZXF1ZW5jaWVzX2NsKTsKLSAgdWl2ZWN0b3JfaW5pdCgmYml0bGVuX2xsZCk7Ci0gIHVpdmVjdG9yX2luaXQoJmJpdGxlbl9sbGRfZSk7Ci0gIHVpdmVjdG9yX2luaXQoJmJpdGxlbl9jbCk7Ci0KLSAgLypUaGlzIHdoaWxlIGxvb3AgbmV2ZXIgbG9vcHMgZHVlIHRvIGEgYnJlYWsgYXQgdGhlIGVuZCwgaXQgaXMgaGVyZSB0bwotICBhbGxvdyBicmVha2luZyBvdXQgb2YgaXQgdG8gdGhlIGNsZWFudXAgcGhhc2Ugb24gZXJyb3IgY29uZGl0aW9ucy4qLwotICB3aGlsZSghZXJyb3IpIHsKLSAgICBpZihzZXR0aW5ncy0+dXNlX2x6NzcpIHsKLSAgICAgIGVycm9yID0gZW5jb2RlTFo3NygmbHo3N19lbmNvZGVkLCBoYXNoLCBkYXRhLCBkYXRhcG9zLCBkYXRhZW5kLCBzZXR0aW5ncy0+d2luZG93c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy0+bWlubWF0Y2gsIHNldHRpbmdzLT5uaWNlbWF0Y2gsIHNldHRpbmdzLT5sYXp5bWF0Y2hpbmcpOwotICAgICAgaWYoZXJyb3IpIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZighdWl2ZWN0b3JfcmVzaXplKCZsejc3X2VuY29kZWQsIGRhdGFzaXplKSkgRVJST1JfQlJFQUsoODMgLyphbGxvYyBmYWlsKi8pOwotICAgICAgZm9yKGkgPSBkYXRhcG9zOyBpIDwgZGF0YWVuZDsgKytpKSBsejc3X2VuY29kZWQuZGF0YVtpIC0gZGF0YXBvc10gPSBkYXRhW2ldOyAvKm5vIExaNzcsIGJ1dCBzdGlsbCB3aWxsIGJlIEh1ZmZtYW4gY29tcHJlc3NlZCovCi0gICAgfQotCi0gICAgaWYoIXVpdmVjdG9yX3Jlc2l6ZXYoJmZyZXF1ZW5jaWVzX2xsLCAyODYsIDApKSBFUlJPUl9CUkVBSyg4MyAvKmFsbG9jIGZhaWwqLyk7Ci0gICAgaWYoIXVpdmVjdG9yX3Jlc2l6ZXYoJmZyZXF1ZW5jaWVzX2QsIDMwLCAwKSkgRVJST1JfQlJFQUsoODMgLyphbGxvYyBmYWlsKi8pOwotCi0gICAgLypDb3VudCB0aGUgZnJlcXVlbmNpZXMgb2YgbGl0LCBsZW4gYW5kIGRpc3QgY29kZXMqLwotICAgIGZvcihpID0gMDsgaSAhPSBsejc3X2VuY29kZWQuc2l6ZTsgKytpKSB7Ci0gICAgICB1bnNpZ25lZCBzeW1ib2wgPSBsejc3X2VuY29kZWQuZGF0YVtpXTsKLSAgICAgICsrZnJlcXVlbmNpZXNfbGwuZGF0YVtzeW1ib2xdOwotICAgICAgaWYoc3ltYm9sID4gMjU2KSB7Ci0gICAgICAgIHVuc2lnbmVkIGRpc3QgPSBsejc3X2VuY29kZWQuZGF0YVtpICsgMl07Ci0gICAgICAgICsrZnJlcXVlbmNpZXNfZC5kYXRhW2Rpc3RdOwotICAgICAgICBpICs9IDM7Ci0gICAgICB9Ci0gICAgfQotICAgIGZyZXF1ZW5jaWVzX2xsLmRhdGFbMjU2XSA9IDE7IC8qdGhlcmUgd2lsbCBiZSBleGFjdGx5IDEgZW5kIGNvZGUsIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrKi8KLQotICAgIC8qTWFrZSBib3RoIGh1ZmZtYW4gdHJlZXMsIG9uZSBmb3IgdGhlIGxpdCBhbmQgbGVuIGNvZGVzLCBvbmUgZm9yIHRoZSBkaXN0IGNvZGVzKi8KLSAgICBlcnJvciA9IEh1ZmZtYW5UcmVlX21ha2VGcm9tRnJlcXVlbmNpZXMoJnRyZWVfbGwsIGZyZXF1ZW5jaWVzX2xsLmRhdGEsIDI1NywgZnJlcXVlbmNpZXNfbGwuc2l6ZSwgMTUpOwotICAgIGlmKGVycm9yKSBicmVhazsKLSAgICAvKjIsIG5vdCAxLCBpcyBjaG9zZW4gZm9yIG1pbmNvZGVzOiBzb21lIGJ1Z2d5IFBORyBkZWNvZGVycyByZXF1aXJlIGF0IGxlYXN0IDIgc3ltYm9scyBpbiB0aGUgZGlzdCB0cmVlKi8KLSAgICBlcnJvciA9IEh1ZmZtYW5UcmVlX21ha2VGcm9tRnJlcXVlbmNpZXMoJnRyZWVfZCwgZnJlcXVlbmNpZXNfZC5kYXRhLCAyLCBmcmVxdWVuY2llc19kLnNpemUsIDE1KTsKLSAgICBpZihlcnJvcikgYnJlYWs7Ci0KLSAgICBudW1jb2Rlc19sbCA9IHRyZWVfbGwubnVtY29kZXM7IGlmKG51bWNvZGVzX2xsID4gMjg2KSBudW1jb2Rlc19sbCA9IDI4NjsKLSAgICBudW1jb2Rlc19kID0gdHJlZV9kLm51bWNvZGVzOyBpZihudW1jb2Rlc19kID4gMzApIG51bWNvZGVzX2QgPSAzMDsKLSAgICAvKnN0b3JlIHRoZSBjb2RlIGxlbmd0aHMgb2YgYm90aCBnZW5lcmF0ZWQgdHJlZXMgaW4gYml0bGVuX2xsZCovCi0gICAgZm9yKGkgPSAwOyBpICE9IG51bWNvZGVzX2xsOyArK2kpIHVpdmVjdG9yX3B1c2hfYmFjaygmYml0bGVuX2xsZCwgSHVmZm1hblRyZWVfZ2V0TGVuZ3RoKCZ0cmVlX2xsLCAodW5zaWduZWQpaSkpOwotICAgIGZvcihpID0gMDsgaSAhPSBudW1jb2Rlc19kOyArK2kpIHVpdmVjdG9yX3B1c2hfYmFjaygmYml0bGVuX2xsZCwgSHVmZm1hblRyZWVfZ2V0TGVuZ3RoKCZ0cmVlX2QsICh1bnNpZ25lZClpKSk7Ci0KLSAgICAvKnJ1bi1sZW5ndGggY29tcHJlc3MgYml0bGVuX2xkZCBpbnRvIGJpdGxlbl9sbGRfZSBieSB1c2luZyByZXBlYXQgY29kZXMgMTYgKGNvcHkgbGVuZ3RoIDMtNiB0aW1lcyksCi0gICAgMTcgKDMtMTAgemVyb2VzKSwgMTggKDExLTEzOCB6ZXJvZXMpKi8KLSAgICBmb3IoaSA9IDA7IGkgIT0gKHVuc2lnbmVkKWJpdGxlbl9sbGQuc2l6ZTsgKytpKSB7Ci0gICAgICB1bnNpZ25lZCBqID0gMDsgLyphbW91bnQgb2YgcmVwaXRpdGlvbnMqLwotICAgICAgd2hpbGUoaSArIGogKyAxIDwgKHVuc2lnbmVkKWJpdGxlbl9sbGQuc2l6ZSAmJiBiaXRsZW5fbGxkLmRhdGFbaSArIGogKyAxXSA9PSBiaXRsZW5fbGxkLmRhdGFbaV0pICsrajsKLQotICAgICAgaWYoYml0bGVuX2xsZC5kYXRhW2ldID09IDAgJiYgaiA+PSAyKSAvKnJlcGVhdCBjb2RlIGZvciB6ZXJvZXMqLyB7Ci0gICAgICAgICsrajsgLyppbmNsdWRlIHRoZSBmaXJzdCB6ZXJvKi8KLSAgICAgICAgaWYoaiA8PSAxMCkgLypyZXBlYXQgY29kZSAxNyBzdXBwb3J0cyBtYXggMTAgemVyb2VzKi8gewotICAgICAgICAgIHVpdmVjdG9yX3B1c2hfYmFjaygmYml0bGVuX2xsZF9lLCAxNyk7Ci0gICAgICAgICAgdWl2ZWN0b3JfcHVzaF9iYWNrKCZiaXRsZW5fbGxkX2UsIGogLSAzKTsKLSAgICAgICAgfSBlbHNlIC8qcmVwZWF0IGNvZGUgMTggc3VwcG9ydHMgbWF4IDEzOCB6ZXJvZXMqLyB7Ci0gICAgICAgICAgaWYoaiA+IDEzOCkgaiA9IDEzODsKLSAgICAgICAgICB1aXZlY3Rvcl9wdXNoX2JhY2soJmJpdGxlbl9sbGRfZSwgMTgpOwotICAgICAgICAgIHVpdmVjdG9yX3B1c2hfYmFjaygmYml0bGVuX2xsZF9lLCBqIC0gMTEpOwotICAgICAgICB9Ci0gICAgICAgIGkgKz0gKGogLSAxKTsKLSAgICAgIH0gZWxzZSBpZihqID49IDMpIC8qcmVwZWF0IGNvZGUgZm9yIHZhbHVlIG90aGVyIHRoYW4gemVybyovIHsKLSAgICAgICAgc2l6ZV90IGs7Ci0gICAgICAgIHVuc2lnbmVkIG51bSA9IGogLyA2LCByZXN0ID0gaiAlIDY7Ci0gICAgICAgIHVpdmVjdG9yX3B1c2hfYmFjaygmYml0bGVuX2xsZF9lLCBiaXRsZW5fbGxkLmRhdGFbaV0pOwotICAgICAgICBmb3IoayA9IDA7IGsgPCBudW07ICsraykgewotICAgICAgICAgIHVpdmVjdG9yX3B1c2hfYmFjaygmYml0bGVuX2xsZF9lLCAxNik7Ci0gICAgICAgICAgdWl2ZWN0b3JfcHVzaF9iYWNrKCZiaXRsZW5fbGxkX2UsIDYgLSAzKTsKLSAgICAgICAgfQotICAgICAgICBpZihyZXN0ID49IDMpIHsKLSAgICAgICAgICB1aXZlY3Rvcl9wdXNoX2JhY2soJmJpdGxlbl9sbGRfZSwgMTYpOwotICAgICAgICAgIHVpdmVjdG9yX3B1c2hfYmFjaygmYml0bGVuX2xsZF9lLCByZXN0IC0gMyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBqIC09IHJlc3Q7Ci0gICAgICAgIGkgKz0gajsKLSAgICAgIH0gZWxzZSAvKnRvbyBzaG9ydCB0byBiZW5lZml0IGZyb20gcmVwZWF0IGNvZGUqLyB7Ci0gICAgICAgIHVpdmVjdG9yX3B1c2hfYmFjaygmYml0bGVuX2xsZF9lLCBiaXRsZW5fbGxkLmRhdGFbaV0pOwotICAgICAgfQotICAgIH0KLQotICAgIC8qZ2VuZXJhdGUgdHJlZV9jbCwgdGhlIGh1ZmZtYW50cmVlIG9mIGh1ZmZtYW50cmVlcyovCi0KLSAgICBpZighdWl2ZWN0b3JfcmVzaXpldigmZnJlcXVlbmNpZXNfY2wsIE5VTV9DT0RFX0xFTkdUSF9DT0RFUywgMCkpIEVSUk9SX0JSRUFLKDgzIC8qYWxsb2MgZmFpbCovKTsKLSAgICBmb3IoaSA9IDA7IGkgIT0gYml0bGVuX2xsZF9lLnNpemU7ICsraSkgewotICAgICAgKytmcmVxdWVuY2llc19jbC5kYXRhW2JpdGxlbl9sbGRfZS5kYXRhW2ldXTsKLSAgICAgIC8qYWZ0ZXIgYSByZXBlYXQgY29kZSBjb21lIHRoZSBiaXRzIHRoYXQgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHJlcGV0aXRpb25zLAotICAgICAgdGhvc2UgZG9uJ3QgbmVlZCB0byBiZSBpbiB0aGUgZnJlcXVlbmNpZXNfY2wgY2FsY3VsYXRpb24qLwotICAgICAgaWYoYml0bGVuX2xsZF9lLmRhdGFbaV0gPj0gMTYpICsraTsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEh1ZmZtYW5UcmVlX21ha2VGcm9tRnJlcXVlbmNpZXMoJnRyZWVfY2wsIGZyZXF1ZW5jaWVzX2NsLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzX2NsLnNpemUsIGZyZXF1ZW5jaWVzX2NsLnNpemUsIDcpOwotICAgIGlmKGVycm9yKSBicmVhazsKLQotICAgIGlmKCF1aXZlY3Rvcl9yZXNpemUoJmJpdGxlbl9jbCwgdHJlZV9jbC5udW1jb2RlcykpIEVSUk9SX0JSRUFLKDgzIC8qYWxsb2MgZmFpbCovKTsKLSAgICBmb3IoaSA9IDA7IGkgIT0gdHJlZV9jbC5udW1jb2RlczsgKytpKSB7Ci0gICAgICAvKmxlbmdodHMgb2YgY29kZSBsZW5ndGggdHJlZSBpcyBpbiB0aGUgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5IGRlZmxhdGUqLwotICAgICAgYml0bGVuX2NsLmRhdGFbaV0gPSBIdWZmbWFuVHJlZV9nZXRMZW5ndGgoJnRyZWVfY2wsIENMQ0xfT1JERVJbaV0pOwotICAgIH0KLSAgICB3aGlsZShiaXRsZW5fY2wuZGF0YVtiaXRsZW5fY2wuc2l6ZSAtIDFdID09IDAgJiYgYml0bGVuX2NsLnNpemUgPiA0KSB7Ci0gICAgICAvKnJlbW92ZSB6ZXJvcyBhdCB0aGUgZW5kLCBidXQgbWluaW11bSBzaXplIG11c3QgYmUgNCovCi0gICAgICBpZighdWl2ZWN0b3JfcmVzaXplKCZiaXRsZW5fY2wsIGJpdGxlbl9jbC5zaXplIC0gMSkpIEVSUk9SX0JSRUFLKDgzIC8qYWxsb2MgZmFpbCovKTsKLSAgICB9Ci0gICAgaWYoZXJyb3IpIGJyZWFrOwotCi0gICAgLyoKLSAgICBXcml0ZSBldmVyeXRoaW5nIGludG8gdGhlIG91dHB1dAotCi0gICAgQWZ0ZXIgdGhlIEJGSU5BTCBhbmQgQlRZUEUsIHRoZSBkeW5hbWljIGJsb2NrIGNvbnNpc3RzIG91dCBvZiB0aGUgZm9sbG93aW5nOgotICAgIC0gNSBiaXRzIEhMSVQsIDUgYml0cyBIRElTVCwgNCBiaXRzIEhDTEVOCi0gICAgLSAoSENMRU4rNCkqMyBiaXRzIGNvZGUgbGVuZ3RocyBvZiBjb2RlIGxlbmd0aCBhbHBoYWJldAotICAgIC0gSExJVCArIDI1NyBjb2RlIGxlbmdodHMgb2YgbGl0L2xlbmd0aCBhbHBoYWJldCAoZW5jb2RlZCB1c2luZyB0aGUgY29kZSBsZW5ndGgKLSAgICAgIGFscGhhYmV0LCArIHBvc3NpYmxlIHJlcGV0aXRpb24gY29kZXMgMTYsIDE3LCAxOCkKLSAgICAtIEhESVNUICsgMSBjb2RlIGxlbmd0aHMgb2YgZGlzdGFuY2UgYWxwaGFiZXQgKGVuY29kZWQgdXNpbmcgdGhlIGNvZGUgbGVuZ3RoCi0gICAgICBhbHBoYWJldCwgKyBwb3NzaWJsZSByZXBldGl0aW9uIGNvZGVzIDE2LCAxNywgMTgpCi0gICAgLSBjb21wcmVzc2VkIGRhdGEKLSAgICAtIDI1NiAoZW5kIGNvZGUpCi0gICAgKi8KLQotICAgIC8qV3JpdGUgYmxvY2sgdHlwZSovCi0gICAgYWRkQml0VG9TdHJlYW0oYnAsIG91dCwgQkZJTkFMKTsKLSAgICBhZGRCaXRUb1N0cmVhbShicCwgb3V0LCAwKTsgLypmaXJzdCBiaXQgb2YgQlRZUEUgImR5bmFtaWMiKi8KLSAgICBhZGRCaXRUb1N0cmVhbShicCwgb3V0LCAxKTsgLypzZWNvbmQgYml0IG9mIEJUWVBFICJkeW5hbWljIiovCi0KLSAgICAvKndyaXRlIHRoZSBITElULCBIRElTVCBhbmQgSENMRU4gdmFsdWVzKi8KLSAgICBITElUID0gKHVuc2lnbmVkKShudW1jb2Rlc19sbCAtIDI1Nyk7Ci0gICAgSERJU1QgPSAodW5zaWduZWQpKG51bWNvZGVzX2QgLSAxKTsKLSAgICBIQ0xFTiA9ICh1bnNpZ25lZCliaXRsZW5fY2wuc2l6ZSAtIDQ7Ci0gICAgLyp0cmltIHplcm9lcyBmb3IgSENMRU4uIEhMSVQgYW5kIEhESVNUIHdlcmUgYWxyZWFkeSB0cmltbWVkIGF0IHRyZWUgY3JlYXRpb24qLwotICAgIHdoaWxlKCFiaXRsZW5fY2wuZGF0YVtIQ0xFTiArIDQgLSAxXSAmJiBIQ0xFTiA+IDApIC0tSENMRU47Ci0gICAgYWRkQml0c1RvU3RyZWFtKGJwLCBvdXQsIEhMSVQsIDUpOwotICAgIGFkZEJpdHNUb1N0cmVhbShicCwgb3V0LCBIRElTVCwgNSk7Ci0gICAgYWRkQml0c1RvU3RyZWFtKGJwLCBvdXQsIEhDTEVOLCA0KTsKLQotICAgIC8qd3JpdGUgdGhlIGNvZGUgbGVuZ2h0cyBvZiB0aGUgY29kZSBsZW5ndGggYWxwaGFiZXQqLwotICAgIGZvcihpID0gMDsgaSAhPSBIQ0xFTiArIDQ7ICsraSkgYWRkQml0c1RvU3RyZWFtKGJwLCBvdXQsIGJpdGxlbl9jbC5kYXRhW2ldLCAzKTsKLQotICAgIC8qd3JpdGUgdGhlIGxlbmdodHMgb2YgdGhlIGxpdC9sZW4gQU5EIHRoZSBkaXN0IGFscGhhYmV0Ki8KLSAgICBmb3IoaSA9IDA7IGkgIT0gYml0bGVuX2xsZF9lLnNpemU7ICsraSkgewotICAgICAgYWRkSHVmZm1hblN5bWJvbChicCwgb3V0LCBIdWZmbWFuVHJlZV9nZXRDb2RlKCZ0cmVlX2NsLCBiaXRsZW5fbGxkX2UuZGF0YVtpXSksCi0gICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlX2dldExlbmd0aCgmdHJlZV9jbCwgYml0bGVuX2xsZF9lLmRhdGFbaV0pKTsKLSAgICAgIC8qZXh0cmEgYml0cyBvZiByZXBlYXQgY29kZXMqLwotICAgICAgaWYoYml0bGVuX2xsZF9lLmRhdGFbaV0gPT0gMTYpIGFkZEJpdHNUb1N0cmVhbShicCwgb3V0LCBiaXRsZW5fbGxkX2UuZGF0YVsrK2ldLCAyKTsKLSAgICAgIGVsc2UgaWYoYml0bGVuX2xsZF9lLmRhdGFbaV0gPT0gMTcpIGFkZEJpdHNUb1N0cmVhbShicCwgb3V0LCBiaXRsZW5fbGxkX2UuZGF0YVsrK2ldLCAzKTsKLSAgICAgIGVsc2UgaWYoYml0bGVuX2xsZF9lLmRhdGFbaV0gPT0gMTgpIGFkZEJpdHNUb1N0cmVhbShicCwgb3V0LCBiaXRsZW5fbGxkX2UuZGF0YVsrK2ldLCA3KTsKLSAgICB9Ci0KLSAgICAvKndyaXRlIHRoZSBjb21wcmVzc2VkIGRhdGEgc3ltYm9scyovCi0gICAgd3JpdGVMWjc3ZGF0YShicCwgb3V0LCAmbHo3N19lbmNvZGVkLCAmdHJlZV9sbCwgJnRyZWVfZCk7Ci0gICAgLyplcnJvcjogdGhlIGxlbmd0aCBvZiB0aGUgZW5kIGNvZGUgMjU2IG11c3QgYmUgbGFyZ2VyIHRoYW4gMCovCi0gICAgaWYoSHVmZm1hblRyZWVfZ2V0TGVuZ3RoKCZ0cmVlX2xsLCAyNTYpID09IDApIEVSUk9SX0JSRUFLKDY0KTsKLQotICAgIC8qd3JpdGUgdGhlIGVuZCBjb2RlKi8KLSAgICBhZGRIdWZmbWFuU3ltYm9sKGJwLCBvdXQsIEh1ZmZtYW5UcmVlX2dldENvZGUoJnRyZWVfbGwsIDI1NiksIEh1ZmZtYW5UcmVlX2dldExlbmd0aCgmdHJlZV9sbCwgMjU2KSk7Ci0KLSAgICBicmVhazsgLyplbmQgb2YgZXJyb3Itd2hpbGUqLwotICB9Ci0KLSAgLypjbGVhbnVwKi8KLSAgdWl2ZWN0b3JfY2xlYW51cCgmbHo3N19lbmNvZGVkKTsKLSAgSHVmZm1hblRyZWVfY2xlYW51cCgmdHJlZV9sbCk7Ci0gIEh1ZmZtYW5UcmVlX2NsZWFudXAoJnRyZWVfZCk7Ci0gIEh1ZmZtYW5UcmVlX2NsZWFudXAoJnRyZWVfY2wpOwotICB1aXZlY3Rvcl9jbGVhbnVwKCZmcmVxdWVuY2llc19sbCk7Ci0gIHVpdmVjdG9yX2NsZWFudXAoJmZyZXF1ZW5jaWVzX2QpOwotICB1aXZlY3Rvcl9jbGVhbnVwKCZmcmVxdWVuY2llc19jbCk7Ci0gIHVpdmVjdG9yX2NsZWFudXAoJmJpdGxlbl9sbGRfZSk7Ci0gIHVpdmVjdG9yX2NsZWFudXAoJmJpdGxlbl9sbGQpOwotICB1aXZlY3Rvcl9jbGVhbnVwKCZiaXRsZW5fY2wpOwotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGRlZmxhdGVGaXhlZCh1Y3ZlY3Rvciogb3V0LCBzaXplX3QqIGJwLCBIYXNoKiBoYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YXBvcywgc2l6ZV90IGRhdGFlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdDb21wcmVzc1NldHRpbmdzKiBzZXR0aW5ncywgdW5zaWduZWQgZmluYWwpIHsKLSAgSHVmZm1hblRyZWUgdHJlZV9sbDsgLyp0cmVlIGZvciBsaXRlcmFsIHZhbHVlcyBhbmQgbGVuZ3RoIGNvZGVzKi8KLSAgSHVmZm1hblRyZWUgdHJlZV9kOyAvKnRyZWUgZm9yIGRpc3RhbmNlIGNvZGVzKi8KLQotICB1bnNpZ25lZCBCRklOQUwgPSBmaW5hbDsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICBzaXplX3QgaTsKLQotICBIdWZmbWFuVHJlZV9pbml0KCZ0cmVlX2xsKTsKLSAgSHVmZm1hblRyZWVfaW5pdCgmdHJlZV9kKTsKLQotICBnZW5lcmF0ZUZpeGVkTGl0TGVuVHJlZSgmdHJlZV9sbCk7Ci0gIGdlbmVyYXRlRml4ZWREaXN0YW5jZVRyZWUoJnRyZWVfZCk7Ci0KLSAgYWRkQml0VG9TdHJlYW0oYnAsIG91dCwgQkZJTkFMKTsKLSAgYWRkQml0VG9TdHJlYW0oYnAsIG91dCwgMSk7IC8qZmlyc3QgYml0IG9mIEJUWVBFKi8KLSAgYWRkQml0VG9TdHJlYW0oYnAsIG91dCwgMCk7IC8qc2Vjb25kIGJpdCBvZiBCVFlQRSovCi0KLSAgaWYoc2V0dGluZ3MtPnVzZV9sejc3KSAvKkxaNzcgZW5jb2RlZCovIHsKLSAgICB1aXZlY3RvciBsejc3X2VuY29kZWQ7Ci0gICAgdWl2ZWN0b3JfaW5pdCgmbHo3N19lbmNvZGVkKTsKLSAgICBlcnJvciA9IGVuY29kZUxaNzcoJmx6NzdfZW5jb2RlZCwgaGFzaCwgZGF0YSwgZGF0YXBvcywgZGF0YWVuZCwgc2V0dGluZ3MtPndpbmRvd3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLT5taW5tYXRjaCwgc2V0dGluZ3MtPm5pY2VtYXRjaCwgc2V0dGluZ3MtPmxhenltYXRjaGluZyk7Ci0gICAgaWYoIWVycm9yKSB3cml0ZUxaNzdkYXRhKGJwLCBvdXQsICZsejc3X2VuY29kZWQsICZ0cmVlX2xsLCAmdHJlZV9kKTsKLSAgICB1aXZlY3Rvcl9jbGVhbnVwKCZsejc3X2VuY29kZWQpOwotICB9IGVsc2UgLypubyBMWjc3LCBidXQgc3RpbGwgd2lsbCBiZSBIdWZmbWFuIGNvbXByZXNzZWQqLyB7Ci0gICAgZm9yKGkgPSBkYXRhcG9zOyBpIDwgZGF0YWVuZDsgKytpKSB7Ci0gICAgICBhZGRIdWZmbWFuU3ltYm9sKGJwLCBvdXQsIEh1ZmZtYW5UcmVlX2dldENvZGUoJnRyZWVfbGwsIGRhdGFbaV0pLCBIdWZmbWFuVHJlZV9nZXRMZW5ndGgoJnRyZWVfbGwsIGRhdGFbaV0pKTsKLSAgICB9Ci0gIH0KLSAgLyphZGQgRU5EIGNvZGUqLwotICBpZighZXJyb3IpIGFkZEh1ZmZtYW5TeW1ib2woYnAsIG91dCwgSHVmZm1hblRyZWVfZ2V0Q29kZSgmdHJlZV9sbCwgMjU2KSwgSHVmZm1hblRyZWVfZ2V0TGVuZ3RoKCZ0cmVlX2xsLCAyNTYpKTsKLQotICAvKmNsZWFudXAqLwotICBIdWZmbWFuVHJlZV9jbGVhbnVwKCZ0cmVlX2xsKTsKLSAgSHVmZm1hblRyZWVfY2xlYW51cCgmdHJlZV9kKTsKLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb2RlcG5nX2RlZmxhdGV2KHVjdmVjdG9yKiBvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgc2l6ZV90IGksIGJsb2Nrc2l6ZSwgbnVtZGVmbGF0ZWJsb2NrczsKLSAgc2l6ZV90IGJwID0gMDsgLyp0aGUgYml0IHBvaW50ZXIqLwotICBIYXNoIGhhc2g7Ci0KLSAgaWYoc2V0dGluZ3MtPmJ0eXBlID4gMikgcmV0dXJuIDYxOwotICBlbHNlIGlmKHNldHRpbmdzLT5idHlwZSA9PSAwKSByZXR1cm4gZGVmbGF0ZU5vQ29tcHJlc3Npb24ob3V0LCBpbiwgaW5zaXplKTsKLSAgZWxzZSBpZihzZXR0aW5ncy0+YnR5cGUgPT0gMSkgYmxvY2tzaXplID0gaW5zaXplOwotICBlbHNlIC8qaWYoc2V0dGluZ3MtPmJ0eXBlID09IDIpKi8gewotICAgIC8qb24gUE5HcywgZGVmbGF0ZSBibG9ja3Mgb2YgNjUtMjYyayBzZWVtIHRvIGdpdmUgbW9zdCBkZW5zZSBlbmNvZGluZyovCi0gICAgYmxvY2tzaXplID0gaW5zaXplIC8gOCArIDg7Ci0gICAgaWYoYmxvY2tzaXplIDwgNjU1MzYpIGJsb2Nrc2l6ZSA9IDY1NTM2OwotICAgIGlmKGJsb2Nrc2l6ZSA+IDI2MjE0NCkgYmxvY2tzaXplID0gMjYyMTQ0OwotICB9Ci0KLSAgbnVtZGVmbGF0ZWJsb2NrcyA9IChpbnNpemUgKyBibG9ja3NpemUgLSAxKSAvIGJsb2Nrc2l6ZTsKLSAgaWYobnVtZGVmbGF0ZWJsb2NrcyA9PSAwKSBudW1kZWZsYXRlYmxvY2tzID0gMTsKLQotICBlcnJvciA9IGhhc2hfaW5pdCgmaGFzaCwgc2V0dGluZ3MtPndpbmRvd3NpemUpOwotICBpZihlcnJvcikgcmV0dXJuIGVycm9yOwotCi0gIGZvcihpID0gMDsgaSAhPSBudW1kZWZsYXRlYmxvY2tzICYmICFlcnJvcjsgKytpKSB7Ci0gICAgdW5zaWduZWQgZmluYWwgPSAoaSA9PSBudW1kZWZsYXRlYmxvY2tzIC0gMSk7Ci0gICAgc2l6ZV90IHN0YXJ0ID0gaSAqIGJsb2Nrc2l6ZTsKLSAgICBzaXplX3QgZW5kID0gc3RhcnQgKyBibG9ja3NpemU7Ci0gICAgaWYoZW5kID4gaW5zaXplKSBlbmQgPSBpbnNpemU7Ci0KLSAgICBpZihzZXR0aW5ncy0+YnR5cGUgPT0gMSkgZXJyb3IgPSBkZWZsYXRlRml4ZWQob3V0LCAmYnAsICZoYXNoLCBpbiwgc3RhcnQsIGVuZCwgc2V0dGluZ3MsIGZpbmFsKTsKLSAgICBlbHNlIGlmKHNldHRpbmdzLT5idHlwZSA9PSAyKSBlcnJvciA9IGRlZmxhdGVEeW5hbWljKG91dCwgJmJwLCAmaGFzaCwgaW4sIHN0YXJ0LCBlbmQsIHNldHRpbmdzLCBmaW5hbCk7Ci0gIH0KLQotICBoYXNoX2NsZWFudXAoJmhhc2gpOwotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotdW5zaWduZWQgbG9kZXBuZ19kZWZsYXRlKHVuc2lnbmVkIGNoYXIqKiBvdXQsIHNpemVfdCogb3V0c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgc2l6ZV90IGluc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyogc2V0dGluZ3MpIHsKLSAgdW5zaWduZWQgZXJyb3I7Ci0gIHVjdmVjdG9yIHY7Ci0gIHVjdmVjdG9yX2luaXRfYnVmZmVyKCZ2LCAqb3V0LCAqb3V0c2l6ZSk7Ci0gIGVycm9yID0gbG9kZXBuZ19kZWZsYXRldigmdiwgaW4sIGluc2l6ZSwgc2V0dGluZ3MpOwotICAqb3V0ID0gdi5kYXRhOwotICAqb3V0c2l6ZSA9IHYuc2l6ZTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdW5zaWduZWQgZGVmbGF0ZSh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgc2l6ZV90IGluc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdDb21wcmVzc1NldHRpbmdzKiBzZXR0aW5ncykgewotICBpZihzZXR0aW5ncy0+Y3VzdG9tX2RlZmxhdGUpIHsKLSAgICByZXR1cm4gc2V0dGluZ3MtPmN1c3RvbV9kZWZsYXRlKG91dCwgb3V0c2l6ZSwgaW4sIGluc2l6ZSwgc2V0dGluZ3MpOwotICB9IGVsc2UgewotICAgIHJldHVybiBsb2RlcG5nX2RlZmxhdGUob3V0LCBvdXRzaXplLCBpbiwgaW5zaXplLCBzZXR0aW5ncyk7Ci0gIH0KLX0KLQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RFQ09ERVIqLwotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLyBBZGxlcjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLXN0YXRpYyB1bnNpZ25lZCB1cGRhdGVfYWRsZXIzMih1bnNpZ25lZCBhZGxlciwgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgdW5zaWduZWQgbGVuKSB7Ci0gIHVuc2lnbmVkIHMxID0gYWRsZXIgJiAweGZmZmY7Ci0gIHVuc2lnbmVkIHMyID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKLQotICB3aGlsZShsZW4gPiAwKSB7Ci0gICAgLyphdCBsZWFzdCA1NTUyIHN1bXMgY2FuIGJlIGRvbmUgYmVmb3JlIHRoZSBzdW1zIG92ZXJmbG93LCBzYXZpbmcgYSBsb3Qgb2YgbW9kdWxlIGRpdmlzaW9ucyovCi0gICAgdW5zaWduZWQgYW1vdW50ID0gbGVuID4gNTU1MiA/IDU1NTIgOiBsZW47Ci0gICAgbGVuIC09IGFtb3VudDsKLSAgICB3aGlsZShhbW91bnQgPiAwKSB7Ci0gICAgICBzMSArPSAoKmRhdGErKyk7Ci0gICAgICBzMiArPSBzMTsKLSAgICAgIC0tYW1vdW50OwotICAgIH0KLSAgICBzMSAlPSA2NTUyMTsKLSAgICBzMiAlPSA2NTUyMTsKLSAgfQotCi0gIHJldHVybiAoczIgPDwgMTYpIHwgczE7Ci19Ci0KLS8qUmV0dXJuIHRoZSBhZGxlcjMyIG9mIHRoZSBieXRlcyBkYXRhWzAuLmxlbi0xXSovCi1zdGF0aWMgdW5zaWduZWQgYWRsZXIzMihjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCB1bnNpZ25lZCBsZW4pIHsKLSAgcmV0dXJuIHVwZGF0ZV9hZGxlcjMyKDFMLCBkYXRhLCBsZW4pOwotfQotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLyBabGliICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotCi11bnNpZ25lZCBsb2RlcG5nX3psaWJfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluc2l6ZSwgY29uc3QgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyogc2V0dGluZ3MpIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICB1bnNpZ25lZCBDTSwgQ0lORk8sIEZESUNUOwotCi0gIGlmKGluc2l6ZSA8IDIpIHJldHVybiA1MzsgLyplcnJvciwgc2l6ZSBvZiB6bGliIGRhdGEgdG9vIHNtYWxsKi8KLSAgLypyZWFkIGluZm9ybWF0aW9uIGZyb20gemxpYiBoZWFkZXIqLwotICBpZigoaW5bMF0gKiAyNTYgKyBpblsxXSkgJSAzMSAhPSAwKSB7Ci0gICAgLyplcnJvcjogMjU2ICogaW5bMF0gKyBpblsxXSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzEsIHRoZSBGQ0hFQ0sgdmFsdWUgaXMgc3VwcG9zZWQgdG8gYmUgbWFkZSB0aGF0IHdheSovCi0gICAgcmV0dXJuIDI0OwotICB9Ci0KLSAgQ00gPSBpblswXSAmIDE1OwotICBDSU5GTyA9IChpblswXSA+PiA0KSAmIDE1OwotICAvKkZDSEVDSyA9IGluWzFdICYgMzE7Ki8gLypGQ0hFQ0sgaXMgYWxyZWFkeSB0ZXN0ZWQgYWJvdmUqLwotICBGRElDVCA9IChpblsxXSA+PiA1KSAmIDE7Ci0gIC8qRkxFVkVMID0gKGluWzFdID4+IDYpICYgMzsqLyAvKkZMRVZFTCBpcyBub3QgdXNlZCBoZXJlKi8KLQotICBpZihDTSAhPSA4IHx8IENJTkZPID4gNykgewotICAgIC8qZXJyb3I6IG9ubHkgY29tcHJlc3Npb24gbWV0aG9kIDg6IGluZmxhdGUgd2l0aCBzbGlkaW5nIHdpbmRvdyBvZiAzMmsgaXMgc3VwcG9ydGVkIGJ5IHRoZSBQTkcgc3BlYyovCi0gICAgcmV0dXJuIDI1OwotICB9Ci0gIGlmKEZESUNUICE9IDApIHsKLSAgICAvKmVycm9yOiB0aGUgc3BlY2lmaWNhdGlvbiBvZiBQTkcgc2F5cyBhYm91dCB0aGUgemxpYiBzdHJlYW06Ci0gICAgICAiVGhlIGFkZGl0aW9uYWwgZmxhZ3Mgc2hhbGwgbm90IHNwZWNpZnkgYSBwcmVzZXQgZGljdGlvbmFyeS4iKi8KLSAgICByZXR1cm4gMjY7Ci0gIH0KLQotICBlcnJvciA9IGluZmxhdGUob3V0LCBvdXRzaXplLCBpbiArIDIsIGluc2l6ZSAtIDIsIHNldHRpbmdzKTsKLSAgaWYoZXJyb3IpIHJldHVybiBlcnJvcjsKLQotICBpZighc2V0dGluZ3MtPmlnbm9yZV9hZGxlcjMyKSB7Ci0gICAgdW5zaWduZWQgQURMRVIzMiA9IGxvZGVwbmdfcmVhZDMyYml0SW50KCZpbltpbnNpemUgLSA0XSk7Ci0gICAgdW5zaWduZWQgY2hlY2tzdW0gPSBhZGxlcjMyKCpvdXQsICh1bnNpZ25lZCkoKm91dHNpemUpKTsKLSAgICBpZihjaGVja3N1bSAhPSBBRExFUjMyKSByZXR1cm4gNTg7IC8qZXJyb3IsIGFkbGVyIGNoZWNrc3VtIG5vdCBjb3JyZWN0LCBkYXRhIG11c3QgYmUgY29ycnVwdGVkKi8KLSAgfQotCi0gIHJldHVybiAwOyAvKm5vIGVycm9yKi8KLX0KLQotc3RhdGljIHVuc2lnbmVkIHpsaWJfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5zaXplLCBjb25zdCBMb2RlUE5HRGVjb21wcmVzc1NldHRpbmdzKiBzZXR0aW5ncykgewotICBpZihzZXR0aW5ncy0+Y3VzdG9tX3psaWIpIHsKLSAgICByZXR1cm4gc2V0dGluZ3MtPmN1c3RvbV96bGliKG91dCwgb3V0c2l6ZSwgaW4sIGluc2l6ZSwgc2V0dGluZ3MpOwotICB9IGVsc2UgewotICAgIHJldHVybiBsb2RlcG5nX3psaWJfZGVjb21wcmVzcyhvdXQsIG91dHNpemUsIGluLCBpbnNpemUsIHNldHRpbmdzKTsKLSAgfQotfQotCi0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUgotCi11bnNpZ25lZCBsb2RlcG5nX3psaWJfY29tcHJlc3ModW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5zaXplLCBjb25zdCBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyogc2V0dGluZ3MpIHsKLSAgLyppbml0aWFsbHksICpvdXQgbXVzdCBiZSBOVUxMIGFuZCBvdXRzaXplIDAsIGlmIHlvdSBqdXN0IGdpdmUgc29tZSByYW5kb20gKm91dAotICB0aGF0J3MgcG9pbnRpbmcgdG8gYSBub24gYWxsb2NhdGVkIGJ1ZmZlciwgdGhpcydsbCBjcmFzaCovCi0gIHVjdmVjdG9yIG91dHY7Ci0gIHNpemVfdCBpOwotICB1bnNpZ25lZCBlcnJvcjsKLSAgdW5zaWduZWQgY2hhciogZGVmbGF0ZWRhdGEgPSAwOwotICBzaXplX3QgZGVmbGF0ZXNpemUgPSAwOwotCi0gIC8qemxpYiBkYXRhOiAxIGJ5dGUgQ01GIChDTStDSU5GTyksIDEgYnl0ZSBGTEcsIGRlZmxhdGUgZGF0YSwgNCBieXRlIEFETEVSMzIgY2hlY2tzdW0gb2YgdGhlIERlY29tcHJlc3NlZCBkYXRhKi8KLSAgdW5zaWduZWQgQ01GID0gMTIwOyAvKjBiMDExMTEwMDA6IENNIDgsIENJTkZPIDcuIFdpdGggQ0lORk8gNywgYW55IHdpbmRvdyBzaXplIHVwIHRvIDMyNzY4IGNhbiBiZSB1c2VkLiovCi0gIHVuc2lnbmVkIEZMRVZFTCA9IDA7Ci0gIHVuc2lnbmVkIEZESUNUID0gMDsKLSAgdW5zaWduZWQgQ01GRkxHID0gMjU2ICogQ01GICsgRkRJQ1QgKiAzMiArIEZMRVZFTCAqIDY0OwotICB1bnNpZ25lZCBGQ0hFQ0sgPSAzMSAtIENNRkZMRyAlIDMxOwotICBDTUZGTEcgKz0gRkNIRUNLOwotCi0gIC8qdWN2ZWN0b3ItY29udHJvbGxlZCB2ZXJzaW9uIG9mIHRoZSBvdXRwdXQgYnVmZmVyLCBmb3IgZHluYW1pYyBhcnJheSovCi0gIHVjdmVjdG9yX2luaXRfYnVmZmVyKCZvdXR2LCAqb3V0LCAqb3V0c2l6ZSk7Ci0KLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZvdXR2LCAodW5zaWduZWQgY2hhcikoQ01GRkxHID4+IDgpKTsKLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZvdXR2LCAodW5zaWduZWQgY2hhcikoQ01GRkxHICYgMjU1KSk7Ci0KLSAgZXJyb3IgPSBkZWZsYXRlKCZkZWZsYXRlZGF0YSwgJmRlZmxhdGVzaXplLCBpbiwgaW5zaXplLCBzZXR0aW5ncyk7Ci0KLSAgaWYoIWVycm9yKSB7Ci0gICAgdW5zaWduZWQgQURMRVIzMiA9IGFkbGVyMzIoaW4sICh1bnNpZ25lZClpbnNpemUpOwotICAgIGZvcihpID0gMDsgaSAhPSBkZWZsYXRlc2l6ZTsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJm91dHYsIGRlZmxhdGVkYXRhW2ldKTsKLSAgICBsb2RlcG5nX2ZyZWUoZGVmbGF0ZWRhdGEpOwotICAgIGxvZGVwbmdfYWRkMzJiaXRJbnQoJm91dHYsIEFETEVSMzIpOwotICB9Ci0KLSAgKm91dCA9IG91dHYuZGF0YTsKLSAgKm91dHNpemUgPSBvdXR2LnNpemU7Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0vKiBjb21wcmVzcyB1c2luZyB0aGUgZGVmYXVsdCBvciBjdXN0b20gemxpYiBmdW5jdGlvbiAqLwotc3RhdGljIHVuc2lnbmVkIHpsaWJfY29tcHJlc3ModW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbnNpemUsIGNvbnN0IExvZGVQTkdDb21wcmVzc1NldHRpbmdzKiBzZXR0aW5ncykgewotICBpZihzZXR0aW5ncy0+Y3VzdG9tX3psaWIpIHsKLSAgICByZXR1cm4gc2V0dGluZ3MtPmN1c3RvbV96bGliKG91dCwgb3V0c2l6ZSwgaW4sIGluc2l6ZSwgc2V0dGluZ3MpOwotICB9IGVsc2UgewotICAgIHJldHVybiBsb2RlcG5nX3psaWJfY29tcHJlc3Mob3V0LCBvdXRzaXplLCBpbiwgaW5zaXplLCBzZXR0aW5ncyk7Ci0gIH0KLX0KLQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotCi0jZWxzZSAvKm5vIExPREVQTkdfQ09NUElMRV9aTElCKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ERUNPREVSCi1zdGF0aWMgdW5zaWduZWQgemxpYl9kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIqKiBvdXQsIHNpemVfdCogb3V0c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbnNpemUsIGNvbnN0IExvZGVQTkdEZWNvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKSB7Ci0gIGlmKCFzZXR0aW5ncy0+Y3VzdG9tX3psaWIpIHJldHVybiA4NzsgLypubyBjdXN0b20gemxpYiBmdW5jdGlvbiBwcm92aWRlZCAqLwotICByZXR1cm4gc2V0dGluZ3MtPmN1c3RvbV96bGliKG91dCwgb3V0c2l6ZSwgaW4sIGluc2l6ZSwgc2V0dGluZ3MpOwotfQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RFQ09ERVIqLwotI2lmZGVmIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi1zdGF0aWMgdW5zaWduZWQgemxpYl9jb21wcmVzcyh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluc2l6ZSwgY29uc3QgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKSB7Ci0gIGlmKCFzZXR0aW5ncy0+Y3VzdG9tX3psaWIpIHJldHVybiA4NzsgLypubyBjdXN0b20gemxpYiBmdW5jdGlvbiBwcm92aWRlZCAqLwotICByZXR1cm4gc2V0dGluZ3MtPmN1c3RvbV96bGliKG91dCwgb3V0c2l6ZSwgaW4sIGluc2l6ZSwgc2V0dGluZ3MpOwotfQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotCi0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfWkxJQiovCi0KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUgotCi0vKnRoaXMgaXMgYSBnb29kIHRyYWRlb2ZmIGJldHdlZW4gc3BlZWQgYW5kIGNvbXByZXNzaW9uIHJhdGlvKi8KLSNkZWZpbmUgREVGQVVMVF9XSU5ET1dTSVpFIDIwNDgKLQotdm9pZCBsb2RlcG5nX2NvbXByZXNzX3NldHRpbmdzX2luaXQoTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKSB7Ci0gIC8qY29tcHJlc3Mgd2l0aCBkeW5hbWljIGh1ZmZtYW4gdHJlZSAobm90IGluIHRoZSBtYXRoZW1hdGljYWwgc2Vuc2UsIGp1c3Qgbm90IHRoZSBwcmVkZWZpbmVkIG9uZSkqLwotICBzZXR0aW5ncy0+YnR5cGUgPSAyOwotICBzZXR0aW5ncy0+dXNlX2x6NzcgPSAxOwotICBzZXR0aW5ncy0+d2luZG93c2l6ZSA9IERFRkFVTFRfV0lORE9XU0laRTsKLSAgc2V0dGluZ3MtPm1pbm1hdGNoID0gMzsKLSAgc2V0dGluZ3MtPm5pY2VtYXRjaCA9IDEyODsKLSAgc2V0dGluZ3MtPmxhenltYXRjaGluZyA9IDE7Ci0KLSAgc2V0dGluZ3MtPmN1c3RvbV96bGliID0gMDsKLSAgc2V0dGluZ3MtPmN1c3RvbV9kZWZsYXRlID0gMDsKLSAgc2V0dGluZ3MtPmN1c3RvbV9jb250ZXh0ID0gMDsKLX0KLQotY29uc3QgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MgbG9kZXBuZ19kZWZhdWx0X2NvbXByZXNzX3NldHRpbmdzID0gezIsIDEsIERFRkFVTFRfV0lORE9XU0laRSwgMywgMTI4LCAxLCAwLCAwLCAwfTsKLQotCi0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUiovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotCi12b2lkIGxvZGVwbmdfZGVjb21wcmVzc19zZXR0aW5nc19pbml0KExvZGVQTkdEZWNvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKSB7Ci0gIHNldHRpbmdzLT5pZ25vcmVfYWRsZXIzMiA9IDA7Ci0KLSAgc2V0dGluZ3MtPmN1c3RvbV96bGliID0gMDsKLSAgc2V0dGluZ3MtPmN1c3RvbV9pbmZsYXRlID0gMDsKLSAgc2V0dGluZ3MtPmN1c3RvbV9jb250ZXh0ID0gMDsKLX0KLQotY29uc3QgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyBsb2RlcG5nX2RlZmF1bHRfZGVjb21wcmVzc19zZXR0aW5ncyA9IHswLCAwLCAwLCAwfTsKLQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RFQ09ERVIqLwotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8vIEVuZCBvZiBabGliIHJlbGF0ZWQgY29kZS4gQmVnaW4gb2YgUE5HIHJlbGF0ZWQgY29kZS4gICAgICAgICAgICAgICAgIC8vICovCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9QTkcKLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8gQ1JDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICovCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi0KLSNpZm5kZWYgTE9ERVBOR19OT19DT01QSUxFX0NSQwotLyogQ1JDIHBvbHlub21pYWw6IDB4ZWRiODgzMjAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb2RlcG5nX2NyYzMyX3RhYmxlWzI1Nl0gPSB7Ci0gICAgICAgICAgIDB1LCAxOTk2OTU5ODk0dSwgMzk5MzkxOTc4OHUsIDI1Njc1MjQ3OTR1LCAgMTI0NjM0MTM3dSwgMTg4NjA1NzYxNXUsIDM5MTU2MjE2ODV1LCAyNjU3MzkyMDM1dSwKLSAgIDI0OTI2ODI3NHUsIDIwNDQ1MDgzMjR1LCAzNzcyMTE1MjMwdSwgMjU0NzE3Nzg2NHUsICAxNjI5NDE5OTV1LCAyMTI1NTYxMDIxdSwgMzg4NzYwNzA0N3UsIDI0Mjg0NDQwNDl1LAotICAgNDk4NTM2NTQ4dSwgMTc4OTkyNzY2NnUsIDQwODkwMTY2NDh1LCAyMjI3MDYxMjE0dSwgIDQ1MDU0ODg2MXUsIDE4NDMyNTg2MDN1LCA0MTA3NTgwNzUzdSwgMjIxMTY3NzYzOXUsCi0gICAzMjU4ODM5OTB1LCAxNjg0Nzc3MTUydSwgNDI1MTEyMjA0MnUsIDIzMjE5MjY2MzZ1LCAgMzM1NjMzNDg3dSwgMTY2MTM2NTQ2NXUsIDQxOTUzMDI3NTV1LCAyMzY2MTE1MzE3dSwKLSAgIDk5NzA3MzA5NnUsIDEyODE5NTM4ODZ1LCAzNTc5ODU1MzMydSwgMjcyNDY4ODI0MnUsIDEwMDY4ODgxNDV1LCAxMjU4NjA3Njg3dSwgMzUyNDEwMTYyOXUsIDI3Njg5NDI0NDN1LAotICAgOTAxMDk3NzIydSwgMTExOTAwMDY4NHUsIDM2ODY1MTcyMDZ1LCAyODk4MDY1NzI4dSwgIDg1MzA0NDQ1MXUsIDExNzIyNjYxMDF1LCAzNzA1MDE1NzU5dSwgMjg4MjYxNjY2NXUsCi0gICA2NTE3Njc5ODB1LCAxMzczNTAzNTQ2dSwgMzM2OTU1NDMwNHUsIDMyMTgxMDQ1OTh1LCAgNTY1NTA3MjUzdSwgMTQ1NDYyMTczMXUsIDM0ODUxMTE3MDV1LCAzMDk5NDM2MzAzdSwKLSAgIDY3MTI2Njk3NHUsIDE1OTQxOTgwMjR1LCAzMzIyNzMwOTMwdSwgMjk3MDM0NzgxMnUsICA3OTU4MzU1Mjd1LCAxNDgzMjMwMjI1dSwgMzI0NDM2NzI3NXUsIDMwNjAxNDk1NjV1LAotICAxOTk0MTQ2MTkydSwgICAzMTE1ODUzNHUsIDI1NjM5MDc3NzJ1LCA0MDIzNzE3OTMwdSwgMTkwNzQ1OTQ2NXUsICAxMTI2MzcyMTV1LCAyNjgwMTUzMjUzdSwgMzkwNDQyNzA1OXUsCi0gIDIwMTM3NzYyOTB1LCAgMjUxNzIyMDM2dSwgMjUxNzIxNTM3NHUsIDM3NzU4MzAwNDB1LCAyMTM3NjU2NzYzdSwgIDE0MTM3NjgxM3UsIDI0MzkyNzc3MTl1LCAzODY1MjcxMjk3dSwKLSAgMTgwMjE5NTQ0NHUsICA0NzY4NjQ4NjZ1LCAyMjM4MDAxMzY4dSwgNDA2NjUwODg3OHUsIDE4MTIzNzA5MjV1LCAgNDUzMDkyNzMxdSwgMjE4MTYyNTAyNXUsIDQxMTE0NTEyMjN1LAotICAxNzA2MDg4OTAydSwgIDMxNDA0MjcwNHUsIDIzNDQ1MzIyMDJ1LCA0MjQwMDE3NTMydSwgMTY1ODY1ODI3MXUsICAzNjY2MTk5Nzd1LCAyMzYyNjcwMzIzdSwgNDIyNDk5NDQwNXUsCi0gIDEzMDM1MzU5NjB1LCAgOTg0OTYxNDg2dSwgMjc0NzAwNzA5MnUsIDM1NjkwMzc1Mzh1LCAxMjU2MTcwODE3dSwgMTAzNzYwNDMxMXUsIDI3NjUyMTA3MzN1LCAzNTU0MDc5OTk1dSwKLSAgMTEzMTAxNDUwNnUsICA4Nzk2Nzk5OTZ1LCAyOTA5MjQzNDYydSwgMzY2Mzc3MTg1NnUsIDExNDExMjQ0Njd1LCAgODU1ODQyMjc3dSwgMjg1MjgwMTYzMXUsIDM3MDg2NDg2NDl1LAotICAxMzQyNTMzOTQ4dSwgIDY1NDQ1OTMwNnUsIDMxODgzOTYwNDh1LCAzMzczMDE1MTc0dSwgMTQ2NjQ3OTkwOXUsICA1NDQxNzk2MzV1LCAzMTEwNTIzOTEzdSwgMzQ2MjUyMjAxNXUsCi0gIDE1OTE2NzEwNTR1LCAgNzAyMTM4Nzc2dSwgMjk2NjQ2MDQ1MHUsIDMzNTI3OTk0MTJ1LCAxNTA0OTE4ODA3dSwgIDc4MzU1MTg3M3UsIDMwODI2NDA0NDN1LCAzMjMzNDQyOTg5dSwKLSAgMzk4ODI5MjM4NHUsIDI1OTYyNTQ2NDZ1LCAgIDYyMzE3MDY4dSwgMTk1NzgxMDg0MnUsIDM5Mzk4NDU5NDV1LCAyNjQ3ODE2MTExdSwgICA4MTQ3MDk5N3UsIDE5NDM4MDM1MjN1LAotICAzODE0OTE4OTMwdSwgMjQ4OTU5NjgwNHUsICAyMjUyNzQ0MzB1LCAyMDUzNzkwMzc2dSwgMzgyNjE3NTc1NXUsIDI0NjY5MDYwMTN1LCAgMTY3ODE2NzQzdSwgMjA5NzY1MTM3N3UsCi0gIDQwMjc1NTI1ODB1LCAyMjY1NDkwMzg2dSwgIDUwMzQ0NDA3MnUsIDE3NjIwNTA4MTR1LCA0MTUwNDE3MjQ1dSwgMjE1NDEyOTM1NXUsICA0MjY1MjIyMjV1LCAxODUyNTA3ODc5dSwKLSAgNDI3NTMxMzUyNnUsIDIzMTIzMTc5MjB1LCAgMjgyNzUzNjI2dSwgMTc0MjU1NTg1MnUsIDQxODk3MDgxNDN1LCAyMzk0ODc3OTQ1dSwgIDM5NzkxNzc2M3UsIDE2MjIxODM2Mzd1LAotICAzNjA0MzkwODg4dSwgMjcxNDg2NjU1OHUsICA5NTM3Mjk3MzJ1LCAxMzQwMDc2NjI2dSwgMzUxODcxOTk4NXUsIDI3OTczNjA5OTl1LCAxMDY4ODI4MzgxdSwgMTIxOTYzODg1OXUsCi0gIDM2MjQ3NDE4NTB1LCAyOTM2Njc1MTQ4dSwgIDkwNjE4NTQ2MnUsIDEwOTA4MTI1MTJ1LCAzNzQ3NjcyMDAzdSwgMjgyNTM3OTY2OXUsICA4MjkzMjkxMzV1LCAxMTgxMzM1MTYxdSwKLSAgMzQxMjE3NzgwNHUsIDMxNjA4MzQ4NDJ1LCAgNjI4MDg1NDA4dSwgMTM4MjYwNTM2NnUsIDM0MjMzNjkxMDl1LCAzMTM4MDc4NDY3dSwgIDU3MDU2MjIzM3UsIDE0MjY0MDA4MTV1LAotICAzMzE3MzE2NTQydSwgMjk5ODczMzYwOHUsICA3MzMyMzk5NTR1LCAxNTU1MjYxOTU2dSwgMzI2ODkzNTU5MXUsIDMwNTAzNjA2MjV1LCAgNzUyNDU5NDAzdSwgMTU0MTMyMDIyMXUsCi0gIDI2MDcwNzE5MjB1LCAzOTY1OTczMDMwdSwgMTk2OTkyMjk3MnUsICAgNDA3MzU0OTh1LCAyNjE3ODM3MjI1dSwgMzk0MzU3NzE1MXUsIDE5MTMwODc4Nzd1LCAgIDgzOTA4MzcxdSwKLSAgMjUxMjM0MTYzNHUsIDM4MDM3NDA2OTJ1LCAyMDc1MjA4NjIydSwgIDIxMzI2MTExMnUsIDI0NjMyNzI2MDN1LCAzODU1OTkwMjg1dSwgMjA5NDg1NDA3MXUsICAxOTg5NTg4ODF1LAotICAyMjYyMDI5MDEydSwgNDA1NzI2MDYxMHUsIDE3NTkzNTk5OTJ1LCAgNTM0NDE0MTkwdSwgMjE3NjcxODU0MXUsIDQxMzkzMjkxMTV1LCAxODczODM2MDAxdSwgIDQxNDY2NDU2N3UsCi0gIDIyODIyNDg5MzR1LCA0Mjc5MjAwMzY4dSwgMTcxMTY4NDU1NHUsICAyODUyODExMTZ1LCAyNDA1ODAxNzI3dSwgNDE2NzIxNjc0NXUsIDE2MzQ0Njc3OTV1LCAgMzc2MjI5NzAxdSwKLSAgMjY4NTA2Nzg5NnUsIDM2MDgwMDc0MDZ1LCAxMzA4OTE4NjEydSwgIDk1NjU0MzkzOHUsIDI4MDg1NTUxMDV1LCAzNDk1OTU4MjYzdSwgMTIzMTYzNjMwMXUsIDEwNDc0MjcwMzV1LAotICAyOTMyOTU5ODE4dSwgMzY1NDcwMzgzNnUsIDEwODgzNTkyNzB1LCAgOTM2OTE4MDAwdSwgMjg0NzcxNDg5OXUsIDM3MzY4Mzc4Mjl1LCAxMjAyOTAwODYzdSwgIDgxNzIzMzg5N3UsCi0gIDMxODMzNDIxMDh1LCAzNDAxMjM3MTMwdSwgMTQwNDI3NzU1MnUsICA2MTU4MTgxNTB1LCAzMTM0MjA3NDkzdSwgMzQ1MzQyMTIwM3UsIDE0MjM4NTc0NDl1LCAgNjAxNDUwNDMxdSwKLSAgMzAwOTgzNzYxNHUsIDMyOTQ3MTA0NTZ1LCAxNTY3MTAzNzQ2dSwgIDcxMTkyODcyNHUsIDMwMjA2Njg0NzF1LCAzMjcyMzgwMDY1dSwgMTUxMDMzNDIzNXUsICA3NTUxNjcxMTd1Ci19OwotCi0vKlJldHVybiB0aGUgQ1JDIG9mIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdLiovCi11bnNpZ25lZCBsb2RlcG5nX2NyYzMyKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKLSAgdW5zaWduZWQgciA9IDB4ZmZmZmZmZmZ1OwotICBzaXplX3QgaTsKLSAgZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICByID0gbG9kZXBuZ19jcmMzMl90YWJsZVsociBeIGRhdGFbaV0pICYgMHhmZl0gXiAociA+PiA4KTsKLSAgfQotICByZXR1cm4gciBeIDB4ZmZmZmZmZmZ1OwotfQotI2Vsc2UgLyogIUxPREVQTkdfTk9fQ09NUElMRV9DUkMgKi8KLXVuc2lnbmVkIGxvZGVwbmdfY3JjMzIoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0jZW5kaWYgLyogIUxPREVQTkdfTk9fQ09NUElMRV9DUkMgKi8KLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8gUmVhZGluZyBhbmQgd3JpdGluZyBzaW5nbGUgYml0cyBhbmQgYnl0ZXMgZnJvbS90byBzdHJlYW0gZm9yIExvZGVQTkcgICAvICovCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciByZWFkQml0RnJvbVJldmVyc2VkU3RyZWFtKHNpemVfdCogYml0cG9pbnRlciwgY29uc3QgdW5zaWduZWQgY2hhciogYml0c3RyZWFtKSB7Ci0gIHVuc2lnbmVkIGNoYXIgcmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIpKChiaXRzdHJlYW1bKCpiaXRwb2ludGVyKSA+PiAzXSA+PiAoNyAtICgoKmJpdHBvaW50ZXIpICYgMHg3KSkpICYgMSk7Ci0gICsrKCpiaXRwb2ludGVyKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIHJlYWRCaXRzRnJvbVJldmVyc2VkU3RyZWFtKHNpemVfdCogYml0cG9pbnRlciwgY29uc3QgdW5zaWduZWQgY2hhciogYml0c3RyZWFtLCBzaXplX3QgbmJpdHMpIHsKLSAgdW5zaWduZWQgcmVzdWx0ID0gMDsKLSAgc2l6ZV90IGk7Ci0gIGZvcihpID0gMCA7IGkgPCBuYml0czsgKytpKSB7Ci0gICAgcmVzdWx0IDw8PSAxOwotICAgIHJlc3VsdCB8PSAodW5zaWduZWQpcmVhZEJpdEZyb21SZXZlcnNlZFN0cmVhbShiaXRwb2ludGVyLCBiaXRzdHJlYW0pOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotc3RhdGljIHZvaWQgc2V0Qml0T2ZSZXZlcnNlZFN0cmVhbTAoc2l6ZV90KiBiaXRwb2ludGVyLCB1bnNpZ25lZCBjaGFyKiBiaXRzdHJlYW0sIHVuc2lnbmVkIGNoYXIgYml0KSB7Ci0gIC8qdGhlIGN1cnJlbnQgYml0IGluIGJpdHN0cmVhbSBtdXN0IGJlIDAgZm9yIHRoaXMgdG8gd29yayovCi0gIGlmKGJpdCkgewotICAgIC8qZWFybGllciBiaXQgb2YgaHVmZm1hbiBjb2RlIGlzIGluIGEgbGVzc2VyIHNpZ25pZmljYW50IGJpdCBvZiBhbiBlYXJsaWVyIGJ5dGUqLwotICAgIGJpdHN0cmVhbVsoKmJpdHBvaW50ZXIpID4+IDNdIHw9IChiaXQgPDwgKDcgLSAoKCpiaXRwb2ludGVyKSAmIDB4NykpKTsKLSAgfQotICArKygqYml0cG9pbnRlcik7Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiovCi0KLXN0YXRpYyB2b2lkIHNldEJpdE9mUmV2ZXJzZWRTdHJlYW0oc2l6ZV90KiBiaXRwb2ludGVyLCB1bnNpZ25lZCBjaGFyKiBiaXRzdHJlYW0sIHVuc2lnbmVkIGNoYXIgYml0KSB7Ci0gIC8qdGhlIGN1cnJlbnQgYml0IGluIGJpdHN0cmVhbSBtYXkgYmUgMCBvciAxIGZvciB0aGlzIHRvIHdvcmsqLwotICBpZihiaXQgPT0gMCkgYml0c3RyZWFtWygqYml0cG9pbnRlcikgPj4gM10gJj0gICh1bnNpZ25lZCBjaGFyKSh+KDEgPDwgKDcgLSAoKCpiaXRwb2ludGVyKSAmIDB4NykpKSk7Ci0gIGVsc2UgICAgICAgICBiaXRzdHJlYW1bKCpiaXRwb2ludGVyKSA+PiAzXSB8PSAgKDEgPDwgKDcgLSAoKCpiaXRwb2ludGVyKSAmIDB4NykpKTsKLSAgKysoKmJpdHBvaW50ZXIpOwotfQotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLyBQTkcgY2h1bmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLXVuc2lnbmVkIGxvZGVwbmdfY2h1bmtfbGVuZ3RoKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKSB7Ci0gIHJldHVybiBsb2RlcG5nX3JlYWQzMmJpdEludCgmY2h1bmtbMF0pOwotfQotCi12b2lkIGxvZGVwbmdfY2h1bmtfdHlwZShjaGFyIHR5cGVbNV0sIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKSB7Ci0gIHVuc2lnbmVkIGk7Ci0gIGZvcihpID0gMDsgaSAhPSA0OyArK2kpIHR5cGVbaV0gPSAoY2hhciljaHVua1s0ICsgaV07Ci0gIHR5cGVbNF0gPSAwOyAvKm51bGwgdGVybWluYXRpb24gY2hhciovCi19Ci0KLXVuc2lnbmVkIGNoYXIgbG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuaywgY29uc3QgY2hhciogdHlwZSkgewotICBpZihzdHJsZW4odHlwZSkgIT0gNCkgcmV0dXJuIDA7Ci0gIHJldHVybiAoY2h1bmtbNF0gPT0gdHlwZVswXSAmJiBjaHVua1s1XSA9PSB0eXBlWzFdICYmIGNodW5rWzZdID09IHR5cGVbMl0gJiYgY2h1bmtbN10gPT0gdHlwZVszXSk7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgbG9kZXBuZ19jaHVua19hbmNpbGxhcnkoY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspIHsKLSAgcmV0dXJuKChjaHVua1s0XSAmIDMyKSAhPSAwKTsKLX0KLQotdW5zaWduZWQgY2hhciBsb2RlcG5nX2NodW5rX3ByaXZhdGUoY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspIHsKLSAgcmV0dXJuKChjaHVua1s2XSAmIDMyKSAhPSAwKTsKLX0KLQotdW5zaWduZWQgY2hhciBsb2RlcG5nX2NodW5rX3NhZmV0b2NvcHkoY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspIHsKLSAgcmV0dXJuKChjaHVua1s3XSAmIDMyKSAhPSAwKTsKLX0KLQotdW5zaWduZWQgY2hhciogbG9kZXBuZ19jaHVua19kYXRhKHVuc2lnbmVkIGNoYXIqIGNodW5rKSB7Ci0gIHJldHVybiAmY2h1bmtbOF07Ci19Ci0KLWNvbnN0IHVuc2lnbmVkIGNoYXIqIGxvZGVwbmdfY2h1bmtfZGF0YV9jb25zdChjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuaykgewotICByZXR1cm4gJmNodW5rWzhdOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2NodW5rX2NoZWNrX2NyYyhjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuaykgewotICB1bnNpZ25lZCBsZW5ndGggPSBsb2RlcG5nX2NodW5rX2xlbmd0aChjaHVuayk7Ci0gIHVuc2lnbmVkIENSQyA9IGxvZGVwbmdfcmVhZDMyYml0SW50KCZjaHVua1tsZW5ndGggKyA4XSk7Ci0gIC8qdGhlIENSQyBpcyB0YWtlbiBvZiB0aGUgZGF0YSBhbmQgdGhlIDQgY2h1bmsgdHlwZSBsZXR0ZXJzLCBub3QgdGhlIGxlbmd0aCovCi0gIHVuc2lnbmVkIGNoZWNrc3VtID0gbG9kZXBuZ19jcmMzMigmY2h1bmtbNF0sIGxlbmd0aCArIDQpOwotICBpZihDUkMgIT0gY2hlY2tzdW0pIHJldHVybiAxOwotICBlbHNlIHJldHVybiAwOwotfQotCi12b2lkIGxvZGVwbmdfY2h1bmtfZ2VuZXJhdGVfY3JjKHVuc2lnbmVkIGNoYXIqIGNodW5rKSB7Ci0gIHVuc2lnbmVkIGxlbmd0aCA9IGxvZGVwbmdfY2h1bmtfbGVuZ3RoKGNodW5rKTsKLSAgdW5zaWduZWQgQ1JDID0gbG9kZXBuZ19jcmMzMigmY2h1bmtbNF0sIGxlbmd0aCArIDQpOwotICBsb2RlcG5nX3NldDMyYml0SW50KGNodW5rICsgOCArIGxlbmd0aCwgQ1JDKTsKLX0KLQotdW5zaWduZWQgY2hhciogbG9kZXBuZ19jaHVua19uZXh0KHVuc2lnbmVkIGNoYXIqIGNodW5rKSB7Ci0gIGlmKGNodW5rWzBdID09IDB4ODkgJiYgY2h1bmtbMV0gPT0gMHg1MCAmJiBjaHVua1syXSA9PSAweDRlICYmIGNodW5rWzNdID09IDB4NDcKLSAgICAmJiBjaHVua1s0XSA9PSAweDBkICYmIGNodW5rWzVdID09IDB4MGEgJiYgY2h1bmtbNl0gPT0gMHgxYSAmJiBjaHVua1s3XSA9PSAweDBhKSB7Ci0gICAgLyogSXMgUE5HIG1hZ2ljIGhlYWRlciBhdCBzdGFydCBvZiBQTkcgZmlsZS4gSnVtcCB0byBmaXJzdCBhY3R1YWwgY2h1bmsuICovCi0gICAgcmV0dXJuIGNodW5rICsgODsKLSAgfSBlbHNlIHsKLSAgICB1bnNpZ25lZCB0b3RhbF9jaHVua19sZW5ndGggPSBsb2RlcG5nX2NodW5rX2xlbmd0aChjaHVuaykgKyAxMjsKLSAgICByZXR1cm4gY2h1bmsgKyB0b3RhbF9jaHVua19sZW5ndGg7Ci0gIH0KLX0KLQotY29uc3QgdW5zaWduZWQgY2hhciogbG9kZXBuZ19jaHVua19uZXh0X2NvbnN0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKSB7Ci0gIGlmKGNodW5rWzBdID09IDB4ODkgJiYgY2h1bmtbMV0gPT0gMHg1MCAmJiBjaHVua1syXSA9PSAweDRlICYmIGNodW5rWzNdID09IDB4NDcKLSAgICAmJiBjaHVua1s0XSA9PSAweDBkICYmIGNodW5rWzVdID09IDB4MGEgJiYgY2h1bmtbNl0gPT0gMHgxYSAmJiBjaHVua1s3XSA9PSAweDBhKSB7Ci0gICAgLyogSXMgUE5HIG1hZ2ljIGhlYWRlciBhdCBzdGFydCBvZiBQTkcgZmlsZS4gSnVtcCB0byBmaXJzdCBhY3R1YWwgY2h1bmsuICovCi0gICAgcmV0dXJuIGNodW5rICsgODsKLSAgfSBlbHNlIHsKLSAgICB1bnNpZ25lZCB0b3RhbF9jaHVua19sZW5ndGggPSBsb2RlcG5nX2NodW5rX2xlbmd0aChjaHVuaykgKyAxMjsKLSAgICByZXR1cm4gY2h1bmsgKyB0b3RhbF9jaHVua19sZW5ndGg7Ci0gIH0KLX0KLQotdW5zaWduZWQgY2hhciogbG9kZXBuZ19jaHVua19maW5kKHVuc2lnbmVkIGNoYXIqIGNodW5rLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBlbmQsIGNvbnN0IGNoYXIgdHlwZVs1XSkgewotICBmb3IoOzspIHsKLSAgICBpZihjaHVuayArIDEyID49IGVuZCkgcmV0dXJuIDA7Ci0gICAgaWYobG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhjaHVuaywgdHlwZSkpIHJldHVybiBjaHVuazsKLSAgICBjaHVuayA9IGxvZGVwbmdfY2h1bmtfbmV4dChjaHVuayk7Ci0gIH0KLX0KLQotY29uc3QgdW5zaWduZWQgY2hhciogbG9kZXBuZ19jaHVua19maW5kX2NvbnN0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBlbmQsIGNvbnN0IGNoYXIgdHlwZVs1XSkgewotICBmb3IoOzspIHsKLSAgICBpZihjaHVuayArIDEyID49IGVuZCkgcmV0dXJuIDA7Ci0gICAgaWYobG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhjaHVuaywgdHlwZSkpIHJldHVybiBjaHVuazsKLSAgICBjaHVuayA9IGxvZGVwbmdfY2h1bmtfbmV4dF9jb25zdChjaHVuayk7Ci0gIH0KLX0KLQotdW5zaWduZWQgbG9kZXBuZ19jaHVua19hcHBlbmQodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRsZW5ndGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKSB7Ci0gIHVuc2lnbmVkIGk7Ci0gIHVuc2lnbmVkIHRvdGFsX2NodW5rX2xlbmd0aCA9IGxvZGVwbmdfY2h1bmtfbGVuZ3RoKGNodW5rKSArIDEyOwotICB1bnNpZ25lZCBjaGFyICpjaHVua19zdGFydCwgKm5ld19idWZmZXI7Ci0gIHNpemVfdCBuZXdfbGVuZ3RoID0gKCpvdXRsZW5ndGgpICsgdG90YWxfY2h1bmtfbGVuZ3RoOwotICBpZihuZXdfbGVuZ3RoIDwgdG90YWxfY2h1bmtfbGVuZ3RoIHx8IG5ld19sZW5ndGggPCAoKm91dGxlbmd0aCkpIHJldHVybiA3NzsgLyppbnRlZ2VyIG92ZXJmbG93IGhhcHBlbmVkKi8KLQotICBuZXdfYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKWxvZGVwbmdfcmVhbGxvYygqb3V0LCBuZXdfbGVuZ3RoKTsKLSAgaWYoIW5ld19idWZmZXIpIHJldHVybiA4MzsgLyphbGxvYyBmYWlsKi8KLSAgKCpvdXQpID0gbmV3X2J1ZmZlcjsKLSAgKCpvdXRsZW5ndGgpID0gbmV3X2xlbmd0aDsKLSAgY2h1bmtfc3RhcnQgPSAmKCpvdXQpW25ld19sZW5ndGggLSB0b3RhbF9jaHVua19sZW5ndGhdOwotCi0gIGZvcihpID0gMDsgaSAhPSB0b3RhbF9jaHVua19sZW5ndGg7ICsraSkgY2h1bmtfc3RhcnRbaV0gPSBjaHVua1tpXTsKLQotICByZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgbG9kZXBuZ19jaHVua19jcmVhdGUodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRsZW5ndGgsIHVuc2lnbmVkIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEpIHsKLSAgdW5zaWduZWQgaTsKLSAgdW5zaWduZWQgY2hhciAqY2h1bmssICpuZXdfYnVmZmVyOwotICBzaXplX3QgbmV3X2xlbmd0aCA9ICgqb3V0bGVuZ3RoKSArIGxlbmd0aCArIDEyOwotICBpZihuZXdfbGVuZ3RoIDwgbGVuZ3RoICsgMTIgfHwgbmV3X2xlbmd0aCA8ICgqb3V0bGVuZ3RoKSkgcmV0dXJuIDc3OyAvKmludGVnZXIgb3ZlcmZsb3cgaGFwcGVuZWQqLwotICBuZXdfYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKWxvZGVwbmdfcmVhbGxvYygqb3V0LCBuZXdfbGVuZ3RoKTsKLSAgaWYoIW5ld19idWZmZXIpIHJldHVybiA4MzsgLyphbGxvYyBmYWlsKi8KLSAgKCpvdXQpID0gbmV3X2J1ZmZlcjsKLSAgKCpvdXRsZW5ndGgpID0gbmV3X2xlbmd0aDsKLSAgY2h1bmsgPSAmKCpvdXQpWygqb3V0bGVuZ3RoKSAtIGxlbmd0aCAtIDEyXTsKLQotICAvKjE6IGxlbmd0aCovCi0gIGxvZGVwbmdfc2V0MzJiaXRJbnQoY2h1bmssICh1bnNpZ25lZClsZW5ndGgpOwotCi0gIC8qMjogY2h1bmsgbmFtZSAoNCBsZXR0ZXJzKSovCi0gIGNodW5rWzRdID0gKHVuc2lnbmVkIGNoYXIpdHlwZVswXTsKLSAgY2h1bmtbNV0gPSAodW5zaWduZWQgY2hhcil0eXBlWzFdOwotICBjaHVua1s2XSA9ICh1bnNpZ25lZCBjaGFyKXR5cGVbMl07Ci0gIGNodW5rWzddID0gKHVuc2lnbmVkIGNoYXIpdHlwZVszXTsKLQotICAvKjM6IHRoZSBkYXRhKi8KLSAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSBjaHVua1s4ICsgaV0gPSBkYXRhW2ldOwotCi0gIC8qNDogQ1JDIChvZiB0aGUgY2h1bmtuYW1lIGNoYXJhY3RlcnMgYW5kIHRoZSBkYXRhKSovCi0gIGxvZGVwbmdfY2h1bmtfZ2VuZXJhdGVfY3JjKGNodW5rKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLS8qIC8gQ29sb3IgdHlwZXMgYW5kIHN1Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICovCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi0vKnJldHVybiB0eXBlIGlzIGEgTG9kZVBORyBlcnJvciBjb2RlKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGVja0NvbG9yVmFsaWRpdHkoTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJkKSAvKmJkID0gYml0ZGVwdGgqLyB7Ci0gIHN3aXRjaChjb2xvcnR5cGUpIHsKLSAgICBjYXNlIDA6IGlmKCEoYmQgPT0gMSB8fCBiZCA9PSAyIHx8IGJkID09IDQgfHwgYmQgPT0gOCB8fCBiZCA9PSAxNikpIHJldHVybiAzNzsgYnJlYWs7IC8qZ3JheSovCi0gICAgY2FzZSAyOiBpZighKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkID09IDggfHwgYmQgPT0gMTYpKSByZXR1cm4gMzc7IGJyZWFrOyAvKlJHQiovCi0gICAgY2FzZSAzOiBpZighKGJkID09IDEgfHwgYmQgPT0gMiB8fCBiZCA9PSA0IHx8IGJkID09IDggICAgICAgICAgICApKSByZXR1cm4gMzc7IGJyZWFrOyAvKnBhbGV0dGUqLwotICAgIGNhc2UgNDogaWYoISggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZCA9PSA4IHx8IGJkID09IDE2KSkgcmV0dXJuIDM3OyBicmVhazsgLypncmF5ICsgYWxwaGEqLwotICAgIGNhc2UgNjogaWYoISggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZCA9PSA4IHx8IGJkID09IDE2KSkgcmV0dXJuIDM3OyBicmVhazsgLypSR0JBKi8KLSAgICBkZWZhdWx0OiByZXR1cm4gMzE7Ci0gIH0KLSAgcmV0dXJuIDA7IC8qYWxsb3dlZCBjb2xvciB0eXBlIC8gYml0cyBjb21iaW5hdGlvbiovCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBnZXROdW1Db2xvckNoYW5uZWxzKExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlKSB7Ci0gIHN3aXRjaChjb2xvcnR5cGUpIHsKLSAgICBjYXNlIDA6IHJldHVybiAxOyAvKmdyYXkqLwotICAgIGNhc2UgMjogcmV0dXJuIDM7IC8qUkdCKi8KLSAgICBjYXNlIDM6IHJldHVybiAxOyAvKnBhbGV0dGUqLwotICAgIGNhc2UgNDogcmV0dXJuIDI7IC8qZ3JheSArIGFscGhhKi8KLSAgICBjYXNlIDY6IHJldHVybiA0OyAvKlJHQkEqLwotICB9Ci0gIHJldHVybiAwOyAvKnVuZXhpc3RpbmcgY29sb3IgdHlwZSovCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb2RlcG5nX2dldF9icHBfbGN0KExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlLCB1bnNpZ25lZCBiaXRkZXB0aCkgewotICAvKmJpdHMgcGVyIHBpeGVsIGlzIGFtb3VudCBvZiBjaGFubmVscyAqIGJpdHMgcGVyIGNoYW5uZWwqLwotICByZXR1cm4gZ2V0TnVtQ29sb3JDaGFubmVscyhjb2xvcnR5cGUpICogYml0ZGVwdGg7Ci19Ci0KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLXZvaWQgbG9kZXBuZ19jb2xvcl9tb2RlX2luaXQoTG9kZVBOR0NvbG9yTW9kZSogaW5mbykgewotICBpbmZvLT5rZXlfZGVmaW5lZCA9IDA7Ci0gIGluZm8tPmtleV9yID0gaW5mby0+a2V5X2cgPSBpbmZvLT5rZXlfYiA9IDA7Ci0gIGluZm8tPmNvbG9ydHlwZSA9IExDVF9SR0JBOwotICBpbmZvLT5iaXRkZXB0aCA9IDg7Ci0gIGluZm8tPnBhbGV0dGUgPSAwOwotICBpbmZvLT5wYWxldHRlc2l6ZSA9IDA7Ci19Ci0KLXZvaWQgbG9kZXBuZ19jb2xvcl9tb2RlX2NsZWFudXAoTG9kZVBOR0NvbG9yTW9kZSogaW5mbykgewotICBsb2RlcG5nX3BhbGV0dGVfY2xlYXIoaW5mbyk7Ci19Ci0KLXVuc2lnbmVkIGxvZGVwbmdfY29sb3JfbW9kZV9jb3B5KExvZGVQTkdDb2xvck1vZGUqIGRlc3QsIGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIHNvdXJjZSkgewotICBzaXplX3QgaTsKLSAgbG9kZXBuZ19jb2xvcl9tb2RlX2NsZWFudXAoZGVzdCk7Ci0gICpkZXN0ID0gKnNvdXJjZTsKLSAgaWYoc291cmNlLT5wYWxldHRlKSB7Ci0gICAgZGVzdC0+cGFsZXR0ZSA9ICh1bnNpZ25lZCBjaGFyKilsb2RlcG5nX21hbGxvYygxMDI0KTsKLSAgICBpZighZGVzdC0+cGFsZXR0ZSAmJiBzb3VyY2UtPnBhbGV0dGVzaXplKSByZXR1cm4gODM7IC8qYWxsb2MgZmFpbCovCi0gICAgZm9yKGkgPSAwOyBpICE9IHNvdXJjZS0+cGFsZXR0ZXNpemUgKiA0OyArK2kpIGRlc3QtPnBhbGV0dGVbaV0gPSBzb3VyY2UtPnBhbGV0dGVbaV07Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLUxvZGVQTkdDb2xvck1vZGUgbG9kZXBuZ19jb2xvcl9tb2RlX21ha2UoTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJpdGRlcHRoKSB7Ci0gIExvZGVQTkdDb2xvck1vZGUgcmVzdWx0OwotICBsb2RlcG5nX2NvbG9yX21vZGVfaW5pdCgmcmVzdWx0KTsKLSAgcmVzdWx0LmNvbG9ydHlwZSA9IGNvbG9ydHlwZTsKLSAgcmVzdWx0LmJpdGRlcHRoID0gYml0ZGVwdGg7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbG9kZXBuZ19jb2xvcl9tb2RlX2VxdWFsKGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIGEsIGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIGIpIHsKLSAgc2l6ZV90IGk7Ci0gIGlmKGEtPmNvbG9ydHlwZSAhPSBiLT5jb2xvcnR5cGUpIHJldHVybiAwOwotICBpZihhLT5iaXRkZXB0aCAhPSBiLT5iaXRkZXB0aCkgcmV0dXJuIDA7Ci0gIGlmKGEtPmtleV9kZWZpbmVkICE9IGItPmtleV9kZWZpbmVkKSByZXR1cm4gMDsKLSAgaWYoYS0+a2V5X2RlZmluZWQpIHsKLSAgICBpZihhLT5rZXlfciAhPSBiLT5rZXlfcikgcmV0dXJuIDA7Ci0gICAgaWYoYS0+a2V5X2cgIT0gYi0+a2V5X2cpIHJldHVybiAwOwotICAgIGlmKGEtPmtleV9iICE9IGItPmtleV9iKSByZXR1cm4gMDsKLSAgfQotICBpZihhLT5wYWxldHRlc2l6ZSAhPSBiLT5wYWxldHRlc2l6ZSkgcmV0dXJuIDA7Ci0gIGZvcihpID0gMDsgaSAhPSBhLT5wYWxldHRlc2l6ZSAqIDQ7ICsraSkgewotICAgIGlmKGEtPnBhbGV0dGVbaV0gIT0gYi0+cGFsZXR0ZVtpXSkgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgbG9kZXBuZ19wYWxldHRlX2NsZWFyKExvZGVQTkdDb2xvck1vZGUqIGluZm8pIHsKLSAgaWYoaW5mby0+cGFsZXR0ZSkgbG9kZXBuZ19mcmVlKGluZm8tPnBhbGV0dGUpOwotICBpbmZvLT5wYWxldHRlID0gMDsKLSAgaW5mby0+cGFsZXR0ZXNpemUgPSAwOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX3BhbGV0dGVfYWRkKExvZGVQTkdDb2xvck1vZGUqIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgciwgdW5zaWduZWQgY2hhciBnLCB1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgYSkgewotICB1bnNpZ25lZCBjaGFyKiBkYXRhOwotICAvKnRoZSBzYW1lIHJlc2l6ZSB0ZWNobmlxdWUgYXMgQysrIHN0ZDo6dmVjdG9ycyBpcyB1c2VkLCBhbmQgaGVyZSBpdCdzIG1hZGUgc28gdGhhdCBmb3IgYSBwYWxldHRlIHdpdGgKLSAgdGhlIG1heCBvZiAyNTYgY29sb3JzLCBpdCdsbCBoYXZlIHRoZSBleGFjdCBhbGxvYyBzaXplKi8KLSAgaWYoIWluZm8tPnBhbGV0dGUpIC8qYWxsb2NhdGUgcGFsZXR0ZSBpZiBlbXB0eSovIHsKLSAgICAvKnJvb20gZm9yIDI1NiBjb2xvcnMgd2l0aCA0IGJ5dGVzIGVhY2gqLwotICAgIGRhdGEgPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19yZWFsbG9jKGluZm8tPnBhbGV0dGUsIDEwMjQpOwotICAgIGlmKCFkYXRhKSByZXR1cm4gODM7IC8qYWxsb2MgZmFpbCovCi0gICAgZWxzZSBpbmZvLT5wYWxldHRlID0gZGF0YTsKLSAgfQotICBpbmZvLT5wYWxldHRlWzQgKiBpbmZvLT5wYWxldHRlc2l6ZSArIDBdID0gcjsKLSAgaW5mby0+cGFsZXR0ZVs0ICogaW5mby0+cGFsZXR0ZXNpemUgKyAxXSA9IGc7Ci0gIGluZm8tPnBhbGV0dGVbNCAqIGluZm8tPnBhbGV0dGVzaXplICsgMl0gPSBiOwotICBpbmZvLT5wYWxldHRlWzQgKiBpbmZvLT5wYWxldHRlc2l6ZSArIDNdID0gYTsKLSAgKytpbmZvLT5wYWxldHRlc2l6ZTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qY2FsY3VsYXRlIGJpdHMgcGVyIHBpeGVsIG91dCBvZiBjb2xvcnR5cGUgYW5kIGJpdGRlcHRoKi8KLXVuc2lnbmVkIGxvZGVwbmdfZ2V0X2JwcChjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBpbmZvKSB7Ci0gIHJldHVybiBsb2RlcG5nX2dldF9icHBfbGN0KGluZm8tPmNvbG9ydHlwZSwgaW5mby0+Yml0ZGVwdGgpOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2dldF9jaGFubmVscyhjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBpbmZvKSB7Ci0gIHJldHVybiBnZXROdW1Db2xvckNoYW5uZWxzKGluZm8tPmNvbG9ydHlwZSk7Ci19Ci0KLXVuc2lnbmVkIGxvZGVwbmdfaXNfZ3JleXNjYWxlX3R5cGUoY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogaW5mbykgewotICByZXR1cm4gaW5mby0+Y29sb3J0eXBlID09IExDVF9HUkVZIHx8IGluZm8tPmNvbG9ydHlwZSA9PSBMQ1RfR1JFWV9BTFBIQTsKLX0KLQotdW5zaWduZWQgbG9kZXBuZ19pc19hbHBoYV90eXBlKGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIGluZm8pIHsKLSAgcmV0dXJuIChpbmZvLT5jb2xvcnR5cGUgJiA0KSAhPSAwOyAvKjQgb3IgNiovCi19Ci0KLXVuc2lnbmVkIGxvZGVwbmdfaXNfcGFsZXR0ZV90eXBlKGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIGluZm8pIHsKLSAgcmV0dXJuIGluZm8tPmNvbG9ydHlwZSA9PSBMQ1RfUEFMRVRURTsKLX0KLQotdW5zaWduZWQgbG9kZXBuZ19oYXNfcGFsZXR0ZV9hbHBoYShjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBpbmZvKSB7Ci0gIHNpemVfdCBpOwotICBmb3IoaSA9IDA7IGkgIT0gaW5mby0+cGFsZXR0ZXNpemU7ICsraSkgewotICAgIGlmKGluZm8tPnBhbGV0dGVbaSAqIDQgKyAzXSA8IDI1NSkgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGxvZGVwbmdfY2FuX2hhdmVfYWxwaGEoY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogaW5mbykgewotICByZXR1cm4gaW5mby0+a2V5X2RlZmluZWQKLSAgICAgIHx8IGxvZGVwbmdfaXNfYWxwaGFfdHlwZShpbmZvKQotICAgICAgfHwgbG9kZXBuZ19oYXNfcGFsZXR0ZV9hbHBoYShpbmZvKTsKLX0KLQotc2l6ZV90IGxvZGVwbmdfZ2V0X3Jhd19zaXplX2xjdCh1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLCBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSwgdW5zaWduZWQgYml0ZGVwdGgpIHsKLSAgc2l6ZV90IGJwcCA9IGxvZGVwbmdfZ2V0X2JwcF9sY3QoY29sb3J0eXBlLCBiaXRkZXB0aCk7Ci0gIHNpemVfdCBuID0gKHNpemVfdCl3ICogKHNpemVfdCloOwotICByZXR1cm4gKChuIC8gOCkgKiBicHApICsgKChuICYgNykgKiBicHAgKyA3KSAvIDg7Ci19Ci0KLXNpemVfdCBsb2RlcG5nX2dldF9yYXdfc2l6ZSh1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLCBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBjb2xvcikgewotICByZXR1cm4gbG9kZXBuZ19nZXRfcmF3X3NpemVfbGN0KHcsIGgsIGNvbG9yLT5jb2xvcnR5cGUsIGNvbG9yLT5iaXRkZXB0aCk7Ci19Ci0KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9QTkcKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotCi0vKmluIGFuIGlkYXQgY2h1bmssIGVhY2ggc2NhbmxpbmUgaXMgYSBtdWx0aXBsZSBvZiA4IGJpdHMsIHVubGlrZSB0aGUgbG9kZXBuZyBvdXRwdXQgYnVmZmVyLAotYW5kIGluIGFkZGl0aW9uIGhhcyBvbmUgZXh0cmEgYnl0ZSBwZXIgbGluZTogdGhlIGZpbHRlciBieXRlLiBTbyB0aGlzIGdpdmVzIGEgbGFyZ2VyCi1yZXN1bHQgdGhhbiBsb2RlcG5nX2dldF9yYXdfc2l6ZS4gKi8KLXN0YXRpYyBzaXplX3QgbG9kZXBuZ19nZXRfcmF3X3NpemVfaWRhdCh1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLCBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBjb2xvcikgewotICBzaXplX3QgYnBwID0gbG9kZXBuZ19nZXRfYnBwKGNvbG9yKTsKLSAgLyogKyAxIGZvciB0aGUgZmlsdGVyIGJ5dGUsIGFuZCBwb3NzaWJseSBwbHVzIHBhZGRpbmcgYml0cyBwZXIgbGluZSAqLwotICBzaXplX3QgbGluZSA9ICgoc2l6ZV90KSh3IC8gOCkgKiBicHApICsgMSArICgodyAmIDcpICogYnBwICsgNykgLyA4OwotICByZXR1cm4gKHNpemVfdCloICogbGluZTsKLX0KLQotLyogU2FmZWx5IGNoZWNrIGlmIG11bHRpcGx5aW5nIHR3byBpbnRlZ2VycyB3aWxsIG92ZXJmbG93IChubyB1bmRlZmluZWQKLWJlaGF2aW9yLCBjb21waWxlciByZW1vdmluZyB0aGUgY29kZSwgZXRjLi4uKSBhbmQgb3V0cHV0IHJlc3VsdC4gKi8KLXN0YXRpYyBpbnQgbG9kZXBuZ19tdWxvZmwoc2l6ZV90IGEsIHNpemVfdCBiLCBzaXplX3QqIHJlc3VsdCkgewotICAqcmVzdWx0ID0gYSAqIGI7IC8qIFVuc2lnbmVkIG11bHRpcGxpY2F0aW9uIGlzIHdlbGwgZGVmaW5lZCBhbmQgc2FmZSBpbiBDOTAgKi8KLSAgcmV0dXJuIChhICE9IDAgJiYgKnJlc3VsdCAvIGEgIT0gYik7Ci19Ci0KLS8qIFNhZmVseSBjaGVjayBpZiBhZGRpbmcgdHdvIGludGVnZXJzIHdpbGwgb3ZlcmZsb3cgKG5vIHVuZGVmaW5lZAotYmVoYXZpb3IsIGNvbXBpbGVyIHJlbW92aW5nIHRoZSBjb2RlLCBldGMuLi4pIGFuZCBvdXRwdXQgcmVzdWx0LiAqLwotc3RhdGljIGludCBsb2RlcG5nX2FkZG9mbChzaXplX3QgYSwgc2l6ZV90IGIsIHNpemVfdCogcmVzdWx0KSB7Ci0gICpyZXN1bHQgPSBhICsgYjsgLyogVW5zaWduZWQgYWRkaXRpb24gaXMgd2VsbCBkZWZpbmVkIGFuZCBzYWZlIGluIEM5MCAqLwotICByZXR1cm4gKnJlc3VsdCA8IGE7Ci19Ci0KLS8qU2FmZWx5IGNoZWNrcyB3aGV0aGVyIHNpemVfdCBvdmVyZmxvdyBjYW4gYmUgY2F1c2VkIGR1ZSB0byBhbW91bnQgb2YgcGl4ZWxzLgotVGhpcyBjaGVjayBpcyBvdmVyY2F1dGlvdXMgcmF0aGVyIHRoYW4gcHJlY2lzZS4gSWYgdGhpcyBjaGVjayBpbmRpY2F0ZXMgbm8gb3ZlcmZsb3csCi15b3UgY2FuIHNhZmVseSBjb21wdXRlIGluIGEgc2l6ZV90IChidXQgbm90IGFuIHVuc2lnbmVkKToKLS0oc2l6ZV90KXcgKiAoc2l6ZV90KWggKiA4Ci0tYW1vdW50IG9mIGJ5dGVzIGluIElEQVQgKGluY2x1ZGluZyBmaWx0ZXIsIHBhZGRpbmcgYW5kIEFkYW03IGJ5dGVzKQotLWFtb3VudCBvZiBieXRlcyBpbiByYXcgY29sb3IgbW9kZWwKLVJldHVybnMgMSBpZiBvdmVyZmxvdyBwb3NzaWJsZSwgMCBpZiBub3QuCi0qLwotc3RhdGljIGludCBsb2RlcG5nX3BpeGVsX292ZXJmbG93KHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogcG5nY29sb3IsIGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIHJhd2NvbG9yKSB7Ci0gIHNpemVfdCBicHAgPSBMT0RFUE5HX01BWChsb2RlcG5nX2dldF9icHAocG5nY29sb3IpLCBsb2RlcG5nX2dldF9icHAocmF3Y29sb3IpKTsKLSAgc2l6ZV90IG51bXBpeGVscywgdG90YWw7Ci0gIHNpemVfdCBsaW5lOyAvKiBieXRlcyBwZXIgbGluZSBpbiB3b3JzdCBjYXNlICovCi0KLSAgaWYobG9kZXBuZ19tdWxvZmwoKHNpemVfdCl3LCAoc2l6ZV90KWgsICZudW1waXhlbHMpKSByZXR1cm4gMTsKLSAgaWYobG9kZXBuZ19tdWxvZmwobnVtcGl4ZWxzLCA4LCAmdG90YWwpKSByZXR1cm4gMTsgLyogYml0IHBvaW50ZXIgd2l0aCA4LWJpdCBjb2xvciwgb3IgOCBieXRlcyBwZXIgY2hhbm5lbCBjb2xvciAqLwotCi0gIC8qIEJ5dGVzIHBlciBzY2FubGluZSB3aXRoIHRoZSBleHByZXNzaW9uICIodyAvIDgpICogYnBwKSArICgodyAmIDcpICogYnBwICsgNykgLyA4IiAqLwotICBpZihsb2RlcG5nX211bG9mbCgoc2l6ZV90KSh3IC8gOCksIGJwcCwgJmxpbmUpKSByZXR1cm4gMTsKLSAgaWYobG9kZXBuZ19hZGRvZmwobGluZSwgKCh3ICYgNykgKiBicHAgKyA3KSAvIDgsICZsaW5lKSkgcmV0dXJuIDE7Ci0KLSAgaWYobG9kZXBuZ19hZGRvZmwobGluZSwgNSwgJmxpbmUpKSByZXR1cm4gMTsgLyogNSBieXRlcyBvdmVyaGVhZCBwZXIgbGluZTogMSBmaWx0ZXJieXRlLCA0IGZvciBBZGFtNyB3b3JzdCBjYXNlICovCi0gIGlmKGxvZGVwbmdfbXVsb2ZsKGxpbmUsIGgsICZ0b3RhbCkpIHJldHVybiAxOyAvKiBUb3RhbCBieXRlcyBpbiB3b3JzdCBjYXNlICovCi0KLSAgcmV0dXJuIDA7IC8qIG5vIG92ZXJmbG93ICovCi19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiovCi0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfUE5HKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTCi0KLXN0YXRpYyB2b2lkIExvZGVQTkdVbmtub3duQ2h1bmtzX2luaXQoTG9kZVBOR0luZm8qIGluZm8pIHsKLSAgdW5zaWduZWQgaTsKLSAgZm9yKGkgPSAwOyBpICE9IDM7ICsraSkgaW5mby0+dW5rbm93bl9jaHVua3NfZGF0YVtpXSA9IDA7Ci0gIGZvcihpID0gMDsgaSAhPSAzOyArK2kpIGluZm8tPnVua25vd25fY2h1bmtzX3NpemVbaV0gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBMb2RlUE5HVW5rbm93bkNodW5rc19jbGVhbnVwKExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIHVuc2lnbmVkIGk7Ci0gIGZvcihpID0gMDsgaSAhPSAzOyArK2kpIGxvZGVwbmdfZnJlZShpbmZvLT51bmtub3duX2NodW5rc19kYXRhW2ldKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIExvZGVQTkdVbmtub3duQ2h1bmtzX2NvcHkoTG9kZVBOR0luZm8qIGRlc3QsIGNvbnN0IExvZGVQTkdJbmZvKiBzcmMpIHsKLSAgdW5zaWduZWQgaTsKLQotICBMb2RlUE5HVW5rbm93bkNodW5rc19jbGVhbnVwKGRlc3QpOwotCi0gIGZvcihpID0gMDsgaSAhPSAzOyArK2kpIHsKLSAgICBzaXplX3QgajsKLSAgICBkZXN0LT51bmtub3duX2NodW5rc19zaXplW2ldID0gc3JjLT51bmtub3duX2NodW5rc19zaXplW2ldOwotICAgIGRlc3QtPnVua25vd25fY2h1bmtzX2RhdGFbaV0gPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2Moc3JjLT51bmtub3duX2NodW5rc19zaXplW2ldKTsKLSAgICBpZighZGVzdC0+dW5rbm93bl9jaHVua3NfZGF0YVtpXSAmJiBkZXN0LT51bmtub3duX2NodW5rc19zaXplW2ldKSByZXR1cm4gODM7IC8qYWxsb2MgZmFpbCovCi0gICAgZm9yKGogPSAwOyBqIDwgc3JjLT51bmtub3duX2NodW5rc19zaXplW2ldOyArK2opIHsKLSAgICAgIGRlc3QtPnVua25vd25fY2h1bmtzX2RhdGFbaV1bal0gPSBzcmMtPnVua25vd25fY2h1bmtzX2RhdGFbaV1bal07Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIExvZGVQTkdUZXh0X2luaXQoTG9kZVBOR0luZm8qIGluZm8pIHsKLSAgaW5mby0+dGV4dF9udW0gPSAwOwotICBpbmZvLT50ZXh0X2tleXMgPSBOVUxMOwotICBpbmZvLT50ZXh0X3N0cmluZ3MgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBMb2RlUE5HVGV4dF9jbGVhbnVwKExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIHNpemVfdCBpOwotICBmb3IoaSA9IDA7IGkgIT0gaW5mby0+dGV4dF9udW07ICsraSkgewotICAgIHN0cmluZ19jbGVhbnVwKCZpbmZvLT50ZXh0X2tleXNbaV0pOwotICAgIHN0cmluZ19jbGVhbnVwKCZpbmZvLT50ZXh0X3N0cmluZ3NbaV0pOwotICB9Ci0gIGxvZGVwbmdfZnJlZShpbmZvLT50ZXh0X2tleXMpOwotICBsb2RlcG5nX2ZyZWUoaW5mby0+dGV4dF9zdHJpbmdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIExvZGVQTkdUZXh0X2NvcHkoTG9kZVBOR0luZm8qIGRlc3QsIGNvbnN0IExvZGVQTkdJbmZvKiBzb3VyY2UpIHsKLSAgc2l6ZV90IGkgPSAwOwotICBkZXN0LT50ZXh0X2tleXMgPSAwOwotICBkZXN0LT50ZXh0X3N0cmluZ3MgPSAwOwotICBkZXN0LT50ZXh0X251bSA9IDA7Ci0gIGZvcihpID0gMDsgaSAhPSBzb3VyY2UtPnRleHRfbnVtOyArK2kpIHsKLSAgICBDRVJST1JfVFJZX1JFVFVSTihsb2RlcG5nX2FkZF90ZXh0KGRlc3QsIHNvdXJjZS0+dGV4dF9rZXlzW2ldLCBzb3VyY2UtPnRleHRfc3RyaW5nc1tpXSkpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIGxvZGVwbmdfY2xlYXJfdGV4dChMb2RlUE5HSW5mbyogaW5mbykgewotICBMb2RlUE5HVGV4dF9jbGVhbnVwKGluZm8pOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2FkZF90ZXh0KExvZGVQTkdJbmZvKiBpbmZvLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHN0cikgewotICBjaGFyKiogbmV3X2tleXMgPSAoY2hhcioqKShsb2RlcG5nX3JlYWxsb2MoaW5mby0+dGV4dF9rZXlzLCBzaXplb2YoY2hhciopICogKGluZm8tPnRleHRfbnVtICsgMSkpKTsKLSAgY2hhcioqIG5ld19zdHJpbmdzID0gKGNoYXIqKikobG9kZXBuZ19yZWFsbG9jKGluZm8tPnRleHRfc3RyaW5ncywgc2l6ZW9mKGNoYXIqKSAqIChpbmZvLT50ZXh0X251bSArIDEpKSk7Ci0gIGlmKCFuZXdfa2V5cyB8fCAhbmV3X3N0cmluZ3MpIHsKLSAgICBsb2RlcG5nX2ZyZWUobmV3X2tleXMpOwotICAgIGxvZGVwbmdfZnJlZShuZXdfc3RyaW5ncyk7Ci0gICAgcmV0dXJuIDgzOyAvKmFsbG9jIGZhaWwqLwotICB9Ci0KLSAgKytpbmZvLT50ZXh0X251bTsKLSAgaW5mby0+dGV4dF9rZXlzID0gbmV3X2tleXM7Ci0gIGluZm8tPnRleHRfc3RyaW5ncyA9IG5ld19zdHJpbmdzOwotCi0gIGluZm8tPnRleHRfa2V5c1tpbmZvLT50ZXh0X251bSAtIDFdID0gYWxsb2Nfc3RyaW5nKGtleSk7Ci0gIGluZm8tPnRleHRfc3RyaW5nc1tpbmZvLT50ZXh0X251bSAtIDFdID0gYWxsb2Nfc3RyaW5nKHN0cik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIExvZGVQTkdJVGV4dF9pbml0KExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIGluZm8tPml0ZXh0X251bSA9IDA7Ci0gIGluZm8tPml0ZXh0X2tleXMgPSBOVUxMOwotICBpbmZvLT5pdGV4dF9sYW5ndGFncyA9IE5VTEw7Ci0gIGluZm8tPml0ZXh0X3RyYW5za2V5cyA9IE5VTEw7Ci0gIGluZm8tPml0ZXh0X3N0cmluZ3MgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBMb2RlUE5HSVRleHRfY2xlYW51cChMb2RlUE5HSW5mbyogaW5mbykgewotICBzaXplX3QgaTsKLSAgZm9yKGkgPSAwOyBpICE9IGluZm8tPml0ZXh0X251bTsgKytpKSB7Ci0gICAgc3RyaW5nX2NsZWFudXAoJmluZm8tPml0ZXh0X2tleXNbaV0pOwotICAgIHN0cmluZ19jbGVhbnVwKCZpbmZvLT5pdGV4dF9sYW5ndGFnc1tpXSk7Ci0gICAgc3RyaW5nX2NsZWFudXAoJmluZm8tPml0ZXh0X3RyYW5za2V5c1tpXSk7Ci0gICAgc3RyaW5nX2NsZWFudXAoJmluZm8tPml0ZXh0X3N0cmluZ3NbaV0pOwotICB9Ci0gIGxvZGVwbmdfZnJlZShpbmZvLT5pdGV4dF9rZXlzKTsKLSAgbG9kZXBuZ19mcmVlKGluZm8tPml0ZXh0X2xhbmd0YWdzKTsKLSAgbG9kZXBuZ19mcmVlKGluZm8tPml0ZXh0X3RyYW5za2V5cyk7Ci0gIGxvZGVwbmdfZnJlZShpbmZvLT5pdGV4dF9zdHJpbmdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIExvZGVQTkdJVGV4dF9jb3B5KExvZGVQTkdJbmZvKiBkZXN0LCBjb25zdCBMb2RlUE5HSW5mbyogc291cmNlKSB7Ci0gIHNpemVfdCBpID0gMDsKLSAgZGVzdC0+aXRleHRfa2V5cyA9IDA7Ci0gIGRlc3QtPml0ZXh0X2xhbmd0YWdzID0gMDsKLSAgZGVzdC0+aXRleHRfdHJhbnNrZXlzID0gMDsKLSAgZGVzdC0+aXRleHRfc3RyaW5ncyA9IDA7Ci0gIGRlc3QtPml0ZXh0X251bSA9IDA7Ci0gIGZvcihpID0gMDsgaSAhPSBzb3VyY2UtPml0ZXh0X251bTsgKytpKSB7Ci0gICAgQ0VSUk9SX1RSWV9SRVRVUk4obG9kZXBuZ19hZGRfaXRleHQoZGVzdCwgc291cmNlLT5pdGV4dF9rZXlzW2ldLCBzb3VyY2UtPml0ZXh0X2xhbmd0YWdzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+aXRleHRfdHJhbnNrZXlzW2ldLCBzb3VyY2UtPml0ZXh0X3N0cmluZ3NbaV0pKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBsb2RlcG5nX2NsZWFyX2l0ZXh0KExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIExvZGVQTkdJVGV4dF9jbGVhbnVwKGluZm8pOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2FkZF9pdGV4dChMb2RlUE5HSW5mbyogaW5mbywgY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiBsYW5ndGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHJhbnNrZXksIGNvbnN0IGNoYXIqIHN0cikgewotICBjaGFyKiogbmV3X2tleXMgPSAoY2hhcioqKShsb2RlcG5nX3JlYWxsb2MoaW5mby0+aXRleHRfa2V5cywgc2l6ZW9mKGNoYXIqKSAqIChpbmZvLT5pdGV4dF9udW0gKyAxKSkpOwotICBjaGFyKiogbmV3X2xhbmd0YWdzID0gKGNoYXIqKikobG9kZXBuZ19yZWFsbG9jKGluZm8tPml0ZXh0X2xhbmd0YWdzLCBzaXplb2YoY2hhciopICogKGluZm8tPml0ZXh0X251bSArIDEpKSk7Ci0gIGNoYXIqKiBuZXdfdHJhbnNrZXlzID0gKGNoYXIqKikobG9kZXBuZ19yZWFsbG9jKGluZm8tPml0ZXh0X3RyYW5za2V5cywgc2l6ZW9mKGNoYXIqKSAqIChpbmZvLT5pdGV4dF9udW0gKyAxKSkpOwotICBjaGFyKiogbmV3X3N0cmluZ3MgPSAoY2hhcioqKShsb2RlcG5nX3JlYWxsb2MoaW5mby0+aXRleHRfc3RyaW5ncywgc2l6ZW9mKGNoYXIqKSAqIChpbmZvLT5pdGV4dF9udW0gKyAxKSkpOwotICBpZighbmV3X2tleXMgfHwgIW5ld19sYW5ndGFncyB8fCAhbmV3X3RyYW5za2V5cyB8fCAhbmV3X3N0cmluZ3MpIHsKLSAgICBsb2RlcG5nX2ZyZWUobmV3X2tleXMpOwotICAgIGxvZGVwbmdfZnJlZShuZXdfbGFuZ3RhZ3MpOwotICAgIGxvZGVwbmdfZnJlZShuZXdfdHJhbnNrZXlzKTsKLSAgICBsb2RlcG5nX2ZyZWUobmV3X3N0cmluZ3MpOwotICAgIHJldHVybiA4MzsgLyphbGxvYyBmYWlsKi8KLSAgfQotCi0gICsraW5mby0+aXRleHRfbnVtOwotICBpbmZvLT5pdGV4dF9rZXlzID0gbmV3X2tleXM7Ci0gIGluZm8tPml0ZXh0X2xhbmd0YWdzID0gbmV3X2xhbmd0YWdzOwotICBpbmZvLT5pdGV4dF90cmFuc2tleXMgPSBuZXdfdHJhbnNrZXlzOwotICBpbmZvLT5pdGV4dF9zdHJpbmdzID0gbmV3X3N0cmluZ3M7Ci0KLSAgaW5mby0+aXRleHRfa2V5c1tpbmZvLT5pdGV4dF9udW0gLSAxXSA9IGFsbG9jX3N0cmluZyhrZXkpOwotICBpbmZvLT5pdGV4dF9sYW5ndGFnc1tpbmZvLT5pdGV4dF9udW0gLSAxXSA9IGFsbG9jX3N0cmluZyhsYW5ndGFnKTsKLSAgaW5mby0+aXRleHRfdHJhbnNrZXlzW2luZm8tPml0ZXh0X251bSAtIDFdID0gYWxsb2Nfc3RyaW5nKHRyYW5za2V5KTsKLSAgaW5mby0+aXRleHRfc3RyaW5nc1tpbmZvLT5pdGV4dF9udW0gLSAxXSA9IGFsbG9jX3N0cmluZyhzdHIpOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBzYW1lIGFzIHNldCBidXQgZG9lcyBub3QgZGVsZXRlICovCi1zdGF0aWMgdW5zaWduZWQgbG9kZXBuZ19hc3NpZ25faWNjKExvZGVQTkdJbmZvKiBpbmZvLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBwcm9maWxlLCB1bnNpZ25lZCBwcm9maWxlX3NpemUpIHsKLSAgaW5mby0+aWNjcF9uYW1lID0gYWxsb2Nfc3RyaW5nKG5hbWUpOwotICBpbmZvLT5pY2NwX3Byb2ZpbGUgPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2MocHJvZmlsZV9zaXplKTsKLQotICBpZighaW5mby0+aWNjcF9uYW1lIHx8ICFpbmZvLT5pY2NwX3Byb2ZpbGUpIHJldHVybiA4MzsgLyphbGxvYyBmYWlsKi8KLQotICBtZW1jcHkoaW5mby0+aWNjcF9wcm9maWxlLCBwcm9maWxlLCBwcm9maWxlX3NpemUpOwotICBpbmZvLT5pY2NwX3Byb2ZpbGVfc2l6ZSA9IHByb2ZpbGVfc2l6ZTsKLQotICByZXR1cm4gMDsgLypvayovCi19Ci0KLXVuc2lnbmVkIGxvZGVwbmdfc2V0X2ljYyhMb2RlUE5HSW5mbyogaW5mbywgY29uc3QgY2hhciogbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciogcHJvZmlsZSwgdW5zaWduZWQgcHJvZmlsZV9zaXplKSB7Ci0gIGlmKGluZm8tPmljY3BfbmFtZSkgbG9kZXBuZ19jbGVhcl9pY2MoaW5mbyk7Ci0gIGluZm8tPmljY3BfZGVmaW5lZCA9IDE7Ci0KLSAgcmV0dXJuIGxvZGVwbmdfYXNzaWduX2ljYyhpbmZvLCBuYW1lLCBwcm9maWxlLCBwcm9maWxlX3NpemUpOwotfQotCi12b2lkIGxvZGVwbmdfY2xlYXJfaWNjKExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIHN0cmluZ19jbGVhbnVwKCZpbmZvLT5pY2NwX25hbWUpOwotICBsb2RlcG5nX2ZyZWUoaW5mby0+aWNjcF9wcm9maWxlKTsKLSAgaW5mby0+aWNjcF9wcm9maWxlID0gTlVMTDsKLSAgaW5mby0+aWNjcF9wcm9maWxlX3NpemUgPSAwOwotICBpbmZvLT5pY2NwX2RlZmluZWQgPSAwOwotfQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MqLwotCi12b2lkIGxvZGVwbmdfaW5mb19pbml0KExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIGxvZGVwbmdfY29sb3JfbW9kZV9pbml0KCZpbmZvLT5jb2xvcik7Ci0gIGluZm8tPmludGVybGFjZV9tZXRob2QgPSAwOwotICBpbmZvLT5jb21wcmVzc2lvbl9tZXRob2QgPSAwOwotICBpbmZvLT5maWx0ZXJfbWV0aG9kID0gMDsKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotICBpbmZvLT5iYWNrZ3JvdW5kX2RlZmluZWQgPSAwOwotICBpbmZvLT5iYWNrZ3JvdW5kX3IgPSBpbmZvLT5iYWNrZ3JvdW5kX2cgPSBpbmZvLT5iYWNrZ3JvdW5kX2IgPSAwOwotCi0gIExvZGVQTkdUZXh0X2luaXQoaW5mbyk7Ci0gIExvZGVQTkdJVGV4dF9pbml0KGluZm8pOwotCi0gIGluZm8tPnRpbWVfZGVmaW5lZCA9IDA7Ci0gIGluZm8tPnBoeXNfZGVmaW5lZCA9IDA7Ci0KLSAgaW5mby0+Z2FtYV9kZWZpbmVkID0gMDsKLSAgaW5mby0+Y2hybV9kZWZpbmVkID0gMDsKLSAgaW5mby0+c3JnYl9kZWZpbmVkID0gMDsKLSAgaW5mby0+aWNjcF9kZWZpbmVkID0gMDsKLSAgaW5mby0+aWNjcF9uYW1lID0gTlVMTDsKLSAgaW5mby0+aWNjcF9wcm9maWxlID0gTlVMTDsKLQotICBMb2RlUE5HVW5rbm93bkNodW5rc19pbml0KGluZm8pOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MqLwotfQotCi12b2lkIGxvZGVwbmdfaW5mb19jbGVhbnVwKExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIGxvZGVwbmdfY29sb3JfbW9kZV9jbGVhbnVwKCZpbmZvLT5jb2xvcik7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgTG9kZVBOR1RleHRfY2xlYW51cChpbmZvKTsKLSAgTG9kZVBOR0lUZXh0X2NsZWFudXAoaW5mbyk7Ci0KLSAgbG9kZXBuZ19jbGVhcl9pY2MoaW5mbyk7Ci0KLSAgTG9kZVBOR1Vua25vd25DaHVua3NfY2xlYW51cChpbmZvKTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLX0KLQotdW5zaWduZWQgbG9kZXBuZ19pbmZvX2NvcHkoTG9kZVBOR0luZm8qIGRlc3QsIGNvbnN0IExvZGVQTkdJbmZvKiBzb3VyY2UpIHsKLSAgbG9kZXBuZ19pbmZvX2NsZWFudXAoZGVzdCk7Ci0gICpkZXN0ID0gKnNvdXJjZTsKLSAgbG9kZXBuZ19jb2xvcl9tb2RlX2luaXQoJmRlc3QtPmNvbG9yKTsKLSAgQ0VSUk9SX1RSWV9SRVRVUk4obG9kZXBuZ19jb2xvcl9tb2RlX2NvcHkoJmRlc3QtPmNvbG9yLCAmc291cmNlLT5jb2xvcikpOwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgQ0VSUk9SX1RSWV9SRVRVUk4oTG9kZVBOR1RleHRfY29weShkZXN0LCBzb3VyY2UpKTsKLSAgQ0VSUk9SX1RSWV9SRVRVUk4oTG9kZVBOR0lUZXh0X2NvcHkoZGVzdCwgc291cmNlKSk7Ci0gIGlmKHNvdXJjZS0+aWNjcF9kZWZpbmVkKSB7Ci0gICAgQ0VSUk9SX1RSWV9SRVRVUk4obG9kZXBuZ19hc3NpZ25faWNjKGRlc3QsIHNvdXJjZS0+aWNjcF9uYW1lLCBzb3VyY2UtPmljY3BfcHJvZmlsZSwgc291cmNlLT5pY2NwX3Byb2ZpbGVfc2l6ZSkpOwotICB9Ci0KLSAgTG9kZVBOR1Vua25vd25DaHVua3NfaW5pdChkZXN0KTsKLSAgQ0VSUk9SX1RSWV9SRVRVUk4oTG9kZVBOR1Vua25vd25DaHVua3NfY29weShkZXN0LCBzb3VyY2UpKTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLS8qaW5kZXg6IGJpdGdyb3VwIGluZGV4LCBiaXRzOiBiaXRncm91cCBzaXplKDEsIDIgb3IgNCksIGluOiBiaXRncm91cCB2YWx1ZSwgb3V0OiBvY3RldCBhcnJheSB0byBhZGQgYml0cyB0byovCi1zdGF0aWMgdm9pZCBhZGRDb2xvckJpdHModW5zaWduZWQgY2hhciogb3V0LCBzaXplX3QgaW5kZXgsIHVuc2lnbmVkIGJpdHMsIHVuc2lnbmVkIGluKSB7Ci0gIHVuc2lnbmVkIG0gPSBiaXRzID09IDEgPyA3IDogYml0cyA9PSAyID8gMyA6IDE7IC8qOCAvIGJpdHMgLSAxKi8KLSAgLypwID0gdGhlIHBhcnRpYWwgaW5kZXggaW4gdGhlIGJ5dGUsIGUuZy4gd2l0aCA0IHBhbGV0dGViaXRzIGl0IGlzIDAgZm9yIGZpcnN0IGhhbGYgb3IgMSBmb3Igc2Vjb25kIGhhbGYqLwotICB1bnNpZ25lZCBwID0gaW5kZXggJiBtOwotICBpbiAmPSAoMXUgPDwgYml0cykgLSAxdTsgLypmaWx0ZXIgb3V0IGFueSBvdGhlciBiaXRzIG9mIHRoZSBpbnB1dCB2YWx1ZSovCi0gIGluID0gaW4gPDwgKGJpdHMgKiAobSAtIHApKTsKLSAgaWYocCA9PSAwKSBvdXRbaW5kZXggKiBiaXRzIC8gOF0gPSBpbjsKLSAgZWxzZSBvdXRbaW5kZXggKiBiaXRzIC8gOF0gfD0gaW47Ci19Ci0KLXR5cGVkZWYgc3RydWN0IENvbG9yVHJlZSBDb2xvclRyZWU7Ci0KLS8qCi1PbmUgbm9kZSBvZiBhIGNvbG9yIHRyZWUKLVRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiB1bmlxdWUgY29sb3JzIGFuZCB0byBnZXQgYSBwYWxldHRlCi1pbmRleCBmb3IgYSBjb2xvci4gSXQncyBsaWtlIGFuIG9jdHJlZSwgYnV0IGJlY2F1c2UgdGhlIGFscGhhIGNoYW5uZWwgaXMgdXNlZCB0b28sIGVhY2gKLW5vZGUgaGFzIDE2IGluc3RlYWQgb2YgOCBjaGlsZHJlbi4KLSovCi1zdHJ1Y3QgQ29sb3JUcmVlIHsKLSAgQ29sb3JUcmVlKiBjaGlsZHJlblsxNl07IC8qdXAgdG8gMTYgcG9pbnRlcnMgdG8gQ29sb3JUcmVlIG9mIG5leHQgbGV2ZWwqLwotICBpbnQgaW5kZXg7IC8qdGhlIHBheWxvYWQuIE9ubHkgaGFzIGEgbWVhbmluZ2Z1bCB2YWx1ZSBpZiB0aGlzIGlzIGluIHRoZSBsYXN0IGxldmVsKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGNvbG9yX3RyZWVfaW5pdChDb2xvclRyZWUqIHRyZWUpIHsKLSAgaW50IGk7Ci0gIGZvcihpID0gMDsgaSAhPSAxNjsgKytpKSB0cmVlLT5jaGlsZHJlbltpXSA9IDA7Ci0gIHRyZWUtPmluZGV4ID0gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbG9yX3RyZWVfY2xlYW51cChDb2xvclRyZWUqIHRyZWUpIHsKLSAgaW50IGk7Ci0gIGZvcihpID0gMDsgaSAhPSAxNjsgKytpKSB7Ci0gICAgaWYodHJlZS0+Y2hpbGRyZW5baV0pIHsKLSAgICAgIGNvbG9yX3RyZWVfY2xlYW51cCh0cmVlLT5jaGlsZHJlbltpXSk7Ci0gICAgICBsb2RlcG5nX2ZyZWUodHJlZS0+Y2hpbGRyZW5baV0pOwotICAgIH0KLSAgfQotfQotCi0vKnJldHVybnMgLTEgaWYgY29sb3Igbm90IHByZXNlbnQsIGl0cyBpbmRleCBvdGhlcndpc2UqLwotc3RhdGljIGludCBjb2xvcl90cmVlX2dldChDb2xvclRyZWUqIHRyZWUsIHVuc2lnbmVkIGNoYXIgciwgdW5zaWduZWQgY2hhciBnLCB1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgYSkgewotICBpbnQgYml0ID0gMDsKLSAgZm9yKGJpdCA9IDA7IGJpdCA8IDg7ICsrYml0KSB7Ci0gICAgaW50IGkgPSA4ICogKChyID4+IGJpdCkgJiAxKSArIDQgKiAoKGcgPj4gYml0KSAmIDEpICsgMiAqICgoYiA+PiBiaXQpICYgMSkgKyAxICogKChhID4+IGJpdCkgJiAxKTsKLSAgICBpZighdHJlZS0+Y2hpbGRyZW5baV0pIHJldHVybiAtMTsKLSAgICBlbHNlIHRyZWUgPSB0cmVlLT5jaGlsZHJlbltpXTsKLSAgfQotICByZXR1cm4gdHJlZSA/IHRyZWUtPmluZGV4IDogLTE7Ci19Ci0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUgotc3RhdGljIGludCBjb2xvcl90cmVlX2hhcyhDb2xvclRyZWUqIHRyZWUsIHVuc2lnbmVkIGNoYXIgciwgdW5zaWduZWQgY2hhciBnLCB1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgYSkgewotICByZXR1cm4gY29sb3JfdHJlZV9nZXQodHJlZSwgciwgZywgYiwgYSkgPj0gMDsKLX0KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9FTkNPREVSKi8KLQotLypjb2xvciBpcyBub3QgYWxsb3dlZCB0byBhbHJlYWR5IGV4aXN0LgotSW5kZXggc2hvdWxkIGJlID49IDAgKGl0J3Mgc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB1c2luZyAtMSBmb3IgImRvZXNuJ3QgZXhpc3QiKSovCi1zdGF0aWMgdm9pZCBjb2xvcl90cmVlX2FkZChDb2xvclRyZWUqIHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHIsIHVuc2lnbmVkIGNoYXIgZywgdW5zaWduZWQgY2hhciBiLCB1bnNpZ25lZCBjaGFyIGEsIHVuc2lnbmVkIGluZGV4KSB7Ci0gIGludCBiaXQ7Ci0gIGZvcihiaXQgPSAwOyBiaXQgPCA4OyArK2JpdCkgewotICAgIGludCBpID0gOCAqICgociA+PiBiaXQpICYgMSkgKyA0ICogKChnID4+IGJpdCkgJiAxKSArIDIgKiAoKGIgPj4gYml0KSAmIDEpICsgMSAqICgoYSA+PiBiaXQpICYgMSk7Ci0gICAgaWYoIXRyZWUtPmNoaWxkcmVuW2ldKSB7Ci0gICAgICB0cmVlLT5jaGlsZHJlbltpXSA9IChDb2xvclRyZWUqKWxvZGVwbmdfbWFsbG9jKHNpemVvZihDb2xvclRyZWUpKTsKLSAgICAgIGNvbG9yX3RyZWVfaW5pdCh0cmVlLT5jaGlsZHJlbltpXSk7Ci0gICAgfQotICAgIHRyZWUgPSB0cmVlLT5jaGlsZHJlbltpXTsKLSAgfQotICB0cmVlLT5pbmRleCA9IChpbnQpaW5kZXg7Ci19Ci0KLS8qcHV0IGEgcGl4ZWwsIGdpdmVuIGl0cyBSR0JBIGNvbG9yLCBpbnRvIGltYWdlIG9mIGFueSBjb2xvciB0eXBlKi8KLXN0YXRpYyB1bnNpZ25lZCByZ2JhOFRvUGl4ZWwodW5zaWduZWQgY2hhciogb3V0LCBzaXplX3QgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogbW9kZSwgQ29sb3JUcmVlKiB0cmVlIC8qZm9yIHBhbGV0dGUqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciByLCB1bnNpZ25lZCBjaGFyIGcsIHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgY2hhciBhKSB7Ci0gIGlmKG1vZGUtPmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSkgewotICAgIHVuc2lnbmVkIGNoYXIgZ3JheSA9IHI7IC8qKCh1bnNpZ25lZCBzaG9ydClyICsgZyArIGIpIC8gMzsqLwotICAgIGlmKG1vZGUtPmJpdGRlcHRoID09IDgpIG91dFtpXSA9IGdyYXk7Ci0gICAgZWxzZSBpZihtb2RlLT5iaXRkZXB0aCA9PSAxNikgb3V0W2kgKiAyICsgMF0gPSBvdXRbaSAqIDIgKyAxXSA9IGdyYXk7Ci0gICAgZWxzZSB7Ci0gICAgICAvKnRha2UgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBncmF5Ki8KLSAgICAgIGdyYXkgPSAoZ3JheSA+PiAoOCAtIG1vZGUtPmJpdGRlcHRoKSkgJiAoKDEgPDwgbW9kZS0+Yml0ZGVwdGgpIC0gMSk7Ci0gICAgICBhZGRDb2xvckJpdHMob3V0LCBpLCBtb2RlLT5iaXRkZXB0aCwgZ3JheSk7Ci0gICAgfQotICB9IGVsc2UgaWYobW9kZS0+Y29sb3J0eXBlID09IExDVF9SR0IpIHsKLSAgICBpZihtb2RlLT5iaXRkZXB0aCA9PSA4KSB7Ci0gICAgICBvdXRbaSAqIDMgKyAwXSA9IHI7Ci0gICAgICBvdXRbaSAqIDMgKyAxXSA9IGc7Ci0gICAgICBvdXRbaSAqIDMgKyAyXSA9IGI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dFtpICogNiArIDBdID0gb3V0W2kgKiA2ICsgMV0gPSByOwotICAgICAgb3V0W2kgKiA2ICsgMl0gPSBvdXRbaSAqIDYgKyAzXSA9IGc7Ci0gICAgICBvdXRbaSAqIDYgKyA0XSA9IG91dFtpICogNiArIDVdID0gYjsKLSAgICB9Ci0gIH0gZWxzZSBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX1BBTEVUVEUpIHsKLSAgICBpbnQgaW5kZXggPSBjb2xvcl90cmVlX2dldCh0cmVlLCByLCBnLCBiLCBhKTsKLSAgICBpZihpbmRleCA8IDApIHJldHVybiA4MjsgLypjb2xvciBub3QgaW4gcGFsZXR0ZSovCi0gICAgaWYobW9kZS0+Yml0ZGVwdGggPT0gOCkgb3V0W2ldID0gaW5kZXg7Ci0gICAgZWxzZSBhZGRDb2xvckJpdHMob3V0LCBpLCBtb2RlLT5iaXRkZXB0aCwgKHVuc2lnbmVkKWluZGV4KTsKLSAgfSBlbHNlIGlmKG1vZGUtPmNvbG9ydHlwZSA9PSBMQ1RfR1JFWV9BTFBIQSkgewotICAgIHVuc2lnbmVkIGNoYXIgZ3JheSA9IHI7IC8qKCh1bnNpZ25lZCBzaG9ydClyICsgZyArIGIpIC8gMzsqLwotICAgIGlmKG1vZGUtPmJpdGRlcHRoID09IDgpIHsKLSAgICAgIG91dFtpICogMiArIDBdID0gZ3JheTsKLSAgICAgIG91dFtpICogMiArIDFdID0gYTsKLSAgICB9IGVsc2UgaWYobW9kZS0+Yml0ZGVwdGggPT0gMTYpIHsKLSAgICAgIG91dFtpICogNCArIDBdID0gb3V0W2kgKiA0ICsgMV0gPSBncmF5OwotICAgICAgb3V0W2kgKiA0ICsgMl0gPSBvdXRbaSAqIDQgKyAzXSA9IGE7Ci0gICAgfQotICB9IGVsc2UgaWYobW9kZS0+Y29sb3J0eXBlID09IExDVF9SR0JBKSB7Ci0gICAgaWYobW9kZS0+Yml0ZGVwdGggPT0gOCkgewotICAgICAgb3V0W2kgKiA0ICsgMF0gPSByOwotICAgICAgb3V0W2kgKiA0ICsgMV0gPSBnOwotICAgICAgb3V0W2kgKiA0ICsgMl0gPSBiOwotICAgICAgb3V0W2kgKiA0ICsgM10gPSBhOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRbaSAqIDggKyAwXSA9IG91dFtpICogOCArIDFdID0gcjsKLSAgICAgIG91dFtpICogOCArIDJdID0gb3V0W2kgKiA4ICsgM10gPSBnOwotICAgICAgb3V0W2kgKiA4ICsgNF0gPSBvdXRbaSAqIDggKyA1XSA9IGI7Ci0gICAgICBvdXRbaSAqIDggKyA2XSA9IG91dFtpICogOCArIDddID0gYTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsgLypubyBlcnJvciovCi19Ci0KLS8qcHV0IGEgcGl4ZWwsIGdpdmVuIGl0cyBSR0JBMTYgY29sb3IsIGludG8gaW1hZ2Ugb2YgYW55IGNvbG9yIDE2LWJpdGRlcHRoIHR5cGUqLwotc3RhdGljIHZvaWQgcmdiYTE2VG9QaXhlbCh1bnNpZ25lZCBjaGFyKiBvdXQsIHNpemVfdCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgciwgdW5zaWduZWQgc2hvcnQgZywgdW5zaWduZWQgc2hvcnQgYiwgdW5zaWduZWQgc2hvcnQgYSkgewotICBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX0dSRVkpIHsKLSAgICB1bnNpZ25lZCBzaG9ydCBncmF5ID0gcjsgLyooKHVuc2lnbmVkKXIgKyBnICsgYikgLyAzOyovCi0gICAgb3V0W2kgKiAyICsgMF0gPSAoZ3JheSA+PiA4KSAmIDI1NTsKLSAgICBvdXRbaSAqIDIgKyAxXSA9IGdyYXkgJiAyNTU7Ci0gIH0gZWxzZSBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX1JHQikgewotICAgIG91dFtpICogNiArIDBdID0gKHIgPj4gOCkgJiAyNTU7Ci0gICAgb3V0W2kgKiA2ICsgMV0gPSByICYgMjU1OwotICAgIG91dFtpICogNiArIDJdID0gKGcgPj4gOCkgJiAyNTU7Ci0gICAgb3V0W2kgKiA2ICsgM10gPSBnICYgMjU1OwotICAgIG91dFtpICogNiArIDRdID0gKGIgPj4gOCkgJiAyNTU7Ci0gICAgb3V0W2kgKiA2ICsgNV0gPSBiICYgMjU1OwotICB9IGVsc2UgaWYobW9kZS0+Y29sb3J0eXBlID09IExDVF9HUkVZX0FMUEhBKSB7Ci0gICAgdW5zaWduZWQgc2hvcnQgZ3JheSA9IHI7IC8qKCh1bnNpZ25lZClyICsgZyArIGIpIC8gMzsqLwotICAgIG91dFtpICogNCArIDBdID0gKGdyYXkgPj4gOCkgJiAyNTU7Ci0gICAgb3V0W2kgKiA0ICsgMV0gPSBncmF5ICYgMjU1OwotICAgIG91dFtpICogNCArIDJdID0gKGEgPj4gOCkgJiAyNTU7Ci0gICAgb3V0W2kgKiA0ICsgM10gPSBhICYgMjU1OwotICB9IGVsc2UgaWYobW9kZS0+Y29sb3J0eXBlID09IExDVF9SR0JBKSB7Ci0gICAgb3V0W2kgKiA4ICsgMF0gPSAociA+PiA4KSAmIDI1NTsKLSAgICBvdXRbaSAqIDggKyAxXSA9IHIgJiAyNTU7Ci0gICAgb3V0W2kgKiA4ICsgMl0gPSAoZyA+PiA4KSAmIDI1NTsKLSAgICBvdXRbaSAqIDggKyAzXSA9IGcgJiAyNTU7Ci0gICAgb3V0W2kgKiA4ICsgNF0gPSAoYiA+PiA4KSAmIDI1NTsKLSAgICBvdXRbaSAqIDggKyA1XSA9IGIgJiAyNTU7Ci0gICAgb3V0W2kgKiA4ICsgNl0gPSAoYSA+PiA4KSAmIDI1NTsKLSAgICBvdXRbaSAqIDggKyA3XSA9IGEgJiAyNTU7Ci0gIH0KLX0KLQotLypHZXQgUkdCQTggY29sb3Igb2YgcGl4ZWwgd2l0aCBpbmRleCBpICh5ICogd2lkdGggKyB4KSBmcm9tIHRoZSByYXcgaW1hZ2Ugd2l0aCBnaXZlbiBjb2xvciB0eXBlLiovCi1zdGF0aWMgdm9pZCBnZXRQaXhlbENvbG9yUkdCQTgodW5zaWduZWQgY2hhciogciwgdW5zaWduZWQgY2hhciogZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBiLCB1bnNpZ25lZCBjaGFyKiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBtb2RlKSB7Ci0gIGlmKG1vZGUtPmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSkgewotICAgIGlmKG1vZGUtPmJpdGRlcHRoID09IDgpIHsKLSAgICAgICpyID0gKmcgPSAqYiA9IGluW2ldOwotICAgICAgaWYobW9kZS0+a2V5X2RlZmluZWQgJiYgKnIgPT0gbW9kZS0+a2V5X3IpICphID0gMDsKLSAgICAgIGVsc2UgKmEgPSAyNTU7Ci0gICAgfSBlbHNlIGlmKG1vZGUtPmJpdGRlcHRoID09IDE2KSB7Ci0gICAgICAqciA9ICpnID0gKmIgPSBpbltpICogMiArIDBdOwotICAgICAgaWYobW9kZS0+a2V5X2RlZmluZWQgJiYgMjU2VSAqIGluW2kgKiAyICsgMF0gKyBpbltpICogMiArIDFdID09IG1vZGUtPmtleV9yKSAqYSA9IDA7Ci0gICAgICBlbHNlICphID0gMjU1OwotICAgIH0gZWxzZSB7Ci0gICAgICB1bnNpZ25lZCBoaWdoZXN0ID0gKCgxVSA8PCBtb2RlLT5iaXRkZXB0aCkgLSAxVSk7IC8qaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhpcyBiaXQgZGVwdGgqLwotICAgICAgc2l6ZV90IGogPSBpICogbW9kZS0+Yml0ZGVwdGg7Ci0gICAgICB1bnNpZ25lZCB2YWx1ZSA9IHJlYWRCaXRzRnJvbVJldmVyc2VkU3RyZWFtKCZqLCBpbiwgbW9kZS0+Yml0ZGVwdGgpOwotICAgICAgKnIgPSAqZyA9ICpiID0gKHZhbHVlICogMjU1KSAvIGhpZ2hlc3Q7Ci0gICAgICBpZihtb2RlLT5rZXlfZGVmaW5lZCAmJiB2YWx1ZSA9PSBtb2RlLT5rZXlfcikgKmEgPSAwOwotICAgICAgZWxzZSAqYSA9IDI1NTsKLSAgICB9Ci0gIH0gZWxzZSBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX1JHQikgewotICAgIGlmKG1vZGUtPmJpdGRlcHRoID09IDgpIHsKLSAgICAgICpyID0gaW5baSAqIDMgKyAwXTsgKmcgPSBpbltpICogMyArIDFdOyAqYiA9IGluW2kgKiAzICsgMl07Ci0gICAgICBpZihtb2RlLT5rZXlfZGVmaW5lZCAmJiAqciA9PSBtb2RlLT5rZXlfciAmJiAqZyA9PSBtb2RlLT5rZXlfZyAmJiAqYiA9PSBtb2RlLT5rZXlfYikgKmEgPSAwOwotICAgICAgZWxzZSAqYSA9IDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgKnIgPSBpbltpICogNiArIDBdOwotICAgICAgKmcgPSBpbltpICogNiArIDJdOwotICAgICAgKmIgPSBpbltpICogNiArIDRdOwotICAgICAgaWYobW9kZS0+a2V5X2RlZmluZWQgJiYgMjU2VSAqIGluW2kgKiA2ICsgMF0gKyBpbltpICogNiArIDFdID09IG1vZGUtPmtleV9yCi0gICAgICAgICAmJiAyNTZVICogaW5baSAqIDYgKyAyXSArIGluW2kgKiA2ICsgM10gPT0gbW9kZS0+a2V5X2cKLSAgICAgICAgICYmIDI1NlUgKiBpbltpICogNiArIDRdICsgaW5baSAqIDYgKyA1XSA9PSBtb2RlLT5rZXlfYikgKmEgPSAwOwotICAgICAgZWxzZSAqYSA9IDI1NTsKLSAgICB9Ci0gIH0gZWxzZSBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX1BBTEVUVEUpIHsKLSAgICB1bnNpZ25lZCBpbmRleDsKLSAgICBpZihtb2RlLT5iaXRkZXB0aCA9PSA4KSBpbmRleCA9IGluW2ldOwotICAgIGVsc2UgewotICAgICAgc2l6ZV90IGogPSBpICogbW9kZS0+Yml0ZGVwdGg7Ci0gICAgICBpbmRleCA9IHJlYWRCaXRzRnJvbVJldmVyc2VkU3RyZWFtKCZqLCBpbiwgbW9kZS0+Yml0ZGVwdGgpOwotICAgIH0KLQotICAgIGlmKGluZGV4ID49IG1vZGUtPnBhbGV0dGVzaXplKSB7Ci0gICAgICAvKlRoaXMgaXMgYW4gZXJyb3IgYWNjb3JkaW5nIHRvIHRoZSBQTkcgc3BlYywgYnV0IGNvbW1vbiBQTkcgZGVjb2RlcnMgbWFrZSBpdCBibGFjayBpbnN0ZWFkLgotICAgICAgRG9uZSBoZXJlIHRvbywgc2xpZ2h0bHkgZmFzdGVyIGR1ZSB0byBubyBlcnJvciBoYW5kbGluZyBuZWVkZWQuKi8KLSAgICAgICpyID0gKmcgPSAqYiA9IDA7Ci0gICAgICAqYSA9IDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgKnIgPSBtb2RlLT5wYWxldHRlW2luZGV4ICogNCArIDBdOwotICAgICAgKmcgPSBtb2RlLT5wYWxldHRlW2luZGV4ICogNCArIDFdOwotICAgICAgKmIgPSBtb2RlLT5wYWxldHRlW2luZGV4ICogNCArIDJdOwotICAgICAgKmEgPSBtb2RlLT5wYWxldHRlW2luZGV4ICogNCArIDNdOwotICAgIH0KLSAgfSBlbHNlIGlmKG1vZGUtPmNvbG9ydHlwZSA9PSBMQ1RfR1JFWV9BTFBIQSkgewotICAgIGlmKG1vZGUtPmJpdGRlcHRoID09IDgpIHsKLSAgICAgICpyID0gKmcgPSAqYiA9IGluW2kgKiAyICsgMF07Ci0gICAgICAqYSA9IGluW2kgKiAyICsgMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICpyID0gKmcgPSAqYiA9IGluW2kgKiA0ICsgMF07Ci0gICAgICAqYSA9IGluW2kgKiA0ICsgMl07Ci0gICAgfQotICB9IGVsc2UgaWYobW9kZS0+Y29sb3J0eXBlID09IExDVF9SR0JBKSB7Ci0gICAgaWYobW9kZS0+Yml0ZGVwdGggPT0gOCkgewotICAgICAgKnIgPSBpbltpICogNCArIDBdOwotICAgICAgKmcgPSBpbltpICogNCArIDFdOwotICAgICAgKmIgPSBpbltpICogNCArIDJdOwotICAgICAgKmEgPSBpbltpICogNCArIDNdOwotICAgIH0gZWxzZSB7Ci0gICAgICAqciA9IGluW2kgKiA4ICsgMF07Ci0gICAgICAqZyA9IGluW2kgKiA4ICsgMl07Ci0gICAgICAqYiA9IGluW2kgKiA4ICsgNF07Ci0gICAgICAqYSA9IGluW2kgKiA4ICsgNl07Ci0gICAgfQotICB9Ci19Ci0KLS8qU2ltaWxhciB0byBnZXRQaXhlbENvbG9yUkdCQTgsIGJ1dCB3aXRoIGFsbCB0aGUgZm9yIGxvb3BzIGluc2lkZSBvZiB0aGUgY29sb3IKLW1vZGUgdGVzdCBjYXNlcywgb3B0aW1pemVkIHRvIGNvbnZlcnQgdGhlIGNvbG9ycyBtdWNoIGZhc3Rlciwgd2hlbiBjb252ZXJ0aW5nCi10byBSR0JBIG9yIFJHQiB3aXRoIDggYml0IHBlciBjYW5uZWwuIGJ1ZmZlciBtdXN0IGJlIFJHQkEgb3IgUkdCIG91dHB1dCB3aXRoCi1lbm91Z2ggbWVtb3J5LCBpZiBoYXNfYWxwaGEgaXMgdHJ1ZSB0aGUgb3V0cHV0IGlzIFJHQkEuIG1vZGUgaGFzIHRoZSBjb2xvciBtb2RlCi1vZiB0aGUgaW5wdXQgYnVmZmVyLiovCi1zdGF0aWMgdm9pZCBnZXRQaXhlbENvbG9yc1JHQkE4KHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IG51bXBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGFzX2FscGhhLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogbW9kZSkgewotICB1bnNpZ25lZCBudW1fY2hhbm5lbHMgPSBoYXNfYWxwaGEgPyA0IDogMzsKLSAgc2l6ZV90IGk7Ci0gIGlmKG1vZGUtPmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSkgewotICAgIGlmKG1vZGUtPmJpdGRlcHRoID09IDgpIHsKLSAgICAgIGZvcihpID0gMDsgaSAhPSBudW1waXhlbHM7ICsraSwgYnVmZmVyICs9IG51bV9jaGFubmVscykgewotICAgICAgICBidWZmZXJbMF0gPSBidWZmZXJbMV0gPSBidWZmZXJbMl0gPSBpbltpXTsKLSAgICAgICAgaWYoaGFzX2FscGhhKSBidWZmZXJbM10gPSBtb2RlLT5rZXlfZGVmaW5lZCAmJiBpbltpXSA9PSBtb2RlLT5rZXlfciA/IDAgOiAyNTU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmKG1vZGUtPmJpdGRlcHRoID09IDE2KSB7Ci0gICAgICBmb3IoaSA9IDA7IGkgIT0gbnVtcGl4ZWxzOyArK2ksIGJ1ZmZlciArPSBudW1fY2hhbm5lbHMpIHsKLSAgICAgICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gYnVmZmVyWzJdID0gaW5baSAqIDJdOwotICAgICAgICBpZihoYXNfYWxwaGEpIGJ1ZmZlclszXSA9IG1vZGUtPmtleV9kZWZpbmVkICYmIDI1NlUgKiBpbltpICogMiArIDBdICsgaW5baSAqIDIgKyAxXSA9PSBtb2RlLT5rZXlfciA/IDAgOiAyNTU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVuc2lnbmVkIGhpZ2hlc3QgPSAoKDFVIDw8IG1vZGUtPmJpdGRlcHRoKSAtIDFVKTsgLypoaWdoZXN0IHBvc3NpYmxlIHZhbHVlIGZvciB0aGlzIGJpdCBkZXB0aCovCi0gICAgICBzaXplX3QgaiA9IDA7Ci0gICAgICBmb3IoaSA9IDA7IGkgIT0gbnVtcGl4ZWxzOyArK2ksIGJ1ZmZlciArPSBudW1fY2hhbm5lbHMpIHsKLSAgICAgICAgdW5zaWduZWQgdmFsdWUgPSByZWFkQml0c0Zyb21SZXZlcnNlZFN0cmVhbSgmaiwgaW4sIG1vZGUtPmJpdGRlcHRoKTsKLSAgICAgICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gYnVmZmVyWzJdID0gKHZhbHVlICogMjU1KSAvIGhpZ2hlc3Q7Ci0gICAgICAgIGlmKGhhc19hbHBoYSkgYnVmZmVyWzNdID0gbW9kZS0+a2V5X2RlZmluZWQgJiYgdmFsdWUgPT0gbW9kZS0+a2V5X3IgPyAwIDogMjU1OwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmKG1vZGUtPmNvbG9ydHlwZSA9PSBMQ1RfUkdCKSB7Ci0gICAgaWYobW9kZS0+Yml0ZGVwdGggPT0gOCkgewotICAgICAgZm9yKGkgPSAwOyBpICE9IG51bXBpeGVsczsgKytpLCBidWZmZXIgKz0gbnVtX2NoYW5uZWxzKSB7Ci0gICAgICAgIGJ1ZmZlclswXSA9IGluW2kgKiAzICsgMF07Ci0gICAgICAgIGJ1ZmZlclsxXSA9IGluW2kgKiAzICsgMV07Ci0gICAgICAgIGJ1ZmZlclsyXSA9IGluW2kgKiAzICsgMl07Ci0gICAgICAgIGlmKGhhc19hbHBoYSkgYnVmZmVyWzNdID0gbW9kZS0+a2V5X2RlZmluZWQgJiYgYnVmZmVyWzBdID09IG1vZGUtPmtleV9yCi0gICAgICAgICAgICYmIGJ1ZmZlclsxXT09IG1vZGUtPmtleV9nICYmIGJ1ZmZlclsyXSA9PSBtb2RlLT5rZXlfYiA/IDAgOiAyNTU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvcihpID0gMDsgaSAhPSBudW1waXhlbHM7ICsraSwgYnVmZmVyICs9IG51bV9jaGFubmVscykgewotICAgICAgICBidWZmZXJbMF0gPSBpbltpICogNiArIDBdOwotICAgICAgICBidWZmZXJbMV0gPSBpbltpICogNiArIDJdOwotICAgICAgICBidWZmZXJbMl0gPSBpbltpICogNiArIDRdOwotICAgICAgICBpZihoYXNfYWxwaGEpIGJ1ZmZlclszXSA9IG1vZGUtPmtleV9kZWZpbmVkCi0gICAgICAgICAgICYmIDI1NlUgKiBpbltpICogNiArIDBdICsgaW5baSAqIDYgKyAxXSA9PSBtb2RlLT5rZXlfcgotICAgICAgICAgICAmJiAyNTZVICogaW5baSAqIDYgKyAyXSArIGluW2kgKiA2ICsgM10gPT0gbW9kZS0+a2V5X2cKLSAgICAgICAgICAgJiYgMjU2VSAqIGluW2kgKiA2ICsgNF0gKyBpbltpICogNiArIDVdID09IG1vZGUtPmtleV9iID8gMCA6IDI1NTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX1BBTEVUVEUpIHsKLSAgICB1bnNpZ25lZCBpbmRleDsKLSAgICBzaXplX3QgaiA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpICE9IG51bXBpeGVsczsgKytpLCBidWZmZXIgKz0gbnVtX2NoYW5uZWxzKSB7Ci0gICAgICBpZihtb2RlLT5iaXRkZXB0aCA9PSA4KSBpbmRleCA9IGluW2ldOwotICAgICAgZWxzZSBpbmRleCA9IHJlYWRCaXRzRnJvbVJldmVyc2VkU3RyZWFtKCZqLCBpbiwgbW9kZS0+Yml0ZGVwdGgpOwotCi0gICAgICBpZihpbmRleCA+PSBtb2RlLT5wYWxldHRlc2l6ZSkgewotICAgICAgICAvKlRoaXMgaXMgYW4gZXJyb3IgYWNjb3JkaW5nIHRvIHRoZSBQTkcgc3BlYywgYnV0IG1vc3QgUE5HIGRlY29kZXJzIG1ha2UgaXQgYmxhY2sgaW5zdGVhZC4KLSAgICAgICAgRG9uZSBoZXJlIHRvbywgc2xpZ2h0bHkgZmFzdGVyIGR1ZSB0byBubyBlcnJvciBoYW5kbGluZyBuZWVkZWQuKi8KLSAgICAgICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gYnVmZmVyWzJdID0gMDsKLSAgICAgICAgaWYoaGFzX2FscGhhKSBidWZmZXJbM10gPSAyNTU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidWZmZXJbMF0gPSBtb2RlLT5wYWxldHRlW2luZGV4ICogNCArIDBdOwotICAgICAgICBidWZmZXJbMV0gPSBtb2RlLT5wYWxldHRlW2luZGV4ICogNCArIDFdOwotICAgICAgICBidWZmZXJbMl0gPSBtb2RlLT5wYWxldHRlW2luZGV4ICogNCArIDJdOwotICAgICAgICBpZihoYXNfYWxwaGEpIGJ1ZmZlclszXSA9IG1vZGUtPnBhbGV0dGVbaW5kZXggKiA0ICsgM107Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYobW9kZS0+Y29sb3J0eXBlID09IExDVF9HUkVZX0FMUEhBKSB7Ci0gICAgaWYobW9kZS0+Yml0ZGVwdGggPT0gOCkgewotICAgICAgZm9yKGkgPSAwOyBpICE9IG51bXBpeGVsczsgKytpLCBidWZmZXIgKz0gbnVtX2NoYW5uZWxzKSB7Ci0gICAgICAgIGJ1ZmZlclswXSA9IGJ1ZmZlclsxXSA9IGJ1ZmZlclsyXSA9IGluW2kgKiAyICsgMF07Ci0gICAgICAgIGlmKGhhc19hbHBoYSkgYnVmZmVyWzNdID0gaW5baSAqIDIgKyAxXTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZm9yKGkgPSAwOyBpICE9IG51bXBpeGVsczsgKytpLCBidWZmZXIgKz0gbnVtX2NoYW5uZWxzKSB7Ci0gICAgICAgIGJ1ZmZlclswXSA9IGJ1ZmZlclsxXSA9IGJ1ZmZlclsyXSA9IGluW2kgKiA0ICsgMF07Ci0gICAgICAgIGlmKGhhc19hbHBoYSkgYnVmZmVyWzNdID0gaW5baSAqIDQgKyAyXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX1JHQkEpIHsKLSAgICBpZihtb2RlLT5iaXRkZXB0aCA9PSA4KSB7Ci0gICAgICBmb3IoaSA9IDA7IGkgIT0gbnVtcGl4ZWxzOyArK2ksIGJ1ZmZlciArPSBudW1fY2hhbm5lbHMpIHsKLSAgICAgICAgYnVmZmVyWzBdID0gaW5baSAqIDQgKyAwXTsKLSAgICAgICAgYnVmZmVyWzFdID0gaW5baSAqIDQgKyAxXTsKLSAgICAgICAgYnVmZmVyWzJdID0gaW5baSAqIDQgKyAyXTsKLSAgICAgICAgaWYoaGFzX2FscGhhKSBidWZmZXJbM10gPSBpbltpICogNCArIDNdOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IoaSA9IDA7IGkgIT0gbnVtcGl4ZWxzOyArK2ksIGJ1ZmZlciArPSBudW1fY2hhbm5lbHMpIHsKLSAgICAgICAgYnVmZmVyWzBdID0gaW5baSAqIDggKyAwXTsKLSAgICAgICAgYnVmZmVyWzFdID0gaW5baSAqIDggKyAyXTsKLSAgICAgICAgYnVmZmVyWzJdID0gaW5baSAqIDggKyA0XTsKLSAgICAgICAgaWYoaGFzX2FscGhhKSBidWZmZXJbM10gPSBpbltpICogOCArIDZdOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKkdldCBSR0JBMTYgY29sb3Igb2YgcGl4ZWwgd2l0aCBpbmRleCBpICh5ICogd2lkdGggKyB4KSBmcm9tIHRoZSByYXcgaW1hZ2Ugd2l0aAotZ2l2ZW4gY29sb3IgdHlwZSwgYnV0IHRoZSBnaXZlbiBjb2xvciB0eXBlIG11c3QgYmUgMTYtYml0IGl0c2VsZi4qLwotc3RhdGljIHZvaWQgZ2V0UGl4ZWxDb2xvclJHQkExNih1bnNpZ25lZCBzaG9ydCogciwgdW5zaWduZWQgc2hvcnQqIGcsIHVuc2lnbmVkIHNob3J0KiBiLCB1bnNpZ25lZCBzaG9ydCogYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpLCBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBtb2RlKSB7Ci0gIGlmKG1vZGUtPmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSkgewotICAgICpyID0gKmcgPSAqYiA9IDI1NiAqIGluW2kgKiAyICsgMF0gKyBpbltpICogMiArIDFdOwotICAgIGlmKG1vZGUtPmtleV9kZWZpbmVkICYmIDI1NlUgKiBpbltpICogMiArIDBdICsgaW5baSAqIDIgKyAxXSA9PSBtb2RlLT5rZXlfcikgKmEgPSAwOwotICAgIGVsc2UgKmEgPSA2NTUzNTsKLSAgfSBlbHNlIGlmKG1vZGUtPmNvbG9ydHlwZSA9PSBMQ1RfUkdCKSB7Ci0gICAgKnIgPSAyNTZ1ICogaW5baSAqIDYgKyAwXSArIGluW2kgKiA2ICsgMV07Ci0gICAgKmcgPSAyNTZ1ICogaW5baSAqIDYgKyAyXSArIGluW2kgKiA2ICsgM107Ci0gICAgKmIgPSAyNTZ1ICogaW5baSAqIDYgKyA0XSArIGluW2kgKiA2ICsgNV07Ci0gICAgaWYobW9kZS0+a2V5X2RlZmluZWQKLSAgICAgICAmJiAyNTZ1ICogaW5baSAqIDYgKyAwXSArIGluW2kgKiA2ICsgMV0gPT0gbW9kZS0+a2V5X3IKLSAgICAgICAmJiAyNTZ1ICogaW5baSAqIDYgKyAyXSArIGluW2kgKiA2ICsgM10gPT0gbW9kZS0+a2V5X2cKLSAgICAgICAmJiAyNTZ1ICogaW5baSAqIDYgKyA0XSArIGluW2kgKiA2ICsgNV0gPT0gbW9kZS0+a2V5X2IpICphID0gMDsKLSAgICBlbHNlICphID0gNjU1MzU7Ci0gIH0gZWxzZSBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX0dSRVlfQUxQSEEpIHsKLSAgICAqciA9ICpnID0gKmIgPSAyNTZ1ICogaW5baSAqIDQgKyAwXSArIGluW2kgKiA0ICsgMV07Ci0gICAgKmEgPSAyNTZ1ICogaW5baSAqIDQgKyAyXSArIGluW2kgKiA0ICsgM107Ci0gIH0gZWxzZSBpZihtb2RlLT5jb2xvcnR5cGUgPT0gTENUX1JHQkEpIHsKLSAgICAqciA9IDI1NnUgKiBpbltpICogOCArIDBdICsgaW5baSAqIDggKyAxXTsKLSAgICAqZyA9IDI1NnUgKiBpbltpICogOCArIDJdICsgaW5baSAqIDggKyAzXTsKLSAgICAqYiA9IDI1NnUgKiBpbltpICogOCArIDRdICsgaW5baSAqIDggKyA1XTsKLSAgICAqYSA9IDI1NnUgKiBpbltpICogOCArIDZdICsgaW5baSAqIDggKyA3XTsKLSAgfQotfQotCi11bnNpZ25lZCBsb2RlcG5nX2NvbnZlcnQodW5zaWduZWQgY2hhciogb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBtb2RlX291dCwgY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogbW9kZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoKSB7Ci0gIHNpemVfdCBpOwotICBDb2xvclRyZWUgdHJlZTsKLSAgc2l6ZV90IG51bXBpeGVscyA9IChzaXplX3QpdyAqIChzaXplX3QpaDsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotCi0gIGlmKGxvZGVwbmdfY29sb3JfbW9kZV9lcXVhbChtb2RlX291dCwgbW9kZV9pbikpIHsKLSAgICBzaXplX3QgbnVtYnl0ZXMgPSBsb2RlcG5nX2dldF9yYXdfc2l6ZSh3LCBoLCBtb2RlX2luKTsKLSAgICBmb3IoaSA9IDA7IGkgIT0gbnVtYnl0ZXM7ICsraSkgb3V0W2ldID0gaW5baV07Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZihtb2RlX291dC0+Y29sb3J0eXBlID09IExDVF9QQUxFVFRFKSB7Ci0gICAgc2l6ZV90IHBhbGV0dGVzaXplID0gbW9kZV9vdXQtPnBhbGV0dGVzaXplOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBhbGV0dGUgPSBtb2RlX291dC0+cGFsZXR0ZTsKLSAgICBzaXplX3QgcGFsc2l6ZSA9IChzaXplX3QpMXUgPDwgbW9kZV9vdXQtPmJpdGRlcHRoOwotICAgIC8qaWYgdGhlIHVzZXIgc3BlY2lmaWVkIG91dHB1dCBwYWxldHRlIGJ1dCBkaWQgbm90IGdpdmUgdGhlIHZhbHVlcywgYXNzdW1lCi0gICAgdGhleSB3YW50IHRoZSB2YWx1ZXMgb2YgdGhlIGlucHV0IGNvbG9yIHR5cGUgKGFzc3VtaW5nIHRoYXQgb25lIGlzIHBhbGV0dGUpLgotICAgIE5vdGUgdGhhdCB3ZSBuZXZlciBjcmVhdGUgYSBuZXcgcGFsZXR0ZSBvdXJzZWx2ZXMuKi8KLSAgICBpZihwYWxldHRlc2l6ZSA9PSAwKSB7Ci0gICAgICBwYWxldHRlc2l6ZSA9IG1vZGVfaW4tPnBhbGV0dGVzaXplOwotICAgICAgcGFsZXR0ZSA9IG1vZGVfaW4tPnBhbGV0dGU7Ci0gICAgICAvKmlmIHRoZSBpbnB1dCB3YXMgYWxzbyBwYWxldHRlIHdpdGggc2FtZSBiaXRkZXB0aCwgdGhlbiB0aGUgY29sb3IgdHlwZXMgYXJlIGFsc28KLSAgICAgIGVxdWFsLCBzbyBjb3B5IGxpdGVyYWxseS4gVGhpcyB0byBwcmVzZXJ2ZSB0aGUgZXhhY3QgaW5kaWNlcyB0aGF0IHdlcmUgaW4gdGhlIFBORwotICAgICAgZXZlbiBpbiBjYXNlIHRoZXJlIGFyZSBkdXBsaWNhdGUgY29sb3JzIGluIHRoZSBwYWxldHRlLiovCi0gICAgICBpZiAobW9kZV9pbi0+Y29sb3J0eXBlID09IExDVF9QQUxFVFRFICYmIG1vZGVfaW4tPmJpdGRlcHRoID09IG1vZGVfb3V0LT5iaXRkZXB0aCkgewotICAgICAgICBzaXplX3QgbnVtYnl0ZXMgPSBsb2RlcG5nX2dldF9yYXdfc2l6ZSh3LCBoLCBtb2RlX2luKTsKLSAgICAgICAgZm9yKGkgPSAwOyBpICE9IG51bWJ5dGVzOyArK2kpIG91dFtpXSA9IGluW2ldOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYocGFsZXR0ZXNpemUgPCBwYWxzaXplKSBwYWxzaXplID0gcGFsZXR0ZXNpemU7Ci0gICAgY29sb3JfdHJlZV9pbml0KCZ0cmVlKTsKLSAgICBmb3IoaSA9IDA7IGkgIT0gcGFsc2l6ZTsgKytpKSB7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gJnBhbGV0dGVbaSAqIDRdOwotICAgICAgY29sb3JfdHJlZV9hZGQoJnRyZWUsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sICh1bnNpZ25lZClpKTsKLSAgICB9Ci0gIH0KLQotICBpZihtb2RlX2luLT5iaXRkZXB0aCA9PSAxNiAmJiBtb2RlX291dC0+Yml0ZGVwdGggPT0gMTYpIHsKLSAgICBmb3IoaSA9IDA7IGkgIT0gbnVtcGl4ZWxzOyArK2kpIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOwotICAgICAgZ2V0UGl4ZWxDb2xvclJHQkExNigmciwgJmcsICZiLCAmYSwgaW4sIGksIG1vZGVfaW4pOwotICAgICAgcmdiYTE2VG9QaXhlbChvdXQsIGksIG1vZGVfb3V0LCByLCBnLCBiLCBhKTsKLSAgICB9Ci0gIH0gZWxzZSBpZihtb2RlX291dC0+Yml0ZGVwdGggPT0gOCAmJiBtb2RlX291dC0+Y29sb3J0eXBlID09IExDVF9SR0JBKSB7Ci0gICAgZ2V0UGl4ZWxDb2xvcnNSR0JBOChvdXQsIG51bXBpeGVscywgMSwgaW4sIG1vZGVfaW4pOwotICB9IGVsc2UgaWYobW9kZV9vdXQtPmJpdGRlcHRoID09IDggJiYgbW9kZV9vdXQtPmNvbG9ydHlwZSA9PSBMQ1RfUkdCKSB7Ci0gICAgZ2V0UGl4ZWxDb2xvcnNSR0JBOChvdXQsIG51bXBpeGVscywgMCwgaW4sIG1vZGVfaW4pOwotICB9IGVsc2UgewotICAgIHVuc2lnbmVkIGNoYXIgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpICE9IG51bXBpeGVsczsgKytpKSB7Ci0gICAgICBnZXRQaXhlbENvbG9yUkdCQTgoJnIsICZnLCAmYiwgJmEsIGluLCBpLCBtb2RlX2luKTsKLSAgICAgIGVycm9yID0gcmdiYThUb1BpeGVsKG91dCwgaSwgbW9kZV9vdXQsICZ0cmVlLCByLCBnLCBiLCBhKTsKLSAgICAgIGlmIChlcnJvcikgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYobW9kZV9vdXQtPmNvbG9ydHlwZSA9PSBMQ1RfUEFMRVRURSkgewotICAgIGNvbG9yX3RyZWVfY2xlYW51cCgmdHJlZSk7Ci0gIH0KLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLQotLyogQ29udmVydHMgYSBzaW5nbGUgcmdiIGNvbG9yIHdpdGhvdXQgYWxwaGEgZnJvbSBvbmUgdHlwZSB0byBhbm90aGVyLCBjb2xvciBiaXRzIHRydW5jYXRlZCB0bwotdGhlaXIgYml0ZGVwdGguIEluIGNhc2Ugb2Ygc2luZ2xlIGNoYW5uZWwgKGdyYXkgb3IgcGFsZXR0ZSksIG9ubHkgdGhlIHIgY2hhbm5lbCBpcyB1c2VkLiBTbG93Ci1mdW5jdGlvbiwgZG8gbm90IHVzZSB0byBwcm9jZXNzIGFsbCBwaXhlbHMgb2YgYW4gaW1hZ2UuIEFscGhhIGNoYW5uZWwgbm90IHN1cHBvcnRlZCBvbiBwdXJwb3NlOgotdGhpcyBpcyBmb3IgYktHRCwgc3VwcG9ydGluZyBhbHBoYSBtYXkgcHJldmVudCBpdCBmcm9tIGZpbmRpbmcgYSBjb2xvciBpbiB0aGUgcGFsZXR0ZSwgZnJvbSB0aGUKLXNwZWNpZmljYXRpb24gaXQgbG9va3MgbGlrZSBiS0dEIHNob3VsZCBpZ25vcmUgdGhlIGFscGhhIHZhbHVlcyBvZiB0aGUgcGFsZXR0ZSBzaW5jZSBpdCBjYW4gdXNlCi1hbnkgcGFsZXR0ZSBpbmRleCBidXQgZG9lc24ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwuIElkZW0gd2l0aCBpZ25vcmluZyBjb2xvciBrZXkuICovCi11bnNpZ25lZCBsb2RlcG5nX2NvbnZlcnRfcmdiKAotICAgIHVuc2lnbmVkKiByX291dCwgdW5zaWduZWQqIGdfb3V0LCB1bnNpZ25lZCogYl9vdXQsCi0gICAgdW5zaWduZWQgcl9pbiwgdW5zaWduZWQgZ19pbiwgdW5zaWduZWQgYl9pbiwKLSAgICBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBtb2RlX291dCwgY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogbW9kZV9pbikgewotICB1bnNpZ25lZCByID0gMCwgZyA9IDAsIGIgPSAwOwotICB1bnNpZ25lZCBtdWwgPSA2NTUzNSAvICgoMXUgPDwgbW9kZV9pbi0+Yml0ZGVwdGgpIC0gMXUpOyAvKjY1NTM1LCAyMTg0NSwgNDM2OSwgMjU3LCAxKi8KLSAgdW5zaWduZWQgc2hpZnQgPSAxNiAtIG1vZGVfb3V0LT5iaXRkZXB0aDsKLQotICBpZihtb2RlX2luLT5jb2xvcnR5cGUgPT0gTENUX0dSRVkgfHwgbW9kZV9pbi0+Y29sb3J0eXBlID09IExDVF9HUkVZX0FMUEhBKSB7Ci0gICAgciA9IGcgPSBiID0gcl9pbiAqIG11bDsKLSAgfSBlbHNlIGlmKG1vZGVfaW4tPmNvbG9ydHlwZSA9PSBMQ1RfUkdCIHx8IG1vZGVfaW4tPmNvbG9ydHlwZSA9PSBMQ1RfUkdCQSkgewotICAgIHIgPSByX2luICogbXVsOwotICAgIGcgPSBnX2luICogbXVsOwotICAgIGIgPSBiX2luICogbXVsOwotICB9IGVsc2UgaWYobW9kZV9pbi0+Y29sb3J0eXBlID09IExDVF9QQUxFVFRFKSB7Ci0gICAgaWYocl9pbiA+PSBtb2RlX2luLT5wYWxldHRlc2l6ZSkgcmV0dXJuIDgyOwotICAgIHIgPSBtb2RlX2luLT5wYWxldHRlW3JfaW4gKiA0ICsgMF0gKiAyNTd1OwotICAgIGcgPSBtb2RlX2luLT5wYWxldHRlW3JfaW4gKiA0ICsgMV0gKiAyNTd1OwotICAgIGIgPSBtb2RlX2luLT5wYWxldHRlW3JfaW4gKiA0ICsgMl0gKiAyNTd1OwotICB9IGVsc2UgewotICAgIHJldHVybiAzMTsKLSAgfQotCi0gIC8qIG5vdyBjb252ZXJ0IHRvIG91dHB1dCBmb3JtYXQgKi8KLSAgaWYobW9kZV9vdXQtPmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSB8fCBtb2RlX291dC0+Y29sb3J0eXBlID09IExDVF9HUkVZX0FMUEhBKSB7Ci0gICAgKnJfb3V0ID0gciA+PiBzaGlmdCA7Ci0gIH0gZWxzZSBpZihtb2RlX291dC0+Y29sb3J0eXBlID09IExDVF9SR0IgfHwgbW9kZV9vdXQtPmNvbG9ydHlwZSA9PSBMQ1RfUkdCQSkgewotICAgICpyX291dCA9IHIgPj4gc2hpZnQgOwotICAgICpnX291dCA9IGcgPj4gc2hpZnQgOwotICAgICpiX291dCA9IGIgPj4gc2hpZnQgOwotICB9IGVsc2UgaWYobW9kZV9vdXQtPmNvbG9ydHlwZSA9PSBMQ1RfUEFMRVRURSkgewotICAgIHVuc2lnbmVkIGk7Ci0gICAgLyogYSAxNi1iaXQgY29sb3IgY2Fubm90IGJlIGluIHRoZSBwYWxldHRlICovCi0gICAgaWYoKHIgPj4gOCkgIT0gKHIgJiAyNTUpIHx8IChnID4+IDgpICE9IChnICYgMjU1KSB8fCAoYiA+PiA4KSAhPSAoYiAmIDI1NSkpIHJldHVybiA4MjsKLSAgICBmb3IoaSA9IDA7IGkgPCBtb2RlX291dC0+cGFsZXR0ZXNpemU7IGkrKykgewotICAgICAgdW5zaWduZWQgaiA9IGkgKiA0OwotICAgICAgaWYoKHIgPj4gOCkgPT0gbW9kZV9vdXQtPnBhbGV0dGVbaiArIDBdICYmIChnID4+IDgpID09IG1vZGVfb3V0LT5wYWxldHRlW2ogKyAxXSAmJgotICAgICAgICAgIChiID4+IDgpID09IG1vZGVfb3V0LT5wYWxldHRlW2ogKyAyXSkgewotICAgICAgICAqcl9vdXQgPSBpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDgyOwotICB9IGVsc2UgewotICAgIHJldHVybiAzMTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0VOQ09ERVIKLQotdm9pZCBsb2RlcG5nX2NvbG9yX3Byb2ZpbGVfaW5pdChMb2RlUE5HQ29sb3JQcm9maWxlKiBwcm9maWxlKSB7Ci0gIHByb2ZpbGUtPmNvbG9yZWQgPSAwOwotICBwcm9maWxlLT5rZXkgPSAwOwotICBwcm9maWxlLT5rZXlfciA9IHByb2ZpbGUtPmtleV9nID0gcHJvZmlsZS0+a2V5X2IgPSAwOwotICBwcm9maWxlLT5hbHBoYSA9IDA7Ci0gIHByb2ZpbGUtPm51bWNvbG9ycyA9IDA7Ci0gIHByb2ZpbGUtPmJpdHMgPSAxOwotICBwcm9maWxlLT5udW1waXhlbHMgPSAwOwotfQotCi0vKmZ1bmN0aW9uIHVzZWQgZm9yIGRlYnVnIHB1cnBvc2VzIHdpdGggQysrKi8KLS8qdm9pZCBwcmludENvbG9yUHJvZmlsZShMb2RlUE5HQ29sb3JQcm9maWxlKiBwKSB7Ci0gIHN0ZDo6Y291dCA8PCAiY29sb3JlZDogIiA8PCAoaW50KXAtPmNvbG9yZWQgPDwgIiwgIjsKLSAgc3RkOjpjb3V0IDw8ICJrZXk6ICIgPDwgKGludClwLT5rZXkgPDwgIiwgIjsKLSAgc3RkOjpjb3V0IDw8ICJrZXlfcjogIiA8PCAoaW50KXAtPmtleV9yIDw8ICIsICI7Ci0gIHN0ZDo6Y291dCA8PCAia2V5X2c6ICIgPDwgKGludClwLT5rZXlfZyA8PCAiLCAiOwotICBzdGQ6OmNvdXQgPDwgImtleV9iOiAiIDw8IChpbnQpcC0+a2V5X2IgPDwgIiwgIjsKLSAgc3RkOjpjb3V0IDw8ICJhbHBoYTogIiA8PCAoaW50KXAtPmFscGhhIDw8ICIsICI7Ci0gIHN0ZDo6Y291dCA8PCAibnVtY29sb3JzOiAiIDw8IChpbnQpcC0+bnVtY29sb3JzIDw8ICIsICI7Ci0gIHN0ZDo6Y291dCA8PCAiYml0czogIiA8PCAoaW50KXAtPmJpdHMgPDwgc3RkOjplbmRsOwotfSovCi0KLS8qUmV0dXJucyBob3cgbWFueSBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgZ2l2ZW4gdmFsdWUgKG1heCA4IGJpdCkqLwotc3RhdGljIHVuc2lnbmVkIGdldFZhbHVlUmVxdWlyZWRCaXRzKHVuc2lnbmVkIGNoYXIgdmFsdWUpIHsKLSAgaWYodmFsdWUgPT0gMCB8fCB2YWx1ZSA9PSAyNTUpIHJldHVybiAxOwotICAvKlRoZSBzY2FsaW5nIG9mIDItYml0IGFuZCA0LWJpdCB2YWx1ZXMgdXNlcyBtdWx0aXBsZXMgb2YgODUgYW5kIDE3Ki8KLSAgaWYodmFsdWUgJSAxNyA9PSAwKSByZXR1cm4gdmFsdWUgJSA4NSA9PSAwID8gMiA6IDQ7Ci0gIHJldHVybiA4OwotfQotCi0vKnByb2ZpbGUgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0ZWQuCi1JdCdzIG9rIHRvIHNldCBzb21lIHBhcmFtZXRlcnMgb2YgcHJvZmlsZSB0byBkb25lIGFscmVhZHkuKi8KLXVuc2lnbmVkIGxvZGVwbmdfZ2V0X2NvbG9yX3Byb2ZpbGUoTG9kZVBOR0NvbG9yUHJvZmlsZSogcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIG1vZGVfaW4pIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICBzaXplX3QgaTsKLSAgQ29sb3JUcmVlIHRyZWU7Ci0gIHNpemVfdCBudW1waXhlbHMgPSAoc2l6ZV90KXcgKiAoc2l6ZV90KWg7Ci0KLSAgLyogbWFyayB0aGluZ3MgYXMgZG9uZSBhbHJlYWR5IGlmIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gaGF2ZSBhIG1vcmUgZXhwZW5zaXZlIGNhc2UgKi8KLSAgdW5zaWduZWQgY29sb3JlZF9kb25lID0gbG9kZXBuZ19pc19ncmV5c2NhbGVfdHlwZShtb2RlX2luKSA/IDEgOiAwOwotICB1bnNpZ25lZCBhbHBoYV9kb25lID0gbG9kZXBuZ19jYW5faGF2ZV9hbHBoYShtb2RlX2luKSA/IDAgOiAxOwotICB1bnNpZ25lZCBudW1jb2xvcnNfZG9uZSA9IDA7Ci0gIHVuc2lnbmVkIGJwcCA9IGxvZGVwbmdfZ2V0X2JwcChtb2RlX2luKTsKLSAgdW5zaWduZWQgYml0c19kb25lID0gKHByb2ZpbGUtPmJpdHMgPT0gMSAmJiBicHAgPT0gMSkgPyAxIDogMDsKLSAgdW5zaWduZWQgc2l4dGVlbiA9IDA7IC8qIHdoZXRoZXIgdGhlIGlucHV0IGltYWdlIGlzIDE2IGJpdCAqLwotICB1bnNpZ25lZCBtYXhudW1jb2xvcnMgPSAyNTc7Ci0gIGlmKGJwcCA8PSA4KSBtYXhudW1jb2xvcnMgPSBMT0RFUE5HX01JTigyNTcsIHByb2ZpbGUtPm51bWNvbG9ycyArICgxdSA8PCBicHApKTsKLQotICBwcm9maWxlLT5udW1waXhlbHMgKz0gbnVtcGl4ZWxzOwotCi0gIGNvbG9yX3RyZWVfaW5pdCgmdHJlZSk7Ci0KLSAgLypJZiB0aGUgcHJvZmlsZSB3YXMgYWxyZWFkeSBmaWxsZWQgaW4gZnJvbSBwcmV2aW91cyBkYXRhLCBmaWxsIGl0cyBwYWxldHRlIGluIHRyZWUKLSAgYW5kIG1hcmsgdGhpbmdzIGFzIGRvbmUgYWxyZWFkeSBpZiB3ZSBrbm93IHRoZXkgYXJlIHRoZSBtb3N0IGV4cGVuc2l2ZSBjYXNlIGFscmVhZHkqLwotICBpZihwcm9maWxlLT5hbHBoYSkgYWxwaGFfZG9uZSA9IDE7Ci0gIGlmKHByb2ZpbGUtPmNvbG9yZWQpIGNvbG9yZWRfZG9uZSA9IDE7Ci0gIGlmKHByb2ZpbGUtPmJpdHMgPT0gMTYpIG51bWNvbG9yc19kb25lID0gMTsKLSAgaWYocHJvZmlsZS0+Yml0cyA+PSBicHApIGJpdHNfZG9uZSA9IDE7Ci0gIGlmKHByb2ZpbGUtPm51bWNvbG9ycyA+PSBtYXhudW1jb2xvcnMpIG51bWNvbG9yc19kb25lID0gMTsKLQotICBpZighbnVtY29sb3JzX2RvbmUpIHsKLSAgICBmb3IoaSA9IDA7IGkgPCBwcm9maWxlLT5udW1jb2xvcnM7IGkrKykgewotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogY29sb3IgPSAmcHJvZmlsZS0+cGFsZXR0ZVtpICogNF07Ci0gICAgICBjb2xvcl90cmVlX2FkZCgmdHJlZSwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgY29sb3JbM10sICh1bnNpZ25lZCBpbnQpaSk7Ci0gICAgfQotICB9Ci0KLSAgLypDaGVjayBpZiB0aGUgMTYtYml0IGlucHV0IGlzIHRydWx5IDE2LWJpdCovCi0gIGlmKG1vZGVfaW4tPmJpdGRlcHRoID09IDE2ICYmICFzaXh0ZWVuKSB7Ci0gICAgdW5zaWduZWQgc2hvcnQgciwgZywgYiwgYTsKLSAgICBmb3IoaSA9IDA7IGkgIT0gbnVtcGl4ZWxzOyArK2kpIHsKLSAgICAgIGdldFBpeGVsQ29sb3JSR0JBMTYoJnIsICZnLCAmYiwgJmEsIGluLCBpLCBtb2RlX2luKTsKLSAgICAgIGlmKChyICYgMjU1KSAhPSAoKHIgPj4gOCkgJiAyNTUpIHx8IChnICYgMjU1KSAhPSAoKGcgPj4gOCkgJiAyNTUpIHx8Ci0gICAgICAgICAoYiAmIDI1NSkgIT0gKChiID4+IDgpICYgMjU1KSB8fCAoYSAmIDI1NSkgIT0gKChhID4+IDgpICYgMjU1KSkgLypmaXJzdCBhbmQgc2Vjb25kIGJ5dGUgZGlmZmVyKi8gewotICAgICAgICBwcm9maWxlLT5iaXRzID0gMTY7Ci0gICAgICAgIHNpeHRlZW4gPSAxOwotICAgICAgICBiaXRzX2RvbmUgPSAxOwotICAgICAgICBudW1jb2xvcnNfZG9uZSA9IDE7IC8qY291bnRpbmcgY29sb3JzIG5vIGxvbmdlciB1c2VmdWwsIHBhbGV0dGUgZG9lc24ndCBzdXBwb3J0IDE2LWJpdCovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmKHNpeHRlZW4pIHsKLSAgICB1bnNpZ25lZCBzaG9ydCByID0gMCwgZyA9IDAsIGIgPSAwLCBhID0gMDsKLQotICAgIGZvcihpID0gMDsgaSAhPSBudW1waXhlbHM7ICsraSkgewotICAgICAgZ2V0UGl4ZWxDb2xvclJHQkExNigmciwgJmcsICZiLCAmYSwgaW4sIGksIG1vZGVfaW4pOwotCi0gICAgICBpZighY29sb3JlZF9kb25lICYmIChyICE9IGcgfHwgciAhPSBiKSkgewotICAgICAgICBwcm9maWxlLT5jb2xvcmVkID0gMTsKLSAgICAgICAgY29sb3JlZF9kb25lID0gMTsKLSAgICAgIH0KLQotICAgICAgaWYoIWFscGhhX2RvbmUpIHsKLSAgICAgICAgdW5zaWduZWQgbWF0Y2hrZXkgPSAociA9PSBwcm9maWxlLT5rZXlfciAmJiBnID09IHByb2ZpbGUtPmtleV9nICYmIGIgPT0gcHJvZmlsZS0+a2V5X2IpOwotICAgICAgICBpZihhICE9IDY1NTM1ICYmIChhICE9IDAgfHwgKHByb2ZpbGUtPmtleSAmJiAhbWF0Y2hrZXkpKSkgewotICAgICAgICAgIHByb2ZpbGUtPmFscGhhID0gMTsKLSAgICAgICAgICBwcm9maWxlLT5rZXkgPSAwOwotICAgICAgICAgIGFscGhhX2RvbmUgPSAxOwotICAgICAgICB9IGVsc2UgaWYoYSA9PSAwICYmICFwcm9maWxlLT5hbHBoYSAmJiAhcHJvZmlsZS0+a2V5KSB7Ci0gICAgICAgICAgcHJvZmlsZS0+a2V5ID0gMTsKLSAgICAgICAgICBwcm9maWxlLT5rZXlfciA9IHI7Ci0gICAgICAgICAgcHJvZmlsZS0+a2V5X2cgPSBnOwotICAgICAgICAgIHByb2ZpbGUtPmtleV9iID0gYjsKLSAgICAgICAgfSBlbHNlIGlmKGEgPT0gNjU1MzUgJiYgcHJvZmlsZS0+a2V5ICYmIG1hdGNoa2V5KSB7Ci0gICAgICAgICAgLyogQ29sb3Iga2V5IGNhbm5vdCBiZSB1c2VkIGlmIGFuIG9wYXF1ZSBwaXhlbCBhbHNvIGhhcyB0aGF0IFJHQiBjb2xvci4gKi8KLSAgICAgICAgICBwcm9maWxlLT5hbHBoYSA9IDE7Ci0gICAgICAgICAgcHJvZmlsZS0+a2V5ID0gMDsKLSAgICAgICAgICBhbHBoYV9kb25lID0gMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYoYWxwaGFfZG9uZSAmJiBudW1jb2xvcnNfZG9uZSAmJiBjb2xvcmVkX2RvbmUgJiYgYml0c19kb25lKSBicmVhazsKLSAgICB9Ci0KLSAgICBpZihwcm9maWxlLT5rZXkgJiYgIXByb2ZpbGUtPmFscGhhKSB7Ci0gICAgICBmb3IoaSA9IDA7IGkgIT0gbnVtcGl4ZWxzOyArK2kpIHsKLSAgICAgICAgZ2V0UGl4ZWxDb2xvclJHQkExNigmciwgJmcsICZiLCAmYSwgaW4sIGksIG1vZGVfaW4pOwotICAgICAgICBpZihhICE9IDAgJiYgciA9PSBwcm9maWxlLT5rZXlfciAmJiBnID09IHByb2ZpbGUtPmtleV9nICYmIGIgPT0gcHJvZmlsZS0+a2V5X2IpIHsKLSAgICAgICAgICAvKiBDb2xvciBrZXkgY2Fubm90IGJlIHVzZWQgaWYgYW4gb3BhcXVlIHBpeGVsIGFsc28gaGFzIHRoYXQgUkdCIGNvbG9yLiAqLwotICAgICAgICAgIHByb2ZpbGUtPmFscGhhID0gMTsKLSAgICAgICAgICBwcm9maWxlLT5rZXkgPSAwOwotICAgICAgICAgIGFscGhhX2RvbmUgPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgLyogPCAxNi1iaXQgKi8gewotICAgIHVuc2lnbmVkIGNoYXIgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpICE9IG51bXBpeGVsczsgKytpKSB7Ci0gICAgICBnZXRQaXhlbENvbG9yUkdCQTgoJnIsICZnLCAmYiwgJmEsIGluLCBpLCBtb2RlX2luKTsKLQotICAgICAgaWYoIWJpdHNfZG9uZSAmJiBwcm9maWxlLT5iaXRzIDwgOCkgewotICAgICAgICAvKm9ubHkgciBpcyBjaGVja2VkLCA8IDggYml0cyBpcyBvbmx5IHJlbGV2YW50IGZvciBncmF5c2NhbGUqLwotICAgICAgICB1bnNpZ25lZCBiaXRzID0gZ2V0VmFsdWVSZXF1aXJlZEJpdHMocik7Ci0gICAgICAgIGlmKGJpdHMgPiBwcm9maWxlLT5iaXRzKSBwcm9maWxlLT5iaXRzID0gYml0czsKLSAgICAgIH0KLSAgICAgIGJpdHNfZG9uZSA9IChwcm9maWxlLT5iaXRzID49IGJwcCk7Ci0KLSAgICAgIGlmKCFjb2xvcmVkX2RvbmUgJiYgKHIgIT0gZyB8fCByICE9IGIpKSB7Ci0gICAgICAgIHByb2ZpbGUtPmNvbG9yZWQgPSAxOwotICAgICAgICBjb2xvcmVkX2RvbmUgPSAxOwotICAgICAgICBpZihwcm9maWxlLT5iaXRzIDwgOCkgcHJvZmlsZS0+Yml0cyA9IDg7IC8qUE5HIGhhcyBubyBjb2xvcmVkIG1vZGVzIHdpdGggbGVzcyB0aGFuIDgtYml0IHBlciBjaGFubmVsKi8KLSAgICAgIH0KLQotICAgICAgaWYoIWFscGhhX2RvbmUpIHsKLSAgICAgICAgdW5zaWduZWQgbWF0Y2hrZXkgPSAociA9PSBwcm9maWxlLT5rZXlfciAmJiBnID09IHByb2ZpbGUtPmtleV9nICYmIGIgPT0gcHJvZmlsZS0+a2V5X2IpOwotICAgICAgICBpZihhICE9IDI1NSAmJiAoYSAhPSAwIHx8IChwcm9maWxlLT5rZXkgJiYgIW1hdGNoa2V5KSkpIHsKLSAgICAgICAgICBwcm9maWxlLT5hbHBoYSA9IDE7Ci0gICAgICAgICAgcHJvZmlsZS0+a2V5ID0gMDsKLSAgICAgICAgICBhbHBoYV9kb25lID0gMTsKLSAgICAgICAgICBpZihwcm9maWxlLT5iaXRzIDwgOCkgcHJvZmlsZS0+Yml0cyA9IDg7IC8qUE5HIGhhcyBubyBhbHBoYWNoYW5uZWwgbW9kZXMgd2l0aCBsZXNzIHRoYW4gOC1iaXQgcGVyIGNoYW5uZWwqLwotICAgICAgICB9IGVsc2UgaWYoYSA9PSAwICYmICFwcm9maWxlLT5hbHBoYSAmJiAhcHJvZmlsZS0+a2V5KSB7Ci0gICAgICAgICAgcHJvZmlsZS0+a2V5ID0gMTsKLSAgICAgICAgICBwcm9maWxlLT5rZXlfciA9IHI7Ci0gICAgICAgICAgcHJvZmlsZS0+a2V5X2cgPSBnOwotICAgICAgICAgIHByb2ZpbGUtPmtleV9iID0gYjsKLSAgICAgICAgfSBlbHNlIGlmKGEgPT0gMjU1ICYmIHByb2ZpbGUtPmtleSAmJiBtYXRjaGtleSkgewotICAgICAgICAgIC8qIENvbG9yIGtleSBjYW5ub3QgYmUgdXNlZCBpZiBhbiBvcGFxdWUgcGl4ZWwgYWxzbyBoYXMgdGhhdCBSR0IgY29sb3IuICovCi0gICAgICAgICAgcHJvZmlsZS0+YWxwaGEgPSAxOwotICAgICAgICAgIHByb2ZpbGUtPmtleSA9IDA7Ci0gICAgICAgICAgYWxwaGFfZG9uZSA9IDE7Ci0gICAgICAgICAgaWYocHJvZmlsZS0+Yml0cyA8IDgpIHByb2ZpbGUtPmJpdHMgPSA4OyAvKlBORyBoYXMgbm8gYWxwaGFjaGFubmVsIG1vZGVzIHdpdGggbGVzcyB0aGFuIDgtYml0IHBlciBjaGFubmVsKi8KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZighbnVtY29sb3JzX2RvbmUpIHsKLSAgICAgICAgaWYoIWNvbG9yX3RyZWVfaGFzKCZ0cmVlLCByLCBnLCBiLCBhKSkgewotICAgICAgICAgIGNvbG9yX3RyZWVfYWRkKCZ0cmVlLCByLCBnLCBiLCBhLCBwcm9maWxlLT5udW1jb2xvcnMpOwotICAgICAgICAgIGlmKHByb2ZpbGUtPm51bWNvbG9ycyA8IDI1NikgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcCA9IHByb2ZpbGUtPnBhbGV0dGU7Ci0gICAgICAgICAgICB1bnNpZ25lZCBuID0gcHJvZmlsZS0+bnVtY29sb3JzOwotICAgICAgICAgICAgcFtuICogNCArIDBdID0gcjsKLSAgICAgICAgICAgIHBbbiAqIDQgKyAxXSA9IGc7Ci0gICAgICAgICAgICBwW24gKiA0ICsgMl0gPSBiOwotICAgICAgICAgICAgcFtuICogNCArIDNdID0gYTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKytwcm9maWxlLT5udW1jb2xvcnM7Ci0gICAgICAgICAgbnVtY29sb3JzX2RvbmUgPSBwcm9maWxlLT5udW1jb2xvcnMgPj0gbWF4bnVtY29sb3JzOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmKGFscGhhX2RvbmUgJiYgbnVtY29sb3JzX2RvbmUgJiYgY29sb3JlZF9kb25lICYmIGJpdHNfZG9uZSkgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYocHJvZmlsZS0+a2V5ICYmICFwcm9maWxlLT5hbHBoYSkgewotICAgICAgZm9yKGkgPSAwOyBpICE9IG51bXBpeGVsczsgKytpKSB7Ci0gICAgICAgIGdldFBpeGVsQ29sb3JSR0JBOCgmciwgJmcsICZiLCAmYSwgaW4sIGksIG1vZGVfaW4pOwotICAgICAgICBpZihhICE9IDAgJiYgciA9PSBwcm9maWxlLT5rZXlfciAmJiBnID09IHByb2ZpbGUtPmtleV9nICYmIGIgPT0gcHJvZmlsZS0+a2V5X2IpIHsKLSAgICAgICAgICAvKiBDb2xvciBrZXkgY2Fubm90IGJlIHVzZWQgaWYgYW4gb3BhcXVlIHBpeGVsIGFsc28gaGFzIHRoYXQgUkdCIGNvbG9yLiAqLwotICAgICAgICAgIHByb2ZpbGUtPmFscGhhID0gMTsKLSAgICAgICAgICBwcm9maWxlLT5rZXkgPSAwOwotICAgICAgICAgIGFscGhhX2RvbmUgPSAxOwotICAgICAgICAgIGlmKHByb2ZpbGUtPmJpdHMgPCA4KSBwcm9maWxlLT5iaXRzID0gODsgLypQTkcgaGFzIG5vIGFscGhhY2hhbm5lbCBtb2RlcyB3aXRoIGxlc3MgdGhhbiA4LWJpdCBwZXIgY2hhbm5lbCovCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKm1ha2UgdGhlIHByb2ZpbGUncyBrZXkgYWx3YXlzIDE2LWJpdCBmb3IgY29uc2lzdGVuY3kgLSByZXBlYXQgZWFjaCBieXRlIHR3aWNlKi8KLSAgICBwcm9maWxlLT5rZXlfciArPSAocHJvZmlsZS0+a2V5X3IgPDwgOCk7Ci0gICAgcHJvZmlsZS0+a2V5X2cgKz0gKHByb2ZpbGUtPmtleV9nIDw8IDgpOwotICAgIHByb2ZpbGUtPmtleV9iICs9IChwcm9maWxlLT5rZXlfYiA8PCA4KTsKLSAgfQotCi0gIGNvbG9yX3RyZWVfY2xlYW51cCgmdHJlZSk7Ci0gIHJldHVybiBlcnJvcjsKLX0KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTCi0vKkFkZHMgYSBzaW5nbGUgY29sb3IgdG8gdGhlIGNvbG9yIHByb2ZpbGUuIFRoZSBwcm9maWxlIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGVkLiBUaGUgY29sb3IgbXVzdCBiZSBnaXZlbiBhcyAxNi1iaXQKLSh3aXRoIDIgYnl0ZXMgcmVwZWF0aW5nIGZvciA4LWJpdCBhbmQgNjU1MzUgZm9yIG9wYXF1ZSBhbHBoYSBjaGFubmVsKS4gVGhpcyBmdW5jdGlvbiBpcyBleHBlbnNpdmUsIGRvIG5vdCBjYWxsIGl0IGZvcgotYWxsIHBpeGVscyBvZiBhbiBpbWFnZSBidXQgb25seSBmb3IgYSBmZXcgYWRkaXRpb25hbCB2YWx1ZXMuICovCi1zdGF0aWMgdW5zaWduZWQgbG9kZXBuZ19jb2xvcl9wcm9maWxlX2FkZChMb2RlUE5HQ29sb3JQcm9maWxlKiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgciwgdW5zaWduZWQgZywgdW5zaWduZWQgYiwgdW5zaWduZWQgYSkgewotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgaW1hZ2VbOF07Ci0gIExvZGVQTkdDb2xvck1vZGUgbW9kZTsKLSAgbG9kZXBuZ19jb2xvcl9tb2RlX2luaXQoJm1vZGUpOwotICBpbWFnZVswXSA9IHIgPj4gODsgaW1hZ2VbMV0gPSByOyBpbWFnZVsyXSA9IGcgPj4gODsgaW1hZ2VbM10gPSBnOwotICBpbWFnZVs0XSA9IGIgPj4gODsgaW1hZ2VbNV0gPSBiOyBpbWFnZVs2XSA9IGEgPj4gODsgaW1hZ2VbN10gPSBhOwotICBtb2RlLmJpdGRlcHRoID0gMTY7Ci0gIG1vZGUuY29sb3J0eXBlID0gTENUX1JHQkE7Ci0gIGVycm9yID0gbG9kZXBuZ19nZXRfY29sb3JfcHJvZmlsZShwcm9maWxlLCBpbWFnZSwgMSwgMSwgJm1vZGUpOwotICBsb2RlcG5nX2NvbG9yX21vZGVfY2xlYW51cCgmbW9kZSk7Ci0gIHJldHVybiBlcnJvcjsKLX0KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLQotLypBdXRvY2hvb3NlIGNvbG9yIG1vZGVsIGdpdmVuIHRoZSBjb21wdXRlZCBwcm9maWxlLiBtb2RlX2luIGlzIHRvIGNvcHkgcGFsZXR0ZSBvcmRlciBmcm9tCi13aGVuIHJlbGV2YW50LiovCi1zdGF0aWMgdW5zaWduZWQgYXV0b19jaG9vc2VfY29sb3JfZnJvbV9wcm9maWxlKExvZGVQTkdDb2xvck1vZGUqIG1vZGVfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBtb2RlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29sb3JQcm9maWxlKiBwcm9mKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgdW5zaWduZWQgcGFsZXR0ZWJpdHMsIHBhbGV0dGVfb2s7Ci0gIHNpemVfdCBpLCBuOwotICBzaXplX3QgbnVtcGl4ZWxzID0gcHJvZi0+bnVtcGl4ZWxzOwotCi0gIHVuc2lnbmVkIGFscGhhID0gcHJvZi0+YWxwaGE7Ci0gIHVuc2lnbmVkIGtleSA9IHByb2YtPmtleTsKLSAgdW5zaWduZWQgYml0cyA9IHByb2YtPmJpdHM7Ci0KLSAgbW9kZV9vdXQtPmtleV9kZWZpbmVkID0gMDsKLQotICBpZihrZXkgJiYgbnVtcGl4ZWxzIDw9IDE2KSB7Ci0gICAgYWxwaGEgPSAxOyAvKnRvbyBmZXcgcGl4ZWxzIHRvIGp1c3RpZnkgdFJOUyBjaHVuayBvdmVyaGVhZCovCi0gICAga2V5ID0gMDsKLSAgICBpZihiaXRzIDwgOCkgYml0cyA9IDg7IC8qUE5HIGhhcyBubyBhbHBoYWNoYW5uZWwgbW9kZXMgd2l0aCBsZXNzIHRoYW4gOC1iaXQgcGVyIGNoYW5uZWwqLwotICB9Ci0gIG4gPSBwcm9mLT5udW1jb2xvcnM7Ci0gIHBhbGV0dGViaXRzID0gbiA8PSAyID8gMSA6IChuIDw9IDQgPyAyIDogKG4gPD0gMTYgPyA0IDogOCkpOwotICBwYWxldHRlX29rID0gbiA8PSAyNTYgJiYgYml0cyA8PSA4OwotICBpZihudW1waXhlbHMgPCBuICogMikgcGFsZXR0ZV9vayA9IDA7IC8qZG9uJ3QgYWRkIHBhbGV0dGUgb3ZlcmhlYWQgaWYgaW1hZ2UgaGFzIG9ubHkgYSBmZXcgcGl4ZWxzKi8KLSAgaWYoIXByb2YtPmNvbG9yZWQgJiYgYml0cyA8PSBwYWxldHRlYml0cykgcGFsZXR0ZV9vayA9IDA7IC8qZ3JheSBpcyBsZXNzIG92ZXJoZWFkKi8KLQotICBpZihwYWxldHRlX29rKSB7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciogcCA9IHByb2YtPnBhbGV0dGU7Ci0gICAgbG9kZXBuZ19wYWxldHRlX2NsZWFyKG1vZGVfb3V0KTsgLypyZW1vdmUgcG90ZW50aWFsIGVhcmxpZXIgcGFsZXR0ZSovCi0gICAgZm9yKGkgPSAwOyBpICE9IHByb2YtPm51bWNvbG9yczsgKytpKSB7Ci0gICAgICBlcnJvciA9IGxvZGVwbmdfcGFsZXR0ZV9hZGQobW9kZV9vdXQsIHBbaSAqIDQgKyAwXSwgcFtpICogNCArIDFdLCBwW2kgKiA0ICsgMl0sIHBbaSAqIDQgKyAzXSk7Ci0gICAgICBpZihlcnJvcikgYnJlYWs7Ci0gICAgfQotCi0gICAgbW9kZV9vdXQtPmNvbG9ydHlwZSA9IExDVF9QQUxFVFRFOwotICAgIG1vZGVfb3V0LT5iaXRkZXB0aCA9IHBhbGV0dGViaXRzOwotCi0gICAgaWYobW9kZV9pbi0+Y29sb3J0eXBlID09IExDVF9QQUxFVFRFICYmIG1vZGVfaW4tPnBhbGV0dGVzaXplID49IG1vZGVfb3V0LT5wYWxldHRlc2l6ZQotICAgICAgICAmJiBtb2RlX2luLT5iaXRkZXB0aCA9PSBtb2RlX291dC0+Yml0ZGVwdGgpIHsKLSAgICAgIC8qSWYgaW5wdXQgc2hvdWxkIGhhdmUgc2FtZSBwYWxldHRlIGNvbG9ycywga2VlcCBvcmlnaW5hbCB0byBwcmVzZXJ2ZSBpdHMgb3JkZXIgYW5kIHByZXZlbnQgY29udmVyc2lvbiovCi0gICAgICBsb2RlcG5nX2NvbG9yX21vZGVfY2xlYW51cChtb2RlX291dCk7Ci0gICAgICBsb2RlcG5nX2NvbG9yX21vZGVfY29weShtb2RlX291dCwgbW9kZV9pbik7Ci0gICAgfQotICB9IGVsc2UgLyo4LWJpdCBvciAxNi1iaXQgcGVyIGNoYW5uZWwqLyB7Ci0gICAgbW9kZV9vdXQtPmJpdGRlcHRoID0gYml0czsKLSAgICBtb2RlX291dC0+Y29sb3J0eXBlID0gYWxwaGEgPyAocHJvZi0+Y29sb3JlZCA/IExDVF9SR0JBIDogTENUX0dSRVlfQUxQSEEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHByb2YtPmNvbG9yZWQgPyBMQ1RfUkdCIDogTENUX0dSRVkpOwotCi0gICAgaWYoa2V5KSB7Ci0gICAgICB1bnNpZ25lZCBtYXNrID0gKDF1IDw8IG1vZGVfb3V0LT5iaXRkZXB0aCkgLSAxdTsgLypwcm9maWxlIGFsd2F5cyB1c2VzIDE2LWJpdCwgbWFzayBjb252ZXJ0cyBpdCovCi0gICAgICBtb2RlX291dC0+a2V5X3IgPSBwcm9mLT5rZXlfciAmIG1hc2s7Ci0gICAgICBtb2RlX291dC0+a2V5X2cgPSBwcm9mLT5rZXlfZyAmIG1hc2s7Ci0gICAgICBtb2RlX291dC0+a2V5X2IgPSBwcm9mLT5rZXlfYiAmIG1hc2s7Ci0gICAgICBtb2RlX291dC0+a2V5X2RlZmluZWQgPSAxOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotLypBdXRvbWF0aWNhbGx5IGNob29zZXMgY29sb3IgdHlwZSB0aGF0IGdpdmVzIHNtYWxsZXN0IGFtb3VudCBvZiBiaXRzIGluIHRoZQotb3V0cHV0IGltYWdlLCBlLmcuIGdyYXkgaWYgdGhlcmUgYXJlIG9ubHkgZ3JheXNjYWxlIHBpeGVscywgcGFsZXR0ZSBpZiB0aGVyZQotYXJlIGxlc3MgdGhhbiAyNTYgY29sb3JzLCBjb2xvciBrZXkgaWYgb25seSBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IsIC4uLgotVXBkYXRlcyB2YWx1ZXMgb2YgbW9kZSB3aXRoIGEgcG90ZW50aWFsbHkgc21hbGxlciBjb2xvciBtb2RlbC4gbW9kZV9vdXQgc2hvdWxkCi1jb250YWluIHRoZSB1c2VyIGNob3NlbiBjb2xvciBtb2RlbCwgYnV0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV3IGNob3NlbiBvbmUuKi8KLXVuc2lnbmVkIGxvZGVwbmdfYXV0b19jaG9vc2VfY29sb3IoTG9kZVBOR0NvbG9yTW9kZSogbW9kZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGltYWdlLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBtb2RlX2luKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgTG9kZVBOR0NvbG9yUHJvZmlsZSBwcm9mOwotICBsb2RlcG5nX2NvbG9yX3Byb2ZpbGVfaW5pdCgmcHJvZik7Ci0gIGVycm9yID0gbG9kZXBuZ19nZXRfY29sb3JfcHJvZmlsZSgmcHJvZiwgaW1hZ2UsIHcsIGgsIG1vZGVfaW4pOwotICBpZihlcnJvcikgcmV0dXJuIGVycm9yOwotICByZXR1cm4gYXV0b19jaG9vc2VfY29sb3JfZnJvbV9wcm9maWxlKG1vZGVfb3V0LCBtb2RlX2luLCAmcHJvZik7Ci19Ci0KLSNlbmRpZiAvKiAjaWZkZWYgTE9ERVBOR19DT01QSUxFX0VOQ09ERVIgKi8KLQotLyoKLVBhZXRoIHByZWRpY3RlciwgdXNlZCBieSBQTkcgZmlsdGVyIHR5cGUgNAotVGhlIHBhcmFtZXRlcnMgYXJlIG9mIHR5cGUgc2hvcnQsIGJ1dCBzaG91bGQgY29tZSBmcm9tIHVuc2lnbmVkIGNoYXJzLCB0aGUgc2hvcnRzCi1hcmUgb25seSBuZWVkZWQgdG8gbWFrZSB0aGUgcGFldGggY2FsY3VsYXRpb24gY29ycmVjdC4KLSovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWV0aFByZWRpY3RvcihzaG9ydCBhLCBzaG9ydCBiLCBzaG9ydCBjKSB7Ci0gIHNob3J0IHBhID0gYWJzKGIgLSBjKTsKLSAgc2hvcnQgcGIgPSBhYnMoYSAtIGMpOwotICBzaG9ydCBwYyA9IGFicyhhICsgYiAtIGMgLSBjKTsKLQotICBpZihwYyA8IHBhICYmIHBjIDwgcGIpIHJldHVybiAodW5zaWduZWQgY2hhciljOwotICBlbHNlIGlmKHBiIDwgcGEpIHJldHVybiAodW5zaWduZWQgY2hhciliOwotICBlbHNlIHJldHVybiAodW5zaWduZWQgY2hhcilhOwotfQotCi0vKnNoYXJlZCB2YWx1ZXMgdXNlZCBieSBtdWx0aXBsZSBBZGFtNyByZWxhdGVkIGZ1bmN0aW9ucyovCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBBREFNN19JWFs3XSA9IHsgMCwgNCwgMCwgMiwgMCwgMSwgMCB9OyAvKnggc3RhcnQgdmFsdWVzKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBBREFNN19JWVs3XSA9IHsgMCwgMCwgNCwgMCwgMiwgMCwgMSB9OyAvKnkgc3RhcnQgdmFsdWVzKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBBREFNN19EWFs3XSA9IHsgOCwgOCwgNCwgNCwgMiwgMiwgMSB9OyAvKnggZGVsdGEgdmFsdWVzKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBBREFNN19EWVs3XSA9IHsgOCwgOCwgOCwgNCwgNCwgMiwgMiB9OyAvKnkgZGVsdGEgdmFsdWVzKi8KLQotLyoKLU91dHB1dHMgdmFyaW91cyBkaW1lbnNpb25zIGFuZCBwb3NpdGlvbnMgaW4gdGhlIGltYWdlIHJlbGF0ZWQgdG8gdGhlIEFkYW03IHJlZHVjZWQgaW1hZ2VzLgotcGFzc3c6IG91dHB1dCBjb250YWluaW5nIHRoZSB3aWR0aCBvZiB0aGUgNyBwYXNzZXMKLXBhc3NoOiBvdXRwdXQgY29udGFpbmluZyB0aGUgaGVpZ2h0IG9mIHRoZSA3IHBhc3NlcwotZmlsdGVyX3Bhc3NzdGFydDogb3V0cHV0IGNvbnRhaW5pbmcgdGhlIGluZGV4IG9mIHRoZSBzdGFydCBhbmQgZW5kIG9mIGVhY2gKLSByZWR1Y2VkIGltYWdlIHdpdGggZmlsdGVyIGJ5dGVzCi1wYWRkZWRfcGFzc3N0YXJ0IG91dHB1dCBjb250YWluaW5nIHRoZSBpbmRleCBvZiB0aGUgc3RhcnQgYW5kIGVuZCBvZiBlYWNoCi0gcmVkdWNlZCBpbWFnZSB3aGVuIHdpdGhvdXQgZmlsdGVyIGJ5dGVzIGJ1dCB3aXRoIHBhZGRlZCBzY2FubGluZXMKLXBhc3NzdGFydDogb3V0cHV0IGNvbnRhaW5pbmcgdGhlIGluZGV4IG9mIHRoZSBzdGFydCBhbmQgZW5kIG9mIGVhY2ggcmVkdWNlZAotIGltYWdlIHdpdGhvdXQgcGFkZGluZyBiZXR3ZWVuIHNjYW5saW5lcywgYnV0IHN0aWxsIHBhZGRpbmcgYmV0d2VlbiB0aGUgaW1hZ2VzCi13LCBoOiB3aWR0aCBhbmQgaGVpZ2h0IG9mIG5vbi1pbnRlcmxhY2VkIGltYWdlCi1icHA6IGJpdHMgcGVyIHBpeGVsCi0icGFkZGVkIiBpcyBvbmx5IHJlbGV2YW50IGlmIGJwcCBpcyBsZXNzIHRoYW4gOCBhbmQgYSBzY2FubGluZSBvciBpbWFnZSBkb2VzIG5vdAotIGVuZCBhdCBhIGZ1bGwgYnl0ZQotKi8KLXN0YXRpYyB2b2lkIEFkYW03X2dldHBhc3N2YWx1ZXModW5zaWduZWQgcGFzc3dbN10sIHVuc2lnbmVkIHBhc3NoWzddLCBzaXplX3QgZmlsdGVyX3Bhc3NzdGFydFs4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhZGRlZF9wYXNzc3RhcnRbOF0sIHNpemVfdCBwYXNzc3RhcnRbOF0sIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsIHVuc2lnbmVkIGJwcCkgewotICAvKnRoZSBwYXNzc3RhcnQgdmFsdWVzIGhhdmUgOCB2YWx1ZXM6IHRoZSA4dGggb25lIGluZGljYXRlcyB0aGUgYnl0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSA3dGggKD0gbGFzdCkgcGFzcyovCi0gIHVuc2lnbmVkIGk7Ci0KLSAgLypjYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodCBpbiBwaXhlbHMgb2YgZWFjaCBwYXNzKi8KLSAgZm9yKGkgPSAwOyBpICE9IDc7ICsraSkgewotICAgIHBhc3N3W2ldID0gKHcgKyBBREFNN19EWFtpXSAtIEFEQU03X0lYW2ldIC0gMSkgLyBBREFNN19EWFtpXTsKLSAgICBwYXNzaFtpXSA9IChoICsgQURBTTdfRFlbaV0gLSBBREFNN19JWVtpXSAtIDEpIC8gQURBTTdfRFlbaV07Ci0gICAgaWYocGFzc3dbaV0gPT0gMCkgcGFzc2hbaV0gPSAwOwotICAgIGlmKHBhc3NoW2ldID09IDApIHBhc3N3W2ldID0gMDsKLSAgfQotCi0gIGZpbHRlcl9wYXNzc3RhcnRbMF0gPSBwYWRkZWRfcGFzc3N0YXJ0WzBdID0gcGFzc3N0YXJ0WzBdID0gMDsKLSAgZm9yKGkgPSAwOyBpICE9IDc7ICsraSkgewotICAgIC8qaWYgcGFzc3dbaV0gaXMgMCwgaXQncyAwIGJ5dGVzLCBub3QgMSAobm8gZmlsdGVydHlwZS1ieXRlKSovCi0gICAgZmlsdGVyX3Bhc3NzdGFydFtpICsgMV0gPSBmaWx0ZXJfcGFzc3N0YXJ0W2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKHBhc3N3W2ldICYmIHBhc3NoW2ldKSA/IHBhc3NoW2ldICogKDEgKyAocGFzc3dbaV0gKiBicHAgKyA3KSAvIDgpIDogMCk7Ci0gICAgLypiaXRzIHBhZGRlZCBpZiBuZWVkZWQgdG8gZmlsbCBmdWxsIGJ5dGUgYXQgZW5kIG9mIGVhY2ggc2NhbmxpbmUqLwotICAgIHBhZGRlZF9wYXNzc3RhcnRbaSArIDFdID0gcGFkZGVkX3Bhc3NzdGFydFtpXSArIHBhc3NoW2ldICogKChwYXNzd1tpXSAqIGJwcCArIDcpIC8gOCk7Ci0gICAgLypvbmx5IHBhZGRlZCBhdCBlbmQgb2YgcmVkdWNlZCBpbWFnZSovCi0gICAgcGFzc3N0YXJ0W2kgKyAxXSA9IHBhc3NzdGFydFtpXSArIChwYXNzaFtpXSAqIHBhc3N3W2ldICogYnBwICsgNykgLyA4OwotICB9Ci19Ci0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLyBQTkcgRGVjb2RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLS8qcmVhZCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgaGVhZGVyIGFuZCBzdG9yZSBpdCBpbiB0aGUgTG9kZVBOR0luZm8uIHJldHVybiB2YWx1ZSBpcyBlcnJvciovCi11bnNpZ25lZCBsb2RlcG5nX2luc3BlY3QodW5zaWduZWQqIHcsIHVuc2lnbmVkKiBoLCBMb2RlUE5HU3RhdGUqIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplKSB7Ci0gIHVuc2lnbmVkIHdpZHRoLCBoZWlnaHQ7Ci0gIExvZGVQTkdJbmZvKiBpbmZvID0gJnN0YXRlLT5pbmZvX3BuZzsKLSAgaWYoaW5zaXplID09IDAgfHwgaW4gPT0gMCkgewotICAgIENFUlJPUl9SRVRVUk5fRVJST1Ioc3RhdGUtPmVycm9yLCA0OCk7IC8qZXJyb3I6IHRoZSBnaXZlbiBkYXRhIGlzIGVtcHR5Ki8KLSAgfQotICBpZihpbnNpemUgPCAzMykgewotICAgIENFUlJPUl9SRVRVUk5fRVJST1Ioc3RhdGUtPmVycm9yLCAyNyk7IC8qZXJyb3I6IHRoZSBkYXRhIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBvZiBhIFBORyBoZWFkZXIqLwotICB9Ci0KLSAgLyp3aGVuIGRlY29kaW5nIGEgbmV3IFBORyBpbWFnZSwgbWFrZSBzdXJlIGFsbCBwYXJhbWV0ZXJzIGNyZWF0ZWQgYWZ0ZXIgcHJldmlvdXMgZGVjb2RpbmcgYXJlIHJlc2V0Ki8KLSAgLyogVE9ETzogcmVtb3ZlIHRoaXMuIE9uZSBzaG91bGQgdXNlIGEgbmV3IExvZGVQTkdTdGF0ZSBmb3IgbmV3IHNlc3Npb25zICovCi0gIGxvZGVwbmdfaW5mb19jbGVhbnVwKGluZm8pOwotICBsb2RlcG5nX2luZm9faW5pdChpbmZvKTsKLQotICBpZihpblswXSAhPSAxMzcgfHwgaW5bMV0gIT0gODAgfHwgaW5bMl0gIT0gNzggfHwgaW5bM10gIT0gNzEKLSAgICAgfHwgaW5bNF0gIT0gMTMgfHwgaW5bNV0gIT0gMTAgfHwgaW5bNl0gIT0gMjYgfHwgaW5bN10gIT0gMTApIHsKLSAgICBDRVJST1JfUkVUVVJOX0VSUk9SKHN0YXRlLT5lcnJvciwgMjgpOyAvKmVycm9yOiB0aGUgZmlyc3QgOCBieXRlcyBhcmUgbm90IHRoZSBjb3JyZWN0IFBORyBzaWduYXR1cmUqLwotICB9Ci0gIGlmKGxvZGVwbmdfY2h1bmtfbGVuZ3RoKGluICsgOCkgIT0gMTMpIHsKLSAgICBDRVJST1JfUkVUVVJOX0VSUk9SKHN0YXRlLT5lcnJvciwgOTQpOyAvKmVycm9yOiBoZWFkZXIgc2l6ZSBtdXN0IGJlIDEzIGJ5dGVzKi8KLSAgfQotICBpZighbG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhpbiArIDgsICJJSERSIikpIHsKLSAgICBDRVJST1JfUkVUVVJOX0VSUk9SKHN0YXRlLT5lcnJvciwgMjkpOyAvKmVycm9yOiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYSBJSERSIGNodW5rISovCi0gIH0KLQotICAvKnJlYWQgdGhlIHZhbHVlcyBnaXZlbiBpbiB0aGUgaGVhZGVyKi8KLSAgd2lkdGggPSBsb2RlcG5nX3JlYWQzMmJpdEludCgmaW5bMTZdKTsKLSAgaGVpZ2h0ID0gbG9kZXBuZ19yZWFkMzJiaXRJbnQoJmluWzIwXSk7Ci0gIGluZm8tPmNvbG9yLmJpdGRlcHRoID0gaW5bMjRdOwotICBpbmZvLT5jb2xvci5jb2xvcnR5cGUgPSAoTG9kZVBOR0NvbG9yVHlwZSlpblsyNV07Ci0gIGluZm8tPmNvbXByZXNzaW9uX21ldGhvZCA9IGluWzI2XTsKLSAgaW5mby0+ZmlsdGVyX21ldGhvZCA9IGluWzI3XTsKLSAgaW5mby0+aW50ZXJsYWNlX21ldGhvZCA9IGluWzI4XTsKLQotICBpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7Ci0gICAgQ0VSUk9SX1JFVFVSTl9FUlJPUihzdGF0ZS0+ZXJyb3IsIDkzKTsKLSAgfQotCi0gIGlmKHcpICp3ID0gd2lkdGg7Ci0gIGlmKGgpICpoID0gaGVpZ2h0OwotCi0gIGlmKCFzdGF0ZS0+ZGVjb2Rlci5pZ25vcmVfY3JjKSB7Ci0gICAgdW5zaWduZWQgQ1JDID0gbG9kZXBuZ19yZWFkMzJiaXRJbnQoJmluWzI5XSk7Ci0gICAgdW5zaWduZWQgY2hlY2tzdW0gPSBsb2RlcG5nX2NyYzMyKCZpblsxMl0sIDE3KTsKLSAgICBpZihDUkMgIT0gY2hlY2tzdW0pIHsKLSAgICAgIENFUlJPUl9SRVRVUk5fRVJST1Ioc3RhdGUtPmVycm9yLCA1Nyk7IC8qaW52YWxpZCBDUkMqLwotICAgIH0KLSAgfQotCi0gIC8qZXJyb3I6IG9ubHkgY29tcHJlc3Npb24gbWV0aG9kIDAgaXMgYWxsb3dlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiovCi0gIGlmKGluZm8tPmNvbXByZXNzaW9uX21ldGhvZCAhPSAwKSBDRVJST1JfUkVUVVJOX0VSUk9SKHN0YXRlLT5lcnJvciwgMzIpOwotICAvKmVycm9yOiBvbmx5IGZpbHRlciBtZXRob2QgMCBpcyBhbGxvd2VkIGluIHRoZSBzcGVjaWZpY2F0aW9uKi8KLSAgaWYoaW5mby0+ZmlsdGVyX21ldGhvZCAhPSAwKSBDRVJST1JfUkVUVVJOX0VSUk9SKHN0YXRlLT5lcnJvciwgMzMpOwotICAvKmVycm9yOiBvbmx5IGludGVybGFjZSBtZXRob2RzIDAgYW5kIDEgZXhpc3QgaW4gdGhlIHNwZWNpZmljYXRpb24qLwotICBpZihpbmZvLT5pbnRlcmxhY2VfbWV0aG9kID4gMSkgQ0VSUk9SX1JFVFVSTl9FUlJPUihzdGF0ZS0+ZXJyb3IsIDM0KTsKLQotICBzdGF0ZS0+ZXJyb3IgPSBjaGVja0NvbG9yVmFsaWRpdHkoaW5mby0+Y29sb3IuY29sb3J0eXBlLCBpbmZvLT5jb2xvci5iaXRkZXB0aCk7Ci0gIHJldHVybiBzdGF0ZS0+ZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCB1bmZpbHRlclNjYW5saW5lKHVuc2lnbmVkIGNoYXIqIHJlY29uLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzY2FubGluZSwgY29uc3QgdW5zaWduZWQgY2hhciogcHJlY29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGV3aWR0aCwgdW5zaWduZWQgY2hhciBmaWx0ZXJUeXBlLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIC8qCi0gIEZvciBQTkcgZmlsdGVyIG1ldGhvZCAwCi0gIHVuZmlsdGVyIGEgUE5HIGltYWdlIHNjYW5saW5lIGJ5IHNjYW5saW5lLiB3aGVuIHRoZSBwaXhlbHMgYXJlIHNtYWxsZXIgdGhhbiAxIGJ5dGUsCi0gIHRoZSBmaWx0ZXIgd29ya3MgYnl0ZSBwZXIgYnl0ZSAoYnl0ZXdpZHRoID0gMSkKLSAgcHJlY29uIGlzIHRoZSBwcmV2aW91cyB1bmZpbHRlcmVkIHNjYW5saW5lLCByZWNvbiB0aGUgcmVzdWx0LCBzY2FubGluZSB0aGUgY3VycmVudCBvbmUKLSAgdGhlIGluY29taW5nIHNjYW5saW5lcyBkbyBOT1QgaW5jbHVkZSB0aGUgZmlsdGVydHlwZSBieXRlLCB0aGF0IG9uZSBpcyBnaXZlbiBpbiB0aGUgcGFyYW1ldGVyIGZpbHRlclR5cGUgaW5zdGVhZAotICByZWNvbiBhbmQgc2NhbmxpbmUgTUFZIGJlIHRoZSBzYW1lIG1lbW9yeSBhZGRyZXNzISBwcmVjb24gbXVzdCBiZSBkaXNqb2ludC4KLSAgKi8KLQotICBzaXplX3QgaTsKLSAgc3dpdGNoKGZpbHRlclR5cGUpIHsKLSAgICBjYXNlIDA6Ci0gICAgICBmb3IoaSA9IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHJlY29uW2ldID0gc2NhbmxpbmVbaV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBmb3IoaSA9IDA7IGkgIT0gYnl0ZXdpZHRoOyArK2kpIHJlY29uW2ldID0gc2NhbmxpbmVbaV07Ci0gICAgICBmb3IoaSA9IGJ5dGV3aWR0aDsgaSA8IGxlbmd0aDsgKytpKSByZWNvbltpXSA9IHNjYW5saW5lW2ldICsgcmVjb25baSAtIGJ5dGV3aWR0aF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZihwcmVjb24pIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSByZWNvbltpXSA9IHNjYW5saW5lW2ldICsgcHJlY29uW2ldOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSByZWNvbltpXSA9IHNjYW5saW5lW2ldOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgaWYocHJlY29uKSB7Ci0gICAgICAgIGZvcihpID0gMDsgaSAhPSBieXRld2lkdGg7ICsraSkgcmVjb25baV0gPSBzY2FubGluZVtpXSArIChwcmVjb25baV0gPj4gMSk7Ci0gICAgICAgIGZvcihpID0gYnl0ZXdpZHRoOyBpIDwgbGVuZ3RoOyArK2kpIHJlY29uW2ldID0gc2NhbmxpbmVbaV0gKyAoKHJlY29uW2kgLSBieXRld2lkdGhdICsgcHJlY29uW2ldKSA+PiAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvcihpID0gMDsgaSAhPSBieXRld2lkdGg7ICsraSkgcmVjb25baV0gPSBzY2FubGluZVtpXTsKLSAgICAgICAgZm9yKGkgPSBieXRld2lkdGg7IGkgPCBsZW5ndGg7ICsraSkgcmVjb25baV0gPSBzY2FubGluZVtpXSArIChyZWNvbltpIC0gYnl0ZXdpZHRoXSA+PiAxKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGlmKHByZWNvbikgewotICAgICAgICBmb3IoaSA9IDA7IGkgIT0gYnl0ZXdpZHRoOyArK2kpIHsKLSAgICAgICAgICByZWNvbltpXSA9IChzY2FubGluZVtpXSArIHByZWNvbltpXSk7IC8qcGFldGhQcmVkaWN0b3IoMCwgcHJlY29uW2ldLCAwKSBpcyBhbHdheXMgcHJlY29uW2ldKi8KLSAgICAgICAgfQotICAgICAgICBmb3IoaSA9IGJ5dGV3aWR0aDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgcmVjb25baV0gPSAoc2NhbmxpbmVbaV0gKyBwYWV0aFByZWRpY3RvcihyZWNvbltpIC0gYnl0ZXdpZHRoXSwgcHJlY29uW2ldLCBwcmVjb25baSAtIGJ5dGV3aWR0aF0pKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpICE9IGJ5dGV3aWR0aDsgKytpKSB7Ci0gICAgICAgICAgcmVjb25baV0gPSBzY2FubGluZVtpXTsKLSAgICAgICAgfQotICAgICAgICBmb3IoaSA9IGJ5dGV3aWR0aDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgLypwYWV0aFByZWRpY3RvcihyZWNvbltpIC0gYnl0ZXdpZHRoXSwgMCwgMCkgaXMgYWx3YXlzIHJlY29uW2kgLSBieXRld2lkdGhdKi8KLSAgICAgICAgICByZWNvbltpXSA9IChzY2FubGluZVtpXSArIHJlY29uW2kgLSBieXRld2lkdGhdKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogcmV0dXJuIDM2OyAvKmVycm9yOiB1bmV4aXN0aW5nIGZpbHRlciB0eXBlIGdpdmVuKi8KLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIHVuZmlsdGVyKHVuc2lnbmVkIGNoYXIqIG91dCwgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsIHVuc2lnbmVkIGJwcCkgewotICAvKgotICBGb3IgUE5HIGZpbHRlciBtZXRob2QgMAotICB0aGlzIGZ1bmN0aW9uIHVuZmlsdGVycyBhIHNpbmdsZSBpbWFnZSAoZS5nLiB3aXRob3V0IGludGVybGFjaW5nIHRoaXMgaXMgY2FsbGVkIG9uY2UsIHdpdGggQWRhbTcgc2V2ZW4gdGltZXMpCi0gIG91dCBtdXN0IGhhdmUgZW5vdWdoIGJ5dGVzIGFsbG9jYXRlZCBhbHJlYWR5LCBpbiBtdXN0IGhhdmUgdGhlIHNjYW5saW5lcyArIDEgZmlsdGVydHlwZSBieXRlIHBlciBzY2FubGluZQotICB3IGFuZCBoIGFyZSBpbWFnZSBkaW1lbnNpb25zIG9yIGRpbWVuc2lvbnMgb2YgcmVkdWNlZCBpbWFnZSwgYnBwIGlzIGJpdHMgcGVyIHBpeGVsCi0gIGluIGFuZCBvdXQgYXJlIGFsbG93ZWQgdG8gYmUgdGhlIHNhbWUgbWVtb3J5IGFkZHJlc3MgKGJ1dCBhcmVuJ3QgdGhlIHNhbWUgc2l6ZSBzaW5jZSBpbiBoYXMgdGhlIGV4dHJhIGZpbHRlciBieXRlcykKLSAgKi8KLQotICB1bnNpZ25lZCB5OwotICB1bnNpZ25lZCBjaGFyKiBwcmV2bGluZSA9IDA7Ci0KLSAgLypieXRld2lkdGggaXMgdXNlZCBmb3IgZmlsdGVyaW5nLCBpcyAxIHdoZW4gYnBwIDwgOCwgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCBvdGhlcndpc2UqLwotICBzaXplX3QgYnl0ZXdpZHRoID0gKGJwcCArIDcpIC8gODsKLSAgc2l6ZV90IGxpbmVieXRlcyA9ICh3ICogYnBwICsgNykgLyA4OwotCi0gIGZvcih5ID0gMDsgeSA8IGg7ICsreSkgewotICAgIHNpemVfdCBvdXRpbmRleCA9IGxpbmVieXRlcyAqIHk7Ci0gICAgc2l6ZV90IGluaW5kZXggPSAoMSArIGxpbmVieXRlcykgKiB5OyAvKnRoZSBleHRyYSBmaWx0ZXJieXRlIGFkZGVkIHRvIGVhY2ggcm93Ki8KLSAgICB1bnNpZ25lZCBjaGFyIGZpbHRlclR5cGUgPSBpbltpbmluZGV4XTsKLQotICAgIENFUlJPUl9UUllfUkVUVVJOKHVuZmlsdGVyU2NhbmxpbmUoJm91dFtvdXRpbmRleF0sICZpbltpbmluZGV4ICsgMV0sIHByZXZsaW5lLCBieXRld2lkdGgsIGZpbHRlclR5cGUsIGxpbmVieXRlcykpOwotCi0gICAgcHJldmxpbmUgPSAmb3V0W291dGluZGV4XTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKgotaW46IEFkYW03IGludGVybGFjZWQgaW1hZ2UsIHdpdGggbm8gcGFkZGluZyBiaXRzIGJldHdlZW4gc2NhbmxpbmVzLCBidXQgYmV0d2VlbgotIHJlZHVjZWQgaW1hZ2VzIHNvIHRoYXQgZWFjaCByZWR1Y2VkIGltYWdlIHN0YXJ0cyBhdCBhIGJ5dGUuCi1vdXQ6IHRoZSBzYW1lIHBpeGVscywgYnV0IHJlLW9yZGVyZWQgc28gdGhhdCB0aGV5J3JlIG5vdyBhIG5vbi1pbnRlcmxhY2VkIGltYWdlIHdpdGggc2l6ZSB3KmgKLWJwcDogYml0cyBwZXIgcGl4ZWwKLW91dCBoYXMgdGhlIGZvbGxvd2luZyBzaXplIGluIGJpdHM6IHcgKiBoICogYnBwLgotaW4gaXMgcG9zc2libHkgYmlnZ2VyIGR1ZSB0byBwYWRkaW5nIGJpdHMgYmV0d2VlbiByZWR1Y2VkIGltYWdlcy4KLW91dCBtdXN0IGJlIGJpZyBlbm91Z2ggQU5EIG11c3QgYmUgMCBldmVyeXdoZXJlIGlmIGJwcCA8IDggaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLShiZWNhdXNlIHRoYXQncyBsaWtlbHkgYSBsaXR0bGUgYml0IGZhc3RlcikKLU5PVEU6IGNvbW1lbnRzIGFib3V0IHBhZGRpbmcgYml0cyBhcmUgb25seSByZWxldmFudCBpZiBicHAgPCA4Ci0qLwotc3RhdGljIHZvaWQgQWRhbTdfZGVpbnRlcmxhY2UodW5zaWduZWQgY2hhciogb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwgdW5zaWduZWQgYnBwKSB7Ci0gIHVuc2lnbmVkIHBhc3N3WzddLCBwYXNzaFs3XTsKLSAgc2l6ZV90IGZpbHRlcl9wYXNzc3RhcnRbOF0sIHBhZGRlZF9wYXNzc3RhcnRbOF0sIHBhc3NzdGFydFs4XTsKLSAgdW5zaWduZWQgaTsKLQotICBBZGFtN19nZXRwYXNzdmFsdWVzKHBhc3N3LCBwYXNzaCwgZmlsdGVyX3Bhc3NzdGFydCwgcGFkZGVkX3Bhc3NzdGFydCwgcGFzc3N0YXJ0LCB3LCBoLCBicHApOwotCi0gIGlmKGJwcCA+PSA4KSB7Ci0gICAgZm9yKGkgPSAwOyBpICE9IDc7ICsraSkgewotICAgICAgdW5zaWduZWQgeCwgeSwgYjsKLSAgICAgIHNpemVfdCBieXRld2lkdGggPSBicHAgLyA4OwotICAgICAgZm9yKHkgPSAwOyB5IDwgcGFzc2hbaV07ICsreSkKLSAgICAgIGZvcih4ID0gMDsgeCA8IHBhc3N3W2ldOyArK3gpIHsKLSAgICAgICAgc2l6ZV90IHBpeGVsaW5zdGFydCA9IHBhc3NzdGFydFtpXSArICh5ICogcGFzc3dbaV0gKyB4KSAqIGJ5dGV3aWR0aDsKLSAgICAgICAgc2l6ZV90IHBpeGVsb3V0c3RhcnQgPSAoKEFEQU03X0lZW2ldICsgeSAqIEFEQU03X0RZW2ldKSAqIHcgKyBBREFNN19JWFtpXSArIHggKiBBREFNN19EWFtpXSkgKiBieXRld2lkdGg7Ci0gICAgICAgIGZvcihiID0gMDsgYiA8IGJ5dGV3aWR0aDsgKytiKSB7Ci0gICAgICAgICAgb3V0W3BpeGVsb3V0c3RhcnQgKyBiXSA9IGluW3BpeGVsaW5zdGFydCArIGJdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgLypicHAgPCA4OiBBZGFtNyB3aXRoIHBpeGVscyA8IDggYml0IGlzIGEgYml0IHRyaWNraWVyOiB3aXRoIGJpdCBwb2ludGVycyovIHsKLSAgICBmb3IoaSA9IDA7IGkgIT0gNzsgKytpKSB7Ci0gICAgICB1bnNpZ25lZCB4LCB5LCBiOwotICAgICAgdW5zaWduZWQgaWxpbmViaXRzID0gYnBwICogcGFzc3dbaV07Ci0gICAgICB1bnNpZ25lZCBvbGluZWJpdHMgPSBicHAgKiB3OwotICAgICAgc2l6ZV90IG9icCwgaWJwOyAvKmJpdCBwb2ludGVycyAoZm9yIG91dCBhbmQgaW4gYnVmZmVyKSovCi0gICAgICBmb3IoeSA9IDA7IHkgPCBwYXNzaFtpXTsgKyt5KQotICAgICAgZm9yKHggPSAwOyB4IDwgcGFzc3dbaV07ICsreCkgewotICAgICAgICBpYnAgPSAoOCAqIHBhc3NzdGFydFtpXSkgKyAoeSAqIGlsaW5lYml0cyArIHggKiBicHApOwotICAgICAgICBvYnAgPSAoQURBTTdfSVlbaV0gKyB5ICogQURBTTdfRFlbaV0pICogb2xpbmViaXRzICsgKEFEQU03X0lYW2ldICsgeCAqIEFEQU03X0RYW2ldKSAqIGJwcDsKLSAgICAgICAgZm9yKGIgPSAwOyBiIDwgYnBwOyArK2IpIHsKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdCA9IHJlYWRCaXRGcm9tUmV2ZXJzZWRTdHJlYW0oJmlicCwgaW4pOwotICAgICAgICAgIC8qbm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgb3V0IGJ1ZmZlciBpcyBjb21wbGV0ZWx5IDAsIHVzZSBzZXRCaXRPZlJldmVyc2VkU3RyZWFtIG90aGVyd2lzZSovCi0gICAgICAgICAgc2V0Qml0T2ZSZXZlcnNlZFN0cmVhbTAoJm9icCwgb3V0LCBiaXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbW92ZVBhZGRpbmdCaXRzKHVuc2lnbmVkIGNoYXIqIG91dCwgY29uc3QgdW5zaWduZWQgY2hhciogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2xpbmViaXRzLCBzaXplX3QgaWxpbmViaXRzLCB1bnNpZ25lZCBoKSB7Ci0gIC8qCi0gIEFmdGVyIGZpbHRlcmluZyB0aGVyZSBhcmUgc3RpbGwgcGFkZGluZyBiaXRzIGlmIHNjYW5saW5lcyBoYXZlIG5vbiBtdWx0aXBsZSBvZiA4IGJpdCBhbW91bnRzLiBUaGV5IG5lZWQKLSAgdG8gYmUgcmVtb3ZlZCAoZXhjZXB0IGF0IGxhc3Qgc2NhbmxpbmUgb2YgKEFkYW03LXJlZHVjZWQpIGltYWdlKSBiZWZvcmUgd29ya2luZyB3aXRoIHB1cmUgaW1hZ2UgYnVmZmVycwotICBmb3IgdGhlIEFkYW03IGNvZGUsIHRoZSBjb2xvciBjb252ZXJ0IGNvZGUgYW5kIHRoZSBvdXRwdXQgdG8gdGhlIHVzZXIuCi0gIGluIGFuZCBvdXQgYXJlIGFsbG93ZWQgdG8gYmUgdGhlIHNhbWUgYnVmZmVyLCBpbiBtYXkgYWxzbyBiZSBoaWdoZXIgYnV0IHN0aWxsIG92ZXJsYXBwaW5nOyBpbiBtdXN0Ci0gIGhhdmUgPj0gaWxpbmViaXRzKmggYml0cywgb3V0IG11c3QgaGF2ZSA+PSBvbGluZWJpdHMqaCBiaXRzLCBvbGluZWJpdHMgbXVzdCBiZSA8PSBpbGluZWJpdHMKLSAgYWxzbyB1c2VkIHRvIG1vdmUgYml0cyBhZnRlciBlYXJsaWVyIHN1Y2ggb3BlcmF0aW9ucyBoYXBwZW5lZCwgZS5nLiBpbiBhIHNlcXVlbmNlIG9mIHJlZHVjZWQgaW1hZ2VzIGZyb20gQWRhbTcKLSAgb25seSB1c2VmdWwgaWYgKGlsaW5lYml0cyAtIG9saW5lYml0cykgaXMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgMS4uNwotICAqLwotICB1bnNpZ25lZCB5OwotICBzaXplX3QgZGlmZiA9IGlsaW5lYml0cyAtIG9saW5lYml0czsKLSAgc2l6ZV90IGlicCA9IDAsIG9icCA9IDA7IC8qaW5wdXQgYW5kIG91dHB1dCBiaXQgcG9pbnRlcnMqLwotICBmb3IoeSA9IDA7IHkgPCBoOyArK3kpIHsKLSAgICBzaXplX3QgeDsKLSAgICBmb3IoeCA9IDA7IHggPCBvbGluZWJpdHM7ICsreCkgewotICAgICAgdW5zaWduZWQgY2hhciBiaXQgPSByZWFkQml0RnJvbVJldmVyc2VkU3RyZWFtKCZpYnAsIGluKTsKLSAgICAgIHNldEJpdE9mUmV2ZXJzZWRTdHJlYW0oJm9icCwgb3V0LCBiaXQpOwotICAgIH0KLSAgICBpYnAgKz0gZGlmZjsKLSAgfQotfQotCi0vKm91dCBtdXN0IGJlIGJ1ZmZlciBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gZnVsbCBpbWFnZSwgYW5kIGluIG11c3QgY29udGFpbiB0aGUgZnVsbCBkZWNvbXByZXNzZWQgZGF0YSBmcm9tCi10aGUgSURBVCBjaHVua3MgKHdpdGggZmlsdGVyIGluZGV4IGJ5dGVzIGFuZCBwb3NzaWJsZSBwYWRkaW5nIGJpdHMpCi1yZXR1cm4gdmFsdWUgaXMgZXJyb3IqLwotc3RhdGljIHVuc2lnbmVkIHBvc3RQcm9jZXNzU2NhbmxpbmVzKHVuc2lnbmVkIGNoYXIqIG91dCwgdW5zaWduZWQgY2hhciogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdywgdW5zaWduZWQgaCwgY29uc3QgTG9kZVBOR0luZm8qIGluZm9fcG5nKSB7Ci0gIC8qCi0gIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpbHRlcmVkLXBhZGRlZC1pbnRlcmxhY2VkIGRhdGEgaW50byBwdXJlIDJEIGltYWdlIGJ1ZmZlciB3aXRoIHRoZSBQTkcncyBjb2xvcnR5cGUuCi0gIFN0ZXBzOgotICAqKSBpZiBubyBBZGFtNzogMSkgdW5maWx0ZXIgMikgcmVtb3ZlIHBhZGRpbmcgYml0cyAoPSBwb3NpYmxlIGV4dHJhIGJpdHMgcGVyIHNjYW5saW5lIGlmIGJwcCA8IDgpCi0gICopIGlmIGFkYW03OiAxKSA3eCB1bmZpbHRlciAyKSA3eCByZW1vdmUgcGFkZGluZyBiaXRzIDMpIEFkYW03X2RlaW50ZXJsYWNlCi0gIE5PVEU6IHRoZSBpbiBidWZmZXIgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIGludGVybWVkaWF0ZSBkYXRhIQotICAqLwotICB1bnNpZ25lZCBicHAgPSBsb2RlcG5nX2dldF9icHAoJmluZm9fcG5nLT5jb2xvcik7Ci0gIGlmKGJwcCA9PSAwKSByZXR1cm4gMzE7IC8qZXJyb3I6IGludmFsaWQgY29sb3J0eXBlKi8KLQotICBpZihpbmZvX3BuZy0+aW50ZXJsYWNlX21ldGhvZCA9PSAwKSB7Ci0gICAgaWYoYnBwIDwgOCAmJiB3ICogYnBwICE9ICgodyAqIGJwcCArIDcpIC8gOCkgKiA4KSB7Ci0gICAgICBDRVJST1JfVFJZX1JFVFVSTih1bmZpbHRlcihpbiwgaW4sIHcsIGgsIGJwcCkpOwotICAgICAgcmVtb3ZlUGFkZGluZ0JpdHMob3V0LCBpbiwgdyAqIGJwcCwgKCh3ICogYnBwICsgNykgLyA4KSAqIDgsIGgpOwotICAgIH0KLSAgICAvKndlIGNhbiBpbW1lZGlhdGVseSBmaWx0ZXIgaW50byB0aGUgb3V0IGJ1ZmZlciwgbm8gb3RoZXIgc3RlcHMgbmVlZGVkKi8KLSAgICBlbHNlIENFUlJPUl9UUllfUkVUVVJOKHVuZmlsdGVyKG91dCwgaW4sIHcsIGgsIGJwcCkpOwotICB9IGVsc2UgLyppbnRlcmxhY2VfbWV0aG9kIGlzIDEgKEFkYW03KSovIHsKLSAgICB1bnNpZ25lZCBwYXNzd1s3XSwgcGFzc2hbN107IHNpemVfdCBmaWx0ZXJfcGFzc3N0YXJ0WzhdLCBwYWRkZWRfcGFzc3N0YXJ0WzhdLCBwYXNzc3RhcnRbOF07Ci0gICAgdW5zaWduZWQgaTsKLQotICAgIEFkYW03X2dldHBhc3N2YWx1ZXMocGFzc3csIHBhc3NoLCBmaWx0ZXJfcGFzc3N0YXJ0LCBwYWRkZWRfcGFzc3N0YXJ0LCBwYXNzc3RhcnQsIHcsIGgsIGJwcCk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgIT0gNzsgKytpKSB7Ci0gICAgICBDRVJST1JfVFJZX1JFVFVSTih1bmZpbHRlcigmaW5bcGFkZGVkX3Bhc3NzdGFydFtpXV0sICZpbltmaWx0ZXJfcGFzc3N0YXJ0W2ldXSwgcGFzc3dbaV0sIHBhc3NoW2ldLCBicHApKTsKLSAgICAgIC8qVE9ETzogcG9zc2libGUgZWZmaWNpZW5jeSBpbXByb3ZlbWVudDogaWYgaW4gdGhpcyByZWR1Y2VkIGltYWdlIHRoZSBiaXRzIGZpdCBuaWNlbHkgaW4gMSBzY2FubGluZSwKLSAgICAgIG1vdmUgYnl0ZXMgaW5zdGVhZCBvZiBiaXRzIG9yIG1vdmUgbm90IGF0IGFsbCovCi0gICAgICBpZihicHAgPCA4KSB7Ci0gICAgICAgIC8qcmVtb3ZlIHBhZGRpbmcgYml0cyBpbiBzY2FubGluZXM7IGFmdGVyIHRoaXMgdGhlcmUgc3RpbGwgbWF5IGJlIHBhZGRpbmcKLSAgICAgICAgYml0cyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgcmVkdWNlZCBpbWFnZXM6IGVhY2ggcmVkdWNlZCBpbWFnZSBzdGlsbCBzdGFydHMgbmljZWx5IGF0IGEgYnl0ZSovCi0gICAgICAgIHJlbW92ZVBhZGRpbmdCaXRzKCZpbltwYXNzc3RhcnRbaV1dLCAmaW5bcGFkZGVkX3Bhc3NzdGFydFtpXV0sIHBhc3N3W2ldICogYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBhc3N3W2ldICogYnBwICsgNykgLyA4KSAqIDgsIHBhc3NoW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBBZGFtN19kZWludGVybGFjZShvdXQsIGluLCB3LCBoLCBicHApOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCByZWFkQ2h1bmtfUExURShMb2RlUE5HQ29sb3JNb2RlKiBjb2xvciwgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IGNodW5rTGVuZ3RoKSB7Ci0gIHVuc2lnbmVkIHBvcyA9IDAsIGk7Ci0gIGlmKGNvbG9yLT5wYWxldHRlKSBsb2RlcG5nX2ZyZWUoY29sb3ItPnBhbGV0dGUpOwotICBjb2xvci0+cGFsZXR0ZXNpemUgPSBjaHVua0xlbmd0aCAvIDM7Ci0gIGNvbG9yLT5wYWxldHRlID0gKHVuc2lnbmVkIGNoYXIqKWxvZGVwbmdfbWFsbG9jKDQgKiBjb2xvci0+cGFsZXR0ZXNpemUpOwotICBpZighY29sb3ItPnBhbGV0dGUgJiYgY29sb3ItPnBhbGV0dGVzaXplKSB7Ci0gICAgY29sb3ItPnBhbGV0dGVzaXplID0gMDsKLSAgICByZXR1cm4gODM7IC8qYWxsb2MgZmFpbCovCi0gIH0KLSAgaWYoY29sb3ItPnBhbGV0dGVzaXplID4gMjU2KSByZXR1cm4gMzg7IC8qZXJyb3I6IHBhbGV0dGUgdG9vIGJpZyovCi0KLSAgZm9yKGkgPSAwOyBpICE9IGNvbG9yLT5wYWxldHRlc2l6ZTsgKytpKSB7Ci0gICAgY29sb3ItPnBhbGV0dGVbNCAqIGkgKyAwXSA9IGRhdGFbcG9zKytdOyAvKlIqLwotICAgIGNvbG9yLT5wYWxldHRlWzQgKiBpICsgMV0gPSBkYXRhW3BvcysrXTsgLypHKi8KLSAgICBjb2xvci0+cGFsZXR0ZVs0ICogaSArIDJdID0gZGF0YVtwb3MrK107IC8qQiovCi0gICAgY29sb3ItPnBhbGV0dGVbNCAqIGkgKyAzXSA9IDI1NTsgLyphbHBoYSovCi0gIH0KLQotICByZXR1cm4gMDsgLyogT0sgKi8KLX0KLQotc3RhdGljIHVuc2lnbmVkIHJlYWRDaHVua190Uk5TKExvZGVQTkdDb2xvck1vZGUqIGNvbG9yLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBzaXplX3QgY2h1bmtMZW5ndGgpIHsKLSAgdW5zaWduZWQgaTsKLSAgaWYoY29sb3ItPmNvbG9ydHlwZSA9PSBMQ1RfUEFMRVRURSkgewotICAgIC8qZXJyb3I6IG1vcmUgYWxwaGEgdmFsdWVzIGdpdmVuIHRoYW4gdGhlcmUgYXJlIHBhbGV0dGUgZW50cmllcyovCi0gICAgaWYoY2h1bmtMZW5ndGggPiBjb2xvci0+cGFsZXR0ZXNpemUpIHJldHVybiAzOTsKLQotICAgIGZvcihpID0gMDsgaSAhPSBjaHVua0xlbmd0aDsgKytpKSBjb2xvci0+cGFsZXR0ZVs0ICogaSArIDNdID0gZGF0YVtpXTsKLSAgfSBlbHNlIGlmKGNvbG9yLT5jb2xvcnR5cGUgPT0gTENUX0dSRVkpIHsKLSAgICAvKmVycm9yOiB0aGlzIGNodW5rIG11c3QgYmUgMiBieXRlcyBmb3IgZ3JheXNjYWxlIGltYWdlKi8KLSAgICBpZihjaHVua0xlbmd0aCAhPSAyKSByZXR1cm4gMzA7Ci0KLSAgICBjb2xvci0+a2V5X2RlZmluZWQgPSAxOwotICAgIGNvbG9yLT5rZXlfciA9IGNvbG9yLT5rZXlfZyA9IGNvbG9yLT5rZXlfYiA9IDI1NnUgKiBkYXRhWzBdICsgZGF0YVsxXTsKLSAgfSBlbHNlIGlmKGNvbG9yLT5jb2xvcnR5cGUgPT0gTENUX1JHQikgewotICAgIC8qZXJyb3I6IHRoaXMgY2h1bmsgbXVzdCBiZSA2IGJ5dGVzIGZvciBSR0IgaW1hZ2UqLwotICAgIGlmKGNodW5rTGVuZ3RoICE9IDYpIHJldHVybiA0MTsKLQotICAgIGNvbG9yLT5rZXlfZGVmaW5lZCA9IDE7Ci0gICAgY29sb3ItPmtleV9yID0gMjU2dSAqIGRhdGFbMF0gKyBkYXRhWzFdOwotICAgIGNvbG9yLT5rZXlfZyA9IDI1NnUgKiBkYXRhWzJdICsgZGF0YVszXTsKLSAgICBjb2xvci0+a2V5X2IgPSAyNTZ1ICogZGF0YVs0XSArIGRhdGFbNV07Ci0gIH0KLSAgZWxzZSByZXR1cm4gNDI7IC8qZXJyb3I6IHRSTlMgY2h1bmsgbm90IGFsbG93ZWQgZm9yIG90aGVyIGNvbG9yIG1vZGVscyovCi0KLSAgcmV0dXJuIDA7IC8qIE9LICovCi19Ci0KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTCi0vKmJhY2tncm91bmQgY29sb3IgY2h1bmsgKGJLR0QpKi8KLXN0YXRpYyB1bnNpZ25lZCByZWFkQ2h1bmtfYktHRChMb2RlUE5HSW5mbyogaW5mbywgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IGNodW5rTGVuZ3RoKSB7Ci0gIGlmKGluZm8tPmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfUEFMRVRURSkgewotICAgIC8qZXJyb3I6IHRoaXMgY2h1bmsgbXVzdCBiZSAxIGJ5dGUgZm9yIGluZGV4ZWQgY29sb3IgaW1hZ2UqLwotICAgIGlmKGNodW5rTGVuZ3RoICE9IDEpIHJldHVybiA0MzsKLQotICAgIC8qZXJyb3I6IGludmFsaWQgcGFsZXR0ZSBpbmRleCwgb3IgbWF5YmUgdGhpcyBjaHVuayBhcHBlYXJlZCBiZWZvcmUgUExURSovCi0gICAgaWYoZGF0YVswXSA+PSBpbmZvLT5jb2xvci5wYWxldHRlc2l6ZSkgcmV0dXJuIDEwMzsKLQotICAgIGluZm8tPmJhY2tncm91bmRfZGVmaW5lZCA9IDE7Ci0gICAgaW5mby0+YmFja2dyb3VuZF9yID0gaW5mby0+YmFja2dyb3VuZF9nID0gaW5mby0+YmFja2dyb3VuZF9iID0gZGF0YVswXTsKLSAgfSBlbHNlIGlmKGluZm8tPmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSB8fCBpbmZvLT5jb2xvci5jb2xvcnR5cGUgPT0gTENUX0dSRVlfQUxQSEEpIHsKLSAgICAvKmVycm9yOiB0aGlzIGNodW5rIG11c3QgYmUgMiBieXRlcyBmb3IgZ3JheXNjYWxlIGltYWdlKi8KLSAgICBpZihjaHVua0xlbmd0aCAhPSAyKSByZXR1cm4gNDQ7Ci0KLSAgICAvKnRoZSB2YWx1ZXMgYXJlIHRydW5jYXRlZCB0byBiaXRkZXB0aCBpbiB0aGUgUE5HIGZpbGUqLwotICAgIGluZm8tPmJhY2tncm91bmRfZGVmaW5lZCA9IDE7Ci0gICAgaW5mby0+YmFja2dyb3VuZF9yID0gaW5mby0+YmFja2dyb3VuZF9nID0gaW5mby0+YmFja2dyb3VuZF9iID0gMjU2dSAqIGRhdGFbMF0gKyBkYXRhWzFdOwotICB9IGVsc2UgaWYoaW5mby0+Y29sb3IuY29sb3J0eXBlID09IExDVF9SR0IgfHwgaW5mby0+Y29sb3IuY29sb3J0eXBlID09IExDVF9SR0JBKSB7Ci0gICAgLyplcnJvcjogdGhpcyBjaHVuayBtdXN0IGJlIDYgYnl0ZXMgZm9yIGdyYXlzY2FsZSBpbWFnZSovCi0gICAgaWYoY2h1bmtMZW5ndGggIT0gNikgcmV0dXJuIDQ1OwotCi0gICAgLyp0aGUgdmFsdWVzIGFyZSB0cnVuY2F0ZWQgdG8gYml0ZGVwdGggaW4gdGhlIFBORyBmaWxlKi8KLSAgICBpbmZvLT5iYWNrZ3JvdW5kX2RlZmluZWQgPSAxOwotICAgIGluZm8tPmJhY2tncm91bmRfciA9IDI1NnUgKiBkYXRhWzBdICsgZGF0YVsxXTsKLSAgICBpbmZvLT5iYWNrZ3JvdW5kX2cgPSAyNTZ1ICogZGF0YVsyXSArIGRhdGFbM107Ci0gICAgaW5mby0+YmFja2dyb3VuZF9iID0gMjU2dSAqIGRhdGFbNF0gKyBkYXRhWzVdOwotICB9Ci0KLSAgcmV0dXJuIDA7IC8qIE9LICovCi19Ci0KLS8qdGV4dCBjaHVuayAodEVYdCkqLwotc3RhdGljIHVuc2lnbmVkIHJlYWRDaHVua190RVh0KExvZGVQTkdJbmZvKiBpbmZvLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBzaXplX3QgY2h1bmtMZW5ndGgpIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICBjaGFyICprZXkgPSAwLCAqc3RyID0gMDsKLSAgdW5zaWduZWQgaTsKLQotICB3aGlsZSghZXJyb3IpIC8qbm90IHJlYWxseSBhIHdoaWxlIGxvb3AsIG9ubHkgdXNlZCB0byBicmVhayBvbiBlcnJvciovIHsKLSAgICB1bnNpZ25lZCBsZW5ndGgsIHN0cmluZzJfYmVnaW47Ci0KLSAgICBsZW5ndGggPSAwOwotICAgIHdoaWxlKGxlbmd0aCA8IGNodW5rTGVuZ3RoICYmIGRhdGFbbGVuZ3RoXSAhPSAwKSArK2xlbmd0aDsKLSAgICAvKmV2ZW4gdGhvdWdoIGl0J3Mgbm90IGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkLCBubyBlcnJvciBpcyB0aHJvd24gaWYKLSAgICB0aGVyZSdzIG5vIG51bGwgdGVybWluYXRpb24gY2hhciwgaWYgdGhlIHRleHQgaXMgZW1wdHkqLwotICAgIGlmKGxlbmd0aCA8IDEgfHwgbGVuZ3RoID4gNzkpIENFUlJPUl9CUkVBSyhlcnJvciwgODkpOyAvKmtleXdvcmQgdG9vIHNob3J0IG9yIGxvbmcqLwotCi0gICAga2V5ID0gKGNoYXIqKWxvZGVwbmdfbWFsbG9jKGxlbmd0aCArIDEpOwotICAgIGlmKCFrZXkpIENFUlJPUl9CUkVBSyhlcnJvciwgODMpOyAvKmFsbG9jIGZhaWwqLwotCi0gICAga2V5W2xlbmd0aF0gPSAwOwotICAgIGZvcihpID0gMDsgaSAhPSBsZW5ndGg7ICsraSkga2V5W2ldID0gKGNoYXIpZGF0YVtpXTsKLQotICAgIHN0cmluZzJfYmVnaW4gPSBsZW5ndGggKyAxOyAvKnNraXAga2V5d29yZCBudWxsIHRlcm1pbmF0b3IqLwotCi0gICAgbGVuZ3RoID0gKHVuc2lnbmVkKShjaHVua0xlbmd0aCA8IHN0cmluZzJfYmVnaW4gPyAwIDogY2h1bmtMZW5ndGggLSBzdHJpbmcyX2JlZ2luKTsKLSAgICBzdHIgPSAoY2hhciopbG9kZXBuZ19tYWxsb2MobGVuZ3RoICsgMSk7Ci0gICAgaWYoIXN0cikgQ0VSUk9SX0JSRUFLKGVycm9yLCA4Myk7IC8qYWxsb2MgZmFpbCovCi0KLSAgICBzdHJbbGVuZ3RoXSA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSBzdHJbaV0gPSAoY2hhcilkYXRhW3N0cmluZzJfYmVnaW4gKyBpXTsKLQotICAgIGVycm9yID0gbG9kZXBuZ19hZGRfdGV4dChpbmZvLCBrZXksIHN0cik7Ci0KLSAgICBicmVhazsKLSAgfQotCi0gIGxvZGVwbmdfZnJlZShrZXkpOwotICBsb2RlcG5nX2ZyZWUoc3RyKTsKLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLS8qY29tcHJlc3NlZCB0ZXh0IGNodW5rICh6VFh0KSovCi1zdGF0aWMgdW5zaWduZWQgcmVhZENodW5rX3pUWHQoTG9kZVBOR0luZm8qIGluZm8sIGNvbnN0IExvZGVQTkdEZWNvbXByZXNzU2V0dGluZ3MqIHpsaWJzZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBzaXplX3QgY2h1bmtMZW5ndGgpIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICB1bnNpZ25lZCBpOwotCi0gIHVuc2lnbmVkIGxlbmd0aCwgc3RyaW5nMl9iZWdpbjsKLSAgY2hhciAqa2V5ID0gMDsKLSAgdWN2ZWN0b3IgZGVjb2RlZDsKLQotICB1Y3ZlY3Rvcl9pbml0KCZkZWNvZGVkKTsKLQotICB3aGlsZSghZXJyb3IpIC8qbm90IHJlYWxseSBhIHdoaWxlIGxvb3AsIG9ubHkgdXNlZCB0byBicmVhayBvbiBlcnJvciovIHsKLSAgICBmb3IobGVuZ3RoID0gMDsgbGVuZ3RoIDwgY2h1bmtMZW5ndGggJiYgZGF0YVtsZW5ndGhdICE9IDA7ICsrbGVuZ3RoKSA7Ci0gICAgaWYobGVuZ3RoICsgMiA+PSBjaHVua0xlbmd0aCkgQ0VSUk9SX0JSRUFLKGVycm9yLCA3NSk7IC8qbm8gbnVsbCB0ZXJtaW5hdGlvbiwgY29ycnVwdD8qLwotICAgIGlmKGxlbmd0aCA8IDEgfHwgbGVuZ3RoID4gNzkpIENFUlJPUl9CUkVBSyhlcnJvciwgODkpOyAvKmtleXdvcmQgdG9vIHNob3J0IG9yIGxvbmcqLwotCi0gICAga2V5ID0gKGNoYXIqKWxvZGVwbmdfbWFsbG9jKGxlbmd0aCArIDEpOwotICAgIGlmKCFrZXkpIENFUlJPUl9CUkVBSyhlcnJvciwgODMpOyAvKmFsbG9jIGZhaWwqLwotCi0gICAga2V5W2xlbmd0aF0gPSAwOwotICAgIGZvcihpID0gMDsgaSAhPSBsZW5ndGg7ICsraSkga2V5W2ldID0gKGNoYXIpZGF0YVtpXTsKLQotICAgIGlmKGRhdGFbbGVuZ3RoICsgMV0gIT0gMCkgQ0VSUk9SX0JSRUFLKGVycm9yLCA3Mik7IC8qdGhlIDAgYnl0ZSBpbmRpY2F0aW5nIGNvbXByZXNzaW9uIG11c3QgYmUgMCovCi0KLSAgICBzdHJpbmcyX2JlZ2luID0gbGVuZ3RoICsgMjsKLSAgICBpZihzdHJpbmcyX2JlZ2luID4gY2h1bmtMZW5ndGgpIENFUlJPUl9CUkVBSyhlcnJvciwgNzUpOyAvKm5vIG51bGwgdGVybWluYXRpb24sIGNvcnJ1cHQ/Ki8KLQotICAgIGxlbmd0aCA9ICh1bnNpZ25lZCljaHVua0xlbmd0aCAtIHN0cmluZzJfYmVnaW47Ci0gICAgLyp3aWxsIGZhaWwgaWYgemxpYiBlcnJvciwgZS5nLiBpZiBsZW5ndGggaXMgdG9vIHNtYWxsKi8KLSAgICBlcnJvciA9IHpsaWJfZGVjb21wcmVzcygmZGVjb2RlZC5kYXRhLCAmZGVjb2RlZC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikoJmRhdGFbc3RyaW5nMl9iZWdpbl0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgemxpYnNldHRpbmdzKTsKLSAgICBpZihlcnJvcikgYnJlYWs7Ci0gICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZkZWNvZGVkLCAwKTsKLQotICAgIGVycm9yID0gbG9kZXBuZ19hZGRfdGV4dChpbmZvLCBrZXksIChjaGFyKilkZWNvZGVkLmRhdGEpOwotCi0gICAgYnJlYWs7Ci0gIH0KLQotICBsb2RlcG5nX2ZyZWUoa2V5KTsKLSAgdWN2ZWN0b3JfY2xlYW51cCgmZGVjb2RlZCk7Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0vKmludGVybmF0aW9uYWwgdGV4dCBjaHVuayAoaVRYdCkqLwotc3RhdGljIHVuc2lnbmVkIHJlYWRDaHVua19pVFh0KExvZGVQTkdJbmZvKiBpbmZvLCBjb25zdCBMb2RlUE5HRGVjb21wcmVzc1NldHRpbmdzKiB6bGlic2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IGNodW5rTGVuZ3RoKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgdW5zaWduZWQgaTsKLQotICB1bnNpZ25lZCBsZW5ndGgsIGJlZ2luLCBjb21wcmVzc2VkOwotICBjaGFyICprZXkgPSAwLCAqbGFuZ3RhZyA9IDAsICp0cmFuc2tleSA9IDA7Ci0gIHVjdmVjdG9yIGRlY29kZWQ7Ci0gIHVjdmVjdG9yX2luaXQoJmRlY29kZWQpOyAvKiBUT0RPOiBvbmx5IHVzZSBpbiBjYXNlIG9mIGNvbXByZXNzZWQgdGV4dCAqLwotCi0gIHdoaWxlKCFlcnJvcikgLypub3QgcmVhbGx5IGEgd2hpbGUgbG9vcCwgb25seSB1c2VkIHRvIGJyZWFrIG9uIGVycm9yKi8gewotICAgIC8qUXVpY2sgY2hlY2sgaWYgdGhlIGNodW5rIGxlbmd0aCBpc24ndCB0b28gc21hbGwuIEV2ZW4gd2l0aG91dCBjaGVjawotICAgIGl0J2Qgc3RpbGwgZmFpbCB3aXRoIG90aGVyIGVycm9yIGNoZWNrcyBiZWxvdyBpZiBpdCdzIHRvbyBzaG9ydC4gVGhpcyBqdXN0IGdpdmVzIGEgZGlmZmVyZW50IGVycm9yIGNvZGUuKi8KLSAgICBpZihjaHVua0xlbmd0aCA8IDUpIENFUlJPUl9CUkVBSyhlcnJvciwgMzApOyAvKmlUWHQgY2h1bmsgdG9vIHNob3J0Ki8KLQotICAgIC8qcmVhZCB0aGUga2V5Ki8KLSAgICBmb3IobGVuZ3RoID0gMDsgbGVuZ3RoIDwgY2h1bmtMZW5ndGggJiYgZGF0YVtsZW5ndGhdICE9IDA7ICsrbGVuZ3RoKSA7Ci0gICAgaWYobGVuZ3RoICsgMyA+PSBjaHVua0xlbmd0aCkgQ0VSUk9SX0JSRUFLKGVycm9yLCA3NSk7IC8qbm8gbnVsbCB0ZXJtaW5hdGlvbiBjaGFyLCBjb3JydXB0PyovCi0gICAgaWYobGVuZ3RoIDwgMSB8fCBsZW5ndGggPiA3OSkgQ0VSUk9SX0JSRUFLKGVycm9yLCA4OSk7IC8qa2V5d29yZCB0b28gc2hvcnQgb3IgbG9uZyovCi0KLSAgICBrZXkgPSAoY2hhciopbG9kZXBuZ19tYWxsb2MobGVuZ3RoICsgMSk7Ci0gICAgaWYoIWtleSkgQ0VSUk9SX0JSRUFLKGVycm9yLCA4Myk7IC8qYWxsb2MgZmFpbCovCi0KLSAgICBrZXlbbGVuZ3RoXSA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSBrZXlbaV0gPSAoY2hhcilkYXRhW2ldOwotCi0gICAgLypyZWFkIHRoZSBjb21wcmVzc2lvbiBtZXRob2QqLwotICAgIGNvbXByZXNzZWQgPSBkYXRhW2xlbmd0aCArIDFdOwotICAgIGlmKGRhdGFbbGVuZ3RoICsgMl0gIT0gMCkgQ0VSUk9SX0JSRUFLKGVycm9yLCA3Mik7IC8qdGhlIDAgYnl0ZSBpbmRpY2F0aW5nIGNvbXByZXNzaW9uIG11c3QgYmUgMCovCi0KLSAgICAvKmV2ZW4gdGhvdWdoIGl0J3Mgbm90IGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkLCBubyBlcnJvciBpcyB0aHJvd24gaWYKLSAgICB0aGVyZSdzIG5vIG51bGwgdGVybWluYXRpb24gY2hhciwgaWYgdGhlIHRleHQgaXMgZW1wdHkgZm9yIHRoZSBuZXh0IDMgdGV4dHMqLwotCi0gICAgLypyZWFkIHRoZSBsYW5ndGFnKi8KLSAgICBiZWdpbiA9IGxlbmd0aCArIDM7Ci0gICAgbGVuZ3RoID0gMDsKLSAgICBmb3IoaSA9IGJlZ2luOyBpIDwgY2h1bmtMZW5ndGggJiYgZGF0YVtpXSAhPSAwOyArK2kpICsrbGVuZ3RoOwotCi0gICAgbGFuZ3RhZyA9IChjaGFyKilsb2RlcG5nX21hbGxvYyhsZW5ndGggKyAxKTsKLSAgICBpZighbGFuZ3RhZykgQ0VSUk9SX0JSRUFLKGVycm9yLCA4Myk7IC8qYWxsb2MgZmFpbCovCi0KLSAgICBsYW5ndGFnW2xlbmd0aF0gPSAwOwotICAgIGZvcihpID0gMDsgaSAhPSBsZW5ndGg7ICsraSkgbGFuZ3RhZ1tpXSA9IChjaGFyKWRhdGFbYmVnaW4gKyBpXTsKLQotICAgIC8qcmVhZCB0aGUgdHJhbnNrZXkqLwotICAgIGJlZ2luICs9IGxlbmd0aCArIDE7Ci0gICAgbGVuZ3RoID0gMDsKLSAgICBmb3IoaSA9IGJlZ2luOyBpIDwgY2h1bmtMZW5ndGggJiYgZGF0YVtpXSAhPSAwOyArK2kpICsrbGVuZ3RoOwotCi0gICAgdHJhbnNrZXkgPSAoY2hhciopbG9kZXBuZ19tYWxsb2MobGVuZ3RoICsgMSk7Ci0gICAgaWYoIXRyYW5za2V5KSBDRVJST1JfQlJFQUsoZXJyb3IsIDgzKTsgLyphbGxvYyBmYWlsKi8KLQotICAgIHRyYW5za2V5W2xlbmd0aF0gPSAwOwotICAgIGZvcihpID0gMDsgaSAhPSBsZW5ndGg7ICsraSkgdHJhbnNrZXlbaV0gPSAoY2hhcilkYXRhW2JlZ2luICsgaV07Ci0KLSAgICAvKnJlYWQgdGhlIGFjdHVhbCB0ZXh0Ki8KLSAgICBiZWdpbiArPSBsZW5ndGggKyAxOwotCi0gICAgbGVuZ3RoID0gKHVuc2lnbmVkKWNodW5rTGVuZ3RoIDwgYmVnaW4gPyAwIDogKHVuc2lnbmVkKWNodW5rTGVuZ3RoIC0gYmVnaW47Ci0KLSAgICBpZihjb21wcmVzc2VkKSB7Ci0gICAgICAvKndpbGwgZmFpbCBpZiB6bGliIGVycm9yLCBlLmcuIGlmIGxlbmd0aCBpcyB0b28gc21hbGwqLwotICAgICAgZXJyb3IgPSB6bGliX2RlY29tcHJlc3MoJmRlY29kZWQuZGF0YSwgJmRlY29kZWQuc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikoJmRhdGFbYmVnaW5dKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgemxpYnNldHRpbmdzKTsKLSAgICAgIGlmKGVycm9yKSBicmVhazsKLSAgICAgIGlmKGRlY29kZWQuYWxsb2NzaXplIDwgZGVjb2RlZC5zaXplKSBkZWNvZGVkLmFsbG9jc2l6ZSA9IGRlY29kZWQuc2l6ZTsKLSAgICAgIHVjdmVjdG9yX3B1c2hfYmFjaygmZGVjb2RlZCwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmKCF1Y3ZlY3Rvcl9yZXNpemUoJmRlY29kZWQsIGxlbmd0aCArIDEpKSBDRVJST1JfQlJFQUsoZXJyb3IsIDgzIC8qYWxsb2MgZmFpbCovKTsKLQotICAgICAgZGVjb2RlZC5kYXRhW2xlbmd0aF0gPSAwOwotICAgICAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSBkZWNvZGVkLmRhdGFbaV0gPSBkYXRhW2JlZ2luICsgaV07Ci0gICAgfQotCi0gICAgZXJyb3IgPSBsb2RlcG5nX2FkZF9pdGV4dChpbmZvLCBrZXksIGxhbmd0YWcsIHRyYW5za2V5LCAoY2hhciopZGVjb2RlZC5kYXRhKTsKLQotICAgIGJyZWFrOwotICB9Ci0KLSAgbG9kZXBuZ19mcmVlKGtleSk7Ci0gIGxvZGVwbmdfZnJlZShsYW5ndGFnKTsKLSAgbG9kZXBuZ19mcmVlKHRyYW5za2V5KTsKLSAgdWN2ZWN0b3JfY2xlYW51cCgmZGVjb2RlZCk7Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdW5zaWduZWQgcmVhZENodW5rX3RJTUUoTG9kZVBOR0luZm8qIGluZm8sIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBjaHVua0xlbmd0aCkgewotICBpZihjaHVua0xlbmd0aCAhPSA3KSByZXR1cm4gNzM7IC8qaW52YWxpZCB0SU1FIGNodW5rIHNpemUqLwotCi0gIGluZm8tPnRpbWVfZGVmaW5lZCA9IDE7Ci0gIGluZm8tPnRpbWUueWVhciA9IDI1NnUgKiBkYXRhWzBdICsgZGF0YVsxXTsKLSAgaW5mby0+dGltZS5tb250aCA9IGRhdGFbMl07Ci0gIGluZm8tPnRpbWUuZGF5ID0gZGF0YVszXTsKLSAgaW5mby0+dGltZS5ob3VyID0gZGF0YVs0XTsKLSAgaW5mby0+dGltZS5taW51dGUgPSBkYXRhWzVdOwotICBpbmZvLT50aW1lLnNlY29uZCA9IGRhdGFbNl07Ci0KLSAgcmV0dXJuIDA7IC8qIE9LICovCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCByZWFkQ2h1bmtfcEhZcyhMb2RlUE5HSW5mbyogaW5mbywgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IGNodW5rTGVuZ3RoKSB7Ci0gIGlmKGNodW5rTGVuZ3RoICE9IDkpIHJldHVybiA3NDsgLyppbnZhbGlkIHBIWXMgY2h1bmsgc2l6ZSovCi0KLSAgaW5mby0+cGh5c19kZWZpbmVkID0gMTsKLSAgaW5mby0+cGh5c194ID0gMTY3NzcyMTZ1ICogZGF0YVswXSArIDY1NTM2dSAqIGRhdGFbMV0gKyAyNTZ1ICogZGF0YVsyXSArIGRhdGFbM107Ci0gIGluZm8tPnBoeXNfeSA9IDE2Nzc3MjE2dSAqIGRhdGFbNF0gKyA2NTUzNnUgKiBkYXRhWzVdICsgMjU2dSAqIGRhdGFbNl0gKyBkYXRhWzddOwotICBpbmZvLT5waHlzX3VuaXQgPSBkYXRhWzhdOwotCi0gIHJldHVybiAwOyAvKiBPSyAqLwotfQotCi1zdGF0aWMgdW5zaWduZWQgcmVhZENodW5rX2dBTUEoTG9kZVBOR0luZm8qIGluZm8sIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBjaHVua0xlbmd0aCkgewotICBpZihjaHVua0xlbmd0aCAhPSA0KSByZXR1cm4gOTY7IC8qaW52YWxpZCBnQU1BIGNodW5rIHNpemUqLwotCi0gIGluZm8tPmdhbWFfZGVmaW5lZCA9IDE7Ci0gIGluZm8tPmdhbWFfZ2FtbWEgPSAxNjc3NzIxNnUgKiBkYXRhWzBdICsgNjU1MzZ1ICogZGF0YVsxXSArIDI1NnUgKiBkYXRhWzJdICsgZGF0YVszXTsKLQotICByZXR1cm4gMDsgLyogT0sgKi8KLX0KLQotc3RhdGljIHVuc2lnbmVkIHJlYWRDaHVua19jSFJNKExvZGVQTkdJbmZvKiBpbmZvLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBzaXplX3QgY2h1bmtMZW5ndGgpIHsKLSAgaWYoY2h1bmtMZW5ndGggIT0gMzIpIHJldHVybiA5NzsgLyppbnZhbGlkIGNIUk0gY2h1bmsgc2l6ZSovCi0KLSAgaW5mby0+Y2hybV9kZWZpbmVkID0gMTsKLSAgaW5mby0+Y2hybV93aGl0ZV94ID0gMTY3NzcyMTZ1ICogZGF0YVsgMF0gKyA2NTUzNnUgKiBkYXRhWyAxXSArIDI1NnUgKiBkYXRhWyAyXSArIGRhdGFbIDNdOwotICBpbmZvLT5jaHJtX3doaXRlX3kgPSAxNjc3NzIxNnUgKiBkYXRhWyA0XSArIDY1NTM2dSAqIGRhdGFbIDVdICsgMjU2dSAqIGRhdGFbIDZdICsgZGF0YVsgN107Ci0gIGluZm8tPmNocm1fcmVkX3ggICA9IDE2Nzc3MjE2dSAqIGRhdGFbIDhdICsgNjU1MzZ1ICogZGF0YVsgOV0gKyAyNTZ1ICogZGF0YVsxMF0gKyBkYXRhWzExXTsKLSAgaW5mby0+Y2hybV9yZWRfeSAgID0gMTY3NzcyMTZ1ICogZGF0YVsxMl0gKyA2NTUzNnUgKiBkYXRhWzEzXSArIDI1NnUgKiBkYXRhWzE0XSArIGRhdGFbMTVdOwotICBpbmZvLT5jaHJtX2dyZWVuX3ggPSAxNjc3NzIxNnUgKiBkYXRhWzE2XSArIDY1NTM2dSAqIGRhdGFbMTddICsgMjU2dSAqIGRhdGFbMThdICsgZGF0YVsxOV07Ci0gIGluZm8tPmNocm1fZ3JlZW5feSA9IDE2Nzc3MjE2dSAqIGRhdGFbMjBdICsgNjU1MzZ1ICogZGF0YVsyMV0gKyAyNTZ1ICogZGF0YVsyMl0gKyBkYXRhWzIzXTsKLSAgaW5mby0+Y2hybV9ibHVlX3ggID0gMTY3NzcyMTZ1ICogZGF0YVsyNF0gKyA2NTUzNnUgKiBkYXRhWzI1XSArIDI1NnUgKiBkYXRhWzI2XSArIGRhdGFbMjddOwotICBpbmZvLT5jaHJtX2JsdWVfeSAgPSAxNjc3NzIxNnUgKiBkYXRhWzI4XSArIDY1NTM2dSAqIGRhdGFbMjldICsgMjU2dSAqIGRhdGFbMzBdICsgZGF0YVszMV07Ci0KLSAgcmV0dXJuIDA7IC8qIE9LICovCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCByZWFkQ2h1bmtfc1JHQihMb2RlUE5HSW5mbyogaW5mbywgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IGNodW5rTGVuZ3RoKSB7Ci0gIGlmKGNodW5rTGVuZ3RoICE9IDEpIHJldHVybiA5ODsgLyppbnZhbGlkIHNSR0IgY2h1bmsgc2l6ZSAodGhpcyBvbmUgaXMgbmV2ZXIgaWdub3JlZCkqLwotCi0gIGluZm8tPnNyZ2JfZGVmaW5lZCA9IDE7Ci0gIGluZm8tPnNyZ2JfaW50ZW50ID0gZGF0YVswXTsKLQotICByZXR1cm4gMDsgLyogT0sgKi8KLX0KLQotc3RhdGljIHVuc2lnbmVkIHJlYWRDaHVua19pQ0NQKExvZGVQTkdJbmZvKiBpbmZvLCBjb25zdCBMb2RlUE5HRGVjb21wcmVzc1NldHRpbmdzKiB6bGlic2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgc2l6ZV90IGNodW5rTGVuZ3RoKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgdW5zaWduZWQgaTsKLQotICB1bnNpZ25lZCBsZW5ndGgsIHN0cmluZzJfYmVnaW47Ci0gIHVjdmVjdG9yIGRlY29kZWQ7Ci0KLSAgaW5mby0+aWNjcF9kZWZpbmVkID0gMTsKLSAgaWYoaW5mby0+aWNjcF9uYW1lKSBsb2RlcG5nX2NsZWFyX2ljYyhpbmZvKTsKLQotICBmb3IobGVuZ3RoID0gMDsgbGVuZ3RoIDwgY2h1bmtMZW5ndGggJiYgZGF0YVtsZW5ndGhdICE9IDA7ICsrbGVuZ3RoKSA7Ci0gIGlmKGxlbmd0aCArIDIgPj0gY2h1bmtMZW5ndGgpIHJldHVybiA3NTsgLypubyBudWxsIHRlcm1pbmF0aW9uLCBjb3JydXB0PyovCi0gIGlmKGxlbmd0aCA8IDEgfHwgbGVuZ3RoID4gNzkpIHJldHVybiA4OTsgLyprZXl3b3JkIHRvbyBzaG9ydCBvciBsb25nKi8KLQotICBpbmZvLT5pY2NwX25hbWUgPSAoY2hhciopbG9kZXBuZ19tYWxsb2MobGVuZ3RoICsgMSk7Ci0gIGlmKCFpbmZvLT5pY2NwX25hbWUpIHJldHVybiA4MzsgLyphbGxvYyBmYWlsKi8KLQotICBpbmZvLT5pY2NwX25hbWVbbGVuZ3RoXSA9IDA7Ci0gIGZvcihpID0gMDsgaSAhPSBsZW5ndGg7ICsraSkgaW5mby0+aWNjcF9uYW1lW2ldID0gKGNoYXIpZGF0YVtpXTsKLQotICBpZihkYXRhW2xlbmd0aCArIDFdICE9IDApIHJldHVybiA3MjsgLyp0aGUgMCBieXRlIGluZGljYXRpbmcgY29tcHJlc3Npb24gbXVzdCBiZSAwKi8KLQotICBzdHJpbmcyX2JlZ2luID0gbGVuZ3RoICsgMjsKLSAgaWYoc3RyaW5nMl9iZWdpbiA+IGNodW5rTGVuZ3RoKSByZXR1cm4gNzU7IC8qbm8gbnVsbCB0ZXJtaW5hdGlvbiwgY29ycnVwdD8qLwotCi0gIGxlbmd0aCA9ICh1bnNpZ25lZCljaHVua0xlbmd0aCAtIHN0cmluZzJfYmVnaW47Ci0gIHVjdmVjdG9yX2luaXQoJmRlY29kZWQpOwotICBlcnJvciA9IHpsaWJfZGVjb21wcmVzcygmZGVjb2RlZC5kYXRhLCAmZGVjb2RlZC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciopKCZkYXRhW3N0cmluZzJfYmVnaW5dKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCB6bGlic2V0dGluZ3MpOwotICBpZighZXJyb3IpIHsKLSAgICBpbmZvLT5pY2NwX3Byb2ZpbGVfc2l6ZSA9ICh1bnNpZ25lZCBpbnQpZGVjb2RlZC5zaXplOwotICAgIGluZm8tPmljY3BfcHJvZmlsZSA9ICh1bnNpZ25lZCBjaGFyKilsb2RlcG5nX21hbGxvYyhkZWNvZGVkLnNpemUpOwotICAgIGlmKGluZm8tPmljY3BfcHJvZmlsZSkgewotICAgICAgbWVtY3B5KGluZm8tPmljY3BfcHJvZmlsZSwgZGVjb2RlZC5kYXRhLCBkZWNvZGVkLnNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlcnJvciA9IDgzOyAvKiBhbGxvYyBmYWlsICovCi0gICAgfQotICB9Ci0gIHVjdmVjdG9yX2NsZWFudXAoJmRlY29kZWQpOwotICByZXR1cm4gZXJyb3I7Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0KLXVuc2lnbmVkIGxvZGVwbmdfaW5zcGVjdF9jaHVuayhMb2RlUE5HU3RhdGUqIHN0YXRlLCBzaXplX3QgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplKSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rID0gaW4gKyBwb3M7Ci0gIHVuc2lnbmVkIGNodW5rTGVuZ3RoOwotICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhOwotICB1bnNpZ25lZCB1bmhhbmRsZWQgPSAwOwotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0KLSAgaWYgKHBvcyArIDQgPiBpbnNpemUpIHJldHVybiAzMDsKLSAgY2h1bmtMZW5ndGggPSBsb2RlcG5nX2NodW5rX2xlbmd0aChjaHVuayk7Ci0gIGlmKGNodW5rTGVuZ3RoID4gMjE0NzQ4MzY0NykgcmV0dXJuIDYzOwotICBkYXRhID0gbG9kZXBuZ19jaHVua19kYXRhX2NvbnN0KGNodW5rKTsKLSAgaWYoZGF0YSArIGNodW5rTGVuZ3RoICsgNCA+IGluICsgaW5zaXplKSByZXR1cm4gMzA7Ci0KLSAgaWYobG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhjaHVuaywgIlBMVEUiKSkgewotICAgIGVycm9yID0gcmVhZENodW5rX1BMVEUoJnN0YXRlLT5pbmZvX3BuZy5jb2xvciwgZGF0YSwgY2h1bmtMZW5ndGgpOwotICB9IGVsc2UgaWYobG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhjaHVuaywgInRSTlMiKSkgewotICAgIGVycm9yID0gcmVhZENodW5rX3RSTlMoJnN0YXRlLT5pbmZvX3BuZy5jb2xvciwgZGF0YSwgY2h1bmtMZW5ndGgpOwotI2lmZGVmIExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTCi0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiYktHRCIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfYktHRCgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAidEVYdCIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfdEVYdCgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAielRYdCIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfelRYdCgmc3RhdGUtPmluZm9fcG5nLCAmc3RhdGUtPmRlY29kZXIuemxpYnNldHRpbmdzLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiaVRYdCIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfaVRYdCgmc3RhdGUtPmluZm9fcG5nLCAmc3RhdGUtPmRlY29kZXIuemxpYnNldHRpbmdzLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAidElNRSIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfdElNRSgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAicEhZcyIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfcEhZcygmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiZ0FNQSIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfZ0FNQSgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiY0hSTSIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfY0hSTSgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAic1JHQiIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfc1JHQigmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiaUNDUCIpKSB7Ci0gICAgZXJyb3IgPSByZWFkQ2h1bmtfaUNDUCgmc3RhdGUtPmluZm9fcG5nLCAmc3RhdGUtPmRlY29kZXIuemxpYnNldHRpbmdzLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0gIH0gZWxzZSB7Ci0gICAgLyogdW5oYW5kbGVkIGNodW5rIGlzIG9rIChpcyBub3QgYW4gZXJyb3IpICovCi0gICAgdW5oYW5kbGVkID0gMTsKLSAgfQotCi0gIGlmKCFlcnJvciAmJiAhdW5oYW5kbGVkICYmICFzdGF0ZS0+ZGVjb2Rlci5pZ25vcmVfY3JjKSB7Ci0gICAgaWYobG9kZXBuZ19jaHVua19jaGVja19jcmMoY2h1bmspKSByZXR1cm4gNTc7IC8qaW52YWxpZCBDUkMqLwotICB9Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0vKnJlYWQgYSBQTkcsIHRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgc2FtZSBjb2xvciB0eXBlIGFzIHRoZSBQTkcgKGhlbmNlICJnZW5lcmljIikqLwotc3RhdGljIHZvaWQgZGVjb2RlR2VuZXJpYyh1bnNpZ25lZCBjaGFyKiogb3V0LCB1bnNpZ25lZCogdywgdW5zaWduZWQqIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExvZGVQTkdTdGF0ZSogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplKSB7Ci0gIHVuc2lnbmVkIGNoYXIgSUVORCA9IDA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rOwotICBzaXplX3QgaTsKLSAgdWN2ZWN0b3IgaWRhdDsgLyp0aGUgZGF0YSBmcm9tIGlkYXQgY2h1bmtzKi8KLSAgdWN2ZWN0b3Igc2NhbmxpbmVzOwotICBzaXplX3QgcHJlZGljdDsKLSAgc2l6ZV90IG91dHNpemUgPSAwOwotCi0gIC8qZm9yIHVua25vd24gY2h1bmsgb3JkZXIqLwotICB1bnNpZ25lZCB1bmtub3duID0gMDsKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotICB1bnNpZ25lZCBjcml0aWNhbF9wb3MgPSAxOyAvKjEgPSBhZnRlciBJSERSLCAyID0gYWZ0ZXIgUExURSwgMyA9IGFmdGVyIElEQVQqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MqLwotCi0KLSAgLyogc2FmZSBvdXRwdXQgdmFsdWVzIGluIGNhc2UgZXJyb3IgaGFwcGVucyAqLwotICAqb3V0ID0gMDsKLSAgKncgPSAqaCA9IDA7Ci0KLSAgc3RhdGUtPmVycm9yID0gbG9kZXBuZ19pbnNwZWN0KHcsIGgsIHN0YXRlLCBpbiwgaW5zaXplKTsgLypyZWFkcyBoZWFkZXIgYW5kIHJlc2V0cyBvdGhlciBwYXJhbWV0ZXJzIGluIHN0YXRlLT5pbmZvX3BuZyovCi0gIGlmKHN0YXRlLT5lcnJvcikgcmV0dXJuOwotCi0gIGlmKGxvZGVwbmdfcGl4ZWxfb3ZlcmZsb3coKncsICpoLCAmc3RhdGUtPmluZm9fcG5nLmNvbG9yLCAmc3RhdGUtPmluZm9fcmF3KSkgewotICAgIENFUlJPUl9SRVRVUk4oc3RhdGUtPmVycm9yLCA5Mik7IC8qb3ZlcmZsb3cgcG9zc2libGUgZHVlIHRvIGFtb3VudCBvZiBwaXhlbHMqLwotICB9Ci0KLSAgdWN2ZWN0b3JfaW5pdCgmaWRhdCk7Ci0gIGNodW5rID0gJmluWzMzXTsgLypmaXJzdCBieXRlIG9mIHRoZSBmaXJzdCBjaHVuayBhZnRlciB0aGUgaGVhZGVyKi8KLQotICAvKmxvb3AgdGhyb3VnaCB0aGUgY2h1bmtzLCBpZ25vcmluZyB1bmtub3duIGNodW5rcyBhbmQgc3RvcHBpbmcgYXQgSUVORCBjaHVuay4KLSAgSURBVCBkYXRhIGlzIHB1dCBhdCB0aGUgc3RhcnQgb2YgdGhlIGluIGJ1ZmZlciovCi0gIHdoaWxlKCFJRU5EICYmICFzdGF0ZS0+ZXJyb3IpIHsKLSAgICB1bnNpZ25lZCBjaHVua0xlbmd0aDsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhOyAvKnRoZSBkYXRhIGluIHRoZSBjaHVuayovCi0KLSAgICAvKmVycm9yOiBzaXplIG9mIHRoZSBpbiBidWZmZXIgdG9vIHNtYWxsIHRvIGNvbnRhaW4gbmV4dCBjaHVuayovCi0gICAgaWYoKHNpemVfdCkoKGNodW5rIC0gaW4pICsgMTIpID4gaW5zaXplIHx8IGNodW5rIDwgaW4pIHsKLSAgICAgIGlmKHN0YXRlLT5kZWNvZGVyLmlnbm9yZV9lbmQpIGJyZWFrOyAvKm90aGVyIGVycm9ycyBtYXkgc3RpbGwgaGFwcGVuIHRob3VnaCovCi0gICAgICBDRVJST1JfQlJFQUsoc3RhdGUtPmVycm9yLCAzMCk7Ci0gICAgfQotCi0gICAgLypsZW5ndGggb2YgdGhlIGRhdGEgb2YgdGhlIGNodW5rLCBleGNsdWRpbmcgdGhlIGxlbmd0aCBieXRlcywgY2h1bmsgdHlwZSBhbmQgQ1JDIGJ5dGVzKi8KLSAgICBjaHVua0xlbmd0aCA9IGxvZGVwbmdfY2h1bmtfbGVuZ3RoKGNodW5rKTsKLSAgICAvKmVycm9yOiBjaHVuayBsZW5ndGggbGFyZ2VyIHRoYW4gdGhlIG1heCBQTkcgY2h1bmsgc2l6ZSovCi0gICAgaWYoY2h1bmtMZW5ndGggPiAyMTQ3NDgzNjQ3KSB7Ci0gICAgICBpZihzdGF0ZS0+ZGVjb2Rlci5pZ25vcmVfZW5kKSBicmVhazsgLypvdGhlciBlcnJvcnMgbWF5IHN0aWxsIGhhcHBlbiB0aG91Z2gqLwotICAgICAgQ0VSUk9SX0JSRUFLKHN0YXRlLT5lcnJvciwgNjMpOwotICAgIH0KLQotICAgIGlmKChzaXplX3QpKChjaHVuayAtIGluKSArIGNodW5rTGVuZ3RoICsgMTIpID4gaW5zaXplIHx8IChjaHVuayArIGNodW5rTGVuZ3RoICsgMTIpIDwgaW4pIHsKLSAgICAgIENFUlJPUl9CUkVBSyhzdGF0ZS0+ZXJyb3IsIDY0KTsgLyplcnJvcjogc2l6ZSBvZiB0aGUgaW4gYnVmZmVyIHRvbyBzbWFsbCB0byBjb250YWluIG5leHQgY2h1bmsqLwotICAgIH0KLQotICAgIGRhdGEgPSBsb2RlcG5nX2NodW5rX2RhdGFfY29uc3QoY2h1bmspOwotCi0gICAgdW5rbm93biA9IDA7Ci0KLSAgICAvKklEQVQgY2h1bmssIGNvbnRhaW5pbmcgY29tcHJlc3NlZCBpbWFnZSBkYXRhKi8KLSAgICBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiSURBVCIpKSB7Ci0gICAgICBzaXplX3Qgb2xkc2l6ZSA9IGlkYXQuc2l6ZTsKLSAgICAgIHNpemVfdCBuZXdzaXplOwotICAgICAgaWYobG9kZXBuZ19hZGRvZmwob2xkc2l6ZSwgY2h1bmtMZW5ndGgsICZuZXdzaXplKSkgQ0VSUk9SX0JSRUFLKHN0YXRlLT5lcnJvciwgOTUpOwotICAgICAgaWYoIXVjdmVjdG9yX3Jlc2l6ZSgmaWRhdCwgbmV3c2l6ZSkpIENFUlJPUl9CUkVBSyhzdGF0ZS0+ZXJyb3IsIDgzIC8qYWxsb2MgZmFpbCovKTsKLSAgICAgIGZvcihpID0gMDsgaSAhPSBjaHVua0xlbmd0aDsgKytpKSBpZGF0LmRhdGFbb2xkc2l6ZSArIGldID0gZGF0YVtpXTsKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotICAgICAgY3JpdGljYWxfcG9zID0gMzsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLSAgICB9IGVsc2UgaWYobG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhjaHVuaywgIklFTkQiKSkgewotICAgICAgLypJRU5EIGNodW5rKi8KLSAgICAgIElFTkQgPSAxOwotICAgIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiUExURSIpKSB7Ci0gICAgICAvKnBhbGV0dGUgY2h1bmsgKFBMVEUpKi8KLSAgICAgIHN0YXRlLT5lcnJvciA9IHJlYWRDaHVua19QTFRFKCZzdGF0ZS0+aW5mb19wbmcuY29sb3IsIGRhdGEsIGNodW5rTGVuZ3RoKTsKLSAgICAgIGlmKHN0YXRlLT5lcnJvcikgYnJlYWs7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgICAgIGNyaXRpY2FsX3BvcyA9IDI7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0gICAgfSBlbHNlIGlmKGxvZGVwbmdfY2h1bmtfdHlwZV9lcXVhbHMoY2h1bmssICJ0Uk5TIikpIHsKLSAgICAgIC8qcGFsZXR0ZSB0cmFuc3BhcmVuY3kgY2h1bmsgKHRSTlMpLiBFdmVuIHRob3VnaCB0aGlzIG9uZSBpcyBhbiBhbmNpbGxhcnkgY2h1bmsgLCBpdCBpcyBzdGlsbCBjb21waWxlZAotICAgICAgaW4gd2l0aG91dCAnTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MnIGJlY2F1c2UgaXQgY29udGFpbnMgZXNzZW50aWFsIGNvbG9yIGluZm9ybWF0aW9uIHRoYXQKLSAgICAgIGFmZmVjdHMgdGhlIGFscGhhIGNoYW5uZWwgb2YgcGl4ZWxzLiAqLwotICAgICAgc3RhdGUtPmVycm9yID0gcmVhZENodW5rX3RSTlMoJnN0YXRlLT5pbmZvX3BuZy5jb2xvciwgZGF0YSwgY2h1bmtMZW5ndGgpOwotICAgICAgaWYoc3RhdGUtPmVycm9yKSBicmVhazsKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotICAgICAgLypiYWNrZ3JvdW5kIGNvbG9yIGNodW5rIChiS0dEKSovCi0gICAgfSBlbHNlIGlmKGxvZGVwbmdfY2h1bmtfdHlwZV9lcXVhbHMoY2h1bmssICJiS0dEIikpIHsKLSAgICAgIHN0YXRlLT5lcnJvciA9IHJlYWRDaHVua19iS0dEKCZzdGF0ZS0+aW5mb19wbmcsIGRhdGEsIGNodW5rTGVuZ3RoKTsKLSAgICAgIGlmKHN0YXRlLT5lcnJvcikgYnJlYWs7Ci0gICAgfSBlbHNlIGlmKGxvZGVwbmdfY2h1bmtfdHlwZV9lcXVhbHMoY2h1bmssICJ0RVh0IikpIHsKLSAgICAgIC8qdGV4dCBjaHVuayAodEVYdCkqLwotICAgICAgaWYoc3RhdGUtPmRlY29kZXIucmVhZF90ZXh0X2NodW5rcykgewotICAgICAgICBzdGF0ZS0+ZXJyb3IgPSByZWFkQ2h1bmtfdEVYdCgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gICAgICAgIGlmKHN0YXRlLT5lcnJvcikgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmKGxvZGVwbmdfY2h1bmtfdHlwZV9lcXVhbHMoY2h1bmssICJ6VFh0IikpIHsKLSAgICAgIC8qY29tcHJlc3NlZCB0ZXh0IGNodW5rICh6VFh0KSovCi0gICAgICBpZihzdGF0ZS0+ZGVjb2Rlci5yZWFkX3RleHRfY2h1bmtzKSB7Ci0gICAgICAgIHN0YXRlLT5lcnJvciA9IHJlYWRDaHVua196VFh0KCZzdGF0ZS0+aW5mb19wbmcsICZzdGF0ZS0+ZGVjb2Rlci56bGlic2V0dGluZ3MsIGRhdGEsIGNodW5rTGVuZ3RoKTsKLSAgICAgICAgaWYoc3RhdGUtPmVycm9yKSBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYobG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhjaHVuaywgImlUWHQiKSkgewotICAgICAgLyppbnRlcm5hdGlvbmFsIHRleHQgY2h1bmsgKGlUWHQpKi8KLSAgICAgIGlmKHN0YXRlLT5kZWNvZGVyLnJlYWRfdGV4dF9jaHVua3MpIHsKLSAgICAgICAgc3RhdGUtPmVycm9yID0gcmVhZENodW5rX2lUWHQoJnN0YXRlLT5pbmZvX3BuZywgJnN0YXRlLT5kZWNvZGVyLnpsaWJzZXR0aW5ncywgZGF0YSwgY2h1bmtMZW5ndGgpOwotICAgICAgICBpZihzdGF0ZS0+ZXJyb3IpIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAidElNRSIpKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSByZWFkQ2h1bmtfdElNRSgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGJyZWFrOwotICAgIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAicEhZcyIpKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSByZWFkQ2h1bmtfcEhZcygmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGJyZWFrOwotICAgIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiZ0FNQSIpKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSByZWFkQ2h1bmtfZ0FNQSgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGJyZWFrOwotICAgIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiY0hSTSIpKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSByZWFkQ2h1bmtfY0hSTSgmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGJyZWFrOwotICAgIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAic1JHQiIpKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSByZWFkQ2h1bmtfc1JHQigmc3RhdGUtPmluZm9fcG5nLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGJyZWFrOwotICAgIH0gZWxzZSBpZihsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNodW5rLCAiaUNDUCIpKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSByZWFkQ2h1bmtfaUNDUCgmc3RhdGUtPmluZm9fcG5nLCAmc3RhdGUtPmRlY29kZXIuemxpYnNldHRpbmdzLCBkYXRhLCBjaHVua0xlbmd0aCk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGJyZWFrOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MqLwotICAgIH0gZWxzZSAvKml0J3Mgbm90IGFuIGltcGxlbWVudGVkIGNodW5rIHR5cGUsIHNvIGlnbm9yZSBpdDogc2tpcCBvdmVyIHRoZSBkYXRhKi8gewotICAgICAgLyplcnJvcjogdW5rbm93biBjcml0aWNhbCBjaHVuayAoNXRoIGJpdCBvZiBmaXJzdCBieXRlIG9mIGNodW5rIHR5cGUgaXMgMCkqLwotICAgICAgaWYoIXN0YXRlLT5kZWNvZGVyLmlnbm9yZV9jcml0aWNhbCAmJiAhbG9kZXBuZ19jaHVua19hbmNpbGxhcnkoY2h1bmspKSB7Ci0gICAgICAgIENFUlJPUl9CUkVBSyhzdGF0ZS0+ZXJyb3IsIDY5KTsKLSAgICAgIH0KLQotICAgICAgdW5rbm93biA9IDE7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgICAgIGlmKHN0YXRlLT5kZWNvZGVyLnJlbWVtYmVyX3Vua25vd25fY2h1bmtzKSB7Ci0gICAgICAgIHN0YXRlLT5lcnJvciA9IGxvZGVwbmdfY2h1bmtfYXBwZW5kKCZzdGF0ZS0+aW5mb19wbmcudW5rbm93bl9jaHVua3NfZGF0YVtjcml0aWNhbF9wb3MgLSAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLT5pbmZvX3BuZy51bmtub3duX2NodW5rc19zaXplW2NyaXRpY2FsX3BvcyAtIDFdLCBjaHVuayk7Ci0gICAgICAgIGlmKHN0YXRlLT5lcnJvcikgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0gICAgfQotCi0gICAgaWYoIXN0YXRlLT5kZWNvZGVyLmlnbm9yZV9jcmMgJiYgIXVua25vd24pIC8qY2hlY2sgQ1JDIGlmIHdhbnRlZCwgb25seSBvbiBrbm93biBjaHVuayB0eXBlcyovIHsKLSAgICAgIGlmKGxvZGVwbmdfY2h1bmtfY2hlY2tfY3JjKGNodW5rKSkgQ0VSUk9SX0JSRUFLKHN0YXRlLT5lcnJvciwgNTcpOyAvKmludmFsaWQgQ1JDKi8KLSAgICB9Ci0KLSAgICBpZighSUVORCkgY2h1bmsgPSBsb2RlcG5nX2NodW5rX25leHRfY29uc3QoY2h1bmspOwotICB9Ci0KLSAgdWN2ZWN0b3JfaW5pdCgmc2NhbmxpbmVzKTsKLSAgLypwcmVkaWN0IG91dHB1dCBzaXplLCB0byBhbGxvY2F0ZSBleGFjdCBzaXplIGZvciBvdXRwdXQgYnVmZmVyIHRvIGF2b2lkIG1vcmUgZHluYW1pYyBhbGxvY2F0aW9uLgotICBJZiB0aGUgZGVjb21wcmVzc2VkIHNpemUgZG9lcyBub3QgbWF0Y2ggdGhlIHByZWRpY3Rpb24sIHRoZSBpbWFnZSBtdXN0IGJlIGNvcnJ1cHQuKi8KLSAgaWYoc3RhdGUtPmluZm9fcG5nLmludGVybGFjZV9tZXRob2QgPT0gMCkgewotICAgIHByZWRpY3QgPSBsb2RlcG5nX2dldF9yYXdfc2l6ZV9pZGF0KCp3LCAqaCwgJnN0YXRlLT5pbmZvX3BuZy5jb2xvcik7Ci0gIH0gZWxzZSB7Ci0gICAgLypBZGFtLTcgaW50ZXJsYWNlZDogcHJlZGljdGVkIHNpemUgaXMgdGhlIHN1bSBvZiB0aGUgNyBzdWItaW1hZ2VzIHNpemVzKi8KLSAgICBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBjb2xvciA9ICZzdGF0ZS0+aW5mb19wbmcuY29sb3I7Ci0gICAgcHJlZGljdCA9IDA7Ci0gICAgcHJlZGljdCArPSBsb2RlcG5nX2dldF9yYXdfc2l6ZV9pZGF0KCgqdyArIDcpID4+IDMsICgqaCArIDcpID4+IDMsIGNvbG9yKTsKLSAgICBpZigqdyA+IDQpIHByZWRpY3QgKz0gbG9kZXBuZ19nZXRfcmF3X3NpemVfaWRhdCgoKncgKyAzKSA+PiAzLCAoKmggKyA3KSA+PiAzLCBjb2xvcik7Ci0gICAgcHJlZGljdCArPSBsb2RlcG5nX2dldF9yYXdfc2l6ZV9pZGF0KCgqdyArIDMpID4+IDIsICgqaCArIDMpID4+IDMsIGNvbG9yKTsKLSAgICBpZigqdyA+IDIpIHByZWRpY3QgKz0gbG9kZXBuZ19nZXRfcmF3X3NpemVfaWRhdCgoKncgKyAxKSA+PiAyLCAoKmggKyAzKSA+PiAyLCBjb2xvcik7Ci0gICAgcHJlZGljdCArPSBsb2RlcG5nX2dldF9yYXdfc2l6ZV9pZGF0KCgqdyArIDEpID4+IDEsICgqaCArIDEpID4+IDIsIGNvbG9yKTsKLSAgICBpZigqdyA+IDEpIHByZWRpY3QgKz0gbG9kZXBuZ19nZXRfcmF3X3NpemVfaWRhdCgoKncgKyAwKSA+PiAxLCAoKmggKyAxKSA+PiAxLCBjb2xvcik7Ci0gICAgcHJlZGljdCArPSBsb2RlcG5nX2dldF9yYXdfc2l6ZV9pZGF0KCgqdyArIDApLCAoKmggKyAwKSA+PiAxLCBjb2xvcik7Ci0gIH0KLSAgaWYoIXN0YXRlLT5lcnJvciAmJiAhdWN2ZWN0b3JfcmVzZXJ2ZSgmc2NhbmxpbmVzLCBwcmVkaWN0KSkgc3RhdGUtPmVycm9yID0gODM7IC8qYWxsb2MgZmFpbCovCi0gIGlmKCFzdGF0ZS0+ZXJyb3IpIHsKLSAgICBzdGF0ZS0+ZXJyb3IgPSB6bGliX2RlY29tcHJlc3MoJnNjYW5saW5lcy5kYXRhLCAmc2NhbmxpbmVzLnNpemUsIGlkYXQuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRhdC5zaXplLCAmc3RhdGUtPmRlY29kZXIuemxpYnNldHRpbmdzKTsKLSAgICBpZighc3RhdGUtPmVycm9yICYmIHNjYW5saW5lcy5zaXplICE9IHByZWRpY3QpIHN0YXRlLT5lcnJvciA9IDkxOyAvKmRlY29tcHJlc3NlZCBzaXplIGRvZXNuJ3QgbWF0Y2ggcHJlZGljdGlvbiovCi0gIH0KLSAgdWN2ZWN0b3JfY2xlYW51cCgmaWRhdCk7Ci0KLSAgaWYoIXN0YXRlLT5lcnJvcikgewotICAgIG91dHNpemUgPSBsb2RlcG5nX2dldF9yYXdfc2l6ZSgqdywgKmgsICZzdGF0ZS0+aW5mb19wbmcuY29sb3IpOwotICAgICpvdXQgPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2Mob3V0c2l6ZSk7Ci0gICAgaWYoISpvdXQpIHN0YXRlLT5lcnJvciA9IDgzOyAvKmFsbG9jIGZhaWwqLwotICB9Ci0gIGlmKCFzdGF0ZS0+ZXJyb3IpIHsKLSAgICBmb3IoaSA9IDA7IGkgPCBvdXRzaXplOyBpKyspICgqb3V0KVtpXSA9IDA7Ci0gICAgc3RhdGUtPmVycm9yID0gcG9zdFByb2Nlc3NTY2FubGluZXMoKm91dCwgc2NhbmxpbmVzLmRhdGEsICp3LCAqaCwgJnN0YXRlLT5pbmZvX3BuZyk7Ci0gIH0KLSAgdWN2ZWN0b3JfY2xlYW51cCgmc2NhbmxpbmVzKTsKLX0KLQotdW5zaWduZWQgbG9kZXBuZ19kZWNvZGUodW5zaWduZWQgY2hhcioqIG91dCwgdW5zaWduZWQqIHcsIHVuc2lnbmVkKiBoLAotICAgICAgICAgICAgICAgICAgICAgICAgTG9kZVBOR1N0YXRlKiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplKSB7Ci0gICpvdXQgPSAwOwotICBkZWNvZGVHZW5lcmljKG91dCwgdywgaCwgc3RhdGUsIGluLCBpbnNpemUpOwotICBpZihzdGF0ZS0+ZXJyb3IpIHJldHVybiBzdGF0ZS0+ZXJyb3I7Ci0gIGlmKCFzdGF0ZS0+ZGVjb2Rlci5jb2xvcl9jb252ZXJ0IHx8IGxvZGVwbmdfY29sb3JfbW9kZV9lcXVhbCgmc3RhdGUtPmluZm9fcmF3LCAmc3RhdGUtPmluZm9fcG5nLmNvbG9yKSkgewotICAgIC8qc2FtZSBjb2xvciB0eXBlLCBubyBjb3B5aW5nIG9yIGNvbnZlcnRpbmcgb2YgZGF0YSBuZWVkZWQqLwotICAgIC8qc3RvcmUgdGhlIGluZm9fcG5nIGNvbG9yIHNldHRpbmdzIG9uIHRoZSBpbmZvX3JhdyBzbyB0aGF0IHRoZSBpbmZvX3JhdyBzdGlsbCByZWZsZWN0cyB3aGF0IGNvbG9ydHlwZQotICAgIHRoZSByYXcgaW1hZ2UgaGFzIHRvIHRoZSBlbmQgdXNlciovCi0gICAgaWYoIXN0YXRlLT5kZWNvZGVyLmNvbG9yX2NvbnZlcnQpIHsKLSAgICAgIHN0YXRlLT5lcnJvciA9IGxvZGVwbmdfY29sb3JfbW9kZV9jb3B5KCZzdGF0ZS0+aW5mb19yYXcsICZzdGF0ZS0+aW5mb19wbmcuY29sb3IpOwotICAgICAgaWYoc3RhdGUtPmVycm9yKSByZXR1cm4gc3RhdGUtPmVycm9yOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKmNvbG9yIGNvbnZlcnNpb24gbmVlZGVkOyBzb3J0IG9mIGNvcHkgb2YgdGhlIGRhdGEqLwotICAgIHVuc2lnbmVkIGNoYXIqIGRhdGEgPSAqb3V0OwotICAgIHNpemVfdCBvdXRzaXplOwotCi0gICAgLypUT0RPOiBjaGVjayBpZiB0aGlzIHdvcmtzIGFjY29yZGluZyB0byB0aGUgc3RhdGVtZW50IGluIHRoZSBkb2N1bWVudGF0aW9uOiAiVGhlIGNvbnZlcnRlciBjYW4gY29udmVydAotICAgIGZyb20gZ3JheXNjYWxlIGlucHV0IGNvbG9yIHR5cGUsIHRvIDgtYml0IGdyYXlzY2FsZSBvciBncmF5c2NhbGUgd2l0aCBhbHBoYSIqLwotICAgIGlmKCEoc3RhdGUtPmluZm9fcmF3LmNvbG9ydHlwZSA9PSBMQ1RfUkdCIHx8IHN0YXRlLT5pbmZvX3Jhdy5jb2xvcnR5cGUgPT0gTENUX1JHQkEpCi0gICAgICAgJiYgIShzdGF0ZS0+aW5mb19yYXcuYml0ZGVwdGggPT0gOCkpIHsKLSAgICAgIHJldHVybiA1NjsgLyp1bnN1cHBvcnRlZCBjb2xvciBtb2RlIGNvbnZlcnNpb24qLwotICAgIH0KLQotICAgIG91dHNpemUgPSBsb2RlcG5nX2dldF9yYXdfc2l6ZSgqdywgKmgsICZzdGF0ZS0+aW5mb19yYXcpOwotICAgICpvdXQgPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2Mob3V0c2l6ZSk7Ci0gICAgaWYoISgqb3V0KSkgewotICAgICAgc3RhdGUtPmVycm9yID0gODM7IC8qYWxsb2MgZmFpbCovCi0gICAgfQotICAgIGVsc2Ugc3RhdGUtPmVycm9yID0gbG9kZXBuZ19jb252ZXJ0KCpvdXQsIGRhdGEsICZzdGF0ZS0+aW5mb19yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLT5pbmZvX3BuZy5jb2xvciwgKncsICpoKTsKLSAgICBsb2RlcG5nX2ZyZWUoZGF0YSk7Ci0gIH0KLSAgcmV0dXJuIHN0YXRlLT5lcnJvcjsKLX0KLQotdW5zaWduZWQgbG9kZXBuZ19kZWNvZGVfbWVtb3J5KHVuc2lnbmVkIGNoYXIqKiBvdXQsIHVuc2lnbmVkKiB3LCB1bnNpZ25lZCogaCwgY29uc3QgdW5zaWduZWQgY2hhciogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluc2l6ZSwgTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJpdGRlcHRoKSB7Ci0gIHVuc2lnbmVkIGVycm9yOwotICBMb2RlUE5HU3RhdGUgc3RhdGU7Ci0gIGxvZGVwbmdfc3RhdGVfaW5pdCgmc3RhdGUpOwotICBzdGF0ZS5pbmZvX3Jhdy5jb2xvcnR5cGUgPSBjb2xvcnR5cGU7Ci0gIHN0YXRlLmluZm9fcmF3LmJpdGRlcHRoID0gYml0ZGVwdGg7Ci0gIGVycm9yID0gbG9kZXBuZ19kZWNvZGUob3V0LCB3LCBoLCAmc3RhdGUsIGluLCBpbnNpemUpOwotICBsb2RlcG5nX3N0YXRlX2NsZWFudXAoJnN0YXRlKTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2RlY29kZTMyKHVuc2lnbmVkIGNoYXIqKiBvdXQsIHVuc2lnbmVkKiB3LCB1bnNpZ25lZCogaCwgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpbnNpemUpIHsKLSAgcmV0dXJuIGxvZGVwbmdfZGVjb2RlX21lbW9yeShvdXQsIHcsIGgsIGluLCBpbnNpemUsIExDVF9SR0JBLCA4KTsKLX0KLQotdW5zaWduZWQgbG9kZXBuZ19kZWNvZGUyNCh1bnNpZ25lZCBjaGFyKiogb3V0LCB1bnNpZ25lZCogdywgdW5zaWduZWQqIGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplKSB7Ci0gIHJldHVybiBsb2RlcG5nX2RlY29kZV9tZW1vcnkob3V0LCB3LCBoLCBpbiwgaW5zaXplLCBMQ1RfUkdCLCA4KTsKLX0KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ESVNLCi11bnNpZ25lZCBsb2RlcG5nX2RlY29kZV9maWxlKHVuc2lnbmVkIGNoYXIqKiBvdXQsIHVuc2lnbmVkKiB3LCB1bnNpZ25lZCogaCwgY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlLCB1bnNpZ25lZCBiaXRkZXB0aCkgewotICB1bnNpZ25lZCBjaGFyKiBidWZmZXIgPSAwOwotICBzaXplX3QgYnVmZmVyc2l6ZTsKLSAgdW5zaWduZWQgZXJyb3I7Ci0gIC8qIHNhZmUgb3V0cHV0IHZhbHVlcyBpbiBjYXNlIGVycm9yIGhhcHBlbnMgKi8KLSAgKm91dCA9IDA7Ci0gICp3ID0gKmggPSAwOwotICBlcnJvciA9IGxvZGVwbmdfbG9hZF9maWxlKCZidWZmZXIsICZidWZmZXJzaXplLCBmaWxlbmFtZSk7Ci0gIGlmKCFlcnJvcikgZXJyb3IgPSBsb2RlcG5nX2RlY29kZV9tZW1vcnkob3V0LCB3LCBoLCBidWZmZXIsIGJ1ZmZlcnNpemUsIGNvbG9ydHlwZSwgYml0ZGVwdGgpOwotICBsb2RlcG5nX2ZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2RlY29kZTMyX2ZpbGUodW5zaWduZWQgY2hhcioqIG91dCwgdW5zaWduZWQqIHcsIHVuc2lnbmVkKiBoLCBjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICByZXR1cm4gbG9kZXBuZ19kZWNvZGVfZmlsZShvdXQsIHcsIGgsIGZpbGVuYW1lLCBMQ1RfUkdCQSwgOCk7Ci19Ci0KLXVuc2lnbmVkIGxvZGVwbmdfZGVjb2RlMjRfZmlsZSh1bnNpZ25lZCBjaGFyKiogb3V0LCB1bnNpZ25lZCogdywgdW5zaWduZWQqIGgsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gIHJldHVybiBsb2RlcG5nX2RlY29kZV9maWxlKG91dCwgdywgaCwgZmlsZW5hbWUsIExDVF9SR0IsIDgpOwotfQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RJU0sqLwotCi12b2lkIGxvZGVwbmdfZGVjb2Rlcl9zZXR0aW5nc19pbml0KExvZGVQTkdEZWNvZGVyU2V0dGluZ3MqIHNldHRpbmdzKSB7Ci0gIHNldHRpbmdzLT5jb2xvcl9jb252ZXJ0ID0gMTsKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotICBzZXR0aW5ncy0+cmVhZF90ZXh0X2NodW5rcyA9IDE7Ci0gIHNldHRpbmdzLT5yZW1lbWJlcl91bmtub3duX2NodW5rcyA9IDA7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0gIHNldHRpbmdzLT5pZ25vcmVfY3JjID0gMDsKLSAgc2V0dGluZ3MtPmlnbm9yZV9jcml0aWNhbCA9IDA7Ci0gIHNldHRpbmdzLT5pZ25vcmVfZW5kID0gMDsKLSAgbG9kZXBuZ19kZWNvbXByZXNzX3NldHRpbmdzX2luaXQoJnNldHRpbmdzLT56bGlic2V0dGluZ3MpOwotfQotCi0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiovCi0KLSNpZiBkZWZpbmVkKExPREVQTkdfQ09NUElMRV9ERUNPREVSKSB8fCBkZWZpbmVkKExPREVQTkdfQ09NUElMRV9FTkNPREVSKQotCi12b2lkIGxvZGVwbmdfc3RhdGVfaW5pdChMb2RlUE5HU3RhdGUqIHN0YXRlKSB7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RFQ09ERVIKLSAgbG9kZXBuZ19kZWNvZGVyX3NldHRpbmdzX2luaXQoJnN0YXRlLT5kZWNvZGVyKTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9ERUNPREVSKi8KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUgotICBsb2RlcG5nX2VuY29kZXJfc2V0dGluZ3NfaW5pdCgmc3RhdGUtPmVuY29kZXIpOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotICBsb2RlcG5nX2NvbG9yX21vZGVfaW5pdCgmc3RhdGUtPmluZm9fcmF3KTsKLSAgbG9kZXBuZ19pbmZvX2luaXQoJnN0YXRlLT5pbmZvX3BuZyk7Ci0gIHN0YXRlLT5lcnJvciA9IDE7Ci19Ci0KLXZvaWQgbG9kZXBuZ19zdGF0ZV9jbGVhbnVwKExvZGVQTkdTdGF0ZSogc3RhdGUpIHsKLSAgbG9kZXBuZ19jb2xvcl9tb2RlX2NsZWFudXAoJnN0YXRlLT5pbmZvX3Jhdyk7Ci0gIGxvZGVwbmdfaW5mb19jbGVhbnVwKCZzdGF0ZS0+aW5mb19wbmcpOwotfQotCi12b2lkIGxvZGVwbmdfc3RhdGVfY29weShMb2RlUE5HU3RhdGUqIGRlc3QsIGNvbnN0IExvZGVQTkdTdGF0ZSogc291cmNlKSB7Ci0gIGxvZGVwbmdfc3RhdGVfY2xlYW51cChkZXN0KTsKLSAgKmRlc3QgPSAqc291cmNlOwotICBsb2RlcG5nX2NvbG9yX21vZGVfaW5pdCgmZGVzdC0+aW5mb19yYXcpOwotICBsb2RlcG5nX2luZm9faW5pdCgmZGVzdC0+aW5mb19wbmcpOwotICBkZXN0LT5lcnJvciA9IGxvZGVwbmdfY29sb3JfbW9kZV9jb3B5KCZkZXN0LT5pbmZvX3JhdywgJnNvdXJjZS0+aW5mb19yYXcpOyBpZihkZXN0LT5lcnJvcikgcmV0dXJuOwotICBkZXN0LT5lcnJvciA9IGxvZGVwbmdfaW5mb19jb3B5KCZkZXN0LT5pbmZvX3BuZywgJnNvdXJjZS0+aW5mb19wbmcpOyBpZihkZXN0LT5lcnJvcikgcmV0dXJuOwotfQotCi0jZW5kaWYgLyogZGVmaW5lZChMT0RFUE5HX0NPTVBJTEVfREVDT0RFUikgfHwgZGVmaW5lZChMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUikgKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi0KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0vKiAvIFBORyBFbmNvZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAqLwotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotLypjaHVua05hbWUgbXVzdCBiZSBzdHJpbmcgb2YgNCBjaGFyYWN0ZXJzKi8KLXN0YXRpYyB1bnNpZ25lZCBhZGRDaHVuayh1Y3ZlY3Rvciogb3V0LCBjb25zdCBjaGFyKiBjaHVua05hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKLSAgQ0VSUk9SX1RSWV9SRVRVUk4obG9kZXBuZ19jaHVua19jcmVhdGUoJm91dC0+ZGF0YSwgJm91dC0+c2l6ZSwgKHVuc2lnbmVkKWxlbmd0aCwgY2h1bmtOYW1lLCBkYXRhKSk7Ci0gIG91dC0+YWxsb2NzaXplID0gb3V0LT5zaXplOyAvKmZpeCB0aGUgYWxsb2NzaXplIGFnYWluKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlU2lnbmF0dXJlKHVjdmVjdG9yKiBvdXQpIHsKLSAgLyo4IGJ5dGVzIFBORyBzaWduYXR1cmUsIGFrYSB0aGUgbWFnaWMgYnl0ZXMqLwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2sob3V0LCAxMzcpOwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2sob3V0LCA4MCk7Ci0gIHVjdmVjdG9yX3B1c2hfYmFjayhvdXQsIDc4KTsKLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKG91dCwgNzEpOwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2sob3V0LCAxMyk7Ci0gIHVjdmVjdG9yX3B1c2hfYmFjayhvdXQsIDEwKTsKLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKG91dCwgMjYpOwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2sob3V0LCAxMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBhZGRDaHVua19JSERSKHVjdmVjdG9yKiBvdXQsIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSwgdW5zaWduZWQgYml0ZGVwdGgsIHVuc2lnbmVkIGludGVybGFjZV9tZXRob2QpIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICB1Y3ZlY3RvciBoZWFkZXI7Ci0gIHVjdmVjdG9yX2luaXQoJmhlYWRlcik7Ci0KLSAgbG9kZXBuZ19hZGQzMmJpdEludCgmaGVhZGVyLCB3KTsgLyp3aWR0aCovCi0gIGxvZGVwbmdfYWRkMzJiaXRJbnQoJmhlYWRlciwgaCk7IC8qaGVpZ2h0Ki8KLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZoZWFkZXIsICh1bnNpZ25lZCBjaGFyKWJpdGRlcHRoKTsgLypiaXQgZGVwdGgqLwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmhlYWRlciwgKHVuc2lnbmVkIGNoYXIpY29sb3J0eXBlKTsgLypjb2xvciB0eXBlKi8KLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZoZWFkZXIsIDApOyAvKmNvbXByZXNzaW9uIG1ldGhvZCovCi0gIHVjdmVjdG9yX3B1c2hfYmFjaygmaGVhZGVyLCAwKTsgLypmaWx0ZXIgbWV0aG9kKi8KLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZoZWFkZXIsIGludGVybGFjZV9tZXRob2QpOyAvKmludGVybGFjZSBtZXRob2QqLwotCi0gIGVycm9yID0gYWRkQ2h1bmsob3V0LCAiSUhEUiIsIGhlYWRlci5kYXRhLCBoZWFkZXIuc2l6ZSk7Ci0gIHVjdmVjdG9yX2NsZWFudXAoJmhlYWRlcik7Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdW5zaWduZWQgYWRkQ2h1bmtfUExURSh1Y3ZlY3Rvciogb3V0LCBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBpbmZvKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgc2l6ZV90IGk7Ci0gIHVjdmVjdG9yIFBMVEU7Ci0gIHVjdmVjdG9yX2luaXQoJlBMVEUpOwotICBmb3IoaSA9IDA7IGkgIT0gaW5mby0+cGFsZXR0ZXNpemUgKiA0OyArK2kpIHsKLSAgICAvKmFkZCBhbGwgY2hhbm5lbHMgZXhjZXB0IGFscGhhIGNoYW5uZWwqLwotICAgIGlmKGkgJSA0ICE9IDMpIHVjdmVjdG9yX3B1c2hfYmFjaygmUExURSwgaW5mby0+cGFsZXR0ZVtpXSk7Ci0gIH0KLSAgZXJyb3IgPSBhZGRDaHVuayhvdXQsICJQTFRFIiwgUExURS5kYXRhLCBQTFRFLnNpemUpOwotICB1Y3ZlY3Rvcl9jbGVhbnVwKCZQTFRFKTsKLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBhZGRDaHVua190Uk5TKHVjdmVjdG9yKiBvdXQsIGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIGluZm8pIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICBzaXplX3QgaTsKLSAgdWN2ZWN0b3IgdFJOUzsKLSAgdWN2ZWN0b3JfaW5pdCgmdFJOUyk7Ci0gIGlmKGluZm8tPmNvbG9ydHlwZSA9PSBMQ1RfUEFMRVRURSkgewotICAgIHNpemVfdCBhbW91bnQgPSBpbmZvLT5wYWxldHRlc2l6ZTsKLSAgICAvKnRoZSB0YWlsIG9mIHBhbGV0dGUgdmFsdWVzIHRoYXQgYWxsIGhhdmUgMjU1IGFzIGFscGhhLCBkb2VzIG5vdCBoYXZlIHRvIGJlIGVuY29kZWQqLwotICAgIGZvcihpID0gaW5mby0+cGFsZXR0ZXNpemU7IGkgIT0gMDsgLS1pKSB7Ci0gICAgICBpZihpbmZvLT5wYWxldHRlWzQgKiAoaSAtIDEpICsgM10gPT0gMjU1KSAtLWFtb3VudDsKLSAgICAgIGVsc2UgYnJlYWs7Ci0gICAgfQotICAgIC8qYWRkIG9ubHkgYWxwaGEgY2hhbm5lbCovCi0gICAgZm9yKGkgPSAwOyBpICE9IGFtb3VudDsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJnRSTlMsIGluZm8tPnBhbGV0dGVbNCAqIGkgKyAzXSk7Ci0gIH0gZWxzZSBpZihpbmZvLT5jb2xvcnR5cGUgPT0gTENUX0dSRVkpIHsKLSAgICBpZihpbmZvLT5rZXlfZGVmaW5lZCkgewotICAgICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZ0Uk5TLCAodW5zaWduZWQgY2hhcikoaW5mby0+a2V5X3IgPj4gOCkpOwotICAgICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZ0Uk5TLCAodW5zaWduZWQgY2hhcikoaW5mby0+a2V5X3IgJiAyNTUpKTsKLSAgICB9Ci0gIH0gZWxzZSBpZihpbmZvLT5jb2xvcnR5cGUgPT0gTENUX1JHQikgewotICAgIGlmKGluZm8tPmtleV9kZWZpbmVkKSB7Ci0gICAgICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJnRSTlMsICh1bnNpZ25lZCBjaGFyKShpbmZvLT5rZXlfciA+PiA4KSk7Ci0gICAgICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJnRSTlMsICh1bnNpZ25lZCBjaGFyKShpbmZvLT5rZXlfciAmIDI1NSkpOwotICAgICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZ0Uk5TLCAodW5zaWduZWQgY2hhcikoaW5mby0+a2V5X2cgPj4gOCkpOwotICAgICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZ0Uk5TLCAodW5zaWduZWQgY2hhcikoaW5mby0+a2V5X2cgJiAyNTUpKTsKLSAgICAgIHVjdmVjdG9yX3B1c2hfYmFjaygmdFJOUywgKHVuc2lnbmVkIGNoYXIpKGluZm8tPmtleV9iID4+IDgpKTsKLSAgICAgIHVjdmVjdG9yX3B1c2hfYmFjaygmdFJOUywgKHVuc2lnbmVkIGNoYXIpKGluZm8tPmtleV9iICYgMjU1KSk7Ci0gICAgfQotICB9Ci0KLSAgZXJyb3IgPSBhZGRDaHVuayhvdXQsICJ0Uk5TIiwgdFJOUy5kYXRhLCB0Uk5TLnNpemUpOwotICB1Y3ZlY3Rvcl9jbGVhbnVwKCZ0Uk5TKTsKLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBhZGRDaHVua19JREFUKHVjdmVjdG9yKiBvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZGVQTkdDb21wcmVzc1NldHRpbmdzKiB6bGlic2V0dGluZ3MpIHsKLSAgdWN2ZWN0b3IgemxpYmRhdGE7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLQotICAvKmNvbXByZXNzIHdpdGggdGhlIFpsaWIgY29tcHJlc3NvciovCi0gIHVjdmVjdG9yX2luaXQoJnpsaWJkYXRhKTsKLSAgZXJyb3IgPSB6bGliX2NvbXByZXNzKCZ6bGliZGF0YS5kYXRhLCAmemxpYmRhdGEuc2l6ZSwgZGF0YSwgZGF0YXNpemUsIHpsaWJzZXR0aW5ncyk7Ci0gIGlmKCFlcnJvcikgZXJyb3IgPSBhZGRDaHVuayhvdXQsICJJREFUIiwgemxpYmRhdGEuZGF0YSwgemxpYmRhdGEuc2l6ZSk7Ci0gIHVjdmVjdG9yX2NsZWFudXAoJnpsaWJkYXRhKTsKLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBhZGRDaHVua19JRU5EKHVjdmVjdG9yKiBvdXQpIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICBlcnJvciA9IGFkZENodW5rKG91dCwgIklFTkQiLCAwLCAwKTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLQotc3RhdGljIHVuc2lnbmVkIGFkZENodW5rX3RFWHQodWN2ZWN0b3IqIG91dCwgY29uc3QgY2hhcioga2V5d29yZCwgY29uc3QgY2hhciogdGV4dHN0cmluZykgewotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0gIHNpemVfdCBpOwotICB1Y3ZlY3RvciB0ZXh0OwotICB1Y3ZlY3Rvcl9pbml0KCZ0ZXh0KTsKLSAgZm9yKGkgPSAwOyBrZXl3b3JkW2ldICE9IDA7ICsraSkgdWN2ZWN0b3JfcHVzaF9iYWNrKCZ0ZXh0LCAodW5zaWduZWQgY2hhcilrZXl3b3JkW2ldKTsKLSAgaWYoaSA8IDEgfHwgaSA+IDc5KSByZXR1cm4gODk7IC8qZXJyb3I6IGludmFsaWQga2V5d29yZCBzaXplKi8KLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZ0ZXh0LCAwKTsgLyowIHRlcm1pbmF0aW9uIGNoYXIqLwotICBmb3IoaSA9IDA7IHRleHRzdHJpbmdbaV0gIT0gMDsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJnRleHQsICh1bnNpZ25lZCBjaGFyKXRleHRzdHJpbmdbaV0pOwotICBlcnJvciA9IGFkZENodW5rKG91dCwgInRFWHQiLCB0ZXh0LmRhdGEsIHRleHQuc2l6ZSk7Ci0gIHVjdmVjdG9yX2NsZWFudXAoJnRleHQpOwotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGFkZENodW5rX3pUWHQodWN2ZWN0b3IqIG91dCwgY29uc3QgY2hhcioga2V5d29yZCwgY29uc3QgY2hhciogdGV4dHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZGVQTkdDb21wcmVzc1NldHRpbmdzKiB6bGlic2V0dGluZ3MpIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICB1Y3ZlY3RvciBkYXRhLCBjb21wcmVzc2VkOwotICBzaXplX3QgaSwgdGV4dHNpemUgPSBzdHJsZW4odGV4dHN0cmluZyk7Ci0KLSAgdWN2ZWN0b3JfaW5pdCgmZGF0YSk7Ci0gIHVjdmVjdG9yX2luaXQoJmNvbXByZXNzZWQpOwotICBmb3IoaSA9IDA7IGtleXdvcmRbaV0gIT0gMDsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsICh1bnNpZ25lZCBjaGFyKWtleXdvcmRbaV0pOwotICBpZihpIDwgMSB8fCBpID4gNzkpIHJldHVybiA4OTsgLyplcnJvcjogaW52YWxpZCBrZXl3b3JkIHNpemUqLwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsIDApOyAvKjAgdGVybWluYXRpb24gY2hhciovCi0gIHVjdmVjdG9yX3B1c2hfYmFjaygmZGF0YSwgMCk7IC8qY29tcHJlc3Npb24gbWV0aG9kOiAwKi8KLQotICBlcnJvciA9IHpsaWJfY29tcHJlc3MoJmNvbXByZXNzZWQuZGF0YSwgJmNvbXByZXNzZWQuc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKil0ZXh0c3RyaW5nLCB0ZXh0c2l6ZSwgemxpYnNldHRpbmdzKTsKLSAgaWYoIWVycm9yKSB7Ci0gICAgZm9yKGkgPSAwOyBpICE9IGNvbXByZXNzZWQuc2l6ZTsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsIGNvbXByZXNzZWQuZGF0YVtpXSk7Ci0gICAgZXJyb3IgPSBhZGRDaHVuayhvdXQsICJ6VFh0IiwgZGF0YS5kYXRhLCBkYXRhLnNpemUpOwotICB9Ci0KLSAgdWN2ZWN0b3JfY2xlYW51cCgmY29tcHJlc3NlZCk7Ci0gIHVjdmVjdG9yX2NsZWFudXAoJmRhdGEpOwotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBhZGRDaHVua19pVFh0KHVjdmVjdG9yKiBvdXQsIHVuc2lnbmVkIGNvbXByZXNzZWQsIGNvbnN0IGNoYXIqIGtleXdvcmQsIGNvbnN0IGNoYXIqIGxhbmd0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0cmFuc2tleSwgY29uc3QgY2hhciogdGV4dHN0cmluZywgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MqIHpsaWJzZXR0aW5ncykgewotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0gIHVjdmVjdG9yIGRhdGE7Ci0gIHNpemVfdCBpLCB0ZXh0c2l6ZSA9IHN0cmxlbih0ZXh0c3RyaW5nKTsKLQotICB1Y3ZlY3Rvcl9pbml0KCZkYXRhKTsKLQotICBmb3IoaSA9IDA7IGtleXdvcmRbaV0gIT0gMDsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsICh1bnNpZ25lZCBjaGFyKWtleXdvcmRbaV0pOwotICBpZihpIDwgMSB8fCBpID4gNzkpIHJldHVybiA4OTsgLyplcnJvcjogaW52YWxpZCBrZXl3b3JkIHNpemUqLwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsIDApOyAvKm51bGwgdGVybWluYXRpb24gY2hhciovCi0gIHVjdmVjdG9yX3B1c2hfYmFjaygmZGF0YSwgY29tcHJlc3NlZCA/IDEgOiAwKTsgLypjb21wcmVzc2lvbiBmbGFnKi8KLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZkYXRhLCAwKTsgLypjb21wcmVzc2lvbiBtZXRob2QqLwotICBmb3IoaSA9IDA7IGxhbmd0YWdbaV0gIT0gMDsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsICh1bnNpZ25lZCBjaGFyKWxhbmd0YWdbaV0pOwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsIDApOyAvKm51bGwgdGVybWluYXRpb24gY2hhciovCi0gIGZvcihpID0gMDsgdHJhbnNrZXlbaV0gIT0gMDsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsICh1bnNpZ25lZCBjaGFyKXRyYW5za2V5W2ldKTsKLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZkYXRhLCAwKTsgLypudWxsIHRlcm1pbmF0aW9uIGNoYXIqLwotCi0gIGlmKGNvbXByZXNzZWQpIHsKLSAgICB1Y3ZlY3RvciBjb21wcmVzc2VkX2RhdGE7Ci0gICAgdWN2ZWN0b3JfaW5pdCgmY29tcHJlc3NlZF9kYXRhKTsKLSAgICBlcnJvciA9IHpsaWJfY29tcHJlc3MoJmNvbXByZXNzZWRfZGF0YS5kYXRhLCAmY29tcHJlc3NlZF9kYXRhLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKil0ZXh0c3RyaW5nLCB0ZXh0c2l6ZSwgemxpYnNldHRpbmdzKTsKLSAgICBpZighZXJyb3IpIHsKLSAgICAgIGZvcihpID0gMDsgaSAhPSBjb21wcmVzc2VkX2RhdGEuc2l6ZTsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsIGNvbXByZXNzZWRfZGF0YS5kYXRhW2ldKTsKLSAgICB9Ci0gICAgdWN2ZWN0b3JfY2xlYW51cCgmY29tcHJlc3NlZF9kYXRhKTsKLSAgfSBlbHNlIC8qbm90IGNvbXByZXNzZWQqLyB7Ci0gICAgZm9yKGkgPSAwOyB0ZXh0c3RyaW5nW2ldICE9IDA7ICsraSkgdWN2ZWN0b3JfcHVzaF9iYWNrKCZkYXRhLCAodW5zaWduZWQgY2hhcil0ZXh0c3RyaW5nW2ldKTsKLSAgfQotCi0gIGlmKCFlcnJvcikgZXJyb3IgPSBhZGRDaHVuayhvdXQsICJpVFh0IiwgZGF0YS5kYXRhLCBkYXRhLnNpemUpOwotICB1Y3ZlY3Rvcl9jbGVhbnVwKCZkYXRhKTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdW5zaWduZWQgYWRkQ2h1bmtfYktHRCh1Y3ZlY3Rvciogb3V0LCBjb25zdCBMb2RlUE5HSW5mbyogaW5mbykgewotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0gIHVjdmVjdG9yIGJLR0Q7Ci0gIHVjdmVjdG9yX2luaXQoJmJLR0QpOwotICBpZihpbmZvLT5jb2xvci5jb2xvcnR5cGUgPT0gTENUX0dSRVkgfHwgaW5mby0+Y29sb3IuY29sb3J0eXBlID09IExDVF9HUkVZX0FMUEhBKSB7Ci0gICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZiS0dELCAodW5zaWduZWQgY2hhcikoaW5mby0+YmFja2dyb3VuZF9yID4+IDgpKTsKLSAgICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmJLR0QsICh1bnNpZ25lZCBjaGFyKShpbmZvLT5iYWNrZ3JvdW5kX3IgJiAyNTUpKTsKLSAgfSBlbHNlIGlmKGluZm8tPmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfUkdCIHx8IGluZm8tPmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfUkdCQSkgewotICAgIHVjdmVjdG9yX3B1c2hfYmFjaygmYktHRCwgKHVuc2lnbmVkIGNoYXIpKGluZm8tPmJhY2tncm91bmRfciA+PiA4KSk7Ci0gICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZiS0dELCAodW5zaWduZWQgY2hhcikoaW5mby0+YmFja2dyb3VuZF9yICYgMjU1KSk7Ci0gICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZiS0dELCAodW5zaWduZWQgY2hhcikoaW5mby0+YmFja2dyb3VuZF9nID4+IDgpKTsKLSAgICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmJLR0QsICh1bnNpZ25lZCBjaGFyKShpbmZvLT5iYWNrZ3JvdW5kX2cgJiAyNTUpKTsKLSAgICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmJLR0QsICh1bnNpZ25lZCBjaGFyKShpbmZvLT5iYWNrZ3JvdW5kX2IgPj4gOCkpOwotICAgIHVjdmVjdG9yX3B1c2hfYmFjaygmYktHRCwgKHVuc2lnbmVkIGNoYXIpKGluZm8tPmJhY2tncm91bmRfYiAmIDI1NSkpOwotICB9IGVsc2UgaWYoaW5mby0+Y29sb3IuY29sb3J0eXBlID09IExDVF9QQUxFVFRFKSB7Ci0gICAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZiS0dELCAodW5zaWduZWQgY2hhcikoaW5mby0+YmFja2dyb3VuZF9yICYgMjU1KSk7IC8qcGFsZXR0ZSBpbmRleCovCi0gIH0KLQotICBlcnJvciA9IGFkZENodW5rKG91dCwgImJLR0QiLCBiS0dELmRhdGEsIGJLR0Quc2l6ZSk7Ci0gIHVjdmVjdG9yX2NsZWFudXAoJmJLR0QpOwotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGFkZENodW5rX3RJTUUodWN2ZWN0b3IqIG91dCwgY29uc3QgTG9kZVBOR1RpbWUqIHRpbWUpIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICB1bnNpZ25lZCBjaGFyKiBkYXRhID0gKHVuc2lnbmVkIGNoYXIqKWxvZGVwbmdfbWFsbG9jKDcpOwotICBpZighZGF0YSkgcmV0dXJuIDgzOyAvKmFsbG9jIGZhaWwqLwotICBkYXRhWzBdID0gKHVuc2lnbmVkIGNoYXIpKHRpbWUtPnllYXIgPj4gOCk7Ci0gIGRhdGFbMV0gPSAodW5zaWduZWQgY2hhcikodGltZS0+eWVhciAmIDI1NSk7Ci0gIGRhdGFbMl0gPSAodW5zaWduZWQgY2hhcil0aW1lLT5tb250aDsKLSAgZGF0YVszXSA9ICh1bnNpZ25lZCBjaGFyKXRpbWUtPmRheTsKLSAgZGF0YVs0XSA9ICh1bnNpZ25lZCBjaGFyKXRpbWUtPmhvdXI7Ci0gIGRhdGFbNV0gPSAodW5zaWduZWQgY2hhcil0aW1lLT5taW51dGU7Ci0gIGRhdGFbNl0gPSAodW5zaWduZWQgY2hhcil0aW1lLT5zZWNvbmQ7Ci0gIGVycm9yID0gYWRkQ2h1bmsob3V0LCAidElNRSIsIGRhdGEsIDcpOwotICBsb2RlcG5nX2ZyZWUoZGF0YSk7Ci0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGFkZENodW5rX3BIWXModWN2ZWN0b3IqIG91dCwgY29uc3QgTG9kZVBOR0luZm8qIGluZm8pIHsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICB1Y3ZlY3RvciBkYXRhOwotICB1Y3ZlY3Rvcl9pbml0KCZkYXRhKTsKLQotICBsb2RlcG5nX2FkZDMyYml0SW50KCZkYXRhLCBpbmZvLT5waHlzX3gpOwotICBsb2RlcG5nX2FkZDMyYml0SW50KCZkYXRhLCBpbmZvLT5waHlzX3kpOwotICB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsIGluZm8tPnBoeXNfdW5pdCk7Ci0KLSAgZXJyb3IgPSBhZGRDaHVuayhvdXQsICJwSFlzIiwgZGF0YS5kYXRhLCBkYXRhLnNpemUpOwotICB1Y3ZlY3Rvcl9jbGVhbnVwKCZkYXRhKTsKLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBhZGRDaHVua19nQU1BKHVjdmVjdG9yKiBvdXQsIGNvbnN0IExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgdWN2ZWN0b3IgZGF0YTsKLSAgdWN2ZWN0b3JfaW5pdCgmZGF0YSk7Ci0KLSAgbG9kZXBuZ19hZGQzMmJpdEludCgmZGF0YSwgaW5mby0+Z2FtYV9nYW1tYSk7Ci0KLSAgZXJyb3IgPSBhZGRDaHVuayhvdXQsICJnQU1BIiwgZGF0YS5kYXRhLCBkYXRhLnNpemUpOwotICB1Y3ZlY3Rvcl9jbGVhbnVwKCZkYXRhKTsKLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBhZGRDaHVua19jSFJNKHVjdmVjdG9yKiBvdXQsIGNvbnN0IExvZGVQTkdJbmZvKiBpbmZvKSB7Ci0gIHVuc2lnbmVkIGVycm9yID0gMDsKLSAgdWN2ZWN0b3IgZGF0YTsKLSAgdWN2ZWN0b3JfaW5pdCgmZGF0YSk7Ci0KLSAgbG9kZXBuZ19hZGQzMmJpdEludCgmZGF0YSwgaW5mby0+Y2hybV93aGl0ZV94KTsKLSAgbG9kZXBuZ19hZGQzMmJpdEludCgmZGF0YSwgaW5mby0+Y2hybV93aGl0ZV95KTsKLSAgbG9kZXBuZ19hZGQzMmJpdEludCgmZGF0YSwgaW5mby0+Y2hybV9yZWRfeCk7Ci0gIGxvZGVwbmdfYWRkMzJiaXRJbnQoJmRhdGEsIGluZm8tPmNocm1fcmVkX3kpOwotICBsb2RlcG5nX2FkZDMyYml0SW50KCZkYXRhLCBpbmZvLT5jaHJtX2dyZWVuX3gpOwotICBsb2RlcG5nX2FkZDMyYml0SW50KCZkYXRhLCBpbmZvLT5jaHJtX2dyZWVuX3kpOwotICBsb2RlcG5nX2FkZDMyYml0SW50KCZkYXRhLCBpbmZvLT5jaHJtX2JsdWVfeCk7Ci0gIGxvZGVwbmdfYWRkMzJiaXRJbnQoJmRhdGEsIGluZm8tPmNocm1fYmx1ZV95KTsKLQotICBlcnJvciA9IGFkZENodW5rKG91dCwgImNIUk0iLCBkYXRhLmRhdGEsIGRhdGEuc2l6ZSk7Ci0gIHVjdmVjdG9yX2NsZWFudXAoJmRhdGEpOwotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGFkZENodW5rX3NSR0IodWN2ZWN0b3IqIG91dCwgY29uc3QgTG9kZVBOR0luZm8qIGluZm8pIHsKLSAgdW5zaWduZWQgY2hhciBkYXRhID0gaW5mby0+c3JnYl9pbnRlbnQ7Ci0gIHJldHVybiBhZGRDaHVuayhvdXQsICJzUkdCIiwgJmRhdGEsIDEpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgYWRkQ2h1bmtfaUNDUCh1Y3ZlY3Rvciogb3V0LCBjb25zdCBMb2RlUE5HSW5mbyogaW5mbywgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MqIHpsaWJzZXR0aW5ncykgewotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0gIHVjdmVjdG9yIGRhdGEsIGNvbXByZXNzZWQ7Ci0gIHNpemVfdCBpOwotCi0gIHVjdmVjdG9yX2luaXQoJmRhdGEpOwotICB1Y3ZlY3Rvcl9pbml0KCZjb21wcmVzc2VkKTsKLSAgZm9yKGkgPSAwOyBpbmZvLT5pY2NwX25hbWVbaV0gIT0gMDsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsICh1bnNpZ25lZCBjaGFyKWluZm8tPmljY3BfbmFtZVtpXSk7Ci0gIGlmKGkgPCAxIHx8IGkgPiA3OSkgcmV0dXJuIDg5OyAvKmVycm9yOiBpbnZhbGlkIGtleXdvcmQgc2l6ZSovCi0gIHVjdmVjdG9yX3B1c2hfYmFjaygmZGF0YSwgMCk7IC8qMCB0ZXJtaW5hdGlvbiBjaGFyKi8KLSAgdWN2ZWN0b3JfcHVzaF9iYWNrKCZkYXRhLCAwKTsgLypjb21wcmVzc2lvbiBtZXRob2Q6IDAqLwotCi0gIGVycm9yID0gemxpYl9jb21wcmVzcygmY29tcHJlc3NlZC5kYXRhLCAmY29tcHJlc3NlZC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+aWNjcF9wcm9maWxlLCBpbmZvLT5pY2NwX3Byb2ZpbGVfc2l6ZSwgemxpYnNldHRpbmdzKTsKLSAgaWYoIWVycm9yKSB7Ci0gICAgZm9yKGkgPSAwOyBpICE9IGNvbXByZXNzZWQuc2l6ZTsgKytpKSB1Y3ZlY3Rvcl9wdXNoX2JhY2soJmRhdGEsIGNvbXByZXNzZWQuZGF0YVtpXSk7Ci0gICAgZXJyb3IgPSBhZGRDaHVuayhvdXQsICJpQ0NQIiwgZGF0YS5kYXRhLCBkYXRhLnNpemUpOwotICB9Ci0KLSAgdWN2ZWN0b3JfY2xlYW51cCgmY29tcHJlc3NlZCk7Ci0gIHVjdmVjdG9yX2NsZWFudXAoJmRhdGEpOwotICByZXR1cm4gZXJyb3I7Ci19Ci0KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLQotc3RhdGljIHZvaWQgZmlsdGVyU2NhbmxpbmUodW5zaWduZWQgY2hhciogb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzY2FubGluZSwgY29uc3QgdW5zaWduZWQgY2hhciogcHJldmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoLCBzaXplX3QgYnl0ZXdpZHRoLCB1bnNpZ25lZCBjaGFyIGZpbHRlclR5cGUpIHsKLSAgc2l6ZV90IGk7Ci0gIHN3aXRjaChmaWx0ZXJUeXBlKSB7Ci0gICAgY2FzZSAwOiAvKk5vbmUqLwotICAgICAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSBvdXRbaV0gPSBzY2FubGluZVtpXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTogLypTdWIqLwotICAgICAgZm9yKGkgPSAwOyBpICE9IGJ5dGV3aWR0aDsgKytpKSBvdXRbaV0gPSBzY2FubGluZVtpXTsKLSAgICAgIGZvcihpID0gYnl0ZXdpZHRoOyBpIDwgbGVuZ3RoOyArK2kpIG91dFtpXSA9IHNjYW5saW5lW2ldIC0gc2NhbmxpbmVbaSAtIGJ5dGV3aWR0aF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6IC8qVXAqLwotICAgICAgaWYocHJldmxpbmUpIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSBvdXRbaV0gPSBzY2FubGluZVtpXSAtIHByZXZsaW5lW2ldOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSBvdXRbaV0gPSBzY2FubGluZVtpXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzogLypBdmVyYWdlKi8KLSAgICAgIGlmKHByZXZsaW5lKSB7Ci0gICAgICAgIGZvcihpID0gMDsgaSAhPSBieXRld2lkdGg7ICsraSkgb3V0W2ldID0gc2NhbmxpbmVbaV0gLSAocHJldmxpbmVbaV0gPj4gMSk7Ci0gICAgICAgIGZvcihpID0gYnl0ZXdpZHRoOyBpIDwgbGVuZ3RoOyArK2kpIG91dFtpXSA9IHNjYW5saW5lW2ldIC0gKChzY2FubGluZVtpIC0gYnl0ZXdpZHRoXSArIHByZXZsaW5lW2ldKSA+PiAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvcihpID0gMDsgaSAhPSBieXRld2lkdGg7ICsraSkgb3V0W2ldID0gc2NhbmxpbmVbaV07Ci0gICAgICAgIGZvcihpID0gYnl0ZXdpZHRoOyBpIDwgbGVuZ3RoOyArK2kpIG91dFtpXSA9IHNjYW5saW5lW2ldIC0gKHNjYW5saW5lW2kgLSBieXRld2lkdGhdID4+IDEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAvKlBhZXRoKi8KLSAgICAgIGlmKHByZXZsaW5lKSB7Ci0gICAgICAgIC8qcGFldGhQcmVkaWN0b3IoMCwgcHJldmxpbmVbaV0sIDApIGlzIGFsd2F5cyBwcmV2bGluZVtpXSovCi0gICAgICAgIGZvcihpID0gMDsgaSAhPSBieXRld2lkdGg7ICsraSkgb3V0W2ldID0gKHNjYW5saW5lW2ldIC0gcHJldmxpbmVbaV0pOwotICAgICAgICBmb3IoaSA9IGJ5dGV3aWR0aDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgb3V0W2ldID0gKHNjYW5saW5lW2ldIC0gcGFldGhQcmVkaWN0b3Ioc2NhbmxpbmVbaSAtIGJ5dGV3aWR0aF0sIHByZXZsaW5lW2ldLCBwcmV2bGluZVtpIC0gYnl0ZXdpZHRoXSkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmb3IoaSA9IDA7IGkgIT0gYnl0ZXdpZHRoOyArK2kpIG91dFtpXSA9IHNjYW5saW5lW2ldOwotICAgICAgICAvKnBhZXRoUHJlZGljdG9yKHNjYW5saW5lW2kgLSBieXRld2lkdGhdLCAwLCAwKSBpcyBhbHdheXMgc2NhbmxpbmVbaSAtIGJ5dGV3aWR0aF0qLwotICAgICAgICBmb3IoaSA9IGJ5dGV3aWR0aDsgaSA8IGxlbmd0aDsgKytpKSBvdXRbaV0gPSAoc2NhbmxpbmVbaV0gLSBzY2FubGluZVtpIC0gYnl0ZXdpZHRoXSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OiByZXR1cm47IC8qdW5leGlzdGluZyBmaWx0ZXIgdHlwZSBnaXZlbiovCi0gIH0KLX0KLQotLyogbG9nMiBhcHByb3hpbWF0aW9uLiBBIHNsaWdodCBiaXQgZmFzdGVyIHRoYW4gc3RkOjpsb2cuICovCi1zdGF0aWMgZmxvYXQgZmxvZzIoZmxvYXQgZikgewotICBmbG9hdCByZXN1bHQgPSAwOwotICB3aGlsZShmID4gMzIpIHsgcmVzdWx0ICs9IDQ7IGYgLz0gMTY7IH0KLSAgd2hpbGUoZiA+IDIpIHsgKytyZXN1bHQ7IGYgLz0gMjsgfQotICByZXR1cm4gcmVzdWx0ICsgMS40NDI2OTVmICogKGYgKiBmICogZiAvIDMgLSAzICogZiAqIGYgLyAyICsgMyAqIGYgLSAxLjgzMzMzZik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBmaWx0ZXIodW5zaWduZWQgY2hhciogb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogaW5mbywgY29uc3QgTG9kZVBOR0VuY29kZXJTZXR0aW5ncyogc2V0dGluZ3MpIHsKLSAgLyoKLSAgRm9yIFBORyBmaWx0ZXIgbWV0aG9kIDAKLSAgb3V0IG11c3QgYmUgYSBidWZmZXIgd2l0aCBhcyBzaXplOiBoICsgKHcgKiBoICogYnBwICsgNykgLyA4LCBiZWNhdXNlIHRoZXJlIGFyZQotICB0aGUgc2NhbmxpbmVzIHdpdGggMSBleHRyYSBieXRlIHBlciBzY2FubGluZQotICAqLwotCi0gIHVuc2lnbmVkIGJwcCA9IGxvZGVwbmdfZ2V0X2JwcChpbmZvKTsKLSAgLyp0aGUgd2lkdGggb2YgYSBzY2FubGluZSBpbiBieXRlcywgbm90IGluY2x1ZGluZyB0aGUgZmlsdGVyIHR5cGUqLwotICBzaXplX3QgbGluZWJ5dGVzID0gKHcgKiBicHAgKyA3KSAvIDg7Ci0gIC8qYnl0ZXdpZHRoIGlzIHVzZWQgZm9yIGZpbHRlcmluZywgaXMgMSB3aGVuIGJwcCA8IDgsIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgb3RoZXJ3aXNlKi8KLSAgc2l6ZV90IGJ5dGV3aWR0aCA9IChicHAgKyA3KSAvIDg7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHByZXZsaW5lID0gMDsKLSAgdW5zaWduZWQgeCwgeTsKLSAgdW5zaWduZWQgZXJyb3IgPSAwOwotICBMb2RlUE5HRmlsdGVyU3RyYXRlZ3kgc3RyYXRlZ3kgPSBzZXR0aW5ncy0+ZmlsdGVyX3N0cmF0ZWd5OwotCi0gIC8qCi0gIFRoZXJlIGlzIGEgaGV1cmlzdGljIGNhbGxlZCB0aGUgbWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMgaGV1cmlzdGljLCBzdWdnZXN0ZWQgYnkgdGhlIFBORyBzdGFuZGFyZDoKLSAgICogIElmIHRoZSBpbWFnZSB0eXBlIGlzIFBhbGV0dGUsIG9yIHRoZSBiaXQgZGVwdGggaXMgc21hbGxlciB0aGFuIDgsIHRoZW4gZG8gbm90IGZpbHRlciB0aGUgaW1hZ2UgKGkuZS4KLSAgICAgIHVzZSBmaXhlZCBmaWx0ZXJpbmcsIHdpdGggdGhlIGZpbHRlciBOb25lKS4KLSAgICogKFRoZSBvdGhlciBjYXNlKSBJZiB0aGUgaW1hZ2UgdHlwZSBpcyBHcmF5c2NhbGUgb3IgUkdCICh3aXRoIG9yIHdpdGhvdXQgQWxwaGEpLCBhbmQgdGhlIGJpdCBkZXB0aCBpcwotICAgICBub3Qgc21hbGxlciB0aGFuIDgsIHRoZW4gdXNlIGFkYXB0aXZlIGZpbHRlcmluZyBoZXVyaXN0aWMgYXMgZm9sbG93czogaW5kZXBlbmRlbnRseSBmb3IgZWFjaCByb3csIGFwcGx5Ci0gICAgIGFsbCBmaXZlIGZpbHRlcnMgYW5kIHNlbGVjdCB0aGUgZmlsdGVyIHRoYXQgcHJvZHVjZXMgdGhlIHNtYWxsZXN0IHN1bSBvZiBhYnNvbHV0ZSB2YWx1ZXMgcGVyIHJvdy4KLSAgVGhpcyBoZXVyaXN0aWMgaXMgdXNlZCBpZiBmaWx0ZXIgc3RyYXRlZ3kgaXMgTEZTX01JTlNVTSBhbmQgZmlsdGVyX3BhbGV0dGVfemVybyBpcyB0cnVlLgotCi0gIElmIGZpbHRlcl9wYWxldHRlX3plcm8gaXMgdHJ1ZSBhbmQgZmlsdGVyX3N0cmF0ZWd5IGlzIG5vdCBMRlNfTUlOU1VNLCB0aGUgYWJvdmUgaGV1cmlzdGljIGlzIGZvbGxvd2VkLAotICBidXQgZm9yICJ0aGUgb3RoZXIgY2FzZSIsIHdoYXRldmVyIHN0cmF0ZWd5IGZpbHRlcl9zdHJhdGVneSBpcyBzZXQgdG8gaW5zdGVhZCBvZiB0aGUgbWluaW11bSBzdW0KLSAgaGV1cmlzdGljIGlzIHVzZWQuCi0gICovCi0gIGlmKHNldHRpbmdzLT5maWx0ZXJfcGFsZXR0ZV96ZXJvICYmCi0gICAgIChpbmZvLT5jb2xvcnR5cGUgPT0gTENUX1BBTEVUVEUgfHwgaW5mby0+Yml0ZGVwdGggPCA4KSkgc3RyYXRlZ3kgPSBMRlNfWkVSTzsKLQotICBpZihicHAgPT0gMCkgcmV0dXJuIDMxOyAvKmVycm9yOiBpbnZhbGlkIGNvbG9yIHR5cGUqLwotCi0gIGlmKHN0cmF0ZWd5ID09IExGU19aRVJPKSB7Ci0gICAgZm9yKHkgPSAwOyB5ICE9IGg7ICsreSkgewotICAgICAgc2l6ZV90IG91dGluZGV4ID0gKDEgKyBsaW5lYnl0ZXMpICogeTsgLyp0aGUgZXh0cmEgZmlsdGVyYnl0ZSBhZGRlZCB0byBlYWNoIHJvdyovCi0gICAgICBzaXplX3QgaW5pbmRleCA9IGxpbmVieXRlcyAqIHk7Ci0gICAgICBvdXRbb3V0aW5kZXhdID0gMDsgLypmaWx0ZXIgdHlwZSBieXRlKi8KLSAgICAgIGZpbHRlclNjYW5saW5lKCZvdXRbb3V0aW5kZXggKyAxXSwgJmluW2luaW5kZXhdLCBwcmV2bGluZSwgbGluZWJ5dGVzLCBieXRld2lkdGgsIDApOwotICAgICAgcHJldmxpbmUgPSAmaW5baW5pbmRleF07Ci0gICAgfQotICB9IGVsc2UgaWYoc3RyYXRlZ3kgPT0gTEZTX01JTlNVTSkgewotICAgIC8qYWRhcHRpdmUgZmlsdGVyaW5nKi8KLSAgICBzaXplX3Qgc3VtWzVdOwotICAgIHVuc2lnbmVkIGNoYXIqIGF0dGVtcHRbNV07IC8qZml2ZSBmaWx0ZXJpbmcgYXR0ZW1wdHMsIG9uZSBmb3IgZWFjaCBmaWx0ZXIgdHlwZSovCi0gICAgc2l6ZV90IHNtYWxsZXN0ID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyIHR5cGUsIGJlc3RUeXBlID0gMDsKLQotICAgIGZvcih0eXBlID0gMDsgdHlwZSAhPSA1OyArK3R5cGUpIHsKLSAgICAgIGF0dGVtcHRbdHlwZV0gPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2MobGluZWJ5dGVzKTsKLSAgICAgIGlmKCFhdHRlbXB0W3R5cGVdKSByZXR1cm4gODM7IC8qYWxsb2MgZmFpbCovCi0gICAgfQotCi0gICAgaWYoIWVycm9yKSB7Ci0gICAgICBmb3IoeSA9IDA7IHkgIT0gaDsgKyt5KSB7Ci0gICAgICAgIC8qdHJ5IHRoZSA1IGZpbHRlciB0eXBlcyovCi0gICAgICAgIGZvcih0eXBlID0gMDsgdHlwZSAhPSA1OyArK3R5cGUpIHsKLSAgICAgICAgICBmaWx0ZXJTY2FubGluZShhdHRlbXB0W3R5cGVdLCAmaW5beSAqIGxpbmVieXRlc10sIHByZXZsaW5lLCBsaW5lYnl0ZXMsIGJ5dGV3aWR0aCwgdHlwZSk7Ci0KLSAgICAgICAgICAvKmNhbGN1bGF0ZSB0aGUgc3VtIG9mIHRoZSByZXN1bHQqLwotICAgICAgICAgIHN1bVt0eXBlXSA9IDA7Ci0gICAgICAgICAgaWYodHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICBmb3IoeCA9IDA7IHggIT0gbGluZWJ5dGVzOyArK3gpIHN1bVt0eXBlXSArPSAodW5zaWduZWQgY2hhcikoYXR0ZW1wdFt0eXBlXVt4XSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcih4ID0gMDsgeCAhPSBsaW5lYnl0ZXM7ICsreCkgewotICAgICAgICAgICAgICAvKkZvciBkaWZmZXJlbmNlcywgZWFjaCBieXRlIHNob3VsZCBiZSB0cmVhdGVkIGFzIHNpZ25lZCwgdmFsdWVzIGFib3ZlIDEyNyBhcmUgbmVnYXRpdmUKLSAgICAgICAgICAgICAgKGNvbnZlcnRlZCB0byBzaWduZWQgY2hhcikuIEZpbHRlcnR5cGUgMCBpc24ndCBhIGRpZmZlcmVuY2UgdGhvdWdoLCBzbyB1c2UgdW5zaWduZWQgdGhlcmUuCi0gICAgICAgICAgICAgIFRoaXMgbWVhbnMgZmlsdGVydHlwZSAwIGlzIGFsbW9zdCBuZXZlciBjaG9zZW4sIGJ1dCB0aGF0IGlzIGp1c3RpZmllZC4qLwotICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHMgPSBhdHRlbXB0W3R5cGVdW3hdOwotICAgICAgICAgICAgICBzdW1bdHlwZV0gKz0gcyA8IDEyOCA/IHMgOiAoMjU1VSAtIHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qY2hlY2sgaWYgdGhpcyBpcyBzbWFsbGVzdCBzdW0gKG9yIGlmIHR5cGUgPT0gMCBpdCdzIHRoZSBmaXJzdCBjYXNlIHNvIGFsd2F5cyBzdG9yZSB0aGUgdmFsdWVzKSovCi0gICAgICAgICAgaWYodHlwZSA9PSAwIHx8IHN1bVt0eXBlXSA8IHNtYWxsZXN0KSB7Ci0gICAgICAgICAgICBiZXN0VHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBzbWFsbGVzdCA9IHN1bVt0eXBlXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcmV2bGluZSA9ICZpblt5ICogbGluZWJ5dGVzXTsKLQotICAgICAgICAvKm5vdyBmaWxsIHRoZSBvdXQgdmFsdWVzKi8KLSAgICAgICAgb3V0W3kgKiAobGluZWJ5dGVzICsgMSldID0gYmVzdFR5cGU7IC8qdGhlIGZpcnN0IGJ5dGUgb2YgYSBzY2FubGluZSB3aWxsIGJlIHRoZSBmaWx0ZXIgdHlwZSovCi0gICAgICAgIGZvcih4ID0gMDsgeCAhPSBsaW5lYnl0ZXM7ICsreCkgb3V0W3kgKiAobGluZWJ5dGVzICsgMSkgKyAxICsgeF0gPSBhdHRlbXB0W2Jlc3RUeXBlXVt4XTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IodHlwZSA9IDA7IHR5cGUgIT0gNTsgKyt0eXBlKSBsb2RlcG5nX2ZyZWUoYXR0ZW1wdFt0eXBlXSk7Ci0gIH0gZWxzZSBpZihzdHJhdGVneSA9PSBMRlNfRU5UUk9QWSkgewotICAgIGZsb2F0IHN1bVs1XTsKLSAgICB1bnNpZ25lZCBjaGFyKiBhdHRlbXB0WzVdOyAvKmZpdmUgZmlsdGVyaW5nIGF0dGVtcHRzLCBvbmUgZm9yIGVhY2ggZmlsdGVyIHR5cGUqLwotICAgIGZsb2F0IHNtYWxsZXN0ID0gMDsKLSAgICB1bnNpZ25lZCB0eXBlLCBiZXN0VHlwZSA9IDA7Ci0gICAgdW5zaWduZWQgY291bnRbMjU2XTsKLQotICAgIGZvcih0eXBlID0gMDsgdHlwZSAhPSA1OyArK3R5cGUpIHsKLSAgICAgIGF0dGVtcHRbdHlwZV0gPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2MobGluZWJ5dGVzKTsKLSAgICAgIGlmKCFhdHRlbXB0W3R5cGVdKSByZXR1cm4gODM7IC8qYWxsb2MgZmFpbCovCi0gICAgfQotCi0gICAgZm9yKHkgPSAwOyB5ICE9IGg7ICsreSkgewotICAgICAgLyp0cnkgdGhlIDUgZmlsdGVyIHR5cGVzKi8KLSAgICAgIGZvcih0eXBlID0gMDsgdHlwZSAhPSA1OyArK3R5cGUpIHsKLSAgICAgICAgZmlsdGVyU2NhbmxpbmUoYXR0ZW1wdFt0eXBlXSwgJmluW3kgKiBsaW5lYnl0ZXNdLCBwcmV2bGluZSwgbGluZWJ5dGVzLCBieXRld2lkdGgsIHR5cGUpOwotICAgICAgICBmb3IoeCA9IDA7IHggIT0gMjU2OyArK3gpIGNvdW50W3hdID0gMDsKLSAgICAgICAgZm9yKHggPSAwOyB4ICE9IGxpbmVieXRlczsgKyt4KSArK2NvdW50W2F0dGVtcHRbdHlwZV1beF1dOwotICAgICAgICArK2NvdW50W3R5cGVdOyAvKnRoZSBmaWx0ZXIgdHlwZSBpdHNlbGYgaXMgcGFydCBvZiB0aGUgc2NhbmxpbmUqLwotICAgICAgICBzdW1bdHlwZV0gPSAwOwotICAgICAgICBmb3IoeCA9IDA7IHggIT0gMjU2OyArK3gpIHsKLSAgICAgICAgICBmbG9hdCBwID0gY291bnRbeF0gLyAoZmxvYXQpKGxpbmVieXRlcyArIDEpOwotICAgICAgICAgIHN1bVt0eXBlXSArPSBjb3VudFt4XSA9PSAwID8gMCA6IGZsb2cyKDEgLyBwKSAqIHA7Ci0gICAgICAgIH0KLSAgICAgICAgLypjaGVjayBpZiB0aGlzIGlzIHNtYWxsZXN0IHN1bSAob3IgaWYgdHlwZSA9PSAwIGl0J3MgdGhlIGZpcnN0IGNhc2Ugc28gYWx3YXlzIHN0b3JlIHRoZSB2YWx1ZXMpKi8KLSAgICAgICAgaWYodHlwZSA9PSAwIHx8IHN1bVt0eXBlXSA8IHNtYWxsZXN0KSB7Ci0gICAgICAgICAgYmVzdFR5cGUgPSB0eXBlOwotICAgICAgICAgIHNtYWxsZXN0ID0gc3VtW3R5cGVdOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByZXZsaW5lID0gJmluW3kgKiBsaW5lYnl0ZXNdOwotCi0gICAgICAvKm5vdyBmaWxsIHRoZSBvdXQgdmFsdWVzKi8KLSAgICAgIG91dFt5ICogKGxpbmVieXRlcyArIDEpXSA9IGJlc3RUeXBlOyAvKnRoZSBmaXJzdCBieXRlIG9mIGEgc2NhbmxpbmUgd2lsbCBiZSB0aGUgZmlsdGVyIHR5cGUqLwotICAgICAgZm9yKHggPSAwOyB4ICE9IGxpbmVieXRlczsgKyt4KSBvdXRbeSAqIChsaW5lYnl0ZXMgKyAxKSArIDEgKyB4XSA9IGF0dGVtcHRbYmVzdFR5cGVdW3hdOwotICAgIH0KLQotICAgIGZvcih0eXBlID0gMDsgdHlwZSAhPSA1OyArK3R5cGUpIGxvZGVwbmdfZnJlZShhdHRlbXB0W3R5cGVdKTsKLSAgfSBlbHNlIGlmKHN0cmF0ZWd5ID09IExGU19QUkVERUZJTkVEKSB7Ci0gICAgZm9yKHkgPSAwOyB5ICE9IGg7ICsreSkgewotICAgICAgc2l6ZV90IG91dGluZGV4ID0gKDEgKyBsaW5lYnl0ZXMpICogeTsgLyp0aGUgZXh0cmEgZmlsdGVyYnl0ZSBhZGRlZCB0byBlYWNoIHJvdyovCi0gICAgICBzaXplX3QgaW5pbmRleCA9IGxpbmVieXRlcyAqIHk7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHR5cGUgPSBzZXR0aW5ncy0+cHJlZGVmaW5lZF9maWx0ZXJzW3ldOwotICAgICAgb3V0W291dGluZGV4XSA9IHR5cGU7IC8qZmlsdGVyIHR5cGUgYnl0ZSovCi0gICAgICBmaWx0ZXJTY2FubGluZSgmb3V0W291dGluZGV4ICsgMV0sICZpbltpbmluZGV4XSwgcHJldmxpbmUsIGxpbmVieXRlcywgYnl0ZXdpZHRoLCB0eXBlKTsKLSAgICAgIHByZXZsaW5lID0gJmluW2luaW5kZXhdOwotICAgIH0KLSAgfSBlbHNlIGlmKHN0cmF0ZWd5ID09IExGU19CUlVURV9GT1JDRSkgewotICAgIC8qYnJ1dGUgZm9yY2UgZmlsdGVyIGNob29zZXIuCi0gICAgZGVmbGF0ZSB0aGUgc2NhbmxpbmUgYWZ0ZXIgZXZlcnkgZmlsdGVyIGF0dGVtcHQgdG8gc2VlIHdoaWNoIG9uZSBkZWZsYXRlcyBiZXN0LgotICAgIFRoaXMgaXMgdmVyeSBzbG93IGFuZCBnaXZlcyBvbmx5IHNsaWdodGx5IHNtYWxsZXIsIHNvbWV0aW1lcyBldmVuIGxhcmdlciwgcmVzdWx0Ki8KLSAgICBzaXplX3Qgc2l6ZVs1XTsKLSAgICB1bnNpZ25lZCBjaGFyKiBhdHRlbXB0WzVdOyAvKmZpdmUgZmlsdGVyaW5nIGF0dGVtcHRzLCBvbmUgZm9yIGVhY2ggZmlsdGVyIHR5cGUqLwotICAgIHNpemVfdCBzbWFsbGVzdCA9IDA7Ci0gICAgdW5zaWduZWQgdHlwZSA9IDAsIGJlc3RUeXBlID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyKiBkdW1teTsKLSAgICBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyB6bGlic2V0dGluZ3MgPSBzZXR0aW5ncy0+emxpYnNldHRpbmdzOwotICAgIC8qdXNlIGZpeGVkIHRyZWUgb24gdGhlIGF0dGVtcHRzIHNvIHRoYXQgdGhlIHRyZWUgaXMgbm90IGFkYXB0ZWQgdG8gdGhlIGZpbHRlcnR5cGUgb24gcHVycG9zZSwKLSAgICB0byBzaW11bGF0ZSB0aGUgdHJ1ZSBjYXNlIHdoZXJlIHRoZSB0cmVlIGlzIHRoZSBzYW1lIGZvciB0aGUgd2hvbGUgaW1hZ2UuIFNvbWV0aW1lcyBpdCBnaXZlcwotICAgIGJldHRlciByZXN1bHQgd2l0aCBkeW5hbWljIHRyZWUgYW55d2F5LiBVc2luZyB0aGUgZml4ZWQgdHJlZSBzb21ldGltZXMgZ2l2ZXMgd29yc2UsIGJ1dCBpbiByYXJlCi0gICAgY2FzZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBJdCBkb2VzIG1ha2UgdGhpcyBhIGJpdCBsZXNzIHNsb3csIHNvIGl0J3Mgd29ydGggZG9pbmcgdGhpcy4qLwotICAgIHpsaWJzZXR0aW5ncy5idHlwZSA9IDE7Ci0gICAgLyphIGN1c3RvbSBlbmNvZGVyIGxpa2VseSBkb2Vzbid0IHJlYWQgdGhlIGJ0eXBlIHNldHRpbmcgYW5kIGlzIG9wdGltaXplZCBmb3IgY29tcGxldGUgUE5HCi0gICAgaW1hZ2VzIG9ubHksIHNvIGRpc2FibGUgaXQqLwotICAgIHpsaWJzZXR0aW5ncy5jdXN0b21femxpYiA9IDA7Ci0gICAgemxpYnNldHRpbmdzLmN1c3RvbV9kZWZsYXRlID0gMDsKLSAgICBmb3IodHlwZSA9IDA7IHR5cGUgIT0gNTsgKyt0eXBlKSB7Ci0gICAgICBhdHRlbXB0W3R5cGVdID0gKHVuc2lnbmVkIGNoYXIqKWxvZGVwbmdfbWFsbG9jKGxpbmVieXRlcyk7Ci0gICAgICBpZighYXR0ZW1wdFt0eXBlXSkgcmV0dXJuIDgzOyAvKmFsbG9jIGZhaWwqLwotICAgIH0KLSAgICBmb3IoeSA9IDA7IHkgIT0gaDsgKyt5KSAvKnRyeSB0aGUgNSBmaWx0ZXIgdHlwZXMqLyB7Ci0gICAgICBmb3IodHlwZSA9IDA7IHR5cGUgIT0gNTsgKyt0eXBlKSB7Ci0gICAgICAgIHVuc2lnbmVkIHRlc3RzaXplID0gKHVuc2lnbmVkKWxpbmVieXRlczsKLSAgICAgICAgLyppZih0ZXN0c2l6ZSA+IDgpIHRlc3RzaXplIC89IDg7Ki8gLyppdCBhbHJlYWR5IHdvcmtzIGdvb2QgZW5vdWdoIGJ5IHRlc3RpbmcgYSBwYXJ0IG9mIHRoZSByb3cqLwotCi0gICAgICAgIGZpbHRlclNjYW5saW5lKGF0dGVtcHRbdHlwZV0sICZpblt5ICogbGluZWJ5dGVzXSwgcHJldmxpbmUsIGxpbmVieXRlcywgYnl0ZXdpZHRoLCB0eXBlKTsKLSAgICAgICAgc2l6ZVt0eXBlXSA9IDA7Ci0gICAgICAgIGR1bW15ID0gMDsKLSAgICAgICAgemxpYl9jb21wcmVzcygmZHVtbXksICZzaXplW3R5cGVdLCBhdHRlbXB0W3R5cGVdLCB0ZXN0c2l6ZSwgJnpsaWJzZXR0aW5ncyk7Ci0gICAgICAgIGxvZGVwbmdfZnJlZShkdW1teSk7Ci0gICAgICAgIC8qY2hlY2sgaWYgdGhpcyBpcyBzbWFsbGVzdCBzaXplIChvciBpZiB0eXBlID09IDAgaXQncyB0aGUgZmlyc3QgY2FzZSBzbyBhbHdheXMgc3RvcmUgdGhlIHZhbHVlcykqLwotICAgICAgICBpZih0eXBlID09IDAgfHwgc2l6ZVt0eXBlXSA8IHNtYWxsZXN0KSB7Ci0gICAgICAgICAgYmVzdFR5cGUgPSB0eXBlOwotICAgICAgICAgIHNtYWxsZXN0ID0gc2l6ZVt0eXBlXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHJldmxpbmUgPSAmaW5beSAqIGxpbmVieXRlc107Ci0gICAgICBvdXRbeSAqIChsaW5lYnl0ZXMgKyAxKV0gPSBiZXN0VHlwZTsgLyp0aGUgZmlyc3QgYnl0ZSBvZiBhIHNjYW5saW5lIHdpbGwgYmUgdGhlIGZpbHRlciB0eXBlKi8KLSAgICAgIGZvcih4ID0gMDsgeCAhPSBsaW5lYnl0ZXM7ICsreCkgb3V0W3kgKiAobGluZWJ5dGVzICsgMSkgKyAxICsgeF0gPSBhdHRlbXB0W2Jlc3RUeXBlXVt4XTsKLSAgICB9Ci0gICAgZm9yKHR5cGUgPSAwOyB0eXBlICE9IDU7ICsrdHlwZSkgbG9kZXBuZ19mcmVlKGF0dGVtcHRbdHlwZV0pOwotICB9Ci0gIGVsc2UgcmV0dXJuIDg4OyAvKiB1bmtub3duIGZpbHRlciBzdHJhdGVneSAqLwotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHZvaWQgYWRkUGFkZGluZ0JpdHModW5zaWduZWQgY2hhciogb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvbGluZWJpdHMsIHNpemVfdCBpbGluZWJpdHMsIHVuc2lnbmVkIGgpIHsKLSAgLypUaGUgb3Bwb3NpdGUgb2YgdGhlIHJlbW92ZVBhZGRpbmdCaXRzIGZ1bmN0aW9uCi0gIG9saW5lYml0cyBtdXN0IGJlID49IGlsaW5lYml0cyovCi0gIHVuc2lnbmVkIHk7Ci0gIHNpemVfdCBkaWZmID0gb2xpbmViaXRzIC0gaWxpbmViaXRzOwotICBzaXplX3Qgb2JwID0gMCwgaWJwID0gMDsgLypiaXQgcG9pbnRlcnMqLwotICBmb3IoeSA9IDA7IHkgIT0gaDsgKyt5KSB7Ci0gICAgc2l6ZV90IHg7Ci0gICAgZm9yKHggPSAwOyB4IDwgaWxpbmViaXRzOyArK3gpIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYml0ID0gcmVhZEJpdEZyb21SZXZlcnNlZFN0cmVhbSgmaWJwLCBpbik7Ci0gICAgICBzZXRCaXRPZlJldmVyc2VkU3RyZWFtKCZvYnAsIG91dCwgYml0KTsKLSAgICB9Ci0gICAgLypvYnAgKz0gZGlmZjsgLS0+IG5vLCBmaWxsIGluIHNvbWUgdmFsdWUgaW4gdGhlIHBhZGRpbmcgYml0cyB0b28sIHRvIGF2b2lkCi0gICAgIlVzZSBvZiB1bmluaXRpYWxpc2VkIHZhbHVlIG9mIHNpemUgIyMjIiB3YXJuaW5nIGZyb20gdmFsZ3JpbmQqLwotICAgIGZvcih4ID0gMDsgeCAhPSBkaWZmOyArK3gpIHNldEJpdE9mUmV2ZXJzZWRTdHJlYW0oJm9icCwgb3V0LCAwKTsKLSAgfQotfQotCi0vKgotaW46IG5vbi1pbnRlcmxhY2VkIGltYWdlIHdpdGggc2l6ZSB3KmgKLW91dDogdGhlIHNhbWUgcGl4ZWxzLCBidXQgcmUtb3JkZXJlZCBhY2NvcmRpbmcgdG8gUE5HJ3MgQWRhbTcgaW50ZXJsYWNpbmcsIHdpdGgKLSBubyBwYWRkaW5nIGJpdHMgYmV0d2VlbiBzY2FubGluZXMsIGJ1dCBiZXR3ZWVuIHJlZHVjZWQgaW1hZ2VzIHNvIHRoYXQgZWFjaAotIHJlZHVjZWQgaW1hZ2Ugc3RhcnRzIGF0IGEgYnl0ZS4KLWJwcDogYml0cyBwZXIgcGl4ZWwKLXRoZXJlIGFyZSBubyBwYWRkaW5nIGJpdHMsIG5vdCBiZXR3ZWVuIHNjYW5saW5lcywgbm90IGJldHdlZW4gcmVkdWNlZCBpbWFnZXMKLWluIGhhcyB0aGUgZm9sbG93aW5nIHNpemUgaW4gYml0czogdyAqIGggKiBicHAuCi1vdXQgaXMgcG9zc2libHkgYmlnZ2VyIGR1ZSB0byBwYWRkaW5nIGJpdHMgYmV0d2VlbiByZWR1Y2VkIGltYWdlcwotTk9URTogY29tbWVudHMgYWJvdXQgcGFkZGluZyBiaXRzIGFyZSBvbmx5IHJlbGV2YW50IGlmIGJwcCA8IDgKLSovCi1zdGF0aWMgdm9pZCBBZGFtN19pbnRlcmxhY2UodW5zaWduZWQgY2hhciogb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwgdW5zaWduZWQgYnBwKSB7Ci0gIHVuc2lnbmVkIHBhc3N3WzddLCBwYXNzaFs3XTsKLSAgc2l6ZV90IGZpbHRlcl9wYXNzc3RhcnRbOF0sIHBhZGRlZF9wYXNzc3RhcnRbOF0sIHBhc3NzdGFydFs4XTsKLSAgdW5zaWduZWQgaTsKLQotICBBZGFtN19nZXRwYXNzdmFsdWVzKHBhc3N3LCBwYXNzaCwgZmlsdGVyX3Bhc3NzdGFydCwgcGFkZGVkX3Bhc3NzdGFydCwgcGFzc3N0YXJ0LCB3LCBoLCBicHApOwotCi0gIGlmKGJwcCA+PSA4KSB7Ci0gICAgZm9yKGkgPSAwOyBpICE9IDc7ICsraSkgewotICAgICAgdW5zaWduZWQgeCwgeSwgYjsKLSAgICAgIHNpemVfdCBieXRld2lkdGggPSBicHAgLyA4OwotICAgICAgZm9yKHkgPSAwOyB5IDwgcGFzc2hbaV07ICsreSkKLSAgICAgIGZvcih4ID0gMDsgeCA8IHBhc3N3W2ldOyArK3gpIHsKLSAgICAgICAgc2l6ZV90IHBpeGVsaW5zdGFydCA9ICgoQURBTTdfSVlbaV0gKyB5ICogQURBTTdfRFlbaV0pICogdyArIEFEQU03X0lYW2ldICsgeCAqIEFEQU03X0RYW2ldKSAqIGJ5dGV3aWR0aDsKLSAgICAgICAgc2l6ZV90IHBpeGVsb3V0c3RhcnQgPSBwYXNzc3RhcnRbaV0gKyAoeSAqIHBhc3N3W2ldICsgeCkgKiBieXRld2lkdGg7Ci0gICAgICAgIGZvcihiID0gMDsgYiA8IGJ5dGV3aWR0aDsgKytiKSB7Ci0gICAgICAgICAgb3V0W3BpeGVsb3V0c3RhcnQgKyBiXSA9IGluW3BpeGVsaW5zdGFydCArIGJdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgLypicHAgPCA4OiBBZGFtNyB3aXRoIHBpeGVscyA8IDggYml0IGlzIGEgYml0IHRyaWNraWVyOiB3aXRoIGJpdCBwb2ludGVycyovIHsKLSAgICBmb3IoaSA9IDA7IGkgIT0gNzsgKytpKSB7Ci0gICAgICB1bnNpZ25lZCB4LCB5LCBiOwotICAgICAgdW5zaWduZWQgaWxpbmViaXRzID0gYnBwICogcGFzc3dbaV07Ci0gICAgICB1bnNpZ25lZCBvbGluZWJpdHMgPSBicHAgKiB3OwotICAgICAgc2l6ZV90IG9icCwgaWJwOyAvKmJpdCBwb2ludGVycyAoZm9yIG91dCBhbmQgaW4gYnVmZmVyKSovCi0gICAgICBmb3IoeSA9IDA7IHkgPCBwYXNzaFtpXTsgKyt5KQotICAgICAgZm9yKHggPSAwOyB4IDwgcGFzc3dbaV07ICsreCkgewotICAgICAgICBpYnAgPSAoQURBTTdfSVlbaV0gKyB5ICogQURBTTdfRFlbaV0pICogb2xpbmViaXRzICsgKEFEQU03X0lYW2ldICsgeCAqIEFEQU03X0RYW2ldKSAqIGJwcDsKLSAgICAgICAgb2JwID0gKDggKiBwYXNzc3RhcnRbaV0pICsgKHkgKiBpbGluZWJpdHMgKyB4ICogYnBwKTsKLSAgICAgICAgZm9yKGIgPSAwOyBiIDwgYnBwOyArK2IpIHsKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdCA9IHJlYWRCaXRGcm9tUmV2ZXJzZWRTdHJlYW0oJmlicCwgaW4pOwotICAgICAgICAgIHNldEJpdE9mUmV2ZXJzZWRTdHJlYW0oJm9icCwgb3V0LCBiaXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qb3V0IG11c3QgYmUgYnVmZmVyIGJpZyBlbm91Z2ggdG8gY29udGFpbiB1bmNvbXByZXNzZWQgSURBVCBjaHVuayBkYXRhLCBhbmQgaW4gbXVzdCBjb250YWluIHRoZSBmdWxsIGltYWdlLgotcmV0dXJuIHZhbHVlIGlzIGVycm9yKiovCi1zdGF0aWMgdW5zaWduZWQgcHJlUHJvY2Vzc1NjYW5saW5lcyh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdJbmZvKiBpbmZvX3BuZywgY29uc3QgTG9kZVBOR0VuY29kZXJTZXR0aW5ncyogc2V0dGluZ3MpIHsKLSAgLyoKLSAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgcHVyZSAyRCBpbWFnZSB3aXRoIHRoZSBQTkcncyBjb2xvcnR5cGUsIGludG8gZmlsdGVyZWQtcGFkZGVkLWludGVybGFjZWQgZGF0YS4gU3RlcHM6Ci0gICopIGlmIG5vIEFkYW03OiAxKSBhZGQgcGFkZGluZyBiaXRzICg9IHBvc2libGUgZXh0cmEgYml0cyBwZXIgc2NhbmxpbmUgaWYgYnBwIDwgOCkgMikgZmlsdGVyCi0gICopIGlmIGFkYW03OiAxKSBBZGFtN19pbnRlcmxhY2UgMikgN3ggYWRkIHBhZGRpbmcgYml0cyAzKSA3eCBmaWx0ZXIKLSAgKi8KLSAgdW5zaWduZWQgYnBwID0gbG9kZXBuZ19nZXRfYnBwKCZpbmZvX3BuZy0+Y29sb3IpOwotICB1bnNpZ25lZCBlcnJvciA9IDA7Ci0KLSAgaWYoaW5mb19wbmctPmludGVybGFjZV9tZXRob2QgPT0gMCkgewotICAgICpvdXRzaXplID0gaCArIChoICogKCh3ICogYnBwICsgNykgLyA4KSk7IC8qaW1hZ2Ugc2l6ZSBwbHVzIGFuIGV4dHJhIGJ5dGUgcGVyIHNjYW5saW5lICsgcG9zc2libGUgcGFkZGluZyBiaXRzKi8KLSAgICAqb3V0ID0gKHVuc2lnbmVkIGNoYXIqKWxvZGVwbmdfbWFsbG9jKCpvdXRzaXplKTsKLSAgICBpZighKCpvdXQpICYmICgqb3V0c2l6ZSkpIGVycm9yID0gODM7IC8qYWxsb2MgZmFpbCovCi0KLSAgICBpZighZXJyb3IpIHsKLSAgICAgIC8qbm9uIG11bHRpcGxlIG9mIDggYml0cyBwZXIgc2NhbmxpbmUsIHBhZGRpbmcgYml0cyBuZWVkZWQgcGVyIHNjYW5saW5lKi8KLSAgICAgIGlmKGJwcCA8IDggJiYgdyAqIGJwcCAhPSAoKHcgKiBicHAgKyA3KSAvIDgpICogOCkgewotICAgICAgICB1bnNpZ25lZCBjaGFyKiBwYWRkZWQgPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2MoaCAqICgodyAqIGJwcCArIDcpIC8gOCkpOwotICAgICAgICBpZighcGFkZGVkKSBlcnJvciA9IDgzOyAvKmFsbG9jIGZhaWwqLwotICAgICAgICBpZighZXJyb3IpIHsKLSAgICAgICAgICBhZGRQYWRkaW5nQml0cyhwYWRkZWQsIGluLCAoKHcgKiBicHAgKyA3KSAvIDgpICogOCwgdyAqIGJwcCwgaCk7Ci0gICAgICAgICAgZXJyb3IgPSBmaWx0ZXIoKm91dCwgcGFkZGVkLCB3LCBoLCAmaW5mb19wbmctPmNvbG9yLCBzZXR0aW5ncyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9kZXBuZ19mcmVlKHBhZGRlZCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKndlIGNhbiBpbW1lZGlhdGVseSBmaWx0ZXIgaW50byB0aGUgb3V0IGJ1ZmZlciwgbm8gb3RoZXIgc3RlcHMgbmVlZGVkKi8KLSAgICAgICAgZXJyb3IgPSBmaWx0ZXIoKm91dCwgaW4sIHcsIGgsICZpbmZvX3BuZy0+Y29sb3IsIHNldHRpbmdzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSAvKmludGVybGFjZV9tZXRob2QgaXMgMSAoQWRhbTcpKi8gewotICAgIHVuc2lnbmVkIHBhc3N3WzddLCBwYXNzaFs3XTsKLSAgICBzaXplX3QgZmlsdGVyX3Bhc3NzdGFydFs4XSwgcGFkZGVkX3Bhc3NzdGFydFs4XSwgcGFzc3N0YXJ0WzhdOwotICAgIHVuc2lnbmVkIGNoYXIqIGFkYW03OwotCi0gICAgQWRhbTdfZ2V0cGFzc3ZhbHVlcyhwYXNzdywgcGFzc2gsIGZpbHRlcl9wYXNzc3RhcnQsIHBhZGRlZF9wYXNzc3RhcnQsIHBhc3NzdGFydCwgdywgaCwgYnBwKTsKLQotICAgICpvdXRzaXplID0gZmlsdGVyX3Bhc3NzdGFydFs3XTsgLyppbWFnZSBzaXplIHBsdXMgYW4gZXh0cmEgYnl0ZSBwZXIgc2NhbmxpbmUgKyBwb3NzaWJsZSBwYWRkaW5nIGJpdHMqLwotICAgICpvdXQgPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2MoKm91dHNpemUpOwotICAgIGlmKCEoKm91dCkpIGVycm9yID0gODM7IC8qYWxsb2MgZmFpbCovCi0KLSAgICBhZGFtNyA9ICh1bnNpZ25lZCBjaGFyKilsb2RlcG5nX21hbGxvYyhwYXNzc3RhcnRbN10pOwotICAgIGlmKCFhZGFtNyAmJiBwYXNzc3RhcnRbN10pIGVycm9yID0gODM7IC8qYWxsb2MgZmFpbCovCi0KLSAgICBpZighZXJyb3IpIHsKLSAgICAgIHVuc2lnbmVkIGk7Ci0KLSAgICAgIEFkYW03X2ludGVybGFjZShhZGFtNywgaW4sIHcsIGgsIGJwcCk7Ci0gICAgICBmb3IoaSA9IDA7IGkgIT0gNzsgKytpKSB7Ci0gICAgICAgIGlmKGJwcCA8IDgpIHsKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBwYWRkZWQgPSAodW5zaWduZWQgY2hhciopbG9kZXBuZ19tYWxsb2MocGFkZGVkX3Bhc3NzdGFydFtpICsgMV0gLSBwYWRkZWRfcGFzc3N0YXJ0W2ldKTsKLSAgICAgICAgICBpZighcGFkZGVkKSBFUlJPUl9CUkVBSyg4Myk7IC8qYWxsb2MgZmFpbCovCi0gICAgICAgICAgYWRkUGFkZGluZ0JpdHMocGFkZGVkLCAmYWRhbTdbcGFzc3N0YXJ0W2ldXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKHBhc3N3W2ldICogYnBwICsgNykgLyA4KSAqIDgsIHBhc3N3W2ldICogYnBwLCBwYXNzaFtpXSk7Ci0gICAgICAgICAgZXJyb3IgPSBmaWx0ZXIoJigqb3V0KVtmaWx0ZXJfcGFzc3N0YXJ0W2ldXSwgcGFkZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3W2ldLCBwYXNzaFtpXSwgJmluZm9fcG5nLT5jb2xvciwgc2V0dGluZ3MpOwotICAgICAgICAgIGxvZGVwbmdfZnJlZShwYWRkZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGVycm9yID0gZmlsdGVyKCYoKm91dClbZmlsdGVyX3Bhc3NzdGFydFtpXV0sICZhZGFtN1twYWRkZWRfcGFzc3N0YXJ0W2ldXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd1tpXSwgcGFzc2hbaV0sICZpbmZvX3BuZy0+Y29sb3IsIHNldHRpbmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGVycm9yKSBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBsb2RlcG5nX2ZyZWUoYWRhbTcpOwotICB9Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0vKgotcGFsZXR0ZSBtdXN0IGhhdmUgNCAqIHBhbGV0dGVzaXplIGJ5dGVzIGFsbG9jYXRlZCwgYW5kIGdpdmVuIGluIGZvcm1hdCBSR0JBUkdCQVJHQkFSR0JBLi4uCi1yZXR1cm5zIDAgaWYgdGhlIHBhbGV0dGUgaXMgb3BhcXVlLAotcmV0dXJucyAxIGlmIHRoZSBwYWxldHRlIGhhcyBhIHNpbmdsZSBjb2xvciB3aXRoIGFscGhhIDAgPT0+IGNvbG9yIGtleQotcmV0dXJucyAyIGlmIHRoZSBwYWxldHRlIGlzIHNlbWktdHJhbnNsdWNlbnQuCi0qLwotc3RhdGljIHVuc2lnbmVkIGdldFBhbGV0dGVUcmFuc2x1Y2VuY3koY29uc3QgdW5zaWduZWQgY2hhciogcGFsZXR0ZSwgc2l6ZV90IHBhbGV0dGVzaXplKSB7Ci0gIHNpemVfdCBpOwotICB1bnNpZ25lZCBrZXkgPSAwOwotICB1bnNpZ25lZCByID0gMCwgZyA9IDAsIGIgPSAwOyAvKnRoZSB2YWx1ZSBvZiB0aGUgY29sb3Igd2l0aCBhbHBoYSAwLCBzbyBsb25nIGFzIGNvbG9yIGtleWluZyBpcyBwb3NzaWJsZSovCi0gIGZvcihpID0gMDsgaSAhPSBwYWxldHRlc2l6ZTsgKytpKSB7Ci0gICAgaWYoIWtleSAmJiBwYWxldHRlWzQgKiBpICsgM10gPT0gMCkgewotICAgICAgciA9IHBhbGV0dGVbNCAqIGkgKyAwXTsgZyA9IHBhbGV0dGVbNCAqIGkgKyAxXTsgYiA9IHBhbGV0dGVbNCAqIGkgKyAyXTsKLSAgICAgIGtleSA9IDE7Ci0gICAgICBpID0gKHNpemVfdCkoLTEpOyAvKnJlc3RhcnQgZnJvbSBiZWdpbm5pbmcsIHRvIGRldGVjdCBlYXJsaWVyIG9wYXF1ZSBjb2xvcnMgd2l0aCBrZXkncyB2YWx1ZSovCi0gICAgfQotICAgIGVsc2UgaWYocGFsZXR0ZVs0ICogaSArIDNdICE9IDI1NSkgcmV0dXJuIDI7Ci0gICAgLyp3aGVuIGtleSwgbm8gb3BhcXVlIFJHQiBtYXkgaGF2ZSBrZXkncyBSR0IqLwotICAgIGVsc2UgaWYoa2V5ICYmIHIgPT0gcGFsZXR0ZVtpICogNCArIDBdICYmIGcgPT0gcGFsZXR0ZVtpICogNCArIDFdICYmIGIgPT0gcGFsZXR0ZVtpICogNCArIDJdKSByZXR1cm4gMjsKLSAgfQotICByZXR1cm4ga2V5OwotfQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLXN0YXRpYyB1bnNpZ25lZCBhZGRVbmtub3duQ2h1bmtzKHVjdmVjdG9yKiBvdXQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhc2l6ZSkgewotICB1bnNpZ25lZCBjaGFyKiBpbmNodW5rID0gZGF0YTsKLSAgd2hpbGUoKHNpemVfdCkoaW5jaHVuayAtIGRhdGEpIDwgZGF0YXNpemUpIHsKLSAgICBDRVJST1JfVFJZX1JFVFVSTihsb2RlcG5nX2NodW5rX2FwcGVuZCgmb3V0LT5kYXRhLCAmb3V0LT5zaXplLCBpbmNodW5rKSk7Ci0gICAgb3V0LT5hbGxvY3NpemUgPSBvdXQtPnNpemU7IC8qZml4IHRoZSBhbGxvY3NpemUgYWdhaW4qLwotICAgIGluY2h1bmsgPSBsb2RlcG5nX2NodW5rX25leHQoaW5jaHVuayk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpc0dyYXlJQ0NQcm9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHByb2ZpbGUsIHVuc2lnbmVkIHNpemUpIHsKLSAgLyoKLSAgSXQgaXMgYSBncmF5IHByb2ZpbGUgaWYgYnl0ZXMgMTYtMTkgYXJlICJHUkFZIiwgcmdiIHByb2ZpbGUgaWYgYnl0ZXMgMTYtMTkKLSAgYXJlICJSR0IgIi4gV2UgZG8gbm90IHBlcmZvcm0gYW55IGZ1bGwgcGFyc2luZyBvZiB0aGUgSUNDIHByb2ZpbGUgaGVyZSwgb3RoZXIKLSAgdGhhbiBjaGVjayB0aG9zZSA0IGJ5dGVzIHRvIGdyYXlzY2FsZSBwcm9maWxlLiBPdGhlciB0aGFuIHRoYXQsIHZhbGlkaXR5IG9mCi0gIHRoZSBwcm9maWxlIGlzIG5vdCBjaGVja2VkLiBUaGlzIGlzIG5lZWRlZCBvbmx5IGJlY2F1c2UgdGhlIFBORyBzcGVjaWZpY2F0aW9uCi0gIHJlcXVpcmVzIHVzaW5nIGEgbm9uLWdyYXkgY29sb3IgbW9kZWwgaWYgdGhlcmUgaXMgYW4gSUNDIHByb2ZpbGUgd2l0aCAiUkdCICIKLSAgKHNhZGx5IGxpbWl0aW5nIGNvbXByZXNzaW9uIG9wcG9ydHVuaXRpZXMgaWYgdGhlIGlucHV0IGRhdGEgaXMgZ3JheXNjYWxlIFJHQgotICBkYXRhKSwgYW5kIHJlcXVpcmVzIHVzaW5nIGEgZ3JheSBjb2xvciBtb2RlbCBpZiBpdCBpcyAiR1JBWSIuCi0gICovCi0gIGlmKHNpemUgPCAyMCkgcmV0dXJuIDA7Ci0gIHJldHVybiBwcm9maWxlWzE2XSA9PSAnRycgJiYgIHByb2ZpbGVbMTddID09ICdSJyAmJiAgcHJvZmlsZVsxOF0gPT0gJ0EnICYmICBwcm9maWxlWzE5XSA9PSAnWSc7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpc1JHQklDQ1Byb2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciogcHJvZmlsZSwgdW5zaWduZWQgc2l6ZSkgewotICAvKiBTZWUgY29tbWVudCBpbiBpc0dyYXlJQ0NQcm9maWxlKi8KLSAgaWYoc2l6ZSA8IDIwKSByZXR1cm4gMDsKLSAgcmV0dXJuIHByb2ZpbGVbMTZdID09ICdSJyAmJiAgcHJvZmlsZVsxN10gPT0gJ0cnICYmICBwcm9maWxlWzE4XSA9PSAnQicgJiYgIHByb2ZpbGVbMTldID09ICcgJzsKLX0KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLQotdW5zaWduZWQgbG9kZXBuZ19lbmNvZGUodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW1hZ2UsIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2RlUE5HU3RhdGUqIHN0YXRlKSB7Ci0gIHVuc2lnbmVkIGNoYXIqIGRhdGEgPSAwOyAvKnVuY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBJREFUIGNodW5rIGRhdGEqLwotICBzaXplX3QgZGF0YXNpemUgPSAwOwotICB1Y3ZlY3RvciBvdXR2OwotICBMb2RlUE5HSW5mbyBpbmZvOwotCi0gIHVjdmVjdG9yX2luaXQoJm91dHYpOwotICBsb2RlcG5nX2luZm9faW5pdCgmaW5mbyk7Ci0KLSAgLypwcm92aWRlIHNvbWUgcHJvcGVyIG91dHB1dCB2YWx1ZXMgaWYgZXJyb3Igd2lsbCBoYXBwZW4qLwotICAqb3V0ID0gMDsKLSAgKm91dHNpemUgPSAwOwotICBzdGF0ZS0+ZXJyb3IgPSAwOwotCi0gIC8qY2hlY2sgaW5wdXQgdmFsdWVzIHZhbGlkaXR5Ki8KLSAgaWYoKHN0YXRlLT5pbmZvX3BuZy5jb2xvci5jb2xvcnR5cGUgPT0gTENUX1BBTEVUVEUgfHwgc3RhdGUtPmVuY29kZXIuZm9yY2VfcGFsZXR0ZSkKLSAgICAgICYmIChzdGF0ZS0+aW5mb19wbmcuY29sb3IucGFsZXR0ZXNpemUgPT0gMCB8fCBzdGF0ZS0+aW5mb19wbmcuY29sb3IucGFsZXR0ZXNpemUgPiAyNTYpKSB7Ci0gICAgc3RhdGUtPmVycm9yID0gNjg7IC8qaW52YWxpZCBwYWxldHRlIHNpemUsIGl0IGlzIG9ubHkgYWxsb3dlZCB0byBiZSAxLTI1NiovCi0gICAgZ290byBjbGVhbnVwOwotICB9Ci0gIGlmKHN0YXRlLT5lbmNvZGVyLnpsaWJzZXR0aW5ncy5idHlwZSA+IDIpIHsKLSAgICBzdGF0ZS0+ZXJyb3IgPSA2MTsgLyplcnJvcjogdW5leGlzdGluZyBidHlwZSovCi0gICAgZ290byBjbGVhbnVwOwotICB9Ci0gIGlmKHN0YXRlLT5pbmZvX3BuZy5pbnRlcmxhY2VfbWV0aG9kID4gMSkgewotICAgIHN0YXRlLT5lcnJvciA9IDcxOyAvKmVycm9yOiB1bmV4aXN0aW5nIGludGVybGFjZSBtb2RlKi8KLSAgICBnb3RvIGNsZWFudXA7Ci0gIH0KLSAgc3RhdGUtPmVycm9yID0gY2hlY2tDb2xvclZhbGlkaXR5KHN0YXRlLT5pbmZvX3BuZy5jb2xvci5jb2xvcnR5cGUsIHN0YXRlLT5pbmZvX3BuZy5jb2xvci5iaXRkZXB0aCk7Ci0gIGlmKHN0YXRlLT5lcnJvcikgZ290byBjbGVhbnVwOyAvKmVycm9yOiB1bmV4aXN0aW5nIGNvbG9yIHR5cGUgZ2l2ZW4qLwotICBzdGF0ZS0+ZXJyb3IgPSBjaGVja0NvbG9yVmFsaWRpdHkoc3RhdGUtPmluZm9fcmF3LmNvbG9ydHlwZSwgc3RhdGUtPmluZm9fcmF3LmJpdGRlcHRoKTsKLSAgaWYoc3RhdGUtPmVycm9yKSBnb3RvIGNsZWFudXA7IC8qZXJyb3I6IHVuZXhpc3RpbmcgY29sb3IgdHlwZSBnaXZlbiovCi0KLSAgLyogY29sb3IgY29udmVydCBhbmQgY29tcHV0ZSBzY2FubGluZSBmaWx0ZXIgdHlwZXMgKi8KLSAgbG9kZXBuZ19pbmZvX2NvcHkoJmluZm8sICZzdGF0ZS0+aW5mb19wbmcpOwotICBpZihzdGF0ZS0+ZW5jb2Rlci5hdXRvX2NvbnZlcnQpIHsKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotICAgIGlmKHN0YXRlLT5pbmZvX3BuZy5iYWNrZ3JvdW5kX2RlZmluZWQpIHsKLSAgICAgIHVuc2lnbmVkIGJnX3IgPSBzdGF0ZS0+aW5mb19wbmcuYmFja2dyb3VuZF9yOwotICAgICAgdW5zaWduZWQgYmdfZyA9IHN0YXRlLT5pbmZvX3BuZy5iYWNrZ3JvdW5kX2c7Ci0gICAgICB1bnNpZ25lZCBiZ19iID0gc3RhdGUtPmluZm9fcG5nLmJhY2tncm91bmRfYjsKLSAgICAgIHVuc2lnbmVkIHIgPSAwLCBnID0gMCwgYiA9IDA7Ci0gICAgICBMb2RlUE5HQ29sb3JQcm9maWxlIHByb2Y7Ci0gICAgICBMb2RlUE5HQ29sb3JNb2RlIG1vZGUxNiA9IGxvZGVwbmdfY29sb3JfbW9kZV9tYWtlKExDVF9SR0IsIDE2KTsKLSAgICAgIGxvZGVwbmdfY29udmVydF9yZ2IoJnIsICZnLCAmYiwgYmdfciwgYmdfZywgYmdfYiwgJm1vZGUxNiwgJnN0YXRlLT5pbmZvX3BuZy5jb2xvcik7Ci0gICAgICBsb2RlcG5nX2NvbG9yX3Byb2ZpbGVfaW5pdCgmcHJvZik7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSBsb2RlcG5nX2dldF9jb2xvcl9wcm9maWxlKCZwcm9mLCBpbWFnZSwgdywgaCwgJnN0YXRlLT5pbmZvX3Jhdyk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGdvdG8gY2xlYW51cDsKLSAgICAgIGxvZGVwbmdfY29sb3JfcHJvZmlsZV9hZGQoJnByb2YsIHIsIGcsIGIsIDY1NTM1KTsKLSAgICAgIHN0YXRlLT5lcnJvciA9IGF1dG9fY2hvb3NlX2NvbG9yX2Zyb21fcHJvZmlsZSgmaW5mby5jb2xvciwgJnN0YXRlLT5pbmZvX3JhdywgJnByb2YpOwotICAgICAgaWYoc3RhdGUtPmVycm9yKSBnb3RvIGNsZWFudXA7Ci0gICAgICBpZihsb2RlcG5nX2NvbnZlcnRfcmdiKCZpbmZvLmJhY2tncm91bmRfciwgJmluZm8uYmFja2dyb3VuZF9nLCAmaW5mby5iYWNrZ3JvdW5kX2IsCi0gICAgICAgICAgYmdfciwgYmdfZywgYmdfYiwgJmluZm8uY29sb3IsICZzdGF0ZS0+aW5mb19wbmcuY29sb3IpKSB7Ci0gICAgICAgIHN0YXRlLT5lcnJvciA9IDEwNDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MgKi8KLSAgICB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSBsb2RlcG5nX2F1dG9fY2hvb3NlX2NvbG9yKCZpbmZvLmNvbG9yLCBpbWFnZSwgdywgaCwgJnN0YXRlLT5pbmZvX3Jhdyk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0gIH0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotICBpZihzdGF0ZS0+aW5mb19wbmcuaWNjcF9kZWZpbmVkKSB7Ci0gICAgdW5zaWduZWQgZ3JheV9pY2MgPSBpc0dyYXlJQ0NQcm9maWxlKHN0YXRlLT5pbmZvX3BuZy5pY2NwX3Byb2ZpbGUsIHN0YXRlLT5pbmZvX3BuZy5pY2NwX3Byb2ZpbGVfc2l6ZSk7Ci0gICAgdW5zaWduZWQgZ3JheV9wbmcgPSBpbmZvLmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSB8fCBpbmZvLmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfR1JFWV9BTFBIQTsKLSAgICAvKiBUT0RPOiBwZXJoYXBzIGluc3RlYWQgb2YgZ2l2aW5nIGVycm9ycyBvciBsZXNzIG9wdGltYWwgY29tcHJlc3Npb24sIHdlIGNhbiBhdXRvbWF0aWNhbGx5IG1vZGlmeQotICAgIHRoZSBJQ0MgcHJvZmlsZSBoZXJlIHRvIHNheSAiR1JBWSIgb3IgIlJHQiAiIHRvIG1hdGNoIHRoZSBQTkcgY29sb3IgdHlwZSwgdW5sZXNzIHRoaXMgd2lsbCByZXF1aXJlCi0gICAgbm9uIHRyaXZpYWwgY2hhbmdlcyB0byB0aGUgcmVzdCBvZiB0aGUgSUNDIHByb2ZpbGUgKi8KLSAgICBpZighZ3JheV9pY2MgJiYgIWlzUkdCSUNDUHJvZmlsZShzdGF0ZS0+aW5mb19wbmcuaWNjcF9wcm9maWxlLCBzdGF0ZS0+aW5mb19wbmcuaWNjcF9wcm9maWxlX3NpemUpKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSAxMDA7IC8qIERpc2FsbG93ZWQgcHJvZmlsZSBjb2xvciB0eXBlIGZvciBQTkcgKi8KLSAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0gICAgaWYoIXN0YXRlLT5lbmNvZGVyLmF1dG9fY29udmVydCAmJiBncmF5X2ljYyAhPSBncmF5X3BuZykgewotICAgICAgLyogTm9uIHJlY292ZXJhYmxlOiBlbmNvZGVyIG5vdCBhbGxvd2VkIHRvIGNvbnZlcnQgY29sb3IgdHlwZSwgYW5kIHJlcXVlc3RlZCBjb2xvciB0eXBlIG5vdAotICAgICAgY29tcGF0aWJsZSB3aXRoIElDQyBjb2xvciB0eXBlICovCi0gICAgICBzdGF0ZS0+ZXJyb3IgPSAxMDE7Ci0gICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotICAgIGlmKGdyYXlfaWNjICYmICFncmF5X3BuZykgewotICAgICAgLyogTm9uIHJlY292ZXJhYmxlOiB0cnlpbmcgdG8gc2V0IGdyYXlzY2FsZSBJQ0MgcHJvZmlsZSB3aGlsZSBjb2xvcmVkIHBpeGVscyB3ZXJlIGdpdmVuICovCi0gICAgICBzdGF0ZS0+ZXJyb3IgPSAxMDI7Ci0gICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAvKiBOT1RFOiB0aGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGxvZGVwbmdfYXV0b19jaG9vc2VfY29sb3IgbmV2ZXIgcmV0dXJucyBwYWxldHRlIGZvciBncmF5c2NhbGUgcGl4ZWxzICovCi0gICAgfQotICAgIGlmKCFncmF5X2ljYyAmJiBncmF5X3BuZykgewotICAgICAgLyogUmVjb3ZlcmFibGUgYnV0IGFuIHVuZm9ydHVuYXRlIGxvc3MgaW4gY29tcHJlc3Npb24gZGVuc2l0eTogV2UgaGF2ZSBncmF5c2NhbGUgcGl4ZWxzIGJ1dAotICAgICAgYXJlIGZvcmNlZCB0byBzdG9yZSB0aGVtIGluIG1vcmUgZXhwZW5zaXZlIFJHQiBmb3JtYXQgdGhhdCB3aWxsIHJlcGVhdCBlYWNoIHZhbHVlIDMgdGltZXMKLSAgICAgIGJlY2F1c2UgdGhlIFBORyBzcGVjIGRvZXMgbm90IGFsbG93IGFuIFJHQiBJQ0MgcHJvZmlsZSB3aXRoIGludGVybmFsIGdyYXlzY2FsZSBjb2xvciBkYXRhICovCi0gICAgICBpZihpbmZvLmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSkgaW5mby5jb2xvci5jb2xvcnR5cGUgPSBMQ1RfUkdCOwotICAgICAgaWYoaW5mby5jb2xvci5jb2xvcnR5cGUgPT0gTENUX0dSRVlfQUxQSEEpIGluZm8uY29sb3IuY29sb3J0eXBlID0gTENUX1JHQkE7Ci0gICAgICBpZihpbmZvLmNvbG9yLmJpdGRlcHRoIDwgOCkgaW5mby5jb2xvci5iaXRkZXB0aCA9IDg7Ci0gICAgfQotICB9Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0gIGlmKCFsb2RlcG5nX2NvbG9yX21vZGVfZXF1YWwoJnN0YXRlLT5pbmZvX3JhdywgJmluZm8uY29sb3IpKSB7Ci0gICAgdW5zaWduZWQgY2hhciogY29udmVydGVkOwotICAgIHNpemVfdCBzaXplID0gKChzaXplX3QpdyAqIChzaXplX3QpaCAqIChzaXplX3QpbG9kZXBuZ19nZXRfYnBwKCZpbmZvLmNvbG9yKSArIDcpIC8gODsKLQotICAgIGNvbnZlcnRlZCA9ICh1bnNpZ25lZCBjaGFyKilsb2RlcG5nX21hbGxvYyhzaXplKTsKLSAgICBpZighY29udmVydGVkICYmIHNpemUpIHN0YXRlLT5lcnJvciA9IDgzOyAvKmFsbG9jIGZhaWwqLwotICAgIGlmKCFzdGF0ZS0+ZXJyb3IpIHsKLSAgICAgIHN0YXRlLT5lcnJvciA9IGxvZGVwbmdfY29udmVydChjb252ZXJ0ZWQsIGltYWdlLCAmaW5mby5jb2xvciwgJnN0YXRlLT5pbmZvX3JhdywgdywgaCk7Ci0gICAgfQotICAgIGlmKCFzdGF0ZS0+ZXJyb3IpIHByZVByb2Nlc3NTY2FubGluZXMoJmRhdGEsICZkYXRhc2l6ZSwgY29udmVydGVkLCB3LCBoLCAmaW5mbywgJnN0YXRlLT5lbmNvZGVyKTsKLSAgICBsb2RlcG5nX2ZyZWUoY29udmVydGVkKTsKLSAgICBpZihzdGF0ZS0+ZXJyb3IpIGdvdG8gY2xlYW51cDsKLSAgfQotICBlbHNlIHByZVByb2Nlc3NTY2FubGluZXMoJmRhdGEsICZkYXRhc2l6ZSwgaW1hZ2UsIHcsIGgsICZpbmZvLCAmc3RhdGUtPmVuY29kZXIpOwotCi0gIC8qIG91dHB1dCBhbGwgUE5HIGNodW5rcyAqLyB7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgICBzaXplX3QgaTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLSAgICAvKndyaXRlIHNpZ25hdHVyZSBhbmQgY2h1bmtzKi8KLSAgICB3cml0ZVNpZ25hdHVyZSgmb3V0dik7Ci0gICAgLypJSERSKi8KLSAgICBhZGRDaHVua19JSERSKCZvdXR2LCB3LCBoLCBpbmZvLmNvbG9yLmNvbG9ydHlwZSwgaW5mby5jb2xvci5iaXRkZXB0aCwgaW5mby5pbnRlcmxhY2VfbWV0aG9kKTsKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotICAgIC8qdW5rbm93biBjaHVua3MgYmV0d2VlbiBJSERSIGFuZCBQTFRFKi8KLSAgICBpZihpbmZvLnVua25vd25fY2h1bmtzX2RhdGFbMF0pIHsKLSAgICAgIHN0YXRlLT5lcnJvciA9IGFkZFVua25vd25DaHVua3MoJm91dHYsIGluZm8udW5rbm93bl9jaHVua3NfZGF0YVswXSwgaW5mby51bmtub3duX2NodW5rc19zaXplWzBdKTsKLSAgICAgIGlmKHN0YXRlLT5lcnJvcikgZ290byBjbGVhbnVwOwotICAgIH0KLSAgICAvKmNvbG9yIHByb2ZpbGUgY2h1bmtzIG11c3QgY29tZSBiZWZvcmUgUExURSAqLwotICAgIGlmKGluZm8uaWNjcF9kZWZpbmVkKSBhZGRDaHVua19pQ0NQKCZvdXR2LCAmaW5mbywgJnN0YXRlLT5lbmNvZGVyLnpsaWJzZXR0aW5ncyk7Ci0gICAgaWYoaW5mby5zcmdiX2RlZmluZWQpIGFkZENodW5rX3NSR0IoJm91dHYsICZpbmZvKTsKLSAgICBpZihpbmZvLmdhbWFfZGVmaW5lZCkgYWRkQ2h1bmtfZ0FNQSgmb3V0diwgJmluZm8pOwotICAgIGlmKGluZm8uY2hybV9kZWZpbmVkKSBhZGRDaHVua19jSFJNKCZvdXR2LCAmaW5mbyk7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0gICAgLypQTFRFKi8KLSAgICBpZihpbmZvLmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfUEFMRVRURSkgewotICAgICAgYWRkQ2h1bmtfUExURSgmb3V0diwgJmluZm8uY29sb3IpOwotICAgIH0KLSAgICBpZihzdGF0ZS0+ZW5jb2Rlci5mb3JjZV9wYWxldHRlICYmIChpbmZvLmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfUkdCIHx8IGluZm8uY29sb3IuY29sb3J0eXBlID09IExDVF9SR0JBKSkgewotICAgICAgYWRkQ2h1bmtfUExURSgmb3V0diwgJmluZm8uY29sb3IpOwotICAgIH0KLSAgICAvKnRSTlMqLwotICAgIGlmKGluZm8uY29sb3IuY29sb3J0eXBlID09IExDVF9QQUxFVFRFICYmIGdldFBhbGV0dGVUcmFuc2x1Y2VuY3koaW5mby5jb2xvci5wYWxldHRlLCBpbmZvLmNvbG9yLnBhbGV0dGVzaXplKSAhPSAwKSB7Ci0gICAgICBhZGRDaHVua190Uk5TKCZvdXR2LCAmaW5mby5jb2xvcik7Ci0gICAgfQotICAgIGlmKChpbmZvLmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfR1JFWSB8fCBpbmZvLmNvbG9yLmNvbG9ydHlwZSA9PSBMQ1RfUkdCKSAmJiBpbmZvLmNvbG9yLmtleV9kZWZpbmVkKSB7Ci0gICAgICBhZGRDaHVua190Uk5TKCZvdXR2LCAmaW5mby5jb2xvcik7Ci0gICAgfQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTCi0gICAgLypiS0dEIChtdXN0IGNvbWUgYmV0d2VlbiBQTFRFIGFuZCB0aGUgSURBdCBjaHVua3MqLwotICAgIGlmKGluZm8uYmFja2dyb3VuZF9kZWZpbmVkKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSBhZGRDaHVua19iS0dEKCZvdXR2LCAmaW5mbyk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0gICAgLypwSFlzIChtdXN0IGNvbWUgYmVmb3JlIHRoZSBJREFUIGNodW5rcykqLwotICAgIGlmKGluZm8ucGh5c19kZWZpbmVkKSBhZGRDaHVua19wSFlzKCZvdXR2LCAmaW5mbyk7Ci0KLSAgICAvKnVua25vd24gY2h1bmtzIGJldHdlZW4gUExURSBhbmQgSURBVCovCi0gICAgaWYoaW5mby51bmtub3duX2NodW5rc19kYXRhWzFdKSB7Ci0gICAgICBzdGF0ZS0+ZXJyb3IgPSBhZGRVbmtub3duQ2h1bmtzKCZvdXR2LCBpbmZvLnVua25vd25fY2h1bmtzX2RhdGFbMV0sIGluZm8udW5rbm93bl9jaHVua3Nfc2l6ZVsxXSk7Ci0gICAgICBpZihzdGF0ZS0+ZXJyb3IpIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0gICAgLypJREFUIChtdWx0aXBsZSBJREFUIGNodW5rcyBtdXN0IGJlIGNvbnNlY3V0aXZlKSovCi0gICAgc3RhdGUtPmVycm9yID0gYWRkQ2h1bmtfSURBVCgmb3V0diwgZGF0YSwgZGF0YXNpemUsICZzdGF0ZS0+ZW5jb2Rlci56bGlic2V0dGluZ3MpOwotICAgIGlmKHN0YXRlLT5lcnJvcikgZ290byBjbGVhbnVwOwotI2lmZGVmIExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTCi0gICAgLyp0SU1FKi8KLSAgICBpZihpbmZvLnRpbWVfZGVmaW5lZCkgYWRkQ2h1bmtfdElNRSgmb3V0diwgJmluZm8udGltZSk7Ci0gICAgLyp0RVh0IGFuZC9vciB6VFh0Ki8KLSAgICBmb3IoaSA9IDA7IGkgIT0gaW5mby50ZXh0X251bTsgKytpKSB7Ci0gICAgICBpZihzdHJsZW4oaW5mby50ZXh0X2tleXNbaV0pID4gNzkpIHsKLSAgICAgICAgc3RhdGUtPmVycm9yID0gNjY7IC8qdGV4dCBjaHVuayB0b28gbGFyZ2UqLwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICB9Ci0gICAgICBpZihzdHJsZW4oaW5mby50ZXh0X2tleXNbaV0pIDwgMSkgewotICAgICAgICBzdGF0ZS0+ZXJyb3IgPSA2NzsgLyp0ZXh0IGNodW5rIHRvbyBzbWFsbCovCi0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgIH0KLSAgICAgIGlmKHN0YXRlLT5lbmNvZGVyLnRleHRfY29tcHJlc3Npb24pIHsKLSAgICAgICAgYWRkQ2h1bmtfelRYdCgmb3V0diwgaW5mby50ZXh0X2tleXNbaV0sIGluZm8udGV4dF9zdHJpbmdzW2ldLCAmc3RhdGUtPmVuY29kZXIuemxpYnNldHRpbmdzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFkZENodW5rX3RFWHQoJm91dHYsIGluZm8udGV4dF9rZXlzW2ldLCBpbmZvLnRleHRfc3RyaW5nc1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qTG9kZVBORyB2ZXJzaW9uIGlkIGluIHRleHQgY2h1bmsqLwotICAgIGlmKHN0YXRlLT5lbmNvZGVyLmFkZF9pZCkgewotICAgICAgdW5zaWduZWQgYWxyZWFkeV9hZGRlZF9pZF90ZXh0ID0gMDsKLSAgICAgIGZvcihpID0gMDsgaSAhPSBpbmZvLnRleHRfbnVtOyArK2kpIHsKLSAgICAgICAgaWYoIXN0cmNtcChpbmZvLnRleHRfa2V5c1tpXSwgIkxvZGVQTkciKSkgewotICAgICAgICAgIGFscmVhZHlfYWRkZWRfaWRfdGV4dCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmKGFscmVhZHlfYWRkZWRfaWRfdGV4dCA9PSAwKSB7Ci0gICAgICAgIGFkZENodW5rX3RFWHQoJm91dHYsICJMb2RlUE5HIiwgTE9ERVBOR19WRVJTSU9OX1NUUklORyk7IC8qaXQncyBzaG9ydGVyIGFzIHRFWHQgdGhhbiBhcyB6VFh0IGNodW5rKi8KLSAgICAgIH0KLSAgICB9Ci0gICAgLyppVFh0Ki8KLSAgICBmb3IoaSA9IDA7IGkgIT0gaW5mby5pdGV4dF9udW07ICsraSkgewotICAgICAgaWYoc3RybGVuKGluZm8uaXRleHRfa2V5c1tpXSkgPiA3OSkgewotICAgICAgICBzdGF0ZS0+ZXJyb3IgPSA2NjsgLyp0ZXh0IGNodW5rIHRvbyBsYXJnZSovCi0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgIH0KLSAgICAgIGlmKHN0cmxlbihpbmZvLml0ZXh0X2tleXNbaV0pIDwgMSkgewotICAgICAgICBzdGF0ZS0+ZXJyb3IgPSA2NzsgLyp0ZXh0IGNodW5rIHRvbyBzbWFsbCovCi0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgIH0KLSAgICAgIGFkZENodW5rX2lUWHQoJm91dHYsIHN0YXRlLT5lbmNvZGVyLnRleHRfY29tcHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGluZm8uaXRleHRfa2V5c1tpXSwgaW5mby5pdGV4dF9sYW5ndGFnc1tpXSwgaW5mby5pdGV4dF90cmFuc2tleXNbaV0sIGluZm8uaXRleHRfc3RyaW5nc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgJnN0YXRlLT5lbmNvZGVyLnpsaWJzZXR0aW5ncyk7Ci0gICAgfQotCi0gICAgLyp1bmtub3duIGNodW5rcyBiZXR3ZWVuIElEQVQgYW5kIElFTkQqLwotICAgIGlmKGluZm8udW5rbm93bl9jaHVua3NfZGF0YVsyXSkgewotICAgICAgc3RhdGUtPmVycm9yID0gYWRkVW5rbm93bkNodW5rcygmb3V0diwgaW5mby51bmtub3duX2NodW5rc19kYXRhWzJdLCBpbmZvLnVua25vd25fY2h1bmtzX3NpemVbMl0pOwotICAgICAgaWYoc3RhdGUtPmVycm9yKSBnb3RvIGNsZWFudXA7Ci0gICAgfQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MqLwotICAgIGFkZENodW5rX0lFTkQoJm91dHYpOwotICB9Ci0KLWNsZWFudXA6Ci0gIGxvZGVwbmdfaW5mb19jbGVhbnVwKCZpbmZvKTsKLSAgbG9kZXBuZ19mcmVlKGRhdGEpOwotCi0gIC8qaW5zdGVhZCBvZiBjbGVhbmluZyB0aGUgdmVjdG9yIHVwLCBnaXZlIGl0IHRvIHRoZSBvdXRwdXQqLwotICAqb3V0ID0gb3V0di5kYXRhOwotICAqb3V0c2l6ZSA9IG91dHYuc2l6ZTsKLQotICByZXR1cm4gc3RhdGUtPmVycm9yOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2VuY29kZV9tZW1vcnkodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLCBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSwgdW5zaWduZWQgYml0ZGVwdGgpIHsKLSAgdW5zaWduZWQgZXJyb3I7Ci0gIExvZGVQTkdTdGF0ZSBzdGF0ZTsKLSAgbG9kZXBuZ19zdGF0ZV9pbml0KCZzdGF0ZSk7Ci0gIHN0YXRlLmluZm9fcmF3LmNvbG9ydHlwZSA9IGNvbG9ydHlwZTsKLSAgc3RhdGUuaW5mb19yYXcuYml0ZGVwdGggPSBiaXRkZXB0aDsKLSAgc3RhdGUuaW5mb19wbmcuY29sb3IuY29sb3J0eXBlID0gY29sb3J0eXBlOwotICBzdGF0ZS5pbmZvX3BuZy5jb2xvci5iaXRkZXB0aCA9IGJpdGRlcHRoOwotICBsb2RlcG5nX2VuY29kZShvdXQsIG91dHNpemUsIGltYWdlLCB3LCBoLCAmc3RhdGUpOwotICBlcnJvciA9IHN0YXRlLmVycm9yOwotICBsb2RlcG5nX3N0YXRlX2NsZWFudXAoJnN0YXRlKTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2VuY29kZTMyKHVuc2lnbmVkIGNoYXIqKiBvdXQsIHNpemVfdCogb3V0c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciogaW1hZ2UsIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgpIHsKLSAgcmV0dXJuIGxvZGVwbmdfZW5jb2RlX21lbW9yeShvdXQsIG91dHNpemUsIGltYWdlLCB3LCBoLCBMQ1RfUkdCQSwgOCk7Ci19Ci0KLXVuc2lnbmVkIGxvZGVwbmdfZW5jb2RlMjQodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbWFnZSwgdW5zaWduZWQgdywgdW5zaWduZWQgaCkgewotICByZXR1cm4gbG9kZXBuZ19lbmNvZGVfbWVtb3J5KG91dCwgb3V0c2l6ZSwgaW1hZ2UsIHcsIGgsIExDVF9SR0IsIDgpOwotfQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RJU0sKLXVuc2lnbmVkIGxvZGVwbmdfZW5jb2RlX2ZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGltYWdlLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSwgdW5zaWduZWQgYml0ZGVwdGgpIHsKLSAgdW5zaWduZWQgY2hhciogYnVmZmVyOwotICBzaXplX3QgYnVmZmVyc2l6ZTsKLSAgdW5zaWduZWQgZXJyb3IgPSBsb2RlcG5nX2VuY29kZV9tZW1vcnkoJmJ1ZmZlciwgJmJ1ZmZlcnNpemUsIGltYWdlLCB3LCBoLCBjb2xvcnR5cGUsIGJpdGRlcHRoKTsKLSAgaWYoIWVycm9yKSBlcnJvciA9IGxvZGVwbmdfc2F2ZV9maWxlKGJ1ZmZlciwgYnVmZmVyc2l6ZSwgZmlsZW5hbWUpOwotICBsb2RlcG5nX2ZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2VuY29kZTMyX2ZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGltYWdlLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoKSB7Ci0gIHJldHVybiBsb2RlcG5nX2VuY29kZV9maWxlKGZpbGVuYW1lLCBpbWFnZSwgdywgaCwgTENUX1JHQkEsIDgpOwotfQotCi11bnNpZ25lZCBsb2RlcG5nX2VuY29kZTI0X2ZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGltYWdlLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoKSB7Ci0gIHJldHVybiBsb2RlcG5nX2VuY29kZV9maWxlKGZpbGVuYW1lLCBpbWFnZSwgdywgaCwgTENUX1JHQiwgOCk7Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfRElTSyovCi0KLXZvaWQgbG9kZXBuZ19lbmNvZGVyX3NldHRpbmdzX2luaXQoTG9kZVBOR0VuY29kZXJTZXR0aW5ncyogc2V0dGluZ3MpIHsKLSAgbG9kZXBuZ19jb21wcmVzc19zZXR0aW5nc19pbml0KCZzZXR0aW5ncy0+emxpYnNldHRpbmdzKTsKLSAgc2V0dGluZ3MtPmZpbHRlcl9wYWxldHRlX3plcm8gPSAxOwotICBzZXR0aW5ncy0+ZmlsdGVyX3N0cmF0ZWd5ID0gTEZTX01JTlNVTTsKLSAgc2V0dGluZ3MtPmF1dG9fY29udmVydCA9IDE7Ci0gIHNldHRpbmdzLT5mb3JjZV9wYWxldHRlID0gMDsKLSAgc2V0dGluZ3MtPnByZWRlZmluZWRfZmlsdGVycyA9IDA7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgc2V0dGluZ3MtPmFkZF9pZCA9IDA7Ci0gIHNldHRpbmdzLT50ZXh0X2NvbXByZXNzaW9uID0gMTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLX0KLQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX1BORyovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRVJST1JfVEVYVAotLyoKLVRoaXMgcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgYSBudW1lcmljYWwgZXJyb3IgY29kZSBpbiBFbmdsaXNoLiBUaGlzIGlzIGFsc28KLXRoZSBkb2N1bWVudGF0aW9uIG9mIGFsbCB0aGUgZXJyb3IgY29kZXMuCi0qLwotY29uc3QgY2hhciogbG9kZXBuZ19lcnJvcl90ZXh0KHVuc2lnbmVkIGNvZGUpIHsKLSAgc3dpdGNoKGNvZGUpIHsKLSAgICBjYXNlIDA6IHJldHVybiAibm8gZXJyb3IsIGV2ZXJ5dGhpbmcgd2VudCBvayI7Ci0gICAgY2FzZSAxOiByZXR1cm4gIm5vdGhpbmcgZG9uZSB5ZXQiOyAvKnRoZSBFbmNvZGVyL0RlY29kZXIgaGFzIGRvbmUgbm90aGluZyB5ZXQsIGVycm9yIGNoZWNraW5nIG1ha2VzIG5vIHNlbnNlIHlldCovCi0gICAgY2FzZSAxMDogcmV0dXJuICJlbmQgb2YgaW5wdXQgbWVtb3J5IHJlYWNoZWQgd2l0aG91dCBodWZmbWFuIGVuZCBjb2RlIjsgLyp3aGlsZSBodWZmbWFuIGRlY29kaW5nKi8KLSAgICBjYXNlIDExOiByZXR1cm4gImVycm9yIGluIGNvZGUgdHJlZSBtYWRlIGl0IGp1bXAgb3V0c2lkZSBvZiBodWZmbWFuIHRyZWUiOyAvKndoaWxlIGh1ZmZtYW4gZGVjb2RpbmcqLwotICAgIGNhc2UgMTM6IHJldHVybiAicHJvYmxlbSB3aGlsZSBwcm9jZXNzaW5nIGR5bmFtaWMgZGVmbGF0ZSBibG9jayI7Ci0gICAgY2FzZSAxNDogcmV0dXJuICJwcm9ibGVtIHdoaWxlIHByb2Nlc3NpbmcgZHluYW1pYyBkZWZsYXRlIGJsb2NrIjsKLSAgICBjYXNlIDE1OiByZXR1cm4gInByb2JsZW0gd2hpbGUgcHJvY2Vzc2luZyBkeW5hbWljIGRlZmxhdGUgYmxvY2siOwotICAgIGNhc2UgMTY6IHJldHVybiAidW5leGlzdGluZyBjb2RlIHdoaWxlIHByb2Nlc3NpbmcgZHluYW1pYyBkZWZsYXRlIGJsb2NrIjsKLSAgICBjYXNlIDE3OiByZXR1cm4gImVuZCBvZiBvdXQgYnVmZmVyIG1lbW9yeSByZWFjaGVkIHdoaWxlIGluZmxhdGluZyI7Ci0gICAgY2FzZSAxODogcmV0dXJuICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUgd2hpbGUgaW5mbGF0aW5nIjsKLSAgICBjYXNlIDE5OiByZXR1cm4gImVuZCBvZiBvdXQgYnVmZmVyIG1lbW9yeSByZWFjaGVkIHdoaWxlIGluZmxhdGluZyI7Ci0gICAgY2FzZSAyMDogcmV0dXJuICJpbnZhbGlkIGRlZmxhdGUgYmxvY2sgQlRZUEUgZW5jb3VudGVyZWQgd2hpbGUgZGVjb2RpbmciOwotICAgIGNhc2UgMjE6IHJldHVybiAiTkxFTiBpcyBub3Qgb25lcyBjb21wbGVtZW50IG9mIExFTiBpbiBhIGRlZmxhdGUgYmxvY2siOwotCi0gICAgLyplbmQgb2Ygb3V0IGJ1ZmZlciBtZW1vcnkgcmVhY2hlZCB3aGlsZSBpbmZsYXRpbmc6Ci0gICAgVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBpbmZsYXRlZCBkZWZsYXRlIGRhdGEgaXMgbG9uZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBieXRlcyByZXF1aXJlZCB0byBmaWxsIHVwCi0gICAgYWxsIHRoZSBwaXhlbHMgb2YgdGhlIGltYWdlLCBnaXZlbiB0aGUgY29sb3IgZGVwdGggYW5kIGltYWdlIGRpbWVuc2lvbnMuIFNvbWV0aGluZyB0aGF0IGRvZXNuJ3QKLSAgICBoYXBwZW4gaW4gYSBub3JtYWwsIHdlbGwgZW5jb2RlZCwgUE5HIGltYWdlLiovCi0gICAgY2FzZSAyMjogcmV0dXJuICJlbmQgb2Ygb3V0IGJ1ZmZlciBtZW1vcnkgcmVhY2hlZCB3aGlsZSBpbmZsYXRpbmciOwotICAgIGNhc2UgMjM6IHJldHVybiAiZW5kIG9mIGluIGJ1ZmZlciBtZW1vcnkgcmVhY2hlZCB3aGlsZSBpbmZsYXRpbmciOwotICAgIGNhc2UgMjQ6IHJldHVybiAiaW52YWxpZCBGQ0hFQ0sgaW4gemxpYiBoZWFkZXIiOwotICAgIGNhc2UgMjU6IHJldHVybiAiaW52YWxpZCBjb21wcmVzc2lvbiBtZXRob2QgaW4gemxpYiBoZWFkZXIiOwotICAgIGNhc2UgMjY6IHJldHVybiAiRkRJQ1QgZW5jb3VudGVyZWQgaW4gemxpYiBoZWFkZXIgd2hpbGUgaXQncyBub3QgdXNlZCBmb3IgUE5HIjsKLSAgICBjYXNlIDI3OiByZXR1cm4gIlBORyBmaWxlIGlzIHNtYWxsZXIgdGhhbiBhIFBORyBoZWFkZXIiOwotICAgIC8qQ2hlY2tzIHRoZSBtYWdpYyBmaWxlIGhlYWRlciwgdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIFBORyBmaWxlKi8KLSAgICBjYXNlIDI4OiByZXR1cm4gImluY29ycmVjdCBQTkcgc2lnbmF0dXJlLCBpdCdzIG5vIFBORyBvciBjb3JydXB0ZWQiOwotICAgIGNhc2UgMjk6IHJldHVybiAiZmlyc3QgY2h1bmsgaXMgbm90IHRoZSBoZWFkZXIgY2h1bmsiOwotICAgIGNhc2UgMzA6IHJldHVybiAiY2h1bmsgbGVuZ3RoIHRvbyBsYXJnZSwgY2h1bmsgYnJva2VuIG9mZiBhdCBlbmQgb2YgZmlsZSI7Ci0gICAgY2FzZSAzMTogcmV0dXJuICJpbGxlZ2FsIFBORyBjb2xvciB0eXBlIG9yIGJwcCI7Ci0gICAgY2FzZSAzMjogcmV0dXJuICJpbGxlZ2FsIFBORyBjb21wcmVzc2lvbiBtZXRob2QiOwotICAgIGNhc2UgMzM6IHJldHVybiAiaWxsZWdhbCBQTkcgZmlsdGVyIG1ldGhvZCI7Ci0gICAgY2FzZSAzNDogcmV0dXJuICJpbGxlZ2FsIFBORyBpbnRlcmxhY2UgbWV0aG9kIjsKLSAgICBjYXNlIDM1OiByZXR1cm4gImNodW5rIGxlbmd0aCBvZiBhIGNodW5rIGlzIHRvbyBsYXJnZSBvciB0aGUgY2h1bmsgdG9vIHNtYWxsIjsKLSAgICBjYXNlIDM2OiByZXR1cm4gImlsbGVnYWwgUE5HIGZpbHRlciB0eXBlIGVuY291bnRlcmVkIjsKLSAgICBjYXNlIDM3OiByZXR1cm4gImlsbGVnYWwgYml0IGRlcHRoIGZvciB0aGlzIGNvbG9yIHR5cGUgZ2l2ZW4iOwotICAgIGNhc2UgMzg6IHJldHVybiAidGhlIHBhbGV0dGUgaXMgdG9vIGJpZyI7IC8qbW9yZSB0aGFuIDI1NiBjb2xvcnMqLwotICAgIGNhc2UgMzk6IHJldHVybiAidFJOUyBjaHVuayBiZWZvcmUgUExURSBvciBoYXMgbW9yZSBlbnRyaWVzIHRoYW4gcGFsZXR0ZSBzaXplIjsKLSAgICBjYXNlIDQwOiByZXR1cm4gInRSTlMgY2h1bmsgaGFzIHdyb25nIHNpemUgZm9yIGdyYXlzY2FsZSBpbWFnZSI7Ci0gICAgY2FzZSA0MTogcmV0dXJuICJ0Uk5TIGNodW5rIGhhcyB3cm9uZyBzaXplIGZvciBSR0IgaW1hZ2UiOwotICAgIGNhc2UgNDI6IHJldHVybiAidFJOUyBjaHVuayBhcHBlYXJlZCB3aGlsZSBpdCB3YXMgbm90IGFsbG93ZWQgZm9yIHRoaXMgY29sb3IgdHlwZSI7Ci0gICAgY2FzZSA0MzogcmV0dXJuICJiS0dEIGNodW5rIGhhcyB3cm9uZyBzaXplIGZvciBwYWxldHRlIGltYWdlIjsKLSAgICBjYXNlIDQ0OiByZXR1cm4gImJLR0QgY2h1bmsgaGFzIHdyb25nIHNpemUgZm9yIGdyYXlzY2FsZSBpbWFnZSI7Ci0gICAgY2FzZSA0NTogcmV0dXJuICJiS0dEIGNodW5rIGhhcyB3cm9uZyBzaXplIGZvciBSR0IgaW1hZ2UiOwotICAgIGNhc2UgNDg6IHJldHVybiAiZW1wdHkgaW5wdXQgYnVmZmVyIGdpdmVuIHRvIGRlY29kZXIuIE1heWJlIGNhdXNlZCBieSBub24tZXhpc3RpbmcgZmlsZT8iOwotICAgIGNhc2UgNDk6IHJldHVybiAianVtcGVkIHBhc3QgbWVtb3J5IHdoaWxlIGdlbmVyYXRpbmcgZHluYW1pYyBodWZmbWFuIHRyZWUiOwotICAgIGNhc2UgNTA6IHJldHVybiAianVtcGVkIHBhc3QgbWVtb3J5IHdoaWxlIGdlbmVyYXRpbmcgZHluYW1pYyBodWZmbWFuIHRyZWUiOwotICAgIGNhc2UgNTE6IHJldHVybiAianVtcGVkIHBhc3QgbWVtb3J5IHdoaWxlIGluZmxhdGluZyBodWZmbWFuIGJsb2NrIjsKLSAgICBjYXNlIDUyOiByZXR1cm4gImp1bXBlZCBwYXN0IG1lbW9yeSB3aGlsZSBpbmZsYXRpbmciOwotICAgIGNhc2UgNTM6IHJldHVybiAic2l6ZSBvZiB6bGliIGRhdGEgdG9vIHNtYWxsIjsKLSAgICBjYXNlIDU0OiByZXR1cm4gInJlcGVhdCBzeW1ib2wgaW4gdHJlZSB3aGlsZSB0aGVyZSB3YXMgbm8gdmFsdWUgc3ltYm9sIHlldCI7Ci0gICAgLypqdW1wZWQgcGFzdCB0cmVlIHdoaWxlIGdlbmVyYXRpbmcgaHVmZm1hbiB0cmVlLCB0aGlzIGNvdWxkIGJlIHdoZW4gdGhlCi0gICAgdHJlZSB3aWxsIGhhdmUgbW9yZSBsZWF2ZXMgdGhhbiBzeW1ib2xzIGFmdGVyIGdlbmVyYXRpbmcgaXQgb3V0IG9mIHRoZQotICAgIGdpdmVuIGxlbmdodHMuIFRoZXkgY2FsbCB0aGlzIGFuIG92ZXJzdWJzY3JpYmVkIGR5bmFtaWMgYml0IGxlbmd0aHMgdHJlZSBpbiB6bGliLiovCi0gICAgY2FzZSA1NTogcmV0dXJuICJqdW1wZWQgcGFzdCB0cmVlIHdoaWxlIGdlbmVyYXRpbmcgaHVmZm1hbiB0cmVlIjsKLSAgICBjYXNlIDU2OiByZXR1cm4gImdpdmVuIG91dHB1dCBpbWFnZSBjb2xvcnR5cGUgb3IgYml0ZGVwdGggbm90IHN1cHBvcnRlZCBmb3IgY29sb3IgY29udmVyc2lvbiI7Ci0gICAgY2FzZSA1NzogcmV0dXJuICJpbnZhbGlkIENSQyBlbmNvdW50ZXJlZCAoY2hlY2tpbmcgQ1JDIGNhbiBiZSBkaXNhYmxlZCkiOwotICAgIGNhc2UgNTg6IHJldHVybiAiaW52YWxpZCBBRExFUjMyIGVuY291bnRlcmVkIChjaGVja2luZyBBRExFUjMyIGNhbiBiZSBkaXNhYmxlZCkiOwotICAgIGNhc2UgNTk6IHJldHVybiAicmVxdWVzdGVkIGNvbG9yIGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCI7Ci0gICAgY2FzZSA2MDogcmV0dXJuICJpbnZhbGlkIHdpbmRvdyBzaXplIGdpdmVuIGluIHRoZSBzZXR0aW5ncyBvZiB0aGUgZW5jb2RlciAobXVzdCBiZSAwLTMyNzY4KSI7Ci0gICAgY2FzZSA2MTogcmV0dXJuICJpbnZhbGlkIEJUWVBFIGdpdmVuIGluIHRoZSBzZXR0aW5ncyBvZiB0aGUgZW5jb2RlciAob25seSAwLCAxIGFuZCAyIGFyZSBhbGxvd2VkKSI7Ci0gICAgLypMb2RlUE5HIGxlYXZlcyB0aGUgY2hvaWNlIG9mIFJHQiB0byBncmF5c2NhbGUgY29udmVyc2lvbiBmb3JtdWxhIHRvIHRoZSB1c2VyLiovCi0gICAgY2FzZSA2MjogcmV0dXJuICJjb252ZXJzaW9uIGZyb20gY29sb3IgdG8gZ3JheXNjYWxlIG5vdCBzdXBwb3J0ZWQiOwotICAgIC8qKDJeMzEtMSkqLwotICAgIGNhc2UgNjM6IHJldHVybiAibGVuZ3RoIG9mIGEgY2h1bmsgdG9vIGxvbmcsIG1heCBhbGxvd2VkIGZvciBQTkcgaXMgMjE0NzQ4MzY0NyBieXRlcyBwZXIgY2h1bmsiOwotICAgIC8qdGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGluYWJpbGl0eSBvZiBhIGRlZmxhdGVkIGJsb2NrIHRvIGV2ZXIgY29udGFpbiBhbiBlbmQgY29kZS4gSXQgbXVzdCBiZSBhdCBsZWFzdCAxLiovCi0gICAgY2FzZSA2NDogcmV0dXJuICJ0aGUgbGVuZ3RoIG9mIHRoZSBFTkQgc3ltYm9sIDI1NiBpbiB0aGUgSHVmZm1hbiB0cmVlIGlzIDAiOwotICAgIGNhc2UgNjY6IHJldHVybiAidGhlIGxlbmd0aCBvZiBhIHRleHQgY2h1bmsga2V5d29yZCBnaXZlbiB0byB0aGUgZW5jb2RlciBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBvZiA3OSBieXRlcyI7Ci0gICAgY2FzZSA2NzogcmV0dXJuICJ0aGUgbGVuZ3RoIG9mIGEgdGV4dCBjaHVuayBrZXl3b3JkIGdpdmVuIHRvIHRoZSBlbmNvZGVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBvZiAxIGJ5dGUiOwotICAgIGNhc2UgNjg6IHJldHVybiAidHJpZWQgdG8gZW5jb2RlIGEgUExURSBjaHVuayB3aXRoIGEgcGFsZXR0ZSB0aGF0IGhhcyBsZXNzIHRoYW4gMSBvciBtb3JlIHRoYW4gMjU2IGNvbG9ycyI7Ci0gICAgY2FzZSA2OTogcmV0dXJuICJ1bmtub3duIGNodW5rIHR5cGUgd2l0aCAnY3JpdGljYWwnIGZsYWcgZW5jb3VudGVyZWQgYnkgdGhlIGRlY29kZXIiOwotICAgIGNhc2UgNzE6IHJldHVybiAidW5leGlzdGluZyBpbnRlcmxhY2UgbW9kZSBnaXZlbiB0byBlbmNvZGVyIChtdXN0IGJlIDAgb3IgMSkiOwotICAgIGNhc2UgNzI6IHJldHVybiAid2hpbGUgZGVjb2RpbmcsIHVuZXhpc3RpbmcgY29tcHJlc3Npb24gbWV0aG9kIGVuY291bnRlcmluZyBpbiB6VFh0IG9yIGlUWHQgY2h1bmsgKGl0IG11c3QgYmUgMCkiOwotICAgIGNhc2UgNzM6IHJldHVybiAiaW52YWxpZCB0SU1FIGNodW5rIHNpemUiOwotICAgIGNhc2UgNzQ6IHJldHVybiAiaW52YWxpZCBwSFlzIGNodW5rIHNpemUiOwotICAgIC8qbGVuZ3RoIGNvdWxkIGJlIHdyb25nLCBvciBkYXRhIGNob3BwZWQgb2ZmKi8KLSAgICBjYXNlIDc1OiByZXR1cm4gIm5vIG51bGwgdGVybWluYXRpb24gY2hhciBmb3VuZCB3aGlsZSBkZWNvZGluZyB0ZXh0IGNodW5rIjsKLSAgICBjYXNlIDc2OiByZXR1cm4gImlUWHQgY2h1bmsgdG9vIHNob3J0IHRvIGNvbnRhaW4gcmVxdWlyZWQgYnl0ZXMiOwotICAgIGNhc2UgNzc6IHJldHVybiAiaW50ZWdlciBvdmVyZmxvdyBpbiBidWZmZXIgc2l6ZSI7Ci0gICAgY2FzZSA3ODogcmV0dXJuICJmYWlsZWQgdG8gb3BlbiBmaWxlIGZvciByZWFkaW5nIjsgLypmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY291bGRuJ3QgYmUgb3BlbmVkIGZvciByZWFkaW5nKi8KLSAgICBjYXNlIDc5OiByZXR1cm4gImZhaWxlZCB0byBvcGVuIGZpbGUgZm9yIHdyaXRpbmciOwotICAgIGNhc2UgODA6IHJldHVybiAidHJpZWQgY3JlYXRpbmcgYSB0cmVlIG9mIDAgc3ltYm9scyI7Ci0gICAgY2FzZSA4MTogcmV0dXJuICJsYXp5IG1hdGNoaW5nIGF0IHBvcyAwIGlzIGltcG9zc2libGUiOwotICAgIGNhc2UgODI6IHJldHVybiAiY29sb3IgY29udmVyc2lvbiB0byBwYWxldHRlIHJlcXVlc3RlZCB3aGlsZSBhIGNvbG9yIGlzbid0IGluIHBhbGV0dGUsIG9yIGluZGV4IG91dCBvZiBib3VuZHMiOwotICAgIGNhc2UgODM6IHJldHVybiAibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIjsKLSAgICBjYXNlIDg0OiByZXR1cm4gImdpdmVuIGltYWdlIHRvbyBzbWFsbCB0byBjb250YWluIGFsbCBwaXhlbHMgdG8gYmUgZW5jb2RlZCI7Ci0gICAgY2FzZSA4NjogcmV0dXJuICJpbXBvc3NpYmxlIG9mZnNldCBpbiBsejc3IGVuY29kaW5nIChpbnRlcm5hbCBidWcpIjsKLSAgICBjYXNlIDg3OiByZXR1cm4gIm11c3QgcHJvdmlkZSBjdXN0b20gemxpYiBmdW5jdGlvbiBwb2ludGVyIGlmIExPREVQTkdfQ09NUElMRV9aTElCIGlzIG5vdCBkZWZpbmVkIjsKLSAgICBjYXNlIDg4OiByZXR1cm4gImludmFsaWQgZmlsdGVyIHN0cmF0ZWd5IGdpdmVuIGZvciBMb2RlUE5HRW5jb2RlclNldHRpbmdzLmZpbHRlcl9zdHJhdGVneSI7Ci0gICAgY2FzZSA4OTogcmV0dXJuICJ0ZXh0IGNodW5rIGtleXdvcmQgdG9vIHNob3J0IG9yIGxvbmc6IG11c3QgaGF2ZSBzaXplIDEtNzkiOwotICAgIC8qdGhlIHdpbmRvd3NpemUgaW4gdGhlIExvZGVQTkdDb21wcmVzc1NldHRpbmdzLiBSZXF1aXJpbmcgUE9UKD09PiAmIGluc3RlYWQgb2YgJSkgbWFrZXMgZW5jb2RpbmcgMTIlIGZhc3Rlci4qLwotICAgIGNhc2UgOTA6IHJldHVybiAid2luZG93c2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIjsKLSAgICBjYXNlIDkxOiByZXR1cm4gImludmFsaWQgZGVjb21wcmVzc2VkIGlkYXQgc2l6ZSI7Ci0gICAgY2FzZSA5MjogcmV0dXJuICJpbnRlZ2VyIG92ZXJmbG93IGR1ZSB0byB0b28gbWFueSBwaXhlbHMiOwotICAgIGNhc2UgOTM6IHJldHVybiAiemVybyB3aWR0aCBvciBoZWlnaHQgaXMgaW52YWxpZCI7Ci0gICAgY2FzZSA5NDogcmV0dXJuICJoZWFkZXIgY2h1bmsgbXVzdCBoYXZlIGEgc2l6ZSBvZiAxMyBieXRlcyI7Ci0gICAgY2FzZSA5NTogcmV0dXJuICJpbnRlZ2VyIG92ZXJmbG93IHdpdGggY29tYmluZWQgaWRhdCBjaHVuayBzaXplIjsKLSAgICBjYXNlIDk2OiByZXR1cm4gImludmFsaWQgZ0FNQSBjaHVuayBzaXplIjsKLSAgICBjYXNlIDk3OiByZXR1cm4gImludmFsaWQgY0hSTSBjaHVuayBzaXplIjsKLSAgICBjYXNlIDk4OiByZXR1cm4gImludmFsaWQgc1JHQiBjaHVuayBzaXplIjsKLSAgICBjYXNlIDk5OiByZXR1cm4gImludmFsaWQgc1JHQiByZW5kZXJpbmcgaW50ZW50IjsKLSAgICBjYXNlIDEwMDogcmV0dXJuICJpbnZhbGlkIElDQyBwcm9maWxlIGNvbG9yIHR5cGUsIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBvbmx5IGFsbG93cyBSR0Igb3IgR1JBWSI7Ci0gICAgY2FzZSAxMDE6IHJldHVybiAiUE5HIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgUkdCIElDQyBwcm9maWxlIG9uIGdyYXkgY29sb3IgdHlwZXMgYW5kIHZpY2UgdmVyc2EiOwotICAgIGNhc2UgMTAyOiByZXR1cm4gIm5vdCBhbGxvd2VkIHRvIHNldCBncmF5c2NhbGUgSUNDIHByb2ZpbGUgd2l0aCBjb2xvcmVkIHBpeGVscyBieSBQTkcgc3BlY2lmaWNhdGlvbiI7Ci0gICAgY2FzZSAxMDM6IHJldHVybiAiaW52YWxpZCBwYWxldHRlIGluZGV4IGluIGJLR0QgY2h1bmsuIE1heWJlIGl0IGNhbWUgYmVmb3JlIFBMVEUgY2h1bms/IjsKLSAgICBjYXNlIDEwNDogcmV0dXJuICJpbnZhbGlkIGJLR0QgY29sb3Igd2hpbGUgZW5jb2RpbmcgKGUuZy4gcGFsZXR0ZSBpbmRleCBvdXQgb2YgcmFuZ2UpIjsKLSAgfQotICByZXR1cm4gInVua25vd24gZXJyb3IgY29kZSI7Ci19Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfRVJST1JfVEVYVCovCi0KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotLyogLy8gQysrIFdyYXBwZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKi8KLS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0NQUAotbmFtZXNwYWNlIGxvZGVwbmcgewotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RJU0sKLXVuc2lnbmVkIGxvYWRfZmlsZShzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgYnVmZmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKLSAgbG9uZyBzaXplID0gbG9kZXBuZ19maWxlc2l6ZShmaWxlbmFtZS5jX3N0cigpKTsKLSAgaWYoc2l6ZSA8IDApIHJldHVybiA3ODsKLSAgYnVmZmVyLnJlc2l6ZSgoc2l6ZV90KXNpemUpOwotICByZXR1cm4gc2l6ZSA9PSAwID8gMCA6IGxvZGVwbmdfYnVmZmVyX2ZpbGUoJmJ1ZmZlclswXSwgKHNpemVfdClzaXplLCBmaWxlbmFtZS5jX3N0cigpKTsKLX0KLQotLyp3cml0ZSBnaXZlbiBidWZmZXIgdG8gdGhlIGZpbGUsIG92ZXJ3cml0aW5nIHRoZSBmaWxlLCBpdCBkb2Vzbid0IGFwcGVuZCB0byBpdC4qLwotdW5zaWduZWQgc2F2ZV9maWxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBidWZmZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgewotICByZXR1cm4gbG9kZXBuZ19zYXZlX2ZpbGUoYnVmZmVyLmVtcHR5KCkgPyAwIDogJmJ1ZmZlclswXSwgYnVmZmVyLnNpemUoKSwgZmlsZW5hbWUuY19zdHIoKSk7Ci19Ci0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX0RJU0sgKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9aTElCCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RFQ09ERVIKLXVuc2lnbmVkIGRlY29tcHJlc3Moc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpbnNpemUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdEZWNvbXByZXNzU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciA9IDA7Ci0gIHNpemVfdCBidWZmZXJzaXplID0gMDsKLSAgdW5zaWduZWQgZXJyb3IgPSB6bGliX2RlY29tcHJlc3MoJmJ1ZmZlciwgJmJ1ZmZlcnNpemUsIGluLCBpbnNpemUsICZzZXR0aW5ncyk7Ci0gIGlmKGJ1ZmZlcikgewotICAgIG91dC5pbnNlcnQob3V0LmVuZCgpLCAmYnVmZmVyWzBdLCAmYnVmZmVyW2J1ZmZlcnNpemVdKTsKLSAgICBsb2RlcG5nX2ZyZWUoYnVmZmVyKTsKLSAgfQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXVuc2lnbmVkIGRlY29tcHJlc3Moc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIGluLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HRGVjb21wcmVzc1NldHRpbmdzJiBzZXR0aW5ncykgewotICByZXR1cm4gZGVjb21wcmVzcyhvdXQsIGluLmVtcHR5KCkgPyAwIDogJmluWzBdLCBpbi5zaXplKCksIHNldHRpbmdzKTsKLX0KLSNlbmRpZiAvKiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiAqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0VOQ09ERVIKLXVuc2lnbmVkIGNvbXByZXNzKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplLAotICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciA9IDA7Ci0gIHNpemVfdCBidWZmZXJzaXplID0gMDsKLSAgdW5zaWduZWQgZXJyb3IgPSB6bGliX2NvbXByZXNzKCZidWZmZXIsICZidWZmZXJzaXplLCBpbiwgaW5zaXplLCAmc2V0dGluZ3MpOwotICBpZihidWZmZXIpIHsKLSAgICBvdXQuaW5zZXJ0KG91dC5lbmQoKSwgJmJ1ZmZlclswXSwgJmJ1ZmZlcltidWZmZXJzaXplXSk7Ci0gICAgbG9kZXBuZ19mcmVlKGJ1ZmZlcik7Ci0gIH0KLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBjb21wcmVzcyhzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgb3V0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgaW4sCi0gICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgcmV0dXJuIGNvbXByZXNzKG91dCwgaW4uZW1wdHkoKSA/IDAgOiAmaW5bMF0sIGluLnNpemUoKSwgc2V0dGluZ3MpOwotfQotI2VuZGlmIC8qIExPREVQTkdfQ09NUElMRV9FTkNPREVSICovCi0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX1pMSUIgKi8KLQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX1BORwotCi1TdGF0ZTo6U3RhdGUoKSB7Ci0gIGxvZGVwbmdfc3RhdGVfaW5pdCh0aGlzKTsKLX0KLQotU3RhdGU6OlN0YXRlKGNvbnN0IFN0YXRlJiBvdGhlcikgewotICBsb2RlcG5nX3N0YXRlX2luaXQodGhpcyk7Ci0gIGxvZGVwbmdfc3RhdGVfY29weSh0aGlzLCAmb3RoZXIpOwotfQotCi1TdGF0ZTo6flN0YXRlKCkgewotICBsb2RlcG5nX3N0YXRlX2NsZWFudXAodGhpcyk7Ci19Ci0KLVN0YXRlJiBTdGF0ZTo6b3BlcmF0b3I9KGNvbnN0IFN0YXRlJiBvdGhlcikgewotICBsb2RlcG5nX3N0YXRlX2NvcHkodGhpcywgJm90aGVyKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RFQ09ERVIKLQotdW5zaWduZWQgZGVjb2RlKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsIHVuc2lnbmVkJiB3LCB1bnNpZ25lZCYgaCwgY29uc3QgdW5zaWduZWQgY2hhciogaW4sCi0gICAgICAgICAgICAgICAgc2l6ZV90IGluc2l6ZSwgTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJpdGRlcHRoKSB7Ci0gIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlcjsKLSAgdW5zaWduZWQgZXJyb3IgPSBsb2RlcG5nX2RlY29kZV9tZW1vcnkoJmJ1ZmZlciwgJncsICZoLCBpbiwgaW5zaXplLCBjb2xvcnR5cGUsIGJpdGRlcHRoKTsKLSAgaWYoYnVmZmVyICYmICFlcnJvcikgewotICAgIFN0YXRlIHN0YXRlOwotICAgIHN0YXRlLmluZm9fcmF3LmNvbG9ydHlwZSA9IGNvbG9ydHlwZTsKLSAgICBzdGF0ZS5pbmZvX3Jhdy5iaXRkZXB0aCA9IGJpdGRlcHRoOwotICAgIHNpemVfdCBidWZmZXJzaXplID0gbG9kZXBuZ19nZXRfcmF3X3NpemUodywgaCwgJnN0YXRlLmluZm9fcmF3KTsKLSAgICBvdXQuaW5zZXJ0KG91dC5lbmQoKSwgJmJ1ZmZlclswXSwgJmJ1ZmZlcltidWZmZXJzaXplXSk7Ci0gICAgbG9kZXBuZ19mcmVlKGJ1ZmZlcik7Ci0gIH0KLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBkZWNvZGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwgdW5zaWduZWQmIHcsIHVuc2lnbmVkJiBoLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBpbiwgTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJpdGRlcHRoKSB7Ci0gIHJldHVybiBkZWNvZGUob3V0LCB3LCBoLCBpbi5lbXB0eSgpID8gMCA6ICZpblswXSwgKHVuc2lnbmVkKWluLnNpemUoKSwgY29sb3J0eXBlLCBiaXRkZXB0aCk7Ci19Ci0KLXVuc2lnbmVkIGRlY29kZShzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgb3V0LCB1bnNpZ25lZCYgdywgdW5zaWduZWQmIGgsCi0gICAgICAgICAgICAgICAgU3RhdGUmIHN0YXRlLAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplKSB7Ci0gIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciA9IE5VTEw7Ci0gIHVuc2lnbmVkIGVycm9yID0gbG9kZXBuZ19kZWNvZGUoJmJ1ZmZlciwgJncsICZoLCAmc3RhdGUsIGluLCBpbnNpemUpOwotICBpZihidWZmZXIgJiYgIWVycm9yKSB7Ci0gICAgc2l6ZV90IGJ1ZmZlcnNpemUgPSBsb2RlcG5nX2dldF9yYXdfc2l6ZSh3LCBoLCAmc3RhdGUuaW5mb19yYXcpOwotICAgIG91dC5pbnNlcnQob3V0LmVuZCgpLCAmYnVmZmVyWzBdLCAmYnVmZmVyW2J1ZmZlcnNpemVdKTsKLSAgfQotICBsb2RlcG5nX2ZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBkZWNvZGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwgdW5zaWduZWQmIHcsIHVuc2lnbmVkJiBoLAotICAgICAgICAgICAgICAgIFN0YXRlJiBzdGF0ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgaW4pIHsKLSAgcmV0dXJuIGRlY29kZShvdXQsIHcsIGgsIHN0YXRlLCBpbi5lbXB0eSgpID8gMCA6ICZpblswXSwgaW4uc2l6ZSgpKTsKLX0KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ESVNLCi11bnNpZ25lZCBkZWNvZGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwgdW5zaWduZWQmIHcsIHVuc2lnbmVkJiBoLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJpdGRlcHRoKSB7Ci0gIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGJ1ZmZlcjsKLSAgLyogc2FmZSBvdXRwdXQgdmFsdWVzIGluIGNhc2UgZXJyb3IgaGFwcGVucyAqLwotICB3ID0gaCA9IDA7Ci0gIHVuc2lnbmVkIGVycm9yID0gbG9hZF9maWxlKGJ1ZmZlciwgZmlsZW5hbWUpOwotICBpZihlcnJvcikgcmV0dXJuIGVycm9yOwotICByZXR1cm4gZGVjb2RlKG91dCwgdywgaCwgYnVmZmVyLCBjb2xvcnR5cGUsIGJpdGRlcHRoKTsKLX0KLSNlbmRpZiAvKiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiAqLwotI2VuZGlmIC8qIExPREVQTkdfQ09NUElMRV9ESVNLICovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUgotdW5zaWduZWQgZW5jb2RlKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLAotICAgICAgICAgICAgICAgIExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlLCB1bnNpZ25lZCBiaXRkZXB0aCkgewotICB1bnNpZ25lZCBjaGFyKiBidWZmZXI7Ci0gIHNpemVfdCBidWZmZXJzaXplOwotICB1bnNpZ25lZCBlcnJvciA9IGxvZGVwbmdfZW5jb2RlX21lbW9yeSgmYnVmZmVyLCAmYnVmZmVyc2l6ZSwgaW4sIHcsIGgsIGNvbG9ydHlwZSwgYml0ZGVwdGgpOwotICBpZihidWZmZXIpIHsKLSAgICBvdXQuaW5zZXJ0KG91dC5lbmQoKSwgJmJ1ZmZlclswXSwgJmJ1ZmZlcltidWZmZXJzaXplXSk7Ci0gICAgbG9kZXBuZ19mcmVlKGJ1ZmZlcik7Ci0gIH0KLSAgcmV0dXJuIGVycm9yOwotfQotCi11bnNpZ25lZCBlbmNvZGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgaW4sIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsCi0gICAgICAgICAgICAgICAgTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJpdGRlcHRoKSB7Ci0gIGlmKGxvZGVwbmdfZ2V0X3Jhd19zaXplX2xjdCh3LCBoLCBjb2xvcnR5cGUsIGJpdGRlcHRoKSA+IGluLnNpemUoKSkgcmV0dXJuIDg0OwotICByZXR1cm4gZW5jb2RlKG91dCwgaW4uZW1wdHkoKSA/IDAgOiAmaW5bMF0sIHcsIGgsIGNvbG9ydHlwZSwgYml0ZGVwdGgpOwotfQotCi11bnNpZ25lZCBlbmNvZGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwKLSAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICBTdGF0ZSYgc3RhdGUpIHsKLSAgdW5zaWduZWQgY2hhciogYnVmZmVyOwotICBzaXplX3QgYnVmZmVyc2l6ZTsKLSAgdW5zaWduZWQgZXJyb3IgPSBsb2RlcG5nX2VuY29kZSgmYnVmZmVyLCAmYnVmZmVyc2l6ZSwgaW4sIHcsIGgsICZzdGF0ZSk7Ci0gIGlmKGJ1ZmZlcikgewotICAgIG91dC5pbnNlcnQob3V0LmVuZCgpLCAmYnVmZmVyWzBdLCAmYnVmZmVyW2J1ZmZlcnNpemVdKTsKLSAgICBsb2RlcG5nX2ZyZWUoYnVmZmVyKTsKLSAgfQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXVuc2lnbmVkIGVuY29kZShzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgb3V0LAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBpbiwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICBTdGF0ZSYgc3RhdGUpIHsKLSAgaWYobG9kZXBuZ19nZXRfcmF3X3NpemUodywgaCwgJnN0YXRlLmluZm9fcmF3KSA+IGluLnNpemUoKSkgcmV0dXJuIDg0OwotICByZXR1cm4gZW5jb2RlKG91dCwgaW4uZW1wdHkoKSA/IDAgOiAmaW5bMF0sIHcsIGgsIHN0YXRlKTsKLX0KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ESVNLCi11bnNpZ25lZCBlbmNvZGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLAotICAgICAgICAgICAgICAgIExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlLCB1bnNpZ25lZCBiaXRkZXB0aCkgewotICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBidWZmZXI7Ci0gIHVuc2lnbmVkIGVycm9yID0gZW5jb2RlKGJ1ZmZlciwgaW4sIHcsIGgsIGNvbG9ydHlwZSwgYml0ZGVwdGgpOwotICBpZighZXJyb3IpIGVycm9yID0gc2F2ZV9maWxlKGJ1ZmZlciwgZmlsZW5hbWUpOwotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXVuc2lnbmVkIGVuY29kZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIGluLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLAotICAgICAgICAgICAgICAgIExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlLCB1bnNpZ25lZCBiaXRkZXB0aCkgewotICBpZihsb2RlcG5nX2dldF9yYXdfc2l6ZV9sY3QodywgaCwgY29sb3J0eXBlLCBiaXRkZXB0aCkgPiBpbi5zaXplKCkpIHJldHVybiA4NDsKLSAgcmV0dXJuIGVuY29kZShmaWxlbmFtZSwgaW4uZW1wdHkoKSA/IDAgOiAmaW5bMF0sIHcsIGgsIGNvbG9ydHlwZSwgYml0ZGVwdGgpOwotfQotI2VuZGlmIC8qIExPREVQTkdfQ09NUElMRV9ESVNLICovCi0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX0VOQ09ERVIgKi8KLSNlbmRpZiAvKiBMT0RFUE5HX0NPTVBJTEVfUE5HICovCi19IC8qIG5hbWVzcGFjZSBsb2RlcG5nICovCi0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQ1BQKi8KZGlmZiAtLWdpdCBhL2VuY29kZXIvbG9kZXBuZy5oIGIvZW5jb2Rlci9sb2RlcG5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NmEyMDYuLjAwMDAwMDAKLS0tIGEvZW5jb2Rlci9sb2RlcG5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMwICswLDAgQEAKLS8qCi1Mb2RlUE5HIHZlcnNpb24gMjAxOTAyMTAKLQotQ29weXJpZ2h0IChjKSAyMDA1LTIwMTkgTG9kZSBWYW5kZXZlbm5lCi0KLVRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi13YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLWFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0KLSAgICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLQotICAgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZQotICAgIGRpc3RyaWJ1dGlvbi4KLSovCi0KLSNpZm5kZWYgTE9ERVBOR19ICi0jZGVmaW5lIExPREVQTkdfSAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+IC8qZm9yIHNpemVfdCovCi0KLWV4dGVybiBjb25zdCBjaGFyKiBMT0RFUE5HX1ZFUlNJT05fU1RSSU5HOwotCi0vKgotVGhlIGZvbGxvd2luZyAjZGVmaW5lcyBhcmUgdXNlZCB0byBjcmVhdGUgY29kZSBzZWN0aW9ucy4gVGhleSBjYW4gYmUgZGlzYWJsZWQKLXRvIGRpc2FibGUgY29kZSBzZWN0aW9ucywgd2hpY2ggY2FuIGdpdmUgZmFzdGVyIGNvbXBpbGUgdGltZSBhbmQgc21hbGxlciBiaW5hcnkuCi1UaGUgIk5PX0NPTVBJTEUiIGRlZmluZXMgYXJlIGRlc2lnbmVkIHRvIGJlIHVzZWQgdG8gcGFzcyBhcyBkZWZpbmVzIHRvIHRoZQotY29tcGlsZXIgY29tbWFuZCB0byBkaXNhYmxlIHRoZW0gd2l0aG91dCBtb2RpZnlpbmcgdGhpcyBoZWFkZXIsIGUuZy4KLS1ETE9ERVBOR19OT19DT01QSUxFX1pMSUIgZm9yIGdjYy4KLUluIGFkZGl0aW9uIHRvIHRob3NlIGJlbG93LCB5b3UgY2FuIGFsc28gZGVmaW5lIExPREVQTkdfTk9fQ09NUElMRV9DUkMgdG8KLWFsbG93IGltcGxlbWVudGluZyBhIGN1c3RvbSBsb2RlcG5nX2NyYzMyLgotKi8KLS8qZGVmbGF0ZSAmIHpsaWIuIElmIGRpc2FibGVkLCB5b3UgbXVzdCBzcGVjaWZ5IGFsdGVybmF0aXZlIHpsaWIgZnVuY3Rpb25zIGluCi10aGUgY3VzdG9tX3psaWIgZmllbGQgb2YgdGhlIGNvbXByZXNzIGFuZCBkZWNvbXByZXNzIHNldHRpbmdzKi8KLSNpZm5kZWYgTE9ERVBOR19OT19DT01QSUxFX1pMSUIKLSNkZWZpbmUgTE9ERVBOR19DT01QSUxFX1pMSUIKLSNlbmRpZgotCi0vKnBuZyBlbmNvZGVyIGFuZCBwbmcgZGVjb2RlciovCi0jaWZuZGVmIExPREVQTkdfTk9fQ09NUElMRV9QTkcKLSNkZWZpbmUgTE9ERVBOR19DT01QSUxFX1BORwotI2VuZGlmCi0KLS8qZGVmbGF0ZSZ6bGliIGRlY29kZXIgYW5kIHBuZyBkZWNvZGVyKi8KLSNpZm5kZWYgTE9ERVBOR19OT19DT01QSUxFX0RFQ09ERVIKLSNkZWZpbmUgTE9ERVBOR19DT01QSUxFX0RFQ09ERVIKLSNlbmRpZgotCi0vKmRlZmxhdGUmemxpYiBlbmNvZGVyIGFuZCBwbmcgZW5jb2RlciovCi0jaWZuZGVmIExPREVQTkdfTk9fQ09NUElMRV9FTkNPREVSCi0jZGVmaW5lIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi0jZW5kaWYKLQotLyp0aGUgb3B0aW9uYWwgYnVpbHQgaW4gaGFyZGRpc2sgZmlsZSBsb2FkaW5nIGFuZCBzYXZpbmcgZnVuY3Rpb25zKi8KLSNpZm5kZWYgTE9ERVBOR19OT19DT01QSUxFX0RJU0sKLSNkZWZpbmUgTE9ERVBOR19DT01QSUxFX0RJU0sKLSNlbmRpZgotCi0vKnN1cHBvcnQgZm9yIGNodW5rcyBvdGhlciB0aGFuIElIRFIsIElEQVQsIFBMVEUsIHRSTlMsIElFTkQ6IGFuY2lsbGFyeSBhbmQgdW5rbm93biBjaHVua3MqLwotI2lmbmRlZiBMT0RFUE5HX05PX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotI2RlZmluZSBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotI2VuZGlmCi0KLS8qYWJpbGl0eSB0byBjb252ZXJ0IGVycm9yIG51bWVyaWNhbCBjb2RlcyB0byBFbmdsaXNoIHRleHQgc3RyaW5nKi8KLSNpZm5kZWYgTE9ERVBOR19OT19DT01QSUxFX0VSUk9SX1RFWFQKLSNkZWZpbmUgTE9ERVBOR19DT01QSUxFX0VSUk9SX1RFWFQKLSNlbmRpZgotCi0vKkNvbXBpbGUgdGhlIGRlZmF1bHQgYWxsb2NhdG9ycyAoQydzIGZyZWUsIG1hbGxvYyBhbmQgcmVhbGxvYykuIElmIHlvdSBkaXNhYmxlIHRoaXMsCi15b3UgY2FuIGRlZmluZSB0aGUgZnVuY3Rpb25zIGxvZGVwbmdfZnJlZSwgbG9kZXBuZ19tYWxsb2MgYW5kIGxvZGVwbmdfcmVhbGxvYyBpbiB5b3VyCi1zb3VyY2UgZmlsZXMgd2l0aCBjdXN0b20gYWxsb2NhdG9ycy4qLwotI2lmbmRlZiBMT0RFUE5HX05PX0NPTVBJTEVfQUxMT0NBVE9SUwotI2RlZmluZSBMT0RFUE5HX0NPTVBJTEVfQUxMT0NBVE9SUwotI2VuZGlmCi0KLS8qY29tcGlsZSB0aGUgQysrIHZlcnNpb24gKHlvdSBjYW4gZGlzYWJsZSB0aGUgQysrIHdyYXBwZXIgaGVyZSBldmVuIHdoZW4gY29tcGlsaW5nIGZvciBDKyspKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2lmbmRlZiBMT0RFUE5HX05PX0NPTVBJTEVfQ1BQCi0jZGVmaW5lIExPREVQTkdfQ09NUElMRV9DUFAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQ1BQCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9DUFAqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX1BORwotLypUaGUgUE5HIGNvbG9yIHR5cGVzIChhbHNvIHVzZWQgZm9yIHJhdykuKi8KLXR5cGVkZWYgZW51bSBMb2RlUE5HQ29sb3JUeXBlIHsKLSAgTENUX0dSRVkgPSAwLCAvKmdyYXlzY2FsZTogMSwyLDQsOCwxNiBiaXQqLwotICBMQ1RfUkdCID0gMiwgLypSR0I6IDgsMTYgYml0Ki8KLSAgTENUX1BBTEVUVEUgPSAzLCAvKnBhbGV0dGU6IDEsMiw0LDggYml0Ki8KLSAgTENUX0dSRVlfQUxQSEEgPSA0LCAvKmdyYXlzY2FsZSB3aXRoIGFscGhhOiA4LDE2IGJpdCovCi0gIExDVF9SR0JBID0gNiAvKlJHQiB3aXRoIGFscGhhOiA4LDE2IGJpdCovCi19IExvZGVQTkdDb2xvclR5cGU7Ci0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotLyoKLUNvbnZlcnRzIFBORyBkYXRhIGluIG1lbW9yeSB0byByYXcgcGl4ZWwgZGF0YS4KLW91dDogT3V0cHV0IHBhcmFtZXRlci4gUG9pbnRlciB0byBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJhdyBwaXhlbCBkYXRhLgotICAgICBBZnRlciBkZWNvZGluZywgaXRzIHNpemUgaXMgdyAqIGggKiAoYnl0ZXMgcGVyIHBpeGVsKSBieXRlcyBsYXJnZXIgdGhhbgotICAgICBpbml0aWFsbHkuIEJ5dGVzIHBlciBwaXhlbCBkZXBlbmRzIG9uIGNvbG9ydHlwZSBhbmQgYml0ZGVwdGguCi0gICAgIE11c3QgYmUgZnJlZWQgYWZ0ZXIgdXNhZ2Ugd2l0aCBmcmVlKCpvdXQpLgotICAgICBOb3RlOiBmb3IgMTYtYml0IHBlciBjaGFubmVsIGNvbG9ycywgdXNlcyBiaWcgZW5kaWFuIGZvcm1hdCBsaWtlIFBORyBkb2VzLgotdzogT3V0cHV0IHBhcmFtZXRlci4gUG9pbnRlciB0byB3aWR0aCBvZiBwaXhlbCBkYXRhLgotaDogT3V0cHV0IHBhcmFtZXRlci4gUG9pbnRlciB0byBoZWlnaHQgb2YgcGl4ZWwgZGF0YS4KLWluOiBNZW1vcnkgYnVmZmVyIHdpdGggdGhlIFBORyBmaWxlLgotaW5zaXplOiBzaXplIG9mIHRoZSBpbiBidWZmZXIuCi1jb2xvcnR5cGU6IHRoZSBkZXNpcmVkIGNvbG9yIHR5cGUgZm9yIHRoZSByYXcgb3V0cHV0IGltYWdlLiBTZWUgZXhwbGFuYXRpb24gb24gUE5HIGNvbG9yIHR5cGVzLgotYml0ZGVwdGg6IHRoZSBkZXNpcmVkIGJpdCBkZXB0aCBmb3IgdGhlIHJhdyBvdXRwdXQgaW1hZ2UuIFNlZSBleHBsYW5hdGlvbiBvbiBQTkcgY29sb3IgdHlwZXMuCi1SZXR1cm4gdmFsdWU6IExvZGVQTkcgZXJyb3IgY29kZSAoMCBtZWFucyBubyBlcnJvcikuCi0qLwotdW5zaWduZWQgbG9kZXBuZ19kZWNvZGVfbWVtb3J5KHVuc2lnbmVkIGNoYXIqKiBvdXQsIHVuc2lnbmVkKiB3LCB1bnNpZ25lZCogaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgc2l6ZV90IGluc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSwgdW5zaWduZWQgYml0ZGVwdGgpOwotCi0vKlNhbWUgYXMgbG9kZXBuZ19kZWNvZGVfbWVtb3J5LCBidXQgYWx3YXlzIGRlY29kZXMgdG8gMzItYml0IFJHQkEgcmF3IGltYWdlKi8KLXVuc2lnbmVkIGxvZGVwbmdfZGVjb2RlMzIodW5zaWduZWQgY2hhcioqIG91dCwgdW5zaWduZWQqIHcsIHVuc2lnbmVkKiBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgc2l6ZV90IGluc2l6ZSk7Ci0KLS8qU2FtZSBhcyBsb2RlcG5nX2RlY29kZV9tZW1vcnksIGJ1dCBhbHdheXMgZGVjb2RlcyB0byAyNC1iaXQgUkdCIHJhdyBpbWFnZSovCi11bnNpZ25lZCBsb2RlcG5nX2RlY29kZTI0KHVuc2lnbmVkIGNoYXIqKiBvdXQsIHVuc2lnbmVkKiB3LCB1bnNpZ25lZCogaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpbnNpemUpOwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RJU0sKLS8qCi1Mb2FkIFBORyBmcm9tIGRpc2ssIGZyb20gZmlsZSB3aXRoIGdpdmVuIG5hbWUuCi1TYW1lIGFzIHRoZSBvdGhlciBkZWNvZGUgZnVuY3Rpb25zLCBidXQgaW5zdGVhZCB0YWtlcyBhIGZpbGVuYW1lIGFzIGlucHV0LgotKi8KLXVuc2lnbmVkIGxvZGVwbmdfZGVjb2RlX2ZpbGUodW5zaWduZWQgY2hhcioqIG91dCwgdW5zaWduZWQqIHcsIHVuc2lnbmVkKiBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJpdGRlcHRoKTsKLQotLypTYW1lIGFzIGxvZGVwbmdfZGVjb2RlX2ZpbGUsIGJ1dCBhbHdheXMgZGVjb2RlcyB0byAzMi1iaXQgUkdCQSByYXcgaW1hZ2UuKi8KLXVuc2lnbmVkIGxvZGVwbmdfZGVjb2RlMzJfZmlsZSh1bnNpZ25lZCBjaGFyKiogb3V0LCB1bnNpZ25lZCogdywgdW5zaWduZWQqIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUpOwotCi0vKlNhbWUgYXMgbG9kZXBuZ19kZWNvZGVfZmlsZSwgYnV0IGFsd2F5cyBkZWNvZGVzIHRvIDI0LWJpdCBSR0IgcmF3IGltYWdlLiovCi11bnNpZ25lZCBsb2RlcG5nX2RlY29kZTI0X2ZpbGUodW5zaWduZWQgY2hhcioqIG91dCwgdW5zaWduZWQqIHcsIHVuc2lnbmVkKiBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9ESVNLKi8KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9ERUNPREVSKi8KLQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0VOQ09ERVIKLS8qCi1Db252ZXJ0cyByYXcgcGl4ZWwgZGF0YSBpbnRvIGEgUE5HIGltYWdlIGluIG1lbW9yeS4gVGhlIGNvbG9ydHlwZSBhbmQgYml0ZGVwdGgKLSAgb2YgdGhlIG91dHB1dCBQTkcgaW1hZ2UgY2Fubm90IGJlIGNob3NlbiwgdGhleSBhcmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkCi0gIGJ5IHRoZSBjb2xvcnR5cGUsIGJpdGRlcHRoIGFuZCBjb250ZW50IG9mIHRoZSBpbnB1dCBwaXhlbCBkYXRhLgotICBOb3RlOiBmb3IgMTYtYml0IHBlciBjaGFubmVsIGNvbG9ycywgbmVlZHMgYmlnIGVuZGlhbiBmb3JtYXQgbGlrZSBQTkcgZG9lcy4KLW91dDogT3V0cHV0IHBhcmFtZXRlci4gUG9pbnRlciB0byBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFBORyBpbWFnZSBkYXRhLgotICAgICBNdXN0IGJlIGZyZWVkIGFmdGVyIHVzYWdlIHdpdGggZnJlZSgqb3V0KS4KLW91dHNpemU6IE91dHB1dCBwYXJhbWV0ZXIuIFBvaW50ZXIgdG8gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG91dCBidWZmZXIuCi1pbWFnZTogVGhlIHJhdyBwaXhlbCBkYXRhIHRvIGVuY29kZS4gVGhlIHNpemUgb2YgdGhpcyBidWZmZXIgc2hvdWxkIGJlCi0gICAgICAgdyAqIGggKiAoYnl0ZXMgcGVyIHBpeGVsKSwgYnl0ZXMgcGVyIHBpeGVsIGRlcGVuZHMgb24gY29sb3J0eXBlIGFuZCBiaXRkZXB0aC4KLXc6IHdpZHRoIG9mIHRoZSByYXcgcGl4ZWwgZGF0YSBpbiBwaXhlbHMuCi1oOiBoZWlnaHQgb2YgdGhlIHJhdyBwaXhlbCBkYXRhIGluIHBpeGVscy4KLWNvbG9ydHlwZTogdGhlIGNvbG9yIHR5cGUgb2YgdGhlIHJhdyBpbnB1dCBpbWFnZS4gU2VlIGV4cGxhbmF0aW9uIG9uIFBORyBjb2xvciB0eXBlcy4KLWJpdGRlcHRoOiB0aGUgYml0IGRlcHRoIG9mIHRoZSByYXcgaW5wdXQgaW1hZ2UuIFNlZSBleHBsYW5hdGlvbiBvbiBQTkcgY29sb3IgdHlwZXMuCi1SZXR1cm4gdmFsdWU6IExvZGVQTkcgZXJyb3IgY29kZSAoMCBtZWFucyBubyBlcnJvcikuCi0qLwotdW5zaWduZWQgbG9kZXBuZ19lbmNvZGVfbWVtb3J5KHVuc2lnbmVkIGNoYXIqKiBvdXQsIHNpemVfdCogb3V0c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbWFnZSwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSwgdW5zaWduZWQgYml0ZGVwdGgpOwotCi0vKlNhbWUgYXMgbG9kZXBuZ19lbmNvZGVfbWVtb3J5LCBidXQgYWx3YXlzIGVuY29kZXMgZnJvbSAzMi1iaXQgUkdCQSByYXcgaW1hZ2UuKi8KLXVuc2lnbmVkIGxvZGVwbmdfZW5jb2RlMzIodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbWFnZSwgdW5zaWduZWQgdywgdW5zaWduZWQgaCk7Ci0KLS8qU2FtZSBhcyBsb2RlcG5nX2VuY29kZV9tZW1vcnksIGJ1dCBhbHdheXMgZW5jb2RlcyBmcm9tIDI0LWJpdCBSR0IgcmF3IGltYWdlLiovCi11bnNpZ25lZCBsb2RlcG5nX2VuY29kZTI0KHVuc2lnbmVkIGNoYXIqKiBvdXQsIHNpemVfdCogb3V0c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW1hZ2UsIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgpOwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RJU0sKLS8qCi1Db252ZXJ0cyByYXcgcGl4ZWwgZGF0YSBpbnRvIGEgUE5HIGZpbGUgb24gZGlzay4KLVNhbWUgYXMgdGhlIG90aGVyIGVuY29kZSBmdW5jdGlvbnMsIGJ1dCBpbnN0ZWFkIHRha2VzIGEgZmlsZW5hbWUgYXMgb3V0cHV0LgotTk9URTogVGhpcyBvdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzIHdpdGhvdXQgd2FybmluZyEKLSovCi11bnNpZ25lZCBsb2RlcG5nX2VuY29kZV9maWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbWFnZSwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUsIHVuc2lnbmVkIGJpdGRlcHRoKTsKLQotLypTYW1lIGFzIGxvZGVwbmdfZW5jb2RlX2ZpbGUsIGJ1dCBhbHdheXMgZW5jb2RlcyBmcm9tIDMyLWJpdCBSR0JBIHJhdyBpbWFnZS4qLwotdW5zaWduZWQgbG9kZXBuZ19lbmNvZGUzMl9maWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGltYWdlLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoKTsKLQotLypTYW1lIGFzIGxvZGVwbmdfZW5jb2RlX2ZpbGUsIGJ1dCBhbHdheXMgZW5jb2RlcyBmcm9tIDI0LWJpdCBSR0IgcmF3IGltYWdlLiovCi11bnNpZ25lZCBsb2RlcG5nX2VuY29kZTI0X2ZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW1hZ2UsIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgpOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RJU0sqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQ1BQCi1uYW1lc3BhY2UgbG9kZXBuZyB7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RFQ09ERVIKLS8qU2FtZSBhcyBsb2RlcG5nX2RlY29kZV9tZW1vcnksIGJ1dCBkZWNvZGVzIHRvIGFuIHN0ZDo6dmVjdG9yLiBUaGUgY29sb3J0eXBlCi1pcyB0aGUgZm9ybWF0IHRvIG91dHB1dCB0aGUgcGl4ZWxzIHRvLiBEZWZhdWx0IGlzIFJHQkEgOC1iaXQgcGVyIGNoYW5uZWwuKi8KLXVuc2lnbmVkIGRlY29kZShzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgb3V0LCB1bnNpZ25lZCYgdywgdW5zaWduZWQmIGgsCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpbnNpemUsCi0gICAgICAgICAgICAgICAgTG9kZVBOR0NvbG9yVHlwZSBjb2xvcnR5cGUgPSBMQ1RfUkdCQSwgdW5zaWduZWQgYml0ZGVwdGggPSA4KTsKLXVuc2lnbmVkIGRlY29kZShzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgb3V0LCB1bnNpZ25lZCYgdywgdW5zaWduZWQmIGgsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIGluLAotICAgICAgICAgICAgICAgIExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlID0gTENUX1JHQkEsIHVuc2lnbmVkIGJpdGRlcHRoID0gOCk7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RJU0sKLS8qCi1Db252ZXJ0cyBQTkcgZmlsZSBmcm9tIGRpc2sgdG8gcmF3IHBpeGVsIGRhdGEgaW4gbWVtb3J5LgotU2FtZSBhcyB0aGUgb3RoZXIgZGVjb2RlIGZ1bmN0aW9ucywgYnV0IGluc3RlYWQgdGFrZXMgYSBmaWxlbmFtZSBhcyBpbnB1dC4KLSovCi11bnNpZ25lZCBkZWNvZGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwgdW5zaWduZWQmIHcsIHVuc2lnbmVkJiBoLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSA9IExDVF9SR0JBLCB1bnNpZ25lZCBiaXRkZXB0aCA9IDgpOwotI2VuZGlmIC8qIExPREVQTkdfQ09NUElMRV9ESVNLICovCi0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX0RFQ09ERVIgKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi0vKlNhbWUgYXMgbG9kZXBuZ19lbmNvZGVfbWVtb3J5LCBidXQgZW5jb2RlcyB0byBhbiBzdGQ6OnZlY3Rvci4gY29sb3J0eXBlCi1pcyB0aGF0IG9mIHRoZSByYXcgaW5wdXQgZGF0YS4gVGhlIG91dHB1dCBQTkcgY29sb3IgdHlwZSB3aWxsIGJlIGF1dG8gY2hvc2VuLiovCi11bnNpZ25lZCBlbmNvZGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIG91dCwKLSAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSA9IExDVF9SR0JBLCB1bnNpZ25lZCBiaXRkZXB0aCA9IDgpOwotdW5zaWduZWQgZW5jb2RlKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIGluLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLAotICAgICAgICAgICAgICAgIExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlID0gTENUX1JHQkEsIHVuc2lnbmVkIGJpdGRlcHRoID0gOCk7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RJU0sKLS8qCi1Db252ZXJ0cyAzMi1iaXQgUkdCQSByYXcgcGl4ZWwgZGF0YSBpbnRvIGEgUE5HIGZpbGUgb24gZGlzay4KLVNhbWUgYXMgdGhlIG90aGVyIGVuY29kZSBmdW5jdGlvbnMsIGJ1dCBpbnN0ZWFkIHRha2VzIGEgZmlsZW5hbWUgYXMgb3V0cHV0LgotTk9URTogVGhpcyBvdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzIHdpdGhvdXQgd2FybmluZyEKLSovCi11bnNpZ25lZCBlbmNvZGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLAotICAgICAgICAgICAgICAgIExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlID0gTENUX1JHQkEsIHVuc2lnbmVkIGJpdGRlcHRoID0gOCk7Ci11bnNpZ25lZCBlbmNvZGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBpbiwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICBMb2RlUE5HQ29sb3JUeXBlIGNvbG9ydHlwZSA9IExDVF9SR0JBLCB1bnNpZ25lZCBiaXRkZXB0aCA9IDgpOwotI2VuZGlmIC8qIExPREVQTkdfQ09NUElMRV9ESVNLICovCi0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX0VOQ09ERVIgKi8KLX0gLyogbmFtZXNwYWNlIGxvZGVwbmcgKi8KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9DUFAqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX1BORyovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRVJST1JfVEVYVAotLypSZXR1cm5zIGFuIEVuZ2xpc2ggZGVzY3JpcHRpb24gb2YgdGhlIG51bWVyaWNhbCBlcnJvciBjb2RlLiovCi1jb25zdCBjaGFyKiBsb2RlcG5nX2Vycm9yX3RleHQodW5zaWduZWQgY29kZSk7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfRVJST1JfVEVYVCovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotLypTZXR0aW5ncyBmb3IgemxpYiBkZWNvbXByZXNzaW9uKi8KLXR5cGVkZWYgc3RydWN0IExvZGVQTkdEZWNvbXByZXNzU2V0dGluZ3MgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5nczsKLXN0cnVjdCBMb2RlUE5HRGVjb21wcmVzc1NldHRpbmdzIHsKLSAgLyogQ2hlY2sgTG9kZVBOR0RlY29kZXJTZXR0aW5ncyBmb3IgbW9yZSBpZ25vcmFibGUgZXJyb3JzIHN1Y2ggYXMgaWdub3JlX2NyYyAqLwotICB1bnNpZ25lZCBpZ25vcmVfYWRsZXIzMjsgLyppZiAxLCBjb250aW51ZSBhbmQgZG9uJ3QgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBBZGxlcjMyIGNoZWNrc3VtIGlzIGNvcnJ1cHRlZCovCi0KLSAgLyp1c2UgY3VzdG9tIHpsaWIgZGVjb2RlciBpbnN0ZWFkIG9mIGJ1aWx0IGluIG9uZSAoZGVmYXVsdDogbnVsbCkqLwotICB1bnNpZ25lZCAoKmN1c3RvbV96bGliKSh1bnNpZ25lZCBjaGFyKiosIHNpemVfdCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBzaXplX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdEZWNvbXByZXNzU2V0dGluZ3MqKTsKLSAgLyp1c2UgY3VzdG9tIGRlZmxhdGUgZGVjb2RlciBpbnN0ZWFkIG9mIGJ1aWx0IGluIG9uZSAoZGVmYXVsdDogbnVsbCkKLSAgaWYgY3VzdG9tX3psaWIgaXMgdXNlZCwgY3VzdG9tX2RlZmxhdGUgaXMgaWdub3JlZCBzaW5jZSBvbmx5IHRoZSBidWlsdCBpbgotICB6bGliIGZ1bmN0aW9uIHdpbGwgY2FsbCBjdXN0b21fZGVmbGF0ZSovCi0gIHVuc2lnbmVkICgqY3VzdG9tX2luZmxhdGUpKHVuc2lnbmVkIGNoYXIqKiwgc2l6ZV90KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciosIHNpemVfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyopOwotCi0gIGNvbnN0IHZvaWQqIGN1c3RvbV9jb250ZXh0OyAvKm9wdGlvbmFsIGN1c3RvbSBzZXR0aW5ncyBmb3IgY3VzdG9tIGZ1bmN0aW9ucyovCi19OwotCi1leHRlcm4gY29uc3QgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyBsb2RlcG5nX2RlZmF1bHRfZGVjb21wcmVzc19zZXR0aW5nczsKLXZvaWQgbG9kZXBuZ19kZWNvbXByZXNzX3NldHRpbmdzX2luaXQoTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyogc2V0dGluZ3MpOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RFQ09ERVIqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0VOQ09ERVIKLS8qCi1TZXR0aW5ncyBmb3IgemxpYiBjb21wcmVzc2lvbi4gVHdlYWtpbmcgdGhlc2Ugc2V0dGluZ3MgdHdlYWtzIHRoZSBiYWxhbmNlCi1iZXR3ZWVuIHNwZWVkIGFuZCBjb21wcmVzc2lvbiByYXRpby4KLSovCi10eXBlZGVmIHN0cnVjdCBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyBMb2RlUE5HQ29tcHJlc3NTZXR0aW5nczsKLXN0cnVjdCBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyAvKmRlZmxhdGUgPSBjb21wcmVzcyovIHsKLSAgLypMWjc3IHJlbGF0ZWQgc2V0dGluZ3MqLwotICB1bnNpZ25lZCBidHlwZTsgLyp0aGUgYmxvY2sgdHlwZSBmb3IgTFogKDAsIDEsIDIgb3IgMywgc2VlIHpsaWIgc3RhbmRhcmQpLiBTaG91bGQgYmUgMiBmb3IgcHJvcGVyIGNvbXByZXNzaW9uLiovCi0gIHVuc2lnbmVkIHVzZV9sejc3OyAvKndoZXRoZXIgb3Igbm90IHRvIHVzZSBMWjc3LiBTaG91bGQgYmUgMSBmb3IgcHJvcGVyIGNvbXByZXNzaW9uLiovCi0gIHVuc2lnbmVkIHdpbmRvd3NpemU7IC8qbXVzdCBiZSBhIHBvd2VyIG9mIHR3byA8PSAzMjc2OC4gaGlnaGVyIGNvbXByZXNzZXMgbW9yZSBidXQgaXMgc2xvd2VyLiBEZWZhdWx0IHZhbHVlOiAyMDQ4LiovCi0gIHVuc2lnbmVkIG1pbm1hdGNoOyAvKm1pbmludW0gbHo3NyBsZW5ndGguIDMgaXMgbm9ybWFsbHkgYmVzdCwgNiBjYW4gYmUgYmV0dGVyIGZvciBzb21lIFBOR3MuIERlZmF1bHQ6IDAqLwotICB1bnNpZ25lZCBuaWNlbWF0Y2g7IC8qc3RvcCBzZWFyY2hpbmcgaWYgPj0gdGhpcyBsZW5ndGggZm91bmQuIFNldCB0byAyNTggZm9yIGJlc3QgY29tcHJlc3Npb24uIERlZmF1bHQ6IDEyOCovCi0gIHVuc2lnbmVkIGxhenltYXRjaGluZzsgLyp1c2UgbGF6eSBtYXRjaGluZzogYmV0dGVyIGNvbXByZXNzaW9uIGJ1dCBhIGJpdCBzbG93ZXIuIERlZmF1bHQ6IHRydWUqLwotCi0gIC8qdXNlIGN1c3RvbSB6bGliIGVuY29kZXIgaW5zdGVhZCBvZiBidWlsdCBpbiBvbmUgKGRlZmF1bHQ6IG51bGwpKi8KLSAgdW5zaWduZWQgKCpjdXN0b21femxpYikodW5zaWduZWQgY2hhcioqLCBzaXplX3QqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiwgc2l6ZV90LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyopOwotICAvKnVzZSBjdXN0b20gZGVmbGF0ZSBlbmNvZGVyIGluc3RlYWQgb2YgYnVpbHQgaW4gb25lIChkZWZhdWx0OiBudWxsKQotICBpZiBjdXN0b21femxpYiBpcyB1c2VkLCBjdXN0b21fZGVmbGF0ZSBpcyBpZ25vcmVkIHNpbmNlIG9ubHkgdGhlIGJ1aWx0IGluCi0gIHpsaWIgZnVuY3Rpb24gd2lsbCBjYWxsIGN1c3RvbV9kZWZsYXRlKi8KLSAgdW5zaWduZWQgKCpjdXN0b21fZGVmbGF0ZSkodW5zaWduZWQgY2hhcioqLCBzaXplX3QqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiwgc2l6ZV90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyopOwotCi0gIGNvbnN0IHZvaWQqIGN1c3RvbV9jb250ZXh0OyAvKm9wdGlvbmFsIGN1c3RvbSBzZXR0aW5ncyBmb3IgY3VzdG9tIGZ1bmN0aW9ucyovCi19OwotCi1leHRlcm4gY29uc3QgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MgbG9kZXBuZ19kZWZhdWx0X2NvbXByZXNzX3NldHRpbmdzOwotdm9pZCBsb2RlcG5nX2NvbXByZXNzX3NldHRpbmdzX2luaXQoTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9FTkNPREVSKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9QTkcKLS8qCi1Db2xvciBtb2RlIG9mIGFuIGltYWdlLiBDb250YWlucyBhbGwgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gZGVjb2RlIHRoZSBwaXhlbAotYml0cyB0byBSR0JBIGNvbG9ycy4gVGhpcyBpbmZvcm1hdGlvbiBpcyB0aGUgc2FtZSBhcyB1c2VkIGluIHRoZSBQTkcgZmlsZQotZm9ybWF0LCBhbmQgaXMgdXNlZCBib3RoIGZvciBQTkcgYW5kIHJhdyBpbWFnZSBkYXRhIGluIExvZGVQTkcuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgTG9kZVBOR0NvbG9yTW9kZSB7Ci0gIC8qaGVhZGVyIChJSERSKSovCi0gIExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlOyAvKmNvbG9yIHR5cGUsIHNlZSBQTkcgc3RhbmRhcmQgb3IgZG9jdW1lbnRhdGlvbiBmdXJ0aGVyIGluIHRoaXMgaGVhZGVyIGZpbGUqLwotICB1bnNpZ25lZCBiaXRkZXB0aDsgIC8qYml0cyBwZXIgc2FtcGxlLCBzZWUgUE5HIHN0YW5kYXJkIG9yIGRvY3VtZW50YXRpb24gZnVydGhlciBpbiB0aGlzIGhlYWRlciBmaWxlKi8KLQotICAvKgotICBwYWxldHRlIChQTFRFIGFuZCB0Uk5TKQotCi0gIER5bmFtaWNhbGx5IGFsbG9jYXRlZCB3aXRoIHRoZSBjb2xvcnMgb2YgdGhlIHBhbGV0dGUsIGluY2x1ZGluZyBhbHBoYS4KLSAgV2hlbiBlbmNvZGluZyBhIFBORywgdG8gc3RvcmUgeW91ciBjb2xvcnMgaW4gdGhlIHBhbGV0dGUgb2YgdGhlIExvZGVQTkdDb2xvck1vZGUsIGZpcnN0IHVzZQotICBsb2RlcG5nX3BhbGV0dGVfY2xlYXIsIHRoZW4gZm9yIGVhY2ggY29sb3IgdXNlIGxvZGVwbmdfcGFsZXR0ZV9hZGQuCi0gIElmIHlvdSBlbmNvZGUgYW4gaW1hZ2Ugd2l0aG91dCBhbHBoYSB3aXRoIHBhbGV0dGUsIGRvbid0IGZvcmdldCB0byBwdXQgdmFsdWUgMjU1IGluIGVhY2ggQSBieXRlIG9mIHRoZSBwYWxldHRlLgotCi0gIFdoZW4gZGVjb2RpbmcsIGJ5IGRlZmF1bHQgeW91IGNhbiBpZ25vcmUgdGhpcyBwYWxldHRlLCBzaW5jZSBMb2RlUE5HIGFscmVhZHkKLSAgZmlsbHMgdGhlIHBhbGV0dGUgY29sb3JzIGluIHRoZSBwaXhlbHMgb2YgdGhlIHJhdyBSR0JBIG91dHB1dC4KLQotICBUaGUgcGFsZXR0ZSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY29sb3IgdHlwZSAzLgotICAqLwotICB1bnNpZ25lZCBjaGFyKiBwYWxldHRlOyAvKnBhbGV0dGUgaW4gUkdCQVJHQkEuLi4gb3JkZXIuIFdoZW4gYWxsb2NhdGVkLCBtdXN0IGJlIGVpdGhlciAwLCBvciBoYXZlIHNpemUgMTAyNCovCi0gIHNpemVfdCBwYWxldHRlc2l6ZTsgLypwYWxldHRlIHNpemUgaW4gbnVtYmVyIG9mIGNvbG9ycyAoYW1vdW50IG9mIGJ5dGVzIGlzIDQgKiBwYWxldHRlc2l6ZSkqLwotCi0gIC8qCi0gIHRyYW5zcGFyZW50IGNvbG9yIGtleSAodFJOUykKLQotICBUaGlzIGNvbG9yIHVzZXMgdGhlIHNhbWUgYml0IGRlcHRoIGFzIHRoZSBiaXRkZXB0aCB2YWx1ZSBpbiB0aGlzIHN0cnVjdCwgd2hpY2ggY2FuIGJlIDEtYml0IHRvIDE2LWJpdC4KLSAgRm9yIGdyYXlzY2FsZSBQTkdzLCByLCBnIGFuZCBiIHdpbGwgYWxsIDMgYmUgc2V0IHRvIHRoZSBzYW1lLgotCi0gIFdoZW4gZGVjb2RpbmcsIGJ5IGRlZmF1bHQgeW91IGNhbiBpZ25vcmUgdGhpcyBpbmZvcm1hdGlvbiwgc2luY2UgTG9kZVBORyBzZXRzCi0gIHBpeGVscyB3aXRoIHRoaXMga2V5IHRvIHRyYW5zcGFyZW50IGFscmVhZHkgaW4gdGhlIHJhdyBSR0JBIG91dHB1dC4KLQotICBUaGUgY29sb3Iga2V5IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjb2xvciB0eXBlcyAwIGFuZCAyLgotICAqLwotICB1bnNpZ25lZCBrZXlfZGVmaW5lZDsgLyppcyBhIHRyYW5zcGFyZW50IGNvbG9yIGtleSBnaXZlbj8gMCA9IGZhbHNlLCAxID0gdHJ1ZSovCi0gIHVuc2lnbmVkIGtleV9yOyAgICAgICAvKnJlZC9ncmF5c2NhbGUgY29tcG9uZW50IG9mIGNvbG9yIGtleSovCi0gIHVuc2lnbmVkIGtleV9nOyAgICAgICAvKmdyZWVuIGNvbXBvbmVudCBvZiBjb2xvciBrZXkqLwotICB1bnNpZ25lZCBrZXlfYjsgICAgICAgLypibHVlIGNvbXBvbmVudCBvZiBjb2xvciBrZXkqLwotfSBMb2RlUE5HQ29sb3JNb2RlOwotCi0vKmluaXQsIGNsZWFudXAgYW5kIGNvcHkgZnVuY3Rpb25zIHRvIHVzZSB3aXRoIHRoaXMgc3RydWN0Ki8KLXZvaWQgbG9kZXBuZ19jb2xvcl9tb2RlX2luaXQoTG9kZVBOR0NvbG9yTW9kZSogaW5mbyk7Ci12b2lkIGxvZGVwbmdfY29sb3JfbW9kZV9jbGVhbnVwKExvZGVQTkdDb2xvck1vZGUqIGluZm8pOwotLypyZXR1cm4gdmFsdWUgaXMgZXJyb3IgY29kZSAoMCBtZWFucyBubyBlcnJvcikqLwotdW5zaWduZWQgbG9kZXBuZ19jb2xvcl9tb2RlX2NvcHkoTG9kZVBOR0NvbG9yTW9kZSogZGVzdCwgY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogc291cmNlKTsKLS8qIE1ha2VzIGEgdGVtcG9yYXJ5IExvZGVQTkdDb2xvck1vZGUgdGhhdCBkb2VzIG5vdCBuZWVkIGNsZWFudXAgKG5vIHBhbGV0dGUpICovCi1Mb2RlUE5HQ29sb3JNb2RlIGxvZGVwbmdfY29sb3JfbW9kZV9tYWtlKExvZGVQTkdDb2xvclR5cGUgY29sb3J0eXBlLCB1bnNpZ25lZCBiaXRkZXB0aCk7Ci0KLXZvaWQgbG9kZXBuZ19wYWxldHRlX2NsZWFyKExvZGVQTkdDb2xvck1vZGUqIGluZm8pOwotLyphZGQgMSBjb2xvciB0byB0aGUgcGFsZXR0ZSovCi11bnNpZ25lZCBsb2RlcG5nX3BhbGV0dGVfYWRkKExvZGVQTkdDb2xvck1vZGUqIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgciwgdW5zaWduZWQgY2hhciBnLCB1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgYSk7Ci0KLS8qZ2V0IHRoZSB0b3RhbCBhbW91bnQgb2YgYml0cyBwZXIgcGl4ZWwsIGJhc2VkIG9uIGNvbG9ydHlwZSBhbmQgYml0ZGVwdGggaW4gdGhlIHN0cnVjdCovCi11bnNpZ25lZCBsb2RlcG5nX2dldF9icHAoY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogaW5mbyk7Ci0vKmdldCB0aGUgYW1vdW50IG9mIGNvbG9yIGNoYW5uZWxzIHVzZWQsIGJhc2VkIG9uIGNvbG9ydHlwZSBpbiB0aGUgc3RydWN0LgotSWYgYSBwYWxldHRlIGlzIHVzZWQsIGl0IGNvdW50cyBhcyAxIGNoYW5uZWwuKi8KLXVuc2lnbmVkIGxvZGVwbmdfZ2V0X2NoYW5uZWxzKGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIGluZm8pOwotLyppcyBpdCBhIGdyYXlzY2FsZSB0eXBlPyAob25seSBjb2xvcnR5cGUgMCBvciA0KSovCi11bnNpZ25lZCBsb2RlcG5nX2lzX2dyZXlzY2FsZV90eXBlKGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIGluZm8pOwotLypoYXMgaXQgZ290IGFuIGFscGhhIGNoYW5uZWw/IChvbmx5IGNvbG9ydHlwZSAyIG9yIDYpKi8KLXVuc2lnbmVkIGxvZGVwbmdfaXNfYWxwaGFfdHlwZShjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBpbmZvKTsKLS8qaGFzIGl0IGdvdCBhIHBhbGV0dGU/IChvbmx5IGNvbG9ydHlwZSAzKSovCi11bnNpZ25lZCBsb2RlcG5nX2lzX3BhbGV0dGVfdHlwZShjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBpbmZvKTsKLS8qb25seSByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBwYWxldHRlIGFuZCB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZSBwYWxldHRlIHdpdGggYWxwaGEgPCAyNTUuCi1Mb29wcyB0aHJvdWdoIHRoZSBwYWxldHRlIHRvIGNoZWNrIHRoaXMuKi8KLXVuc2lnbmVkIGxvZGVwbmdfaGFzX3BhbGV0dGVfYWxwaGEoY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogaW5mbyk7Ci0vKgotQ2hlY2sgaWYgdGhlIGdpdmVuIGNvbG9yIGluZm8gaW5kaWNhdGVzIHRoZSBwb3NzaWJpbGl0eSBvZiBoYXZpbmcgbm9uLW9wYXF1ZSBwaXhlbHMgaW4gdGhlIFBORyBpbWFnZS4KLVJldHVybnMgdHJ1ZSBpZiB0aGUgaW1hZ2UgY2FuIGhhdmUgdHJhbnNsdWNlbnQgb3IgaW52aXNpYmxlIHBpeGVscyAoaXQgc3RpbGwgYmUgb3BhcXVlIGlmIGl0IGRvZXNuJ3QgdXNlIHN1Y2ggcGl4ZWxzKS4KLVJldHVybnMgZmFsc2UgaWYgdGhlIGltYWdlIGNhbiBvbmx5IGhhdmUgb3BhcXVlIHBpeGVscy4KLUluIGRldGFpbCwgaXQgcmV0dXJucyB0cnVlIG9ubHkgaWYgaXQncyBhIGNvbG9yIHR5cGUgd2l0aCBhbHBoYSwgb3IgaGFzIGEgcGFsZXR0ZSB3aXRoIG5vbi1vcGFxdWUgdmFsdWVzLAotb3IgaWYgImtleV9kZWZpbmVkIiBpcyB0cnVlLgotKi8KLXVuc2lnbmVkIGxvZGVwbmdfY2FuX2hhdmVfYWxwaGEoY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogaW5mbyk7Ci0vKlJldHVybnMgdGhlIGJ5dGUgc2l6ZSBvZiBhIHJhdyBpbWFnZSBidWZmZXIgd2l0aCBnaXZlbiB3aWR0aCwgaGVpZ2h0IGFuZCBjb2xvciBtb2RlKi8KLXNpemVfdCBsb2RlcG5nX2dldF9yYXdfc2l6ZSh1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLCBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBjb2xvcik7Ci0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUwotLypUaGUgaW5mb3JtYXRpb24gb2YgYSBUaW1lIGNodW5rIGluIFBORy4qLwotdHlwZWRlZiBzdHJ1Y3QgTG9kZVBOR1RpbWUgewotICB1bnNpZ25lZCB5ZWFyOyAgICAvKjIgYnl0ZXMgdXNlZCAoMC02NTUzNSkqLwotICB1bnNpZ25lZCBtb250aDsgICAvKjEtMTIqLwotICB1bnNpZ25lZCBkYXk7ICAgICAvKjEtMzEqLwotICB1bnNpZ25lZCBob3VyOyAgICAvKjAtMjMqLwotICB1bnNpZ25lZCBtaW51dGU7ICAvKjAtNTkqLwotICB1bnNpZ25lZCBzZWNvbmQ7ICAvKjAtNjAgKHRvIGFsbG93IGZvciBsZWFwIHNlY29uZHMpKi8KLX0gTG9kZVBOR1RpbWU7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi0KLS8qSW5mb3JtYXRpb24gYWJvdXQgdGhlIFBORyBpbWFnZSwgZXhjZXB0IHBpeGVscywgd2lkdGggYW5kIGhlaWdodC4qLwotdHlwZWRlZiBzdHJ1Y3QgTG9kZVBOR0luZm8gewotICAvKmhlYWRlciAoSUhEUiksIHBhbGV0dGUgKFBMVEUpIGFuZCB0cmFuc3BhcmVuY3kgKHRSTlMpIGNodW5rcyovCi0gIHVuc2lnbmVkIGNvbXByZXNzaW9uX21ldGhvZDsvKmNvbXByZXNzaW9uIG1ldGhvZCBvZiB0aGUgb3JpZ2luYWwgZmlsZS4gQWx3YXlzIDAuKi8KLSAgdW5zaWduZWQgZmlsdGVyX21ldGhvZDsgICAgIC8qZmlsdGVyIG1ldGhvZCBvZiB0aGUgb3JpZ2luYWwgZmlsZSovCi0gIHVuc2lnbmVkIGludGVybGFjZV9tZXRob2Q7ICAvKmludGVybGFjZSBtZXRob2Qgb2YgdGhlIG9yaWdpbmFsIGZpbGU6IDA9bm9uZSwgMT1BZGFtNyovCi0gIExvZGVQTkdDb2xvck1vZGUgY29sb3I7ICAgICAvKmNvbG9yIHR5cGUgYW5kIGJpdHMsIHBhbGV0dGUgYW5kIHRyYW5zcGFyZW5jeSBvZiB0aGUgUE5HIGZpbGUqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgLyoKLSAgU3VnZ2VzdGVkIGJhY2tncm91bmQgY29sb3IgY2h1bmsgKGJLR0QpCi0KLSAgVGhpcyB1c2VzIHRoZSBzYW1lIGNvbG9yIG1vZGUgYW5kIGJpdCBkZXB0aCBhcyB0aGUgUE5HIChleGNlcHQgbm8gYWxwaGEgY2hhbm5lbCksCi0gIHdpdGggdmFsdWVzIHRydW5jYXRlZCB0byB0aGUgYml0IGRlcHRoIGluIHRoZSB1bnNpZ25lZCBpbnRlZ2VyLgotCi0gIEZvciBncmF5c2NhbGUgYW5kIHBhbGV0dGUgUE5HcywgdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBiYWNrZ3JvdW5kX3IuIFRoZSB2YWx1ZXMKLSAgaW4gYmFja2dyb3VuZF9nIGFuZCBiYWNrZ3JvdW5kX2IgYXJlIHRoZW4gdW51c2VkLgotCi0gIFNvIHdoZW4gZGVjb2RpbmcsIHlvdSBtYXkgZ2V0IHRoZXNlIGluIGEgZGlmZmVyZW50IGNvbG9yIG1vZGUgdGhhbiB0aGUgb25lIHlvdSByZXF1ZXN0ZWQKLSAgZm9yIHRoZSByYXcgcGl4ZWxzLgotCi0gIFdoZW4gZW5jb2Rpbmcgd2l0aCBhdXRvX2NvbnZlcnQsIHlvdSBtdXN0IHVzZSB0aGUgY29sb3IgbW9kZWwgZGVmaW5lZCBpbiBpbmZvX3BuZy5jb2xvciBmb3IKLSAgdGhlc2UgdmFsdWVzLiBUaGUgZW5jb2RlciBub3JtYWxseSBpZ25vcmVzIGluZm9fcG5nLmNvbG9yIHdoZW4gYXV0b19jb252ZXJ0IGlzIG9uLCBidXQgd2lsbAotICB1c2UgaXQgdG8gaW50ZXJwcmV0IHRoZXNlIHZhbHVlcyAoYW5kIGNvbnZlcnQgY29waWVzIG9mIHRoZW0gdG8gaXRzIGNob3NlbiBjb2xvciBtb2RlbCkuCi0KLSAgV2hlbiBlbmNvZGluZywgYXZvaWQgc2V0dGluZyB0aGlzIHRvIGFuIGV4cGVuc2l2ZSBjb2xvciwgc3VjaCBhcyBhIG5vbi1ncmF5IHZhbHVlCi0gIHdoZW4gdGhlIGltYWdlIGlzIGdyYXksIG9yIHRoZSBjb21wcmVzc2lvbiB3aWxsIGJlIHdvcnNlIHNpbmNlIGl0IHdpbGwgYmUgZm9yY2VkIHRvCi0gIHdyaXRlIHRoZSBQTkcgd2l0aCBhIG1vcmUgZXhwZW5zaXZlIGNvbG9yIG1vZGUgKHdoZW4gYXV0b19jb252ZXJ0IGlzIG9uKS4KLQotICBUaGUgZGVjb2RlciBkb2VzIG5vdCB1c2UgdGhpcyBiYWNrZ3JvdW5kIGNvbG9yIHRvIGVkaXQgdGhlIGNvbG9yIG9mIHBpeGVscy4gVGhpcyBpcyBhCi0gIGNvbXBsZXRlbHkgb3B0aW9uYWwgbWV0YWRhdGEgZmVhdHVyZS4KLSAgKi8KLSAgdW5zaWduZWQgYmFja2dyb3VuZF9kZWZpbmVkOyAvKmlzIGEgc3VnZ2VzdGVkIGJhY2tncm91bmQgY29sb3IgZ2l2ZW4/Ki8KLSAgdW5zaWduZWQgYmFja2dyb3VuZF9yOyAgICAgICAvKnJlZC9ncmF5L3BhbGV0dGUgY29tcG9uZW50IG9mIHN1Z2dlc3RlZCBiYWNrZ3JvdW5kIGNvbG9yKi8KLSAgdW5zaWduZWQgYmFja2dyb3VuZF9nOyAgICAgICAvKmdyZWVuIGNvbXBvbmVudCBvZiBzdWdnZXN0ZWQgYmFja2dyb3VuZCBjb2xvciovCi0gIHVuc2lnbmVkIGJhY2tncm91bmRfYjsgICAgICAgLypibHVlIGNvbXBvbmVudCBvZiBzdWdnZXN0ZWQgYmFja2dyb3VuZCBjb2xvciovCi0KLSAgLyoKLSAgbm9uLWludGVybmF0aW9uYWwgdGV4dCBjaHVua3MgKHRFWHQgYW5kIHpUWHQpCi0KLSAgVGhlIGNoYXIqKiBhcnJheXMgZWFjaCBjb250YWluIG51bSBzdHJpbmdzLiBUaGUgYWN0dWFsIG1lc3NhZ2VzIGFyZSBpbgotICB0ZXh0X3N0cmluZ3MsIHdoaWxlIHRleHRfa2V5cyBhcmUga2V5d29yZHMgdGhhdCBnaXZlIGEgc2hvcnQgZGVzY3JpcHRpb24gd2hhdAotICB0aGUgYWN0dWFsIHRleHQgcmVwcmVzZW50cywgZS5nLiBUaXRsZSwgQXV0aG9yLCBEZXNjcmlwdGlvbiwgb3IgYW55dGhpbmcgZWxzZS4KLQotICBBbGwgdGhlIHN0cmluZyBmaWVsZHMgYmVsb3cgaW5jbHVkaW5nIGtleXMsIG5hbWVzIGFuZCBsYW5ndWFnZSB0YWdzIGFyZSBudWxsIHRlcm1pbmF0ZWQuCi0gIFRoZSBQTkcgc3BlY2lmaWNhdGlvbiB1c2VzIG51bGwgY2hhcmFjdGVycyBmb3IgdGhlIGtleXMsIG5hbWVzIGFuZCB0YWdzLCBhbmQgZm9yYmlkcyBudWxsCi0gIGNoYXJhY3RlcnMgdG8gYXBwZWFyIGluIHRoZSBtYWluIHRleHQgd2hpY2ggaXMgd2h5IHdlIGNhbiB1c2UgbnVsbCB0ZXJtaW5hdGlvbiBldmVyeXdoZXJlIGhlcmUuCi0KLSAgQSBrZXl3b3JkIGlzIG1pbmltdW0gMSBjaGFyYWN0ZXIgYW5kIG1heGltdW0gNzkgY2hhcmFjdGVycyBsb25nLiBJdCdzCi0gIGRpc2NvdXJhZ2VkIHRvIHVzZSBhIHNpbmdsZSBsaW5lIGxlbmd0aCBsb25nZXIgdGhhbiA3OSBjaGFyYWN0ZXJzIGZvciB0ZXh0cy4KLQotICBEb24ndCBhbGxvY2F0ZSB0aGVzZSB0ZXh0IGJ1ZmZlcnMgeW91cnNlbGYuIFVzZSB0aGUgaW5pdC9jbGVhbnVwIGZ1bmN0aW9ucwotICBjb3JyZWN0bHkgYW5kIHVzZSBsb2RlcG5nX2FkZF90ZXh0IGFuZCBsb2RlcG5nX2NsZWFyX3RleHQuCi0gICovCi0gIHNpemVfdCB0ZXh0X251bTsgLyp0aGUgYW1vdW50IG9mIHRleHRzIGluIHRoZXNlIGNoYXIqKiBidWZmZXJzICh0aGVyZSBtYXkgYmUgbW9yZSB0ZXh0cyBpbiBpdGV4dCkqLwotICBjaGFyKiogdGV4dF9rZXlzOyAvKnRoZSBrZXl3b3JkIG9mIGEgdGV4dCBjaHVuayAoZS5nLiAiQ29tbWVudCIpKi8KLSAgY2hhcioqIHRleHRfc3RyaW5nczsgLyp0aGUgYWN0dWFsIHRleHQqLwotCi0gIC8qCi0gIGludGVybmF0aW9uYWwgdGV4dCBjaHVua3MgKGlUWHQpCi0gIFNpbWlsYXIgdG8gdGhlIG5vbi1pbnRlcm5hdGlvbmFsIHRleHQgY2h1bmtzLCBidXQgd2l0aCBhZGRpdGlvbmFsIHN0cmluZ3MKLSAgImxhbmd0YWdzIiBhbmQgInRyYW5za2V5cyIuCi0gICovCi0gIHNpemVfdCBpdGV4dF9udW07IC8qdGhlIGFtb3VudCBvZiBpbnRlcm5hdGlvbmFsIHRleHRzIGluIHRoaXMgUE5HKi8KLSAgY2hhcioqIGl0ZXh0X2tleXM7IC8qdGhlIEVuZ2xpc2gga2V5d29yZCBvZiB0aGUgdGV4dCBjaHVuayAoZS5nLiAiQ29tbWVudCIpKi8KLSAgY2hhcioqIGl0ZXh0X2xhbmd0YWdzOyAvKmxhbmd1YWdlIHRhZyBmb3IgdGhpcyB0ZXh0J3MgbGFuZ3VhZ2UsIElTTy9JRUMgNjQ2IHN0cmluZywgZS5nLiBJU08gNjM5IGxhbmd1YWdlIHRhZyovCi0gIGNoYXIqKiBpdGV4dF90cmFuc2tleXM7IC8qa2V5d29yZCB0cmFuc2xhdGVkIHRvIHRoZSBpbnRlcm5hdGlvbmFsIGxhbmd1YWdlIC0gVVRGLTggc3RyaW5nKi8KLSAgY2hhcioqIGl0ZXh0X3N0cmluZ3M7IC8qdGhlIGFjdHVhbCBpbnRlcm5hdGlvbmFsIHRleHQgLSBVVEYtOCBzdHJpbmcqLwotCi0gIC8qdGltZSBjaHVuayAodElNRSkqLwotICB1bnNpZ25lZCB0aW1lX2RlZmluZWQ7IC8qc2V0IHRvIDEgdG8gbWFrZSB0aGUgZW5jb2RlciBnZW5lcmF0ZSBhIHRJTUUgY2h1bmsqLwotICBMb2RlUE5HVGltZSB0aW1lOwotCi0gIC8qcGh5cyBjaHVuayAocEhZcykqLwotICB1bnNpZ25lZCBwaHlzX2RlZmluZWQ7IC8qaWYgMCwgdGhlcmUgaXMgbm8gcEhZcyBjaHVuayBhbmQgdGhlIHZhbHVlcyBiZWxvdyBhcmUgdW5kZWZpbmVkLCBpZiAxIGVsc2UgdGhlcmUgaXMgb25lKi8KLSAgdW5zaWduZWQgcGh5c194OyAvKnBpeGVscyBwZXIgdW5pdCBpbiB4IGRpcmVjdGlvbiovCi0gIHVuc2lnbmVkIHBoeXNfeTsgLypwaXhlbHMgcGVyIHVuaXQgaW4geSBkaXJlY3Rpb24qLwotICB1bnNpZ25lZCBwaHlzX3VuaXQ7IC8qbWF5IGJlIDAgKHVua25vd24gdW5pdCkgb3IgMSAobWV0cmUpKi8KLQotICAvKgotICBDb2xvciBwcm9maWxlIHJlbGF0ZWQgY2h1bmtzOiBnQU1BLCBjSFJNLCBzUkdCLCBpQ1BQCi0KLSAgTG9kZVBORyBkb2VzIG5vdCBhcHBseSBhbnkgY29sb3IgY29udmVyc2lvbnMgb24gcGl4ZWxzIGluIHRoZSBlbmNvZGVyIG9yIGRlY29kZXIgYW5kIGRvZXMgbm90IGludGVycHJldCB0aGVzZSBjb2xvcgotICBwcm9maWxlIHZhbHVlcy4gSXQgbWVyZWx5IHBhc3NlcyBvbiB0aGUgaW5mb3JtYXRpb24uIElmIHlvdSB3aXNoIHRvIHVzZSBjb2xvciBwcm9maWxlcyBhbmQgY29udmVydCBjb2xvcnMsIHBsZWFzZQotICB1c2UgdGhlc2UgdmFsdWVzIHdpdGggYSBjb2xvciBtYW5hZ2VtZW50IGxpYnJhcnkuCi0KLSAgU2VlIHRoZSBQTkcsIElDQyBhbmQgc1JHQiBzcGVjaWZpY2F0aW9ucyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVhbmluZyBvZiB0aGVzZSB2YWx1ZXMuCi0gICovCi0KLSAgLyogZ0FNQSBjaHVuazogb3B0aW9uYWwsIG92ZXJyaWRkZW4gYnkgc1JHQiBvciBpQ0NQIGlmIHRob3NlIGFyZSBwcmVzZW50LiAqLwotICB1bnNpZ25lZCBnYW1hX2RlZmluZWQ7IC8qIFdoZXRoZXIgYSBnQU1BIGNodW5rIGlzIHByZXNlbnQgKDAgPSBub3QgcHJlc2VudCwgMSA9IHByZXNlbnQpLiAqLwotICB1bnNpZ25lZCBnYW1hX2dhbW1hOyAgIC8qIEdhbW1hIGV4cG9uZW50IHRpbWVzIDEwMDAwMCAqLwotCi0gIC8qIGNIUk0gY2h1bms6IG9wdGlvbmFsLCBvdmVycmlkZGVuIGJ5IHNSR0Igb3IgaUNDUCBpZiB0aG9zZSBhcmUgcHJlc2VudC4gKi8KLSAgdW5zaWduZWQgY2hybV9kZWZpbmVkOyAvKiBXaGV0aGVyIGEgY0hSTSBjaHVuayBpcyBwcmVzZW50ICgwID0gbm90IHByZXNlbnQsIDEgPSBwcmVzZW50KS4gKi8KLSAgdW5zaWduZWQgY2hybV93aGl0ZV94OyAvKiBXaGl0ZSBQb2ludCB4IHRpbWVzIDEwMDAwMCAqLwotICB1bnNpZ25lZCBjaHJtX3doaXRlX3k7IC8qIFdoaXRlIFBvaW50IHkgdGltZXMgMTAwMDAwICovCi0gIHVuc2lnbmVkIGNocm1fcmVkX3g7ICAgLyogUmVkIHggdGltZXMgMTAwMDAwICovCi0gIHVuc2lnbmVkIGNocm1fcmVkX3k7ICAgLyogUmVkIHkgdGltZXMgMTAwMDAwICovCi0gIHVuc2lnbmVkIGNocm1fZ3JlZW5feDsgLyogR3JlZW4geCB0aW1lcyAxMDAwMDAgKi8KLSAgdW5zaWduZWQgY2hybV9ncmVlbl95OyAvKiBHcmVlbiB5IHRpbWVzIDEwMDAwMCAqLwotICB1bnNpZ25lZCBjaHJtX2JsdWVfeDsgIC8qIEJsdWUgeCB0aW1lcyAxMDAwMDAgKi8KLSAgdW5zaWduZWQgY2hybV9ibHVlX3k7ICAvKiBCbHVlIHkgdGltZXMgMTAwMDAwICovCi0KLSAgLyoKLSAgc1JHQiBjaHVuazogb3B0aW9uYWwuIE1heSBub3QgYXBwZWFyIGF0IHRoZSBzYW1lIHRpbWUgYXMgaUNDUC4KLSAgSWYgZ0FNQSBpcyBhbHNvIHByZXNlbnQgZ0FNQSBtdXN0IGNvbnRhaW4gdmFsdWUgNDU0NTUuCi0gIElmIGNIUk0gaXMgYWxzbyBwcmVzZW50IGNIUk0gbXVzdCBjb250YWluIHJlc3BlY3RpdmVseSAzMTI3MCwzMjkwMCw2NDAwMCwzMzAwMCwzMDAwMCw2MDAwMCwxNTAwMCw2MDAwLgotICAqLwotICB1bnNpZ25lZCBzcmdiX2RlZmluZWQ7IC8qIFdoZXRoZXIgYW4gc1JHQiBjaHVuayBpcyBwcmVzZW50ICgwID0gbm90IHByZXNlbnQsIDEgPSBwcmVzZW50KS4gKi8KLSAgdW5zaWduZWQgc3JnYl9pbnRlbnQ7ICAvKiBSZW5kZXJpbmcgaW50ZW50OiAwPXBlcmNlcHR1YWwsIDE9cmVsLiBjb2xvcmltZXRyaWMsIDI9c2F0dXJhdGlvbiwgMz1hYnMuIGNvbG9yaW1ldHJpYyAqLwotCi0gIC8qCi0gIGlDQ1AgY2h1bms6IG9wdGlvbmFsLiBNYXkgbm90IGFwcGVhciBhdCB0aGUgc2FtZSB0aW1lIGFzIHNSR0IuCi0KLSAgTG9kZVBORyBkb2VzIG5vdCBwYXJzZSBvciB1c2UgdGhlIElDQyBwcm9maWxlIChleGNlcHQgaXRzIGNvbG9yIHNwYWNlIGhlYWRlciBmaWVsZCBmb3IgYW4gZWRnZSBjYXNlKSwgYQotICBzZXBhcmF0ZSBsaWJyYXJ5IHRvIGhhbmRsZSB0aGUgSUNDIGRhdGEgKG5vdCBpbmNsdWRlZCBpbiBMb2RlUE5HKSBmb3JtYXQgaXMgbmVlZGVkIHRvIHVzZSBpdCBmb3IgY29sb3IKLSAgbWFuYWdlbWVudCBhbmQgY29udmVyc2lvbnMuCi0KLSAgRm9yIGVuY29kaW5nLCBpZiBpQ0NQIGlzIHByZXNlbnQsIGdBTUEgYW5kIGNIUk0gYXJlIHJlY29tbWVuZGVkIHRvIGJlIGFkZGVkIGFzIHdlbGwgd2l0aCB2YWx1ZXMgdGhhdCBtYXRjaCB0aGUgSUNDCi0gIHByb2ZpbGUgYXMgY2xvc2VseSBhcyBwb3NzaWJsZSwgaWYgeW91IHdpc2ggdG8gZG8gdGhpcyB5b3Ugc2hvdWxkIHByb3ZpZGUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciBnQU1BIGFuZCBjSFJNIGFuZAotICBlbmFibGUgdGhlaXIgJ19kZWZpbmVkJyBmbGFncyBzaW5jZSBMb2RlUE5HIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgY29tcHV0ZSB0aGVtIGZyb20gdGhlIElDQyBwcm9maWxlLgotCi0gIEZvciBlbmNvZGluZywgdGhlIElDQyBwcm9maWxlIGlzIHJlcXVpcmVkIGJ5IHRoZSBQTkcgc3BlY2lmaWNhdGlvbiB0byBiZSBhbiAiUkdCIiBwcm9maWxlIGZvciBub24tZ3JheQotICBQTkcgY29sb3IgdHlwZXMgYW5kIGEgIkdSQVkiIHByb2ZpbGUgZm9yIGdyYXkgUE5HIGNvbG9yIHR5cGVzLiBJZiB5b3UgZGlzYWJsZSBhdXRvX2NvbnZlcnQsIHlvdSBtdXN0IGVuc3VyZQotICB0aGUgSUNDIHByb2ZpbGUgdHlwZSBtYXRjaGVzIHlvdXIgcmVxdWVzdGVkIGNvbG9yIHR5cGUsIGVsc2UgdGhlIGVuY29kZXIgZ2l2ZXMgYW4gZXJyb3IuIElmIGF1dG9fY29udmVydCBpcwotICBlbmFibGVkICh0aGUgZGVmYXVsdCksIGFuZCB0aGUgSUNDIHByb2ZpbGUgaXMgbm90IGEgZ29vZCBtYXRjaCBmb3IgdGhlIHBpeGVsIGRhdGEsIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gZW5jb2RlcgotICBlcnJvciBpZiB0aGUgcGl4ZWwgZGF0YSBoYXMgbm9uLWdyYXkgcGl4ZWxzIGZvciBhIEdSQVkgcHJvZmlsZSwgb3IgYSBzaWxlbnQgbGVzcy1vcHRpbWFsIGNvbXByZXNzaW9uIG9mIHRoZSBwaXhlbAotICBkYXRhIGlmIHRoZSBwaXhlbHMgY291bGQgYmUgZW5jb2RlZCBhcyBncmF5c2NhbGUgYnV0IHRoZSBJQ0MgcHJvZmlsZSBpcyBSR0IuCi0KLSAgVG8gYXZvaWQgdGhpcyBkbyBub3Qgc2V0IGFuIElDQyBwcm9maWxlIGluIHRoZSBpbWFnZSB1bmxlc3MgdGhlcmUgaXMgYSBnb29kIHJlYXNvbiBmb3IgaXQsIGFuZCB3aGVuIGRvaW5nIHNvCi0gIG1ha2Ugc3VyZSB5b3UgY29tcHV0ZSBpdCBjYXJlZnVsbHkgdG8gYXZvaWQgdGhlIGFib3ZlIHByb2JsZW1zLgotICAqLwotICB1bnNpZ25lZCBpY2NwX2RlZmluZWQ7ICAgICAgLyogV2hldGhlciBhbiBpQ0NQIGNodW5rIGlzIHByZXNlbnQgKDAgPSBub3QgcHJlc2VudCwgMSA9IHByZXNlbnQpLiAqLwotICBjaGFyKiBpY2NwX25hbWU7ICAgICAgICAgICAgLyogTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHByb2ZpbGUgbmFtZSwgMS03OSBieXRlcyAqLwotICAvKgotICBUaGUgSUNDIHByb2ZpbGUgaW4gaWNjcF9wcm9maWxlX3NpemUgYnl0ZXMuCi0gIERvbid0IGFsbG9jYXRlIHRoaXMgYnVmZmVyIHlvdXJzZWxmLiBVc2UgdGhlIGluaXQvY2xlYW51cCBmdW5jdGlvbnMKLSAgY29ycmVjdGx5IGFuZCB1c2UgbG9kZXBuZ19zZXRfaWNjIGFuZCBsb2RlcG5nX2NsZWFyX2ljYy4KLSAgKi8KLSAgdW5zaWduZWQgY2hhciogaWNjcF9wcm9maWxlOwotICB1bnNpZ25lZCBpY2NwX3Byb2ZpbGVfc2l6ZTsgLyogVGhlIHNpemUgb2YgaWNjcF9wcm9maWxlIGluIGJ5dGVzICovCi0KLSAgLyogRW5kIG9mIGNvbG9yIHByb2ZpbGUgcmVsYXRlZCBjaHVua3MgKi8KLQotCi0gIC8qCi0gIHVua25vd24gY2h1bmtzOiBjaHVua3Mgbm90IGtub3duIGJ5IExvZGVQTkcsIHBhc3NlZCBvbiBieXRlIGZvciBieXRlLgotCi0gIFRoZXJlIGFyZSAzIGJ1ZmZlcnMsIG9uZSBmb3IgZWFjaCBwb3NpdGlvbiBpbiB0aGUgUE5HIHdoZXJlIHVua25vd24gY2h1bmtzIGNhbiBhcHBlYXIuCi0gIEVhY2ggYnVmZmVyIGNvbnRhaW5zIGFsbCB1bmtub3duIGNodW5rcyBmb3IgdGhhdCBwb3NpdGlvbiBjb25zZWN1dGl2ZWx5LgotICBUaGUgMyBwb3NpdGlvbnMgYXJlOgotICAwOiBiZXR3ZWVuIElIRFIgYW5kIFBMVEUsIDE6IGJldHdlZW4gUExURSBhbmQgSURBVCwgMjogYmV0d2VlbiBJREFUIGFuZCBJRU5ELgotCi0gIEZvciBlbmNvZGluZywgZG8gbm90IHN0b3JlIGNyaXRpY2FsIGNodW5rcyBvciBrbm93biBjaHVua3MgdGhhdCBhcmUgZW5hYmxlZCB3aXRoIGEgIl9kZWZpbmVkIiBmbGFnCi0gIGFib3ZlIGluIGhlcmUsIHNpbmNlIHRoZSBlbmNvZGVyIHdpbGwgYmxpbmRseSBmb2xsb3cgdGhpcyBhbmQgY291bGQgdGhlbiBlbmNvZGUgYW4gaW52YWxpZCBQTkcgZmlsZQotICAoc3VjaCBhcyBvbmUgd2l0aCB0d28gSUhEUiBjaHVua3Mgb3IgdGhlIGRpc2FsbG93ZWQgY29tYmluYXRpb24gb2Ygc1JHQiB3aXRoIGlDQ1ApLiBCdXQgZG8gdXNlCi0gIHRoaXMgaWYgeW91IHdpc2ggdG8gc3RvcmUgYW4gYW5jaWxsYXJ5IGNodW5rIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSBMb2RlUE5HIChzdWNoIGFzIHNQTFQgb3IgaElTVCksCi0gIG9yIGFueSBub24tc3RhbmRhcmQgUE5HIGNodW5rLgotCi0gIERvIG5vdCBhbGxvY2F0ZSBvciB0cmF2ZXJzZSB0aGlzIGRhdGEgeW91cnNlbGYuIFVzZSB0aGUgY2h1bmsgdHJhdmVyc2luZyBmdW5jdGlvbnMgZGVjbGFyZWQKLSAgbGF0ZXIsIHN1Y2ggYXMgbG9kZXBuZ19jaHVua19uZXh0IGFuZCBsb2RlcG5nX2NodW5rX2FwcGVuZCwgdG8gcmVhZC93cml0ZSB0aGlzIHN0cnVjdC4KLSAgKi8KLSAgdW5zaWduZWQgY2hhciogdW5rbm93bl9jaHVua3NfZGF0YVszXTsKLSAgc2l6ZV90IHVua25vd25fY2h1bmtzX3NpemVbM107IC8qc2l6ZSBpbiBieXRlcyBvZiB0aGUgdW5rbm93biBjaHVua3MsIGdpdmVuIGZvciBwcm90ZWN0aW9uKi8KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLX0gTG9kZVBOR0luZm87Ci0KLS8qaW5pdCwgY2xlYW51cCBhbmQgY29weSBmdW5jdGlvbnMgdG8gdXNlIHdpdGggdGhpcyBzdHJ1Y3QqLwotdm9pZCBsb2RlcG5nX2luZm9faW5pdChMb2RlUE5HSW5mbyogaW5mbyk7Ci12b2lkIGxvZGVwbmdfaW5mb19jbGVhbnVwKExvZGVQTkdJbmZvKiBpbmZvKTsKLS8qcmV0dXJuIHZhbHVlIGlzIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3IpKi8KLXVuc2lnbmVkIGxvZGVwbmdfaW5mb19jb3B5KExvZGVQTkdJbmZvKiBkZXN0LCBjb25zdCBMb2RlUE5HSW5mbyogc291cmNlKTsKLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTCi11bnNpZ25lZCBsb2RlcG5nX2FkZF90ZXh0KExvZGVQTkdJbmZvKiBpbmZvLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHN0cik7IC8qcHVzaCBiYWNrIGJvdGggdGV4dHMgYXQgb25jZSovCi12b2lkIGxvZGVwbmdfY2xlYXJfdGV4dChMb2RlUE5HSW5mbyogaW5mbyk7IC8qdXNlIHRoaXMgdG8gY2xlYXIgdGhlIHRleHRzIGFnYWluIGFmdGVyIHlvdSBmaWxsZWQgdGhlbSBpbiovCi0KLXVuc2lnbmVkIGxvZGVwbmdfYWRkX2l0ZXh0KExvZGVQTkdJbmZvKiBpbmZvLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIGxhbmd0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0cmFuc2tleSwgY29uc3QgY2hhciogc3RyKTsgLypwdXNoIGJhY2sgdGhlIDQgdGV4dHMgb2YgMSBjaHVuayBhdCBvbmNlKi8KLXZvaWQgbG9kZXBuZ19jbGVhcl9pdGV4dChMb2RlUE5HSW5mbyogaW5mbyk7IC8qdXNlIHRoaXMgdG8gY2xlYXIgdGhlIGl0ZXh0cyBhZ2FpbiBhZnRlciB5b3UgZmlsbGVkIHRoZW0gaW4qLwotCi0vKnJlcGxhY2VzIGlmIGV4aXN0cyovCi11bnNpZ25lZCBsb2RlcG5nX3NldF9pY2MoTG9kZVBOR0luZm8qIGluZm8sIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHByb2ZpbGUsIHVuc2lnbmVkIHByb2ZpbGVfc2l6ZSk7Ci12b2lkIGxvZGVwbmdfY2xlYXJfaWNjKExvZGVQTkdJbmZvKiBpbmZvKTsgLyp1c2UgdGhpcyB0byBjbGVhciB0aGUgdGV4dHMgYWdhaW4gYWZ0ZXIgeW91IGZpbGxlZCB0aGVtIGluKi8KLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLQotLyoKLUNvbnZlcnRzIHJhdyBidWZmZXIgZnJvbSBvbmUgY29sb3IgdHlwZSB0byBhbm90aGVyIGNvbG9yIHR5cGUsIGJhc2VkIG9uCi1Mb2RlUE5HQ29sb3JNb2RlIHN0cnVjdHMgdG8gZGVzY3JpYmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29sb3IgdHlwZS4KLVNlZSB0aGUgcmVmZXJlbmNlIG1hbnVhbCBhdCB0aGUgZW5kIG9mIHRoaXMgaGVhZGVyIGZpbGUgdG8gc2VlIHdoaWNoIGNvbG9yIGNvbnZlcnNpb25zIGFyZSBzdXBwb3J0ZWQuCi1yZXR1cm4gdmFsdWUgPSBMb2RlUE5HIGVycm9yIGNvZGUgKDAgaWYgYWxsIHdlbnQgb2ssIGFuIGVycm9yIGlmIHRoZSBjb252ZXJzaW9uIGlzbid0IHN1cHBvcnRlZCkKLVRoZSBvdXQgYnVmZmVyIG11c3QgaGF2ZSBzaXplICh3ICogaCAqIGJwcCArIDcpIC8gOCwgd2hlcmUgYnBwIGlzIHRoZSBiaXRzIHBlciBwaXhlbAotb2YgdGhlIG91dHB1dCBjb2xvciB0eXBlIChsb2RlcG5nX2dldF9icHApLgotRm9yIDwgOCBicHAgaW1hZ2VzLCB0aGVyZSBzaG91bGQgbm90IGJlIHBhZGRpbmcgYml0cyBhdCB0aGUgZW5kIG9mIHNjYW5saW5lcy4KLUZvciAxNi1iaXQgcGVyIGNoYW5uZWwgY29sb3JzLCB1c2VzIGJpZyBlbmRpYW4gZm9ybWF0IGxpa2UgUE5HIGRvZXMuCi1SZXR1cm4gdmFsdWUgaXMgTG9kZVBORyBlcnJvciBjb2RlCi0qLwotdW5zaWduZWQgbG9kZXBuZ19jb252ZXJ0KHVuc2lnbmVkIGNoYXIqIG91dCwgY29uc3QgdW5zaWduZWQgY2hhciogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbG9yTW9kZSogbW9kZV9vdXQsIGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIG1vZGVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdywgdW5zaWduZWQgaCk7Ci0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotLyoKLVNldHRpbmdzIGZvciB0aGUgZGVjb2Rlci4gVGhpcyBjb250YWlucyBzZXR0aW5ncyBmb3IgdGhlIFBORyBhbmQgdGhlIFpsaWIKLWRlY29kZXIsIGJ1dCBub3QgdGhlIEluZm8gc2V0dGluZ3MgZnJvbSB0aGUgSW5mbyBzdHJ1Y3RzLgotKi8KLXR5cGVkZWYgc3RydWN0IExvZGVQTkdEZWNvZGVyU2V0dGluZ3MgewotICBMb2RlUE5HRGVjb21wcmVzc1NldHRpbmdzIHpsaWJzZXR0aW5nczsgLyppbiBoZXJlIGlzIHRoZSBzZXR0aW5nIHRvIGlnbm9yZSBBZGxlcjMyIGNoZWNrc3VtcyovCi0KLSAgLyogQ2hlY2sgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyBmb3IgbW9yZSBpZ25vcmFibGUgZXJyb3JzIHN1Y2ggYXMgaWdub3JlX2FkbGVyMzIgKi8KLSAgdW5zaWduZWQgaWdub3JlX2NyYzsgLyppZ25vcmUgQ1JDIGNoZWNrc3VtcyovCi0gIHVuc2lnbmVkIGlnbm9yZV9jcml0aWNhbDsgLyppZ25vcmUgdW5rbm93biBjcml0aWNhbCBjaHVua3MqLwotICB1bnNpZ25lZCBpZ25vcmVfZW5kOyAvKmlnbm9yZSBpc3N1ZXMgYXQgZW5kIG9mIGZpbGUgaWYgcG9zc2libGUgKG1pc3NpbmcgSUVORCBjaHVuaywgdG9vIGxhcmdlIGNodW5rLCAuLi4pKi8KLSAgLyogVE9ETzogbWFrZSBhIHN5c3RlbSBpbnZvbHZpbmcgd2FybmluZ3Mgd2l0aCBsZXZlbHMgYW5kIGEgc3RyaWN0IG1vZGUgaW5zdGVhZC4gT3RoZXIgcG90ZW50aWFsbHkgcmVjb3ZlcmFibGUKLSAgICAgZXJyb3JzOiBzcmdiIHJlbmRlcmluZyBpbnRlbnQgdmFsdWUsIHNpemUgb2YgY29udGVudCBvZiBhbmNpbGxhcnkgY2h1bmtzLCBtb3JlIHRoYW4gNzkgY2hhcmFjdGVycyBmb3Igc29tZQotICAgICBzdHJpbmdzLCBwbGFjZW1lbnQvY29tYmluYXRpb24gcnVsZXMgZm9yIGFuY2lsbGFyeSBjaHVua3MsIGNyYyBvZiB1bmtub3duIGNodW5rcywgYWxsb3dlZCBjaGFyYWN0ZXJzCi0gICAgIGluIHN0cmluZyBrZXlzLCBldGMuLi4gKi8KLQotICB1bnNpZ25lZCBjb2xvcl9jb252ZXJ0OyAvKndoZXRoZXIgdG8gY29udmVydCB0aGUgUE5HIHRvIHRoZSBjb2xvciB0eXBlIHlvdSB3YW50LiBEZWZhdWx0OiB5ZXMqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgdW5zaWduZWQgcmVhZF90ZXh0X2NodW5rczsgLyppZiBmYWxzZSBidXQgcmVtZW1iZXJfdW5rbm93bl9jaHVua3MgaXMgdHJ1ZSwgdGhleSdyZSBzdG9yZWQgaW4gdGhlIHVua25vd24gY2h1bmtzKi8KLSAgLypzdG9yZSBhbGwgYnl0ZXMgZnJvbSB1bmtub3duIGNodW5rcyBpbiB0aGUgTG9kZVBOR0luZm8gKG9mZiBieSBkZWZhdWx0LCB1c2VmdWwgZm9yIGEgcG5nIGVkaXRvcikqLwotICB1bnNpZ25lZCByZW1lbWJlcl91bmtub3duX2NodW5rczsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9BTkNJTExBUllfQ0hVTktTKi8KLX0gTG9kZVBOR0RlY29kZXJTZXR0aW5nczsKLQotdm9pZCBsb2RlcG5nX2RlY29kZXJfc2V0dGluZ3NfaW5pdChMb2RlUE5HRGVjb2RlclNldHRpbmdzKiBzZXR0aW5ncyk7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfREVDT0RFUiovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUgotLyphdXRvbWF0aWNhbGx5IHVzZSBjb2xvciB0eXBlIHdpdGggbGVzcyBiaXRzIHBlciBwaXhlbCBpZiBsb3NzbGVzc2x5IHBvc3NpYmxlLiBEZWZhdWx0OiBBVVRPKi8KLXR5cGVkZWYgZW51bSBMb2RlUE5HRmlsdGVyU3RyYXRlZ3kgewotICAvKmV2ZXJ5IGZpbHRlciBhdCB6ZXJvKi8KLSAgTEZTX1pFUk8sCi0gIC8qVXNlIGZpbHRlciB0aGF0IGdpdmVzIG1pbmltdW0gc3VtLCBhcyBkZXNjcmliZWQgaW4gdGhlIG9mZmljaWFsIFBORyBmaWx0ZXIgaGV1cmlzdGljLiovCi0gIExGU19NSU5TVU0sCi0gIC8qVXNlIHRoZSBmaWx0ZXIgdHlwZSB0aGF0IGdpdmVzIHNtYWxsZXN0IFNoYW5ub24gZW50cm9weSBmb3IgdGhpcyBzY2FubGluZS4gRGVwZW5kaW5nCi0gIG9uIHRoZSBpbWFnZSwgdGhpcyBpcyBiZXR0ZXIgb3Igd29yc2UgdGhhbiBtaW5zdW0uKi8KLSAgTEZTX0VOVFJPUFksCi0gIC8qCi0gIEJydXRlLWZvcmNlLXNlYXJjaCBQTkcgZmlsdGVycyBieSBjb21wcmVzc2luZyBlYWNoIGZpbHRlciBmb3IgZWFjaCBzY2FubGluZS4KLSAgRXhwZXJpbWVudGFsLCB2ZXJ5IHNsb3csIGFuZCBvbmx5IHJhcmVseSBnaXZlcyBiZXR0ZXIgY29tcHJlc3Npb24gdGhhbiBNSU5TVU0uCi0gICovCi0gIExGU19CUlVURV9GT1JDRSwKLSAgLyp1c2UgcHJlZGVmaW5lZF9maWx0ZXJzIGJ1ZmZlcjogeW91IHNwZWNpZnkgdGhlIGZpbHRlciB0eXBlIGZvciBlYWNoIHNjYW5saW5lKi8KLSAgTEZTX1BSRURFRklORUQKLX0gTG9kZVBOR0ZpbHRlclN0cmF0ZWd5OwotCi0vKkdpdmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgaW50ZWdlciBSR0JBIGNvbG9ycyBvZiB0aGUgaW1hZ2UgKGNvdW50LCBhbHBoYSBjaGFubmVsIHVzYWdlLCBiaXQgZGVwdGgsIC4uLiksCi13aGljaCBoZWxwcyBkZWNpZGUgd2hpY2ggY29sb3IgbW9kZWwgdG8gdXNlIGZvciBlbmNvZGluZy4KLVVzZWQgaW50ZXJuYWxseSBieSBkZWZhdWx0IGlmICJhdXRvX2NvbnZlcnQiIGlzIGVuYWJsZWQuIFB1YmxpYyBiZWNhdXNlIGl0J3MgdXNlZnVsIGZvciBjdXN0b20gYWxnb3JpdGhtcy4KLU5PVEU6IFRoaXMgaXMgbm90IHJlbGF0ZWQgdG8gdGhlIElDQyBjb2xvciBwcm9maWxlLCBzZWFyY2ggImljY3BfcHJvZmlsZSIgaW5zdGVhZCB0byBmaW5kIHRoZSBJQ0MvY2hyb21hY2l0eS8uLi4KLWZpZWxkcyBpbiB0aGlzIGhlYWRlciBmaWxlLiovCi10eXBlZGVmIHN0cnVjdCBMb2RlUE5HQ29sb3JQcm9maWxlIHsKLSAgdW5zaWduZWQgY29sb3JlZDsgLypub3QgZ3JheXNjYWxlKi8KLSAgdW5zaWduZWQga2V5OyAvKmltYWdlIGlzIG5vdCBvcGFxdWUgYW5kIGNvbG9yIGtleSBpcyBwb3NzaWJsZSBpbnN0ZWFkIG9mIGZ1bGwgYWxwaGEqLwotICB1bnNpZ25lZCBzaG9ydCBrZXlfcjsgLyprZXkgdmFsdWVzLCBhbHdheXMgYXMgMTYtYml0LCBpbiA4LWJpdCBjYXNlIHRoZSBieXRlIGlzIGR1cGxpY2F0ZWQsIGUuZy4gNjU1MzUgbWVhbnMgMjU1Ki8KLSAgdW5zaWduZWQgc2hvcnQga2V5X2c7Ci0gIHVuc2lnbmVkIHNob3J0IGtleV9iOwotICB1bnNpZ25lZCBhbHBoYTsgLyppbWFnZSBpcyBub3Qgb3BhcXVlIGFuZCBhbHBoYSBjaGFubmVsIG9yIGFscGhhIHBhbGV0dGUgcmVxdWlyZWQqLwotICB1bnNpZ25lZCBudW1jb2xvcnM7IC8qYW1vdW50IG9mIGNvbG9ycywgdXAgdG8gMjU3LiBOb3QgdmFsaWQgaWYgYml0cyA9PSAxNi4qLwotICB1bnNpZ25lZCBjaGFyIHBhbGV0dGVbMTAyNF07IC8qUmVtZW1iZXJzIHVwIHRvIHRoZSBmaXJzdCAyNTYgUkdCQSBjb2xvcnMsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIqLwotICB1bnNpZ25lZCBiaXRzOyAvKmJpdHMgcGVyIGNoYW5uZWwgKG5vdCBmb3IgcGFsZXR0ZSkuIDEsMiBvciA0IGZvciBncmF5c2NhbGUgb25seS4gMTYgaWYgMTYtYml0IHBlciBjaGFubmVsIHJlcXVpcmVkLiovCi0gIHNpemVfdCBudW1waXhlbHM7Ci19IExvZGVQTkdDb2xvclByb2ZpbGU7Ci0KLXZvaWQgbG9kZXBuZ19jb2xvcl9wcm9maWxlX2luaXQoTG9kZVBOR0NvbG9yUHJvZmlsZSogcHJvZmlsZSk7Ci0KLS8qR2V0IGEgTG9kZVBOR0NvbG9yUHJvZmlsZSBvZiB0aGUgaW1hZ2UuIFRoZSBwcm9maWxlIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGVkLgotTk9URTogVGhpcyBpcyBub3QgcmVsYXRlZCB0byB0aGUgSUNDIGNvbG9yIHByb2ZpbGUsIHNlYXJjaCAiaWNjcF9wcm9maWxlIiBpbnN0ZWFkIHRvIGZpbmQgdGhlIElDQy9jaHJvbWFjaXR5Ly4uLgotZmllbGRzIGluIHRoaXMgaGVhZGVyIGZpbGUuKi8KLXVuc2lnbmVkIGxvZGVwbmdfZ2V0X2NvbG9yX3Byb2ZpbGUoTG9kZVBOR0NvbG9yUHJvZmlsZSogcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW1hZ2UsIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdDb2xvck1vZGUqIG1vZGVfaW4pOwotLypUaGUgZnVuY3Rpb24gTG9kZVBORyB1c2VzIGludGVybmFsbHkgdG8gZGVjaWRlIHRoZSBQTkcgY29sb3Igd2l0aCBhdXRvX2NvbnZlcnQuCi1DaG9vc2VzIGFuIG9wdGltYWwgY29sb3IgbW9kZWwsIGUuZy4gZ3JheSBpZiBvbmx5IGdyYXkgcGl4ZWxzLCBwYWxldHRlIGlmIDwgMjU2IGNvbG9ycywgLi4uKi8KLXVuc2lnbmVkIGxvZGVwbmdfYXV0b19jaG9vc2VfY29sb3IoTG9kZVBOR0NvbG9yTW9kZSogbW9kZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGltYWdlLCB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HQ29sb3JNb2RlKiBtb2RlX2luKTsKLQotLypTZXR0aW5ncyBmb3IgdGhlIGVuY29kZXIuKi8KLXR5cGVkZWYgc3RydWN0IExvZGVQTkdFbmNvZGVyU2V0dGluZ3MgewotICBMb2RlUE5HQ29tcHJlc3NTZXR0aW5ncyB6bGlic2V0dGluZ3M7IC8qc2V0dGluZ3MgZm9yIHRoZSB6bGliIGVuY29kZXIsIHN1Y2ggYXMgd2luZG93IHNpemUsIC4uLiovCi0KLSAgdW5zaWduZWQgYXV0b19jb252ZXJ0OyAvKmF1dG9tYXRpY2FsbHkgY2hvb3NlIG91dHB1dCBQTkcgY29sb3IgdHlwZS4gRGVmYXVsdDogdHJ1ZSovCi0KLSAgLypJZiB0cnVlLCBmb2xsb3dzIHRoZSBvZmZpY2lhbCBQTkcgaGV1cmlzdGljOiBpZiB0aGUgUE5HIHVzZXMgYSBwYWxldHRlIG9yIGxvd2VyIHRoYW4KLSAgOCBiaXQgZGVwdGgsIHNldCBhbGwgZmlsdGVycyB0byB6ZXJvLiBPdGhlcndpc2UgdXNlIHRoZSBmaWx0ZXJfc3RyYXRlZ3kuIE5vdGUgdGhhdCB0bwotICBjb21wbGV0ZWx5IGZvbGxvdyB0aGUgb2ZmaWNpYWwgUE5HIGhldXJpc3RpYywgZmlsdGVyX3BhbGV0dGVfemVybyBtdXN0IGJlIHRydWUgYW5kCi0gIGZpbHRlcl9zdHJhdGVneSBtdXN0IGJlIExGU19NSU5TVU0qLwotICB1bnNpZ25lZCBmaWx0ZXJfcGFsZXR0ZV96ZXJvOwotICAvKldoaWNoIGZpbHRlciBzdHJhdGVneSB0byB1c2Ugd2hlbiBub3QgdXNpbmcgemVyb2VzIGR1ZSB0byBmaWx0ZXJfcGFsZXR0ZV96ZXJvLgotICBTZXQgZmlsdGVyX3BhbGV0dGVfemVybyB0byAwIHRvIGVuc3VyZSBhbHdheXMgdXNpbmcgeW91ciBjaG9zZW4gc3RyYXRlZ3kuIERlZmF1bHQ6IExGU19NSU5TVU0qLwotICBMb2RlUE5HRmlsdGVyU3RyYXRlZ3kgZmlsdGVyX3N0cmF0ZWd5OwotICAvKnVzZWQgaWYgZmlsdGVyX3N0cmF0ZWd5IGlzIExGU19QUkVERUZJTkVELiBJbiB0aGF0IGNhc2UsIHRoaXMgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciB3aXRoCi0gIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgYW1vdW50IG9mIHNjYW5saW5lcyBpbiB0aGUgaW1hZ2UsIGFuZCBlYWNoIHZhbHVlIG11c3QgPD0gNS4gWW91Ci0gIGhhdmUgdG8gY2xlYW51cCB0aGlzIGJ1ZmZlciwgTG9kZVBORyB3aWxsIG5ldmVyIGZyZWUgaXQuIERvbid0IGZvcmdldCB0aGF0IGZpbHRlcl9wYWxldHRlX3plcm8KLSAgbXVzdCBiZSBzZXQgdG8gMCB0byBlbnN1cmUgdGhpcyBpcyBhbHNvIHVzZWQgb24gcGFsZXR0ZSBvciBsb3cgYml0ZGVwdGggaW1hZ2VzLiovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHByZWRlZmluZWRfZmlsdGVyczsKLQotICAvKmZvcmNlIGNyZWF0aW5nIGEgUExURSBjaHVuayBpZiBjb2xvcnR5cGUgaXMgMiBvciA2ICg9IGEgc3VnZ2VzdGVkIHBhbGV0dGUpLgotICBJZiBjb2xvcnR5cGUgaXMgMywgUExURSBpcyBfYWx3YXlzXyBjcmVhdGVkLiovCi0gIHVuc2lnbmVkIGZvcmNlX3BhbGV0dGU7Ci0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0FOQ0lMTEFSWV9DSFVOS1MKLSAgLyphZGQgTG9kZVBORyBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIGFzIGEgdGV4dCBjaHVuaywgZm9yIGRlYnVnZ2luZyovCi0gIHVuc2lnbmVkIGFkZF9pZDsKLSAgLyplbmNvZGUgdGV4dCBjaHVua3MgYXMgelRYdCBjaHVua3MgaW5zdGVhZCBvZiB0RVh0IGNodW5rcywgYW5kIHVzZSBjb21wcmVzc2lvbiBpbiBpVFh0IGNodW5rcyovCi0gIHVuc2lnbmVkIHRleHRfY29tcHJlc3Npb247Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfQU5DSUxMQVJZX0NIVU5LUyovCi19IExvZGVQTkdFbmNvZGVyU2V0dGluZ3M7Ci0KLXZvaWQgbG9kZXBuZ19lbmNvZGVyX3NldHRpbmdzX2luaXQoTG9kZVBOR0VuY29kZXJTZXR0aW5ncyogc2V0dGluZ3MpOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotCi0KLSNpZiBkZWZpbmVkKExPREVQTkdfQ09NUElMRV9ERUNPREVSKSB8fCBkZWZpbmVkKExPREVQTkdfQ09NUElMRV9FTkNPREVSKQotLypUaGUgc2V0dGluZ3MsIHN0YXRlIGFuZCBpbmZvcm1hdGlvbiBmb3IgZXh0ZW5kZWQgZW5jb2RpbmcgYW5kIGRlY29kaW5nLiovCi10eXBlZGVmIHN0cnVjdCBMb2RlUE5HU3RhdGUgewotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ERUNPREVSCi0gIExvZGVQTkdEZWNvZGVyU2V0dGluZ3MgZGVjb2RlcjsgLyp0aGUgZGVjb2Rpbmcgc2V0dGluZ3MqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RFQ09ERVIqLwotI2lmZGVmIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi0gIExvZGVQTkdFbmNvZGVyU2V0dGluZ3MgZW5jb2RlcjsgLyp0aGUgZW5jb2Rpbmcgc2V0dGluZ3MqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotICBMb2RlUE5HQ29sb3JNb2RlIGluZm9fcmF3OyAvKnNwZWNpZmllcyB0aGUgZm9ybWF0IGluIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGdldCB0aGUgcmF3IHBpeGVsIGJ1ZmZlciovCi0gIExvZGVQTkdJbmZvIGluZm9fcG5nOyAvKmluZm8gb2YgdGhlIFBORyBpbWFnZSBvYnRhaW5lZCBhZnRlciBkZWNvZGluZyovCi0gIHVuc2lnbmVkIGVycm9yOwotI2lmZGVmIExPREVQTkdfQ09NUElMRV9DUFAKLSAgLyogRm9yIHRoZSBsb2RlcG5nOjpTdGF0ZSBzdWJjbGFzcy4gKi8KLSAgdmlydHVhbCB+TG9kZVBOR1N0YXRlKCl7fQotI2VuZGlmCi19IExvZGVQTkdTdGF0ZTsKLQotLyppbml0LCBjbGVhbnVwIGFuZCBjb3B5IGZ1bmN0aW9ucyB0byB1c2Ugd2l0aCB0aGlzIHN0cnVjdCovCi12b2lkIGxvZGVwbmdfc3RhdGVfaW5pdChMb2RlUE5HU3RhdGUqIHN0YXRlKTsKLXZvaWQgbG9kZXBuZ19zdGF0ZV9jbGVhbnVwKExvZGVQTkdTdGF0ZSogc3RhdGUpOwotdm9pZCBsb2RlcG5nX3N0YXRlX2NvcHkoTG9kZVBOR1N0YXRlKiBkZXN0LCBjb25zdCBMb2RlUE5HU3RhdGUqIHNvdXJjZSk7Ci0jZW5kaWYgLyogZGVmaW5lZChMT0RFUE5HX0NPTVBJTEVfREVDT0RFUikgfHwgZGVmaW5lZChMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUikgKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ERUNPREVSCi0vKgotU2FtZSBhcyBsb2RlcG5nX2RlY29kZV9tZW1vcnksIGJ1dCB1c2VzIGEgTG9kZVBOR1N0YXRlIHRvIGFsbG93IGN1c3RvbSBzZXR0aW5ncyBhbmQKLWdldHRpbmcgbXVjaCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQTkcgaW1hZ2UgYW5kIGNvbG9yIG1vZGUuCi0qLwotdW5zaWduZWQgbG9kZXBuZ19kZWNvZGUodW5zaWduZWQgY2hhcioqIG91dCwgdW5zaWduZWQqIHcsIHVuc2lnbmVkKiBoLAotICAgICAgICAgICAgICAgICAgICAgICAgTG9kZVBOR1N0YXRlKiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplKTsKLQotLyoKLVJlYWQgdGhlIFBORyBoZWFkZXIsIGJ1dCBub3QgdGhlIGFjdHVhbCBkYXRhLiBUaGlzIHJldHVybnMgb25seSB0aGUgaW5mb3JtYXRpb24KLXRoYXQgaXMgaW4gdGhlIElIRFIgY2h1bmsgb2YgdGhlIFBORywgc3VjaCBhcyB3aWR0aCwgaGVpZ2h0IGFuZCBjb2xvciB0eXBlLiBUaGUKLWluZm9ybWF0aW9uIGlzIHBsYWNlZCBpbiB0aGUgaW5mb19wbmcgZmllbGQgb2YgdGhlIExvZGVQTkdTdGF0ZS4KLSovCi11bnNpZ25lZCBsb2RlcG5nX2luc3BlY3QodW5zaWduZWQqIHcsIHVuc2lnbmVkKiBoLAotICAgICAgICAgICAgICAgICAgICAgICAgIExvZGVQTkdTdGF0ZSogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpbnNpemUpOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RFQ09ERVIqLwotCi0vKgotUmVhZHMgb25lIG1ldGFkYXRhIGNodW5rIChvdGhlciB0aGFuIElIRFIpIG9mIHRoZSBQTkcgZmlsZSBhbmQgb3V0cHV0cyB3aGF0IGl0Ci1yZWFkIGluIHRoZSBzdGF0ZS4gUmV0dXJucyBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi1Vc2UgbG9kZXBuZ19pbnNwZWN0IGZpcnN0IHdpdGggYSBuZXcgc3RhdGUsIHRoZW4gZS5nLiBsb2RlcG5nX2NodW5rX2ZpbmRfY29uc3QKLXRvIGZpbmQgdGhlIGRlc2lyZWQgY2h1bmsgdHlwZSwgYW5kIGlmIG5vbiBudWxsIHVzZSBsb2RlcG5nX2luc3BlY3RfY2h1bmsgKHdpdGgKLWNodW5rX3BvaW50ZXIgLSBzdGFydF9vZl9maWxlIGFzIHBvcykuCi1TdXBwb3J0cyBtb3N0IG1ldGFkYXRhIGNodW5rcyBmcm9tIHRoZSBQTkcgc3RhbmRhcmQgKGdBTUEsIGJLR0QsIHRFWHQsIC4uLikuCi1JZ25vcmVzIHVuc3VwcG9ydGVkLCB1bmtub3duLCBub24tbWV0YWRhdGEgb3IgSUhEUiBjaHVua3MgKHdpdGhvdXQgZXJyb3IpLgotUmVxdWlyZW1lbnRzOiAmaW5bcG9zXSBtdXN0IHBvaW50IHRvIHN0YXJ0IG9mIGEgY2h1bmssIG11c3QgdXNlIHJlZ3VsYXIKLWxvZGVwbmdfaW5zcGVjdCBmaXJzdCBzaW5jZSBmb3JtYXQgb2YgbW9zdCBvdGhlciBjaHVua3MgZGVwZW5kcyBvbiBJSERSLCBhbmQgaWYKLXRoZXJlIGlzIGEgUExURSBjaHVuaywgdGhhdCBvbmUgbXVzdCBiZSBpbnNwZWN0ZWQgYmVmb3JlIHRSTlMgb3IgYktHRC4KLSovCi11bnNpZ25lZCBsb2RlcG5nX2luc3BlY3RfY2h1bmsoTG9kZVBOR1N0YXRlKiBzdGF0ZSwgc2l6ZV90IHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgc2l6ZV90IGluc2l6ZSk7Ci0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfRU5DT0RFUgotLypUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgb3V0IGJ1ZmZlciB3aXRoIHN0YW5kYXJkIG1hbGxvYyBhbmQgc3RvcmVzIHRoZSBzaXplIGluICpvdXRzaXplLiovCi11bnNpZ25lZCBsb2RlcG5nX2VuY29kZSh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbWFnZSwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZGVQTkdTdGF0ZSogc3RhdGUpOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotCi0vKgotVGhlIGxvZGVwbmdfY2h1bmsgZnVuY3Rpb25zIGFyZSBub3JtYWxseSBub3QgbmVlZGVkLCBleGNlcHQgdG8gdHJhdmVyc2UgdGhlCi11bmtub3duIGNodW5rcyBzdG9yZWQgaW4gdGhlIExvZGVQTkdJbmZvIHN0cnVjdCwgb3IgYWRkIG5ldyBvbmVzIHRvIGl0LgotSXQgYWxzbyBhbGxvd3MgdHJhdmVyc2luZyB0aGUgY2h1bmtzIG9mIGFuIGVuY29kZWQgUE5HIGZpbGUgeW91cnNlbGYuCi0KLVRoZSBjaHVuayBwb2ludGVyIGFsd2F5cyBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2h1bmsgaXRzZWxmLCB0aGF0IGlzCi10aGUgZmlyc3QgYnl0ZSBvZiB0aGUgNCBsZW5ndGggYnl0ZXMuCi0KLUluIHRoZSBQTkcgZmlsZSBmb3JtYXQsIGNodW5rcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotLTQgYnl0ZXMgbGVuZ3RoOiBsZW5ndGggb2YgdGhlIGRhdGEgb2YgdGhlIGNodW5rIGluIGJ5dGVzIChjaHVuayBpdHNlbGYgaXMgMTIgYnl0ZXMgbG9uZ2VyKQotLTQgYnl0ZXMgY2h1bmsgdHlwZSAoQVNDSUkgYS16LEEtWiBvbmx5LCBzZWUgYmVsb3cpCi0tbGVuZ3RoIGJ5dGVzIG9mIGRhdGEgKG1heSBiZSAwIGJ5dGVzIGlmIGxlbmd0aCB3YXMgMCkKLS00IGJ5dGVzIG9mIENSQywgY29tcHV0ZWQgb24gY2h1bmsgbmFtZSArIGRhdGEKLQotVGhlIGZpcnN0IGNodW5rIHN0YXJ0cyBhdCB0aGUgOHRoIGJ5dGUgb2YgdGhlIFBORyBmaWxlLCB0aGUgZW50aXJlIHJlc3Qgb2YgdGhlIGZpbGUKLWV4aXN0cyBvdXQgb2YgY29uY2F0ZW5hdGVkIGNodW5rcyB3aXRoIHRoZSBhYm92ZSBmb3JtYXQuCi0KLVBORyBzdGFuZGFyZCBjaHVuayBBU0NJSSBuYW1pbmcgY29udmVudGlvbnM6Ci0tRmlyc3QgYnl0ZTogdXBwZXJjYXNlID0gY3JpdGljYWwsIGxvd2VyY2FzZSA9IGFuY2lsbGFyeQotLVNlY29uZCBieXRlOiB1cHBlcmNhc2UgPSBwdWJsaWMsIGxvd2VyY2FzZSA9IHByaXZhdGUKLS1UaGlyZCBieXRlOiBtdXN0IGJlIHVwcGVyY2FzZQotLUZvdXJ0aCBieXRlOiB1cHBlcmNhc2UgPSB1bnNhZmUgdG8gY29weSwgbG93ZXJjYXNlID0gc2FmZSB0byBjb3B5Ci0qLwotCi0vKgotR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIG9mIHRoZSBjaHVuay4gVG90YWwgY2h1bmsgbGVuZ3RoIGhhcyAxMiBieXRlcyBtb3JlLgotVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzIHRvIHJlYWQgZnJvbS4gSWYgdGhlIHJlc3VsdCB2YWx1ZSBpcyB0b28gbGFyZ2UsCi1pdCBtYXkgYmUgY29ycnVwdCBkYXRhLgotKi8KLXVuc2lnbmVkIGxvZGVwbmdfY2h1bmtfbGVuZ3RoKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKTsKLQotLypwdXRzIHRoZSA0LWJ5dGUgdHlwZSBpbiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nKi8KLXZvaWQgbG9kZXBuZ19jaHVua190eXBlKGNoYXIgdHlwZVs1XSwgY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspOwotCi0vKmNoZWNrIGlmIHRoZSB0eXBlIGlzIHRoZSBnaXZlbiB0eXBlKi8KLXVuc2lnbmVkIGNoYXIgbG9kZXBuZ19jaHVua190eXBlX2VxdWFscyhjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuaywgY29uc3QgY2hhciogdHlwZSk7Ci0KLS8qMDogaXQncyBvbmUgb2YgdGhlIGNyaXRpY2FsIGNodW5rIHR5cGVzLCAxOiBpdCdzIGFuIGFuY2lsbGFyeSBjaHVuayAoc2VlIFBORyBzdGFuZGFyZCkqLwotdW5zaWduZWQgY2hhciBsb2RlcG5nX2NodW5rX2FuY2lsbGFyeShjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuayk7Ci0KLS8qMDogcHVibGljLCAxOiBwcml2YXRlIChzZWUgUE5HIHN0YW5kYXJkKSovCi11bnNpZ25lZCBjaGFyIGxvZGVwbmdfY2h1bmtfcHJpdmF0ZShjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuayk7Ci0KLS8qMDogdGhlIGNodW5rIGlzIHVuc2FmZSB0byBjb3B5LCAxOiB0aGUgY2h1bmsgaXMgc2FmZSB0byBjb3B5IChzZWUgUE5HIHN0YW5kYXJkKSovCi11bnNpZ25lZCBjaGFyIGxvZGVwbmdfY2h1bmtfc2FmZXRvY29weShjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuayk7Ci0KLS8qZ2V0IHBvaW50ZXIgdG8gdGhlIGRhdGEgb2YgdGhlIGNodW5rLCB3aGVyZSB0aGUgaW5wdXQgcG9pbnRzIHRvIHRoZSBoZWFkZXIgb2YgdGhlIGNodW5rKi8KLXVuc2lnbmVkIGNoYXIqIGxvZGVwbmdfY2h1bmtfZGF0YSh1bnNpZ25lZCBjaGFyKiBjaHVuayk7Ci1jb25zdCB1bnNpZ25lZCBjaGFyKiBsb2RlcG5nX2NodW5rX2RhdGFfY29uc3QoY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspOwotCi0vKnJldHVybnMgMCBpZiB0aGUgY3JjIGlzIGNvcnJlY3QsIDEgaWYgaXQncyBpbmNvcnJlY3QgKDAgZm9yIE9LIGFzIHVzdWFsISkqLwotdW5zaWduZWQgbG9kZXBuZ19jaHVua19jaGVja19jcmMoY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspOwotCi0vKmdlbmVyYXRlcyB0aGUgY29ycmVjdCBDUkMgZnJvbSB0aGUgZGF0YSBhbmQgcHV0cyBpdCBpbiB0aGUgbGFzdCA0IGJ5dGVzIG9mIHRoZSBjaHVuayovCi12b2lkIGxvZGVwbmdfY2h1bmtfZ2VuZXJhdGVfY3JjKHVuc2lnbmVkIGNoYXIqIGNodW5rKTsKLQotLyoKLUl0ZXJhdGUgdG8gbmV4dCBjaHVua3MsIGFsbG93cyBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgY2h1bmtzIG9mIHRoZSBQTkcgZmlsZS4KLUlucHV0IG11c3QgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNodW5rIChyZXN1bHQgb2YgYSBwcmV2aW91cyBsb2RlcG5nX2NodW5rX25leHQgY2FsbCwKLW9yIHRoZSA4dGggYnl0ZSBvZiBhIFBORyBmaWxlIHdoaWNoIGFsd2F5cyBoYXMgdGhlIGZpcnN0IGNodW5rKSwgb3IgYWx0ZXJuYXRpdmVseSBtYXkKLXBvaW50IHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBQTkcgZmlsZSAod2hpY2ggaXMgbm90IGEgY2h1bmsgYnV0IHRoZSBtYWdpYyBoZWFkZXIsIHRoZQotZnVuY3Rpb24gd2lsbCB0aGVuIHNraXAgb3ZlciBpdCBhbmQgcmV0dXJuIHRoZSBmaXJzdCByZWFsIGNodW5rKS4KLUV4cGVjdHMgYXQgbGVhc3QgOCByZWFkYWJsZSBieXRlcyBvZiBtZW1vcnkgaW4gdGhlIGlucHV0IHBvaW50ZXIuCi1XaWxsIG91dHB1dCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjaHVuayBvciB0aGUgZW5kIG9mIHRoZSBmaWxlIGlmIHRoZXJlCi1pcyBubyBtb3JlIGNodW5rIGFmdGVyIHRoaXMuIFN0YXJ0IHRoaXMgcHJvY2VzcyBhdCB0aGUgOHRoIGJ5dGUgb2YgdGhlIFBORyBmaWxlLgotSW4gYSBub24tY29ycnVwdCBQTkcgZmlsZSwgdGhlIGxhc3QgY2h1bmsgc2hvdWxkIGhhdmUgbmFtZSAiSUVORCIuCi0qLwotdW5zaWduZWQgY2hhciogbG9kZXBuZ19jaHVua19uZXh0KHVuc2lnbmVkIGNoYXIqIGNodW5rKTsKLWNvbnN0IHVuc2lnbmVkIGNoYXIqIGxvZGVwbmdfY2h1bmtfbmV4dF9jb25zdChjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuayk7Ci0KLS8qRmluZHMgdGhlIGZpcnN0IGNodW5rIHdpdGggdGhlIGdpdmVuIHR5cGUgaW4gdGhlIHJhbmdlIFtjaHVuaywgZW5kKSwgb3IgcmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZC4qLwotdW5zaWduZWQgY2hhciogbG9kZXBuZ19jaHVua19maW5kKHVuc2lnbmVkIGNoYXIqIGNodW5rLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBlbmQsIGNvbnN0IGNoYXIgdHlwZVs1XSk7Ci1jb25zdCB1bnNpZ25lZCBjaGFyKiBsb2RlcG5nX2NodW5rX2ZpbmRfY29uc3QoY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmssIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGVuZCwgY29uc3QgY2hhciB0eXBlWzVdKTsKLQotLyoKLUFwcGVuZHMgY2h1bmsgdG8gdGhlIGRhdGEgaW4gb3V0LiBUaGUgZ2l2ZW4gY2h1bmsgc2hvdWxkIGFscmVhZHkgaGF2ZSBpdHMgY2h1bmsgaGVhZGVyLgotVGhlIG91dCB2YXJpYWJsZSBhbmQgb3V0bGVuZ3RoIGFyZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIG5ldyByZWFsbG9jYXRlZCBidWZmZXIuCi1SZXR1cm5zIGVycm9yIGNvZGUgKDAgaWYgaXQgd2VudCBvaykKLSovCi11bnNpZ25lZCBsb2RlcG5nX2NodW5rX2FwcGVuZCh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dGxlbmd0aCwgY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspOwotCi0vKgotQXBwZW5kcyBuZXcgY2h1bmsgdG8gb3V0LiBUaGUgY2h1bmsgdG8gYXBwZW5kIGlzIGdpdmVuIGJ5IGdpdmluZyBpdHMgbGVuZ3RoLCB0eXBlCi1hbmQgZGF0YSBzZXBhcmF0ZWx5LiBUaGUgdHlwZSBpcyBhIDQtbGV0dGVyIHN0cmluZy4KLVRoZSBvdXQgdmFyaWFibGUgYW5kIG91dGxlbmd0aCBhcmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgcmVhbGxvY2F0ZWQgYnVmZmVyLgotUmV0dXJuZSBlcnJvciBjb2RlICgwIGlmIGl0IHdlbnQgb2spCi0qLwotdW5zaWduZWQgbG9kZXBuZ19jaHVua19jcmVhdGUodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRsZW5ndGgsIHVuc2lnbmVkIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEpOwotCi0KLS8qQ2FsY3VsYXRlIENSQzMyIG9mIGJ1ZmZlciovCi11bnNpZ25lZCBsb2RlcG5nX2NyYzMyKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbik7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfUE5HKi8KLQotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX1pMSUIKLS8qCi1UaGlzIHpsaWIgcGFydCBjYW4gYmUgdXNlZCBpbmRlcGVuZGVudGx5IHRvIHpsaWIgY29tcHJlc3MgYW5kIGRlY29tcHJlc3MgYQotYnVmZmVyLiBJdCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgZ3ppcCBmaWxlcyBob3dldmVyLCBhbmQgaXQgb25seSBzdXBwb3J0cyB0aGUKLXBhcnQgb2YgemxpYiB0aGF0IGlzIHJlcXVpcmVkIGZvciBQTkcsIGl0IGRvZXMgbm90IHN1cHBvcnQgZGljdGlvbmFyaWVzLgotKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ERUNPREVSCi0vKkluZmxhdGUgYSBidWZmZXIuIEluZmxhdGUgaXMgdGhlIGRlY29tcHJlc3Npb24gc3RlcCBvZiBkZWZsYXRlLiBPdXQgYnVmZmVyIG11c3QgYmUgZnJlZWQgYWZ0ZXIgdXNlLiovCi11bnNpZ25lZCBsb2RlcG5nX2luZmxhdGUodW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdEZWNvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKTsKLQotLyoKLURlY29tcHJlc3NlcyBabGliIGRhdGEuIFJlYWxsb2NhdGVzIHRoZSBvdXQgYnVmZmVyIGFuZCBhcHBlbmRzIHRoZSBkYXRhLiBUaGUKLWRhdGEgbXVzdCBiZSBhY2NvcmRpbmcgdG8gdGhlIHpsaWIgc3BlY2lmaWNhdGlvbi4KLUVpdGhlciwgKm91dCBtdXN0IGJlIE5VTEwgYW5kICpvdXRzaXplIG11c3QgYmUgMCwgb3IsICpvdXQgbXVzdCBiZSBhIHZhbGlkCi1idWZmZXIgYW5kICpvdXRzaXplIGl0cyBzaXplIGluIGJ5dGVzLiBvdXQgbXVzdCBiZSBmcmVlZCBieSB1c2VyIGFmdGVyIHVzYWdlLgotKi8KLXVuc2lnbmVkIGxvZGVwbmdfemxpYl9kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIqKiBvdXQsIHNpemVfdCogb3V0c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyogc2V0dGluZ3MpOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0RFQ09ERVIqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0VOQ09ERVIKLS8qCi1Db21wcmVzc2VzIGRhdGEgd2l0aCBabGliLiBSZWFsbG9jYXRlcyB0aGUgb3V0IGJ1ZmZlciBhbmQgYXBwZW5kcyB0aGUgZGF0YS4KLVpsaWIgYWRkcyBhIHNtYWxsIGhlYWRlciBhbmQgdHJhaWxlciBhcm91bmQgdGhlIGRlZmxhdGUgZGF0YS4KLVRoZSBkYXRhIGlzIG91dHB1dCBpbiB0aGUgZm9ybWF0IG9mIHRoZSB6bGliIHNwZWNpZmljYXRpb24uCi1FaXRoZXIsICpvdXQgbXVzdCBiZSBOVUxMIGFuZCAqb3V0c2l6ZSBtdXN0IGJlIDAsIG9yLCAqb3V0IG11c3QgYmUgYSB2YWxpZAotYnVmZmVyIGFuZCAqb3V0c2l6ZSBpdHMgc2l6ZSBpbiBieXRlcy4gb3V0IG11c3QgYmUgZnJlZWQgYnkgdXNlciBhZnRlciB1c2FnZS4KLSovCi11bnNpZ25lZCBsb2RlcG5nX3psaWJfY29tcHJlc3ModW5zaWduZWQgY2hhcioqIG91dCwgc2l6ZV90KiBvdXRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdDb21wcmVzc1NldHRpbmdzKiBzZXR0aW5ncyk7Ci0KLS8qCi1GaW5kIGxlbmd0aC1saW1pdGVkIEh1ZmZtYW4gY29kZSBmb3IgZ2l2ZW4gZnJlcXVlbmNpZXMuIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlCi1wdWJsaWMgaW50ZXJmYWNlIG9ubHkgZm9yIHRlc3RzLCBpdCdzIHVzZWQgaW50ZXJuYWxseSBieSBsb2RlcG5nX2RlZmxhdGUuCi0qLwotdW5zaWduZWQgbG9kZXBuZ19odWZmbWFuX2NvZGVfbGVuZ3Rocyh1bnNpZ25lZCogbGVuZ3RocywgY29uc3QgdW5zaWduZWQqIGZyZXF1ZW5jaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtY29kZXMsIHVuc2lnbmVkIG1heGJpdGxlbik7Ci0KLS8qQ29tcHJlc3MgYSBidWZmZXIgd2l0aCBkZWZsYXRlLiBTZWUgUkZDIDE5NTEuIE91dCBidWZmZXIgbXVzdCBiZSBmcmVlZCBhZnRlciB1c2UuKi8KLXVuc2lnbmVkIGxvZGVwbmdfZGVmbGF0ZSh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpbnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0NvbXByZXNzU2V0dGluZ3MqIHNldHRpbmdzKTsKLQotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX1pMSUIqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RJU0sKLS8qCi1Mb2FkIGEgZmlsZSBmcm9tIGRpc2sgaW50byBidWZmZXIuIFRoZSBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIG91dCBidWZmZXIsIGFuZAotYWZ0ZXIgdXNhZ2UgeW91IHNob3VsZCBmcmVlIGl0Lgotb3V0OiBvdXRwdXQgcGFyYW1ldGVyLCBjb250YWlucyBwb2ludGVyIHRvIGxvYWRlZCBidWZmZXIuCi1vdXRzaXplOiBvdXRwdXQgcGFyYW1ldGVyLCBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgb3V0IGJ1ZmZlcgotZmlsZW5hbWU6IHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGxvYWQKLXJldHVybiB2YWx1ZTogZXJyb3IgY29kZSAoMCBtZWFucyBvaykKLSovCi11bnNpZ25lZCBsb2RlcG5nX2xvYWRfZmlsZSh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dHNpemUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKLQotLyoKLVNhdmUgYSBmaWxlIGZyb20gYnVmZmVyIHRvIGRpc2suIFdhcm5pbmcsIGlmIGl0IGV4aXN0cywgdGhpcyBmdW5jdGlvbiBvdmVyd3JpdGVzCi10aGUgZmlsZSB3aXRob3V0IHdhcm5pbmchCi1idWZmZXI6IHRoZSBidWZmZXIgdG8gd3JpdGUKLWJ1ZmZlcnNpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciB0byB3cml0ZQotZmlsZW5hbWU6IHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHNhdmUgdG8KLXJldHVybiB2YWx1ZTogZXJyb3IgY29kZSAoMCBtZWFucyBvaykKLSovCi11bnNpZ25lZCBsb2RlcG5nX3NhdmVfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHNpemVfdCBidWZmZXJzaXplLCBjb25zdCBjaGFyKiBmaWxlbmFtZSk7Ci0jZW5kaWYgLypMT0RFUE5HX0NPTVBJTEVfRElTSyovCi0KLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfQ1BQCi0vKiBUaGUgTG9kZVBORyBDKysgd3JhcHBlciB1c2VzIHN0ZDo6dmVjdG9ycyBpbnN0ZWFkIG9mIG1hbnVhbGx5IGFsbG9jYXRlZCBtZW1vcnkgYnVmZmVycy4gKi8KLW5hbWVzcGFjZSBsb2RlcG5nIHsKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfUE5HCi1jbGFzcyBTdGF0ZSA6IHB1YmxpYyBMb2RlUE5HU3RhdGUgewotICBwdWJsaWM6Ci0gICAgU3RhdGUoKTsKLSAgICBTdGF0ZShjb25zdCBTdGF0ZSYgb3RoZXIpOwotICAgIHZpcnR1YWwgflN0YXRlKCk7Ci0gICAgU3RhdGUmIG9wZXJhdG9yPShjb25zdCBTdGF0ZSYgb3RoZXIpOwotfTsKLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9ERUNPREVSCi0vKiBTYW1lIGFzIG90aGVyIGxvZGVwbmc6OmRlY29kZSwgYnV0IHVzaW5nIGEgU3RhdGUgZm9yIG1vcmUgc2V0dGluZ3MgYW5kIGluZm9ybWF0aW9uLiAqLwotdW5zaWduZWQgZGVjb2RlKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsIHVuc2lnbmVkJiB3LCB1bnNpZ25lZCYgaCwKLSAgICAgICAgICAgICAgICBTdGF0ZSYgc3RhdGUsCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHNpemVfdCBpbnNpemUpOwotdW5zaWduZWQgZGVjb2RlKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsIHVuc2lnbmVkJiB3LCB1bnNpZ25lZCYgaCwKLSAgICAgICAgICAgICAgICBTdGF0ZSYgc3RhdGUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIGluKTsKLSNlbmRpZiAvKkxPREVQTkdfQ09NUElMRV9ERUNPREVSKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi0vKiBTYW1lIGFzIG90aGVyIGxvZGVwbmc6OmVuY29kZSwgYnV0IHVzaW5nIGEgU3RhdGUgZm9yIG1vcmUgc2V0dGluZ3MgYW5kIGluZm9ybWF0aW9uLiAqLwotdW5zaWduZWQgZW5jb2RlKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHVuc2lnbmVkIHcsIHVuc2lnbmVkIGgsCi0gICAgICAgICAgICAgICAgU3RhdGUmIHN0YXRlKTsKLXVuc2lnbmVkIGVuY29kZShzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgb3V0LAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBpbiwgdW5zaWduZWQgdywgdW5zaWduZWQgaCwKLSAgICAgICAgICAgICAgICBTdGF0ZSYgc3RhdGUpOwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0VOQ09ERVIqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX0RJU0sKLS8qCi1Mb2FkIGEgZmlsZSBmcm9tIGRpc2sgaW50byBhbiBzdGQ6OnZlY3Rvci4KLXJldHVybiB2YWx1ZTogZXJyb3IgY29kZSAoMCBtZWFucyBvaykKLSovCi11bnNpZ25lZCBsb2FkX2ZpbGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIGJ1ZmZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKLQotLyoKLVNhdmUgdGhlIGJpbmFyeSBkYXRhIGluIGFuIHN0ZDo6dmVjdG9yIHRvIGEgZmlsZSBvbiBkaXNrLiBUaGUgZmlsZSBpcyBvdmVyd3JpdHRlbgotd2l0aG91dCB3YXJuaW5nLgotKi8KLXVuc2lnbmVkIHNhdmVfZmlsZShjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgYnVmZmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOwotI2VuZGlmIC8qIExPREVQTkdfQ09NUElMRV9ESVNLICovCi0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX1BORyAqLwotCi0jaWZkZWYgTE9ERVBOR19DT01QSUxFX1pMSUIKLSNpZmRlZiBMT0RFUE5HX0NPTVBJTEVfREVDT0RFUgotLyogWmxpYi1kZWNvbXByZXNzIGFuIHVuc2lnbmVkIGNoYXIgYnVmZmVyICovCi11bnNpZ25lZCBkZWNvbXByZXNzKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCBzaXplX3QgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2RlUE5HRGVjb21wcmVzc1NldHRpbmdzJiBzZXR0aW5ncyA9IGxvZGVwbmdfZGVmYXVsdF9kZWNvbXByZXNzX3NldHRpbmdzKTsKLQotLyogWmxpYi1kZWNvbXByZXNzIGFuIHN0ZDo6dmVjdG9yICovCi11bnNpZ25lZCBkZWNvbXByZXNzKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBpbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9kZVBOR0RlY29tcHJlc3NTZXR0aW5ncyYgc2V0dGluZ3MgPSBsb2RlcG5nX2RlZmF1bHRfZGVjb21wcmVzc19zZXR0aW5ncyk7Ci0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX0RFQ09ERVIgKi8KLQotI2lmZGVmIExPREVQTkdfQ09NUElMRV9FTkNPREVSCi0vKiBabGliLWNvbXByZXNzIGFuIHVuc2lnbmVkIGNoYXIgYnVmZmVyICovCi11bnNpZ25lZCBjb21wcmVzcyhzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgc2l6ZV90IGluc2l6ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdDb21wcmVzc1NldHRpbmdzJiBzZXR0aW5ncyA9IGxvZGVwbmdfZGVmYXVsdF9jb21wcmVzc19zZXR0aW5ncyk7Ci0KLS8qIFpsaWItY29tcHJlc3MgYW4gc3RkOjp2ZWN0b3IgKi8KLXVuc2lnbmVkIGNvbXByZXNzKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBvdXQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBpbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IExvZGVQTkdDb21wcmVzc1NldHRpbmdzJiBzZXR0aW5ncyA9IGxvZGVwbmdfZGVmYXVsdF9jb21wcmVzc19zZXR0aW5ncyk7Ci0jZW5kaWYgLyogTE9ERVBOR19DT01QSUxFX0VOQ09ERVIgKi8KLSNlbmRpZiAvKiBMT0RFUE5HX0NPTVBJTEVfWkxJQiAqLwotfSAvKiBuYW1lc3BhY2UgbG9kZXBuZyAqLwotI2VuZGlmIC8qTE9ERVBOR19DT01QSUxFX0NQUCovCi0KLS8qCi1UT0RPOgotWy5dIHRlc3QgaWYgdGhlcmUgYXJlIG5vIG1lbW9yeSBsZWFrcyBvciBzZWN1cml0eSBleHBsb2l0cyAtIGRvbmUgYSBsb3QgYnV0IG5lZWRzIHRvIGJlIGNoZWNrZWQgb2Z0ZW4KLVsuXSBjaGVjayBjb21wYXRpYmlsaXR5IHdpdGggdmFyaW91cyBjb21waWxlcnMgIC0gZG9uZSBidXQgbmVlZHMgdG8gYmUgcmVkb25lIGZvciBldmVyeSBuZXdlciB2ZXJzaW9uCi1bWF0gY29udmVydGluZyBjb2xvciB0byAxNi1iaXQgcGVyIGNoYW5uZWwgdHlwZXMKLVtYXSBzdXBwb3J0IGNvbG9yIHByb2ZpbGUgY2h1bmsgdHlwZXMgKGJ1dCBuZXZlciBsZXQgdGhlbSB0b3VjaCBSR0IgdmFsdWVzIGJ5IGRlZmF1bHQpCi1bIF0gc3VwcG9ydCBhbGwgcHVibGljIFBORyBjaHVuayB0eXBlcyAoYWxtb3N0IGRvbmUgZXhjZXB0IHNCSVQsIHNQTFQgYW5kIGhJU1QpCi1bIF0gbWFrZSBzdXJlIGVuY29kZXIgZ2VuZXJhdGVzIG5vIGNodW5rcyB3aXRoIHNpemUgPiAoMl4zMSktMQotWyBdIHBhcnRpYWwgZGVjb2RpbmcgKHN0cmVhbSBwcm9jZXNzaW5nKQotW1hdIGxldCB0aGUgImlzRnVsbHlPcGFxdWUiIGZ1bmN0aW9uIGNoZWNrIGNvbG9yIGtleXMgYW5kIHRyYW5zcGFyZW50IHBhbGV0dGVzIHRvbwotW1hdIGJldHRlciBuYW1lIGZvciB0aGUgdmFyaWFibGVzICJjb2RlcyIsICJjb2Rlc0QiLCAiY29kZWxlbmd0aGNvZGVzIiwgImNsY2wiIGFuZCAibGxkbCIKLVsgXSBhbGxvdyB0cmVhdGluZyBzb21lIGVycm9ycyBsaWtlIHdhcm5pbmdzLCB3aGVuIGltYWdlIGlzIHJlY292ZXJhYmxlIChlLmcuIDY5LCA1NywgNTgpCi1bIF0gbWFrZSB3YXJuaW5ncyBsaWtlOiBvb2IgcGFsZXR0ZSwgY2hlY2tzdW0gZmFpbCwgZGF0YSBhZnRlciBpZW5kLCB3cm9uZy91bmtub3duIGNyaXQgY2h1bmssIG5vIG51bGwgdGVybWluYXRvciBpbiB0ZXh0LCAuLi4KLVsgXSBlcnJvciBtZXNzYWdlcyB3aXRoIGxpbmUgbnVtYmVycyAoYW5kIHZlcnNpb24pCi1bIF0gZXJyb3JzIGluIHN0YXRlIGluc3RlYWQgb2YgYXMgcmV0dXJuIGNvZGU/Ci1bIF0gbmV3IGVycm9ycy93YXJuaW5ncyBsaWtlIHN1c3BpY2lvdXNseSBiaWcgZGVjb21wcmVzc2VkIHp0eHQgb3IgaWNjcCBjaHVuawotWyBdIGxldCB0aGUgQysrIHdyYXBwZXIgY2F0Y2ggZXhjZXB0aW9ucyBjb21pbmcgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSBhbmQgcmV0dXJuIExvZGVQTkcgZXJyb3IgY29kZXMKLVsgXSBhbGxvdyB1c2VyIHRvIHByb3ZpZGUgY3VzdG9tIGNvbG9yIGNvbnZlcnNpb24gZnVuY3Rpb25zLCBlLmcuIGZvciBwcmVtdWx0aXBsaWVkIGFscGhhLCBwYWRkaW5nIGJpdHMgb3Igbm90LCAuLi4KLVsgXSBhbGxvdyB1c2VyIHRvIGdpdmUgZGF0YSAodm9pZCopIHRvIGN1c3RvbSBhbGxvY2F0b3IKLVsgXSBwcm92aWRlIGFsdGVybmF0aXZlcyBmb3IgQyBsaWJyYXJ5IGZ1bmN0aW9ucyBub3QgcHJlc2VudCBvbiBzb21lIHBsYXRmb3JtcyAobWVtY3B5LCAuLi4pCi1bIF0gcmVuYW1lICJncmV5IiB0byAiZ3JheSIgZXZlcnl3aGVyZSBzaW5jZSAiY29sb3IiIGFsc28gdXNlcyBVUyBzcGVsbGluZyAoa2VlcCAiZ3JleSIgY29waWVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkKLSovCi0KLSNlbmRpZiAvKkxPREVQTkdfSCBpbmNsdXNpb24gZ3VhcmQqLwotCi0vKgotTG9kZVBORyBEb2N1bWVudGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMC4gdGFibGUgb2YgY29udGVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgMS4gYWJvdXQKLSAgIDEuMS4gc3VwcG9ydGVkIGZlYXR1cmVzCi0gICAxLjIuIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQKLSAgMi4gQyBhbmQgQysrIHZlcnNpb24KLSAgMy4gc2VjdXJpdHkKLSAgNC4gZGVjb2RpbmcKLSAgNS4gZW5jb2RpbmcKLSAgNi4gY29sb3IgY29udmVyc2lvbnMKLSAgICA2LjEuIFBORyBjb2xvciB0eXBlcwotICAgIDYuMi4gY29sb3IgY29udmVyc2lvbnMKLSAgICA2LjMuIHBhZGRpbmcgYml0cwotICAgIDYuNC4gQSBub3RlIGFib3V0IDE2LWJpdHMgcGVyIGNoYW5uZWwgYW5kIGVuZGlhbm5lc3MKLSAgNy4gZXJyb3IgdmFsdWVzCi0gIDguIGNodW5rcyBhbmQgUE5HIGVkaXRpbmcKLSAgOS4gY29tcGlsZXIgc3VwcG9ydAotICAxMC4gZXhhbXBsZXMKLSAgIDEwLjEuIGRlY29kZXIgQysrIGV4YW1wbGUKLSAgIDEwLjIuIGRlY29kZXIgQyBleGFtcGxlCi0gIDExLiBzdGF0ZSBzZXR0aW5ncyByZWZlcmVuY2UKLSAgMTIuIGNoYW5nZXMKLSAgMTMuIGNvbnRhY3QgaW5mb3JtYXRpb24KLQotCi0xLiBhYm91dAotLS0tLS0tLS0KLQotUE5HIGlzIGEgZmlsZSBmb3JtYXQgdG8gc3RvcmUgcmFzdGVyIGltYWdlcyBsb3NzbGVzc2x5IHdpdGggZ29vZCBjb21wcmVzc2lvbiwKLXN1cHBvcnRpbmcgZGlmZmVyZW50IGNvbG9yIHR5cGVzIGFuZCBhbHBoYSBjaGFubmVsLgotCi1Mb2RlUE5HIGlzIGEgUE5HIGNvZGVjIGFjY29yZGluZyB0byB0aGUgUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKQotU3BlY2lmaWNhdGlvbiAoU2Vjb25kIEVkaXRpb24pIC0gVzNDIFJlY29tbWVuZGF0aW9uIDEwIE5vdmVtYmVyIDIwMDMuCi0KLVRoZSBzcGVjaWZpY2F0aW9ucyB1c2VkIGFyZToKLQotKikgUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyAoUE5HKSBTcGVjaWZpY2F0aW9uIChTZWNvbmQgRWRpdGlvbik6Ci0gICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMAotKikgUkZDIDE5NTAgWkxJQiBDb21wcmVzc2VkIERhdGEgRm9ybWF0IHZlcnNpb24gMy4zOgotICAgICBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvcmZjLXpsaWIuaHRtbAotKikgUkZDIDE5NTEgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gdmVyIDEuMzoKLSAgICAgaHR0cDovL3d3dy5nemlwLm9yZy96bGliL3JmYy1kZWZsYXRlLmh0bWwKLQotVGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgTG9kZVBORyBjYW4gY3VycmVudGx5IGJlIGZvdW5kIGF0Ci1odHRwOi8vbG9kZXYub3JnL2xvZGVwbmcvCi0KLUxvZGVQTkcgd29ya3MgYm90aCBpbiBDIChJU08gQzkwKSBhbmQgQysrLCB3aXRoIGEgQysrIHdyYXBwZXIgdGhhdCBhZGRzCi1leHRyYSBmdW5jdGlvbmFsaXR5LgotCi1Mb2RlUE5HIGV4aXN0cyBvdXQgb2YgdHdvIGZpbGVzOgotLWxvZGVwbmcuaDogdGhlIGhlYWRlciBmaWxlIGZvciBib3RoIEMgYW5kIEMrKwotLWxvZGVwbmcuYyhwcCk6IGdpdmUgaXQgdGhlIG5hbWUgbG9kZXBuZy5jIG9yIGxvZGVwbmcuY3BwIChvciAuY2MpIGRlcGVuZGluZyBvbiB5b3VyIHVzYWdlCi0KLUlmIHlvdSB3YW50IHRvIHN0YXJ0IHVzaW5nIExvZGVQTkcgcmlnaHQgYXdheSB3aXRob3V0IHJlYWRpbmcgdGhpcyBkb2MsIGdldCB0aGUKLWV4YW1wbGVzIGZyb20gdGhlIExvZGVQTkcgd2Vic2l0ZSB0byBzZWUgaG93IHRvIHVzZSBpdCBpbiBjb2RlLCBvciBjaGVjayB0aGUKLXNtYWxsZXIgZXhhbXBsZXMgaW4gY2hhcHRlciAxMyBoZXJlLgotCi1Mb2RlUE5HIGlzIHNpbXBsZSBidXQgb25seSBzdXBwb3J0cyB0aGUgYmFzaWMgcmVxdWlyZW1lbnRzLiBUbyBhY2hpZXZlCi1zaW1wbGljaXR5LCB0aGUgZm9sbG93aW5nIGRlc2lnbiBjaG9pY2VzIHdlcmUgbWFkZTogVGhlcmUgYXJlIG5vIGRlcGVuZGVuY2llcwotb24gYW55IGV4dGVybmFsIGxpYnJhcnkuIFRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gZGVjb2RlIGFuZCBlbmNvZGUgYSBQTkcgd2l0aAotYSBzaW5nbGUgZnVuY3Rpb24gY2FsbCwgYW5kIGV4dGVuZGVkIHZlcnNpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyB0YWtpbmcgYQotTG9kZVBOR1N0YXRlIHN0cnVjdCBhbGxvd2luZyB0byBzcGVjaWZ5IG9yIGdldCBtb3JlIGluZm9ybWF0aW9uLiBCeSBkZWZhdWx0Ci10aGUgY29sb3JzIG9mIHRoZSByYXcgaW1hZ2UgYXJlIGFsd2F5cyBSR0Igb3IgUkdCQSwgbm8gbWF0dGVyIHdoYXQgY29sb3IgdHlwZQotdGhlIFBORyBmaWxlIHVzZXMuIFRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzLCB0aGVyZSBhcmUgc2ltcGxlIGZ1bmN0aW9ucyB0bwotY29udmVydCB0aGUgZmlsZXMgdG8vZnJvbSBidWZmZXJzIGluIG1lbW9yeS4KLQotVGhpcyBhbGwgbWFrZXMgTG9kZVBORyBzdWl0YWJsZSBmb3IgbG9hZGluZyB0ZXh0dXJlcyBpbiBnYW1lcywgZGVtb3MgYW5kIHNtYWxsCi1wcm9ncmFtcywgLi4uIEl0J3MgbGVzcyBzdWl0YWJsZSBmb3IgZnVsbCBmbGVkZ2VkIGltYWdlIGVkaXRvcnMsIGxvYWRpbmcgUE5Hcwotb3ZlciBuZXR3b3JrIChpdCByZXF1aXJlcyBhbGwgdGhlIGltYWdlIGRhdGEgdG8gYmUgYXZhaWxhYmxlIGJlZm9yZSBkZWNvZGluZyBjYW4KLWJlZ2luKSwgbGlmZS1jcml0aWNhbCBzeXN0ZW1zLCAuLi4KLQotMS4xLiBzdXBwb3J0ZWQgZmVhdHVyZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgZGVjb2RlcjoKLQotKikgZGVjb2Rpbmcgb2YgUE5HcyB3aXRoIGFueSBjb2xvciB0eXBlLCBiaXQgZGVwdGggYW5kIGludGVybGFjZSBtb2RlLCB0byBhIDI0LSBvciAzMi1iaXQgY29sb3IgcmF3IGltYWdlLAotICAgb3IgdGhlIHNhbWUgY29sb3IgdHlwZSBhcyB0aGUgUE5HCi0qKSBlbmNvZGluZyBvZiBQTkdzLCBmcm9tIGFueSByYXcgaW1hZ2UgdG8gMjQtIG9yIDMyLWJpdCBjb2xvciwgb3IgdGhlIHNhbWUgY29sb3IgdHlwZSBhcyB0aGUgcmF3IGltYWdlCi0qKSBBZGFtNyBpbnRlcmxhY2UgYW5kIGRlaW50ZXJsYWNlIGZvciBhbnkgY29sb3IgdHlwZQotKikgbG9hZGluZyB0aGUgaW1hZ2UgZnJvbSBoYXJkZGlzayBvciBkZWNvZGluZyBpdCBmcm9tIGEgYnVmZmVyIGZyb20gb3RoZXIgc291cmNlcyB0aGFuIGhhcmRkaXNrCi0qKSBzdXBwb3J0IGZvciBhbHBoYSBjaGFubmVscywgaW5jbHVkaW5nIFJHQkEgY29sb3IgbW9kZWwsIHRyYW5zbHVjZW50IHBhbGV0dGVzIGFuZCBjb2xvciBrZXlpbmcKLSopIHpsaWIgZGVjb21wcmVzc2lvbiAoaW5mbGF0ZSkKLSopIHpsaWIgY29tcHJlc3Npb24gKGRlZmxhdGUpCi0qKSBDUkMzMiBhbmQgQURMRVIzMiBjaGVja3N1bXMKLSopIGNvbG9yaW1ldHJpYyBjb2xvciBwcm9maWxlIGNvbnZlcnNpb25zOiBjdXJyZW50bHkgZXhwZXJpbWVudGFsbHkgYXZhaWxhYmxlIGluIGxvZGVwbmdfdXRpbC5jcHAgb25seSwKLSAgIHBsdXMgYWx0ZXJuYXRpdmVseSBhYmlsaXR5IHRvIHBhc3Mgb24gY2hyb21hL2dhbW1hL0lDQyBwcm9maWxlIGluZm9ybWF0aW9uIHRvIG90aGVyIGNvbG9yIG1hbmFnZW1lbnQgc3lzdGVtLgotKikgaGFuZGxpbmcgb2YgdW5rbm93biBjaHVua3MsIGFsbG93aW5nIG1ha2luZyBhIFBORyBlZGl0b3IgdGhhdCBzdG9yZXMgY3VzdG9tIGFuZCB1bmtub3duIGNodW5rcy4KLSopIHRoZSBmb2xsb3dpbmcgY2h1bmtzIGFyZSBzdXBwb3J0ZWQgYnkgYm90aCBlbmNvZGVyIGFuZCBkZWNvZGVyOgotICAgIElIRFI6IGhlYWRlciBpbmZvcm1hdGlvbgotICAgIFBMVEU6IGNvbG9yIHBhbGV0dGUKLSAgICBJREFUOiBwaXhlbCBkYXRhCi0gICAgSUVORDogdGhlIGZpbmFsIGNodW5rCi0gICAgdFJOUzogdHJhbnNwYXJlbmN5IGZvciBwYWxldHRpemVkIGltYWdlcwotICAgIHRFWHQ6IHRleHR1YWwgaW5mb3JtYXRpb24KLSAgICB6VFh0OiBjb21wcmVzc2VkIHRleHR1YWwgaW5mb3JtYXRpb24KLSAgICBpVFh0OiBpbnRlcm5hdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24KLSAgICBiS0dEOiBzdWdnZXN0ZWQgYmFja2dyb3VuZCBjb2xvcgotICAgIHBIWXM6IHBoeXNpY2FsIGRpbWVuc2lvbnMKLSAgICB0SU1FOiBtb2RpZmljYXRpb24gdGltZQotICAgIGNIUk06IFJHQiBjaHJvbWF0aWNpdGllcwotICAgIGdBTUE6IFJHQiBnYW1tYSBjb3JyZWN0aW9uCi0gICAgaUNDUDogSUNDIGNvbG9yIHByb2ZpbGUKLSAgICBzUkdCOiByZW5kZXJpbmcgaW50ZW50Ci0KLTEuMi4gZmVhdHVyZXMgbm90IHN1cHBvcnRlZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIF9ub3RfIHN1cHBvcnRlZDoKLQotKikgc29tZSBmZWF0dXJlcyBuZWVkZWQgdG8gbWFrZSBhIGNvbmZvcm1hbnQgUE5HLUVkaXRvciBtaWdodCBiZSBzdGlsbCBtaXNzaW5nLgotKikgcGFydGlhbCBsb2FkaW5nL3N0cmVhbSBwcm9jZXNzaW5nLiBBbGwgZGF0YSBtdXN0IGJlIGF2YWlsYWJsZSBhbmQgaXMgcHJvY2Vzc2VkIGluIG9uZSBjYWxsLgotKikgVGhlIGZvbGxvd2luZyBwdWJsaWMgY2h1bmtzIGFyZSBub3QgKHlldCkgc3VwcG9ydGVkIGJ1dCB0cmVhdGVkIGFzIHVua25vd24gY2h1bmtzIGJ5IExvZGVQTkc6Ci0gICAgc0JJVAotICAgIGhJU1QKLSAgICBzUExUCi0KLQotMi4gQyBhbmQgQysrIHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBDIHZlcnNpb24gdXNlcyBidWZmZXJzIGFsbG9jYXRlZCB3aXRoIGFsbG9jIHRoYXQgeW91IG5lZWQgdG8gZnJlZSgpCi15b3Vyc2VsZi4gWW91IG5lZWQgdG8gdXNlIGluaXQgYW5kIGNsZWFudXAgZnVuY3Rpb25zIGZvciBlYWNoIHN0cnVjdCB3aGVuZXZlcgotdXNpbmcgYSBzdHJ1Y3QgZnJvbSB0aGUgQyB2ZXJzaW9uIHRvIGF2b2lkIGV4cGxvaXRzIGFuZCBtZW1vcnkgbGVha3MuCi0KLVRoZSBDKysgdmVyc2lvbiBoYXMgZXh0cmEgZnVuY3Rpb25zIHdpdGggc3RkOjp2ZWN0b3JzIGluIHRoZSBpbnRlcmZhY2UgYW5kIHRoZQotbG9kZXBuZzo6U3RhdGUgY2xhc3Mgd2hpY2ggaXMgYSBMb2RlUE5HU3RhdGUgd2l0aCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3Rvci4KLQotVGhlc2UgZmlsZXMgd29yayB3aXRob3V0IG1vZGlmaWNhdGlvbiBmb3IgYm90aCBDIGFuZCBDKysgY29tcGlsZXJzIGJlY2F1c2UgYWxsCi10aGUgYWRkaXRpb25hbCBDKysgY29kZSBpcyBpbiAiI2lmZGVmIF9fY3BsdXNwbHVzIiBibG9ja3MgdGhhdCBtYWtlIEMtY29tcGlsZXJzCi1pZ25vcmUgaXQsIGFuZCB0aGUgQyBjb2RlIGlzIG1hZGUgdG8gY29tcGlsZSBib3RoIHdpdGggc3RyaWN0IElTTyBDOTAgYW5kIEMrKy4KLQotVG8gdXNlIHRoZSBDKysgdmVyc2lvbiwgeW91IG5lZWQgdG8gcmVuYW1lIHRoZSBzb3VyY2UgZmlsZSB0byBsb2RlcG5nLmNwcAotKGluc3RlYWQgb2YgbG9kZXBuZy5jKSwgYW5kIGNvbXBpbGUgaXQgd2l0aCBhIEMrKyBjb21waWxlci4KLQotVG8gdXNlIHRoZSBDIHZlcnNpb24sIHlvdSBuZWVkIHRvIHJlbmFtZSB0aGUgc291cmNlIGZpbGUgdG8gbG9kZXBuZy5jIChpbnN0ZWFkCi1vZiBsb2RlcG5nLmNwcCksIGFuZCBjb21waWxlIGl0IHdpdGggYSBDIGNvbXBpbGVyLgotCi0KLTMuIFNlY3VyaXR5Ci0tLS0tLS0tLS0tLQotCi1FdmVuIGlmIGNhcmVmdWxseSBkZXNpZ25lZCwgaXQncyBhbHdheXMgcG9zc2libGUgdGhhdCBMb2RlUE5HIGNvbnRhaW5zIHBvc3NpYmxlCi1leHBsb2l0cy4gSWYgeW91IGRpc2NvdmVyIG9uZSwgcGxlYXNlIGxldCBtZSBrbm93LCBhbmQgaXQgd2lsbCBiZSBmaXhlZC4KLQotV2hlbiB1c2luZyBMb2RlUE5HLCBjYXJlIGhhcyB0byBiZSB0YWtlbiB3aXRoIHRoZSBDIHZlcnNpb24gb2YgTG9kZVBORywgYXMgd2VsbAotYXMgdGhlIEMtc3R5bGUgc3RydWN0cyB3aGVuIHdvcmtpbmcgd2l0aCBDKysuIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXJlIHVzZWQKLWZvciBhbGwgQy1zdHlsZSBzdHJ1Y3RzOgotCi0taWYgYSBzdHJ1Y3QgaGFzIGEgY29ycmVzcG9uZGluZyBpbml0IGZ1bmN0aW9uLCBhbHdheXMgY2FsbCB0aGUgaW5pdCBmdW5jdGlvbiB3aGVuIG1ha2luZyBhIG5ldyBvbmUKLS1pZiBhIHN0cnVjdCBoYXMgYSBjb3JyZXNwb25kaW5nIGNsZWFudXAgZnVuY3Rpb24sIGNhbGwgaXQgYmVmb3JlIHRoZSBzdHJ1Y3QgZGlzYXBwZWFycyB0byBhdm9pZCBtZW1vcnkgbGVha3MKLS1pZiBhIHN0cnVjdCBoYXMgYSBjb3JyZXNwb25kaW5nIGNvcHkgZnVuY3Rpb24sIHVzZSB0aGUgY29weSBmdW5jdGlvbiBpbnN0ZWFkIG9mICI9Ii4KLSBUaGUgZGVzdGluYXRpb24gbXVzdCBhbHNvIGJlIGluaXRlZCBhbHJlYWR5LgotCi0KLTQuIERlY29kaW5nCi0tLS0tLS0tLS0tLQotCi1EZWNvZGluZyBjb252ZXJ0cyBhIFBORyBjb21wcmVzc2VkIGltYWdlIHRvIGEgcmF3IHBpeGVsIGJ1ZmZlci4KLQotTW9zdCBkb2N1bWVudGF0aW9uIG9uIHVzaW5nIHRoZSBkZWNvZGVyIGlzIGF0IGl0cyBkZWNsYXJhdGlvbnMgaW4gdGhlIGhlYWRlcgotYWJvdmUuIEZvciBDLCBzaW1wbGUgZGVjb2RpbmcgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbnMgc3VjaCBhcwotbG9kZXBuZ19kZWNvZGUzMiwgYW5kIG1vcmUgYWR2YW5jZWQgZGVjb2RpbmcgY2FuIGJlIGRvbmUgd2l0aCB0aGUgc3RydWN0Ci1Mb2RlUE5HU3RhdGUgYW5kIGxvZGVwbmdfZGVjb2RlLiBGb3IgQysrLCBhbGwgZGVjb2RpbmcgY2FuIGJlIGRvbmUgd2l0aCB0aGUKLXZhcmlvdXMgbG9kZXBuZzo6ZGVjb2RlIGZ1bmN0aW9ucywgYW5kIGxvZGVwbmc6OlN0YXRlIGNhbiBiZSB1c2VkIGZvciBhZHZhbmNlZAotZmVhdHVyZXMuCi0KLVdoZW4gdXNpbmcgdGhlIExvZGVQTkdTdGF0ZSwgaXQgdXNlcyB0aGUgZm9sbG93aW5nIGZpZWxkcyBmb3IgZGVjb2Rpbmc6Ci0qKSBMb2RlUE5HSW5mbyBpbmZvX3BuZzogaXQgc3RvcmVzIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQTkcgKHRoZSBpbnB1dCkgaW4gaGVyZQotKikgTG9kZVBOR0NvbG9yTW9kZSBpbmZvX3JhdzogaGVyZSB5b3UgY2FuIHNheSB3aGF0IGNvbG9yIG1vZGUgb2YgdGhlIHJhdyBpbWFnZSAodGhlIG91dHB1dCkgeW91IHdhbnQgdG8gZ2V0Ci0qKSBMb2RlUE5HRGVjb2RlclNldHRpbmdzIGRlY29kZXI6IHlvdSBjYW4gc3BlY2lmeSBhIGZldyBleHRyYSBzZXR0aW5ncyBmb3IgdGhlIGRlY29kZXIgdG8gdXNlCi0KLUxvZGVQTkdJbmZvIGluZm9fcG5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BZnRlciBkZWNvZGluZywgdGhpcyBjb250YWlucyBleHRyYSBpbmZvcm1hdGlvbiBvZiB0aGUgUE5HIGltYWdlLCBleGNlcHQgdGhlIGFjdHVhbAotcGl4ZWxzLCB3aWR0aCBhbmQgaGVpZ2h0IGJlY2F1c2UgdGhlc2UgYXJlIGFscmVhZHkgZ290dGVuIGRpcmVjdGx5IGZyb20gdGhlIGRlY29kZXIKLWZ1bmN0aW9ucy4KLQotSXQgY29udGFpbnMgZm9yIGV4YW1wbGUgdGhlIG9yaWdpbmFsIGNvbG9yIHR5cGUgb2YgdGhlIFBORyBpbWFnZSwgdGV4dCBjb21tZW50cywKLXN1Z2dlc3RlZCBiYWNrZ3JvdW5kIGNvbG9yLCBldGMuLi4gTW9yZSBkZXRhaWxzIGFib3V0IHRoZSBMb2RlUE5HSW5mbyBzdHJ1Y3QgYXJlCi1hdCBpdHMgZGVjbGFyYXRpb24gZG9jdW1lbnRhdGlvbi4KLQotTG9kZVBOR0NvbG9yTW9kZSBpbmZvX3JhdwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1XaGVuIGRlY29kaW5nLCBoZXJlIHlvdSBjYW4gc3BlY2lmeSB3aGljaCBjb2xvciB0eXBlIHlvdSB3YW50Ci10aGUgcmVzdWx0aW5nIHJhdyBpbWFnZSB0byBiZS4gSWYgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY29sb3J0eXBlIG9mIHRoZQotUE5HLCB0aGVuIHRoZSBkZWNvZGVyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IHRoZSByZXN1bHQuIFRoaXMgY29udmVyc2lvbgotYWx3YXlzIHdvcmtzLCBleGNlcHQgaWYgeW91IHdhbnQgaXQgdG8gY29udmVydCBhIGNvbG9yIFBORyB0byBncmF5c2NhbGUgb3IgdG8KLWEgcGFsZXR0ZSB3aXRoIG1pc3NpbmcgY29sb3JzLgotCi1CeSBkZWZhdWx0LCAzMi1iaXQgY29sb3IgaXMgdXNlZCBmb3IgdGhlIHJlc3VsdC4KLQotTG9kZVBOR0RlY29kZXJTZXR0aW5ncyBkZWNvZGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIHNldHRpbmdzIGNhbiBiZSB1c2VkIHRvIGlnbm9yZSB0aGUgZXJyb3JzIGNyZWF0ZWQgYnkgaW52YWxpZCBDUkMgYW5kIEFkbGVyMzIKLWNodW5rcywgYW5kIHRvIGRpc2FibGUgdGhlIGRlY29kaW5nIG9mIHRFWHQgY2h1bmtzLgotCi1UaGVyZSdzIGFsc28gYSBzZXR0aW5nIGNvbG9yX2NvbnZlcnQsIHRydWUgYnkgZGVmYXVsdC4gSWYgZmFsc2UsIG5vIGNvbnZlcnNpb24KLWlzIGRvbmUsIHRoZSByZXN1bHRpbmcgZGF0YSB3aWxsIGJlIGFzIGl0IHdhcyBpbiB0aGUgUE5HIChhZnRlciBkZWNvbXByZXNzaW9uKQotYW5kIHlvdSdsbCBoYXZlIHRvIHB1enpsZSB0aGUgY29sb3JzIG9mIHRoZSBwaXhlbHMgdG9nZXRoZXIgeW91cnNlbGYgdXNpbmcgdGhlCi1jb2xvciB0eXBlIGluZm9ybWF0aW9uIGluIHRoZSBMb2RlUE5HSW5mby4KLQotCi01LiBFbmNvZGluZwotLS0tLS0tLS0tLS0KLQotRW5jb2RpbmcgY29udmVydHMgYSByYXcgcGl4ZWwgYnVmZmVyIHRvIGEgUE5HIGNvbXByZXNzZWQgaW1hZ2UuCi0KLU1vc3QgZG9jdW1lbnRhdGlvbiBvbiB1c2luZyB0aGUgZW5jb2RlciBpcyBhdCBpdHMgZGVjbGFyYXRpb25zIGluIHRoZSBoZWFkZXIKLWFib3ZlLiBGb3IgQywgc2ltcGxlIGVuY29kaW5nIGNhbiBiZSBkb25lIHdpdGggZnVuY3Rpb25zIHN1Y2ggYXMKLWxvZGVwbmdfZW5jb2RlMzIsIGFuZCBtb3JlIGFkdmFuY2VkIGRlY29kaW5nIGNhbiBiZSBkb25lIHdpdGggdGhlIHN0cnVjdAotTG9kZVBOR1N0YXRlIGFuZCBsb2RlcG5nX2VuY29kZS4gRm9yIEMrKywgYWxsIGVuY29kaW5nIGNhbiBiZSBkb25lIHdpdGggdGhlCi12YXJpb3VzIGxvZGVwbmc6OmVuY29kZSBmdW5jdGlvbnMsIGFuZCBsb2RlcG5nOjpTdGF0ZSBjYW4gYmUgdXNlZCBmb3IgYWR2YW5jZWQKLWZlYXR1cmVzLgotCi1MaWtlIHRoZSBkZWNvZGVyLCB0aGUgZW5jb2RlciBjYW4gYWxzbyBnaXZlIGVycm9ycy4gSG93ZXZlciBpdCBnaXZlcyBsZXNzIGVycm9ycwotc2luY2UgdGhlIGVuY29kZXIgaW5wdXQgaXMgdHJ1c3RlZCwgdGhlIGRlY29kZXIgaW5wdXQgKGEgUE5HIGltYWdlIHRoYXQgY291bGQKLWJlIGZvcmdlZCBieSBhbnlvbmUpIGlzIG5vdCB0cnVzdGVkLgotCi1XaGVuIHVzaW5nIHRoZSBMb2RlUE5HU3RhdGUsIGl0IHVzZXMgdGhlIGZvbGxvd2luZyBmaWVsZHMgZm9yIGVuY29kaW5nOgotKikgTG9kZVBOR0luZm8gaW5mb19wbmc6IGhlcmUgeW91IHNwZWNpZnkgaG93IHlvdSB3YW50IHRoZSBQTkcgKHRoZSBvdXRwdXQpIHRvIGJlLgotKikgTG9kZVBOR0NvbG9yTW9kZSBpbmZvX3JhdzogaGVyZSB5b3Ugc2F5IHdoYXQgY29sb3IgdHlwZSBvZiB0aGUgcmF3IGltYWdlICh0aGUgaW5wdXQpIGhhcwotKikgTG9kZVBOR0VuY29kZXJTZXR0aW5ncyBlbmNvZGVyOiB5b3UgY2FuIHNwZWNpZnkgYSBmZXcgc2V0dGluZ3MgZm9yIHRoZSBlbmNvZGVyIHRvIHVzZQotCi1Mb2RlUE5HSW5mbyBpbmZvX3BuZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2hlbiBlbmNvZGluZywgeW91IHVzZSB0aGlzIHRoZSBvcHBvc2l0ZSB3YXkgYXMgd2hlbiBkZWNvZGluZzogZm9yIGVuY29kaW5nLAoteW91IGZpbGwgaW4gdGhlIHZhbHVlcyB5b3Ugd2FudCB0aGUgUE5HIHRvIGhhdmUgYmVmb3JlIGVuY29kaW5nLiBCeSBkZWZhdWx0IGl0J3MKLW5vdCBuZWVkZWQgdG8gc3BlY2lmeSBhIGNvbG9yIHR5cGUgZm9yIHRoZSBQTkcgc2luY2UgaXQncyBhdXRvbWF0aWNhbGx5IGNob3NlbiwKLWJ1dCBpdCdzIHBvc3NpYmxlIHRvIGNob29zZSBpdCB5b3Vyc2VsZiBnaXZlbiB0aGUgcmlnaHQgc2V0dGluZ3MuCi0KLVRoZSBlbmNvZGVyIHdpbGwgbm90IGFsd2F5cyBleGFjdGx5IG1hdGNoIHRoZSBMb2RlUE5HSW5mbyBzdHJ1Y3QgeW91IGdpdmUsCi1pdCB0cmllcyBhcyBjbG9zZSBhcyBwb3NzaWJsZS4gU29tZSB0aGluZ3MgYXJlIGlnbm9yZWQgYnkgdGhlIGVuY29kZXIuIFRoZQotZW5jb2RlciB1c2VzLCBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzZXR0aW5ncyBmcm9tIGl0IHdoZW4gYXBwbGljYWJsZToKLWNvbG9ydHlwZSBhbmQgYml0ZGVwdGgsIHRleHQgY2h1bmtzLCB0aW1lIGNodW5rLCB0aGUgY29sb3Iga2V5LCB0aGUgcGFsZXR0ZSwgdGhlCi1iYWNrZ3JvdW5kIGNvbG9yLCB0aGUgaW50ZXJsYWNlIG1ldGhvZCwgdW5rbm93biBjaHVua3MsIC4uLgotCi1XaGVuIGVuY29kaW5nIHRvIGEgUE5HIHdpdGggY29sb3J0eXBlIDMsIHRoZSBlbmNvZGVyIHdpbGwgZ2VuZXJhdGUgYSBQTFRFIGNodW5rLgotSWYgdGhlIHBhbGV0dGUgY29udGFpbnMgYW55IGNvbG9ycyBmb3Igd2hpY2ggdGhlIGFscGhhIGNoYW5uZWwgaXMgbm90IDI1NSAoc28KLXRoZXJlIGFyZSB0cmFuc2x1Y2VudCBjb2xvcnMgaW4gdGhlIHBhbGV0dGUpLCBpdCdsbCBhZGQgYSB0Uk5TIGNodW5rLgotCi1Mb2RlUE5HQ29sb3JNb2RlIGluZm9fcmF3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVlvdSBzcGVjaWZ5IHRoZSBjb2xvciB0eXBlIG9mIHRoZSByYXcgaW1hZ2UgdGhhdCB5b3UgZ2l2ZSB0byB0aGUgaW5wdXQgaGVyZSwKLWluY2x1ZGluZyBhIHBvc3NpYmxlIHRyYW5zcGFyZW50IGNvbG9yIGtleSBhbmQgcGFsZXR0ZSB5b3UgaGFwcGVuIHRvIGJlIHVzaW5nIGluCi15b3VyIHJhdyBpbWFnZSBkYXRhLgotCi1CeSBkZWZhdWx0LCAzMi1iaXQgY29sb3IgaXMgYXNzdW1lZCwgbWVhbmluZyB5b3VyIGlucHV0IGhhcyB0byBiZSBpbiBSR0JBCi1mb3JtYXQgd2l0aCA0IGJ5dGVzICh1bnNpZ25lZCBjaGFycykgcGVyIHBpeGVsLgotCi1Mb2RlUE5HRW5jb2RlclNldHRpbmdzIGVuY29kZXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSBzdXBwb3J0ZWQgKHNvbWUgYXJlIGluIHN1Yi1zdHJ1Y3RzKToKLSopIGF1dG9fY29udmVydDogd2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGUgZW5jb2RlciB3aWxsCi1hdXRvbWF0aWNhbGx5IGNob29zZSB0aGUgc21hbGxlc3QgcG9zc2libGUgY29sb3IgbW9kZSAoaW5jbHVkaW5nIGNvbG9yIGtleSkgdGhhdAotY2FuIGVuY29kZSB0aGUgY29sb3JzIG9mIGFsbCBwaXhlbHMgd2l0aG91dCBpbmZvcm1hdGlvbiBsb3NzLgotKikgYnR5cGU6IHRoZSBibG9jayB0eXBlIGZvciBMWjc3LiAwID0gdW5jb21wcmVzc2VkLCAxID0gZml4ZWQgaHVmZm1hbiB0cmVlLAotICAgMiA9IGR5bmFtaWMgaHVmZm1hbiB0cmVlIChiZXN0IGNvbXByZXNzaW9uKS4gU2hvdWxkIGJlIDIgZm9yIHByb3BlcgotICAgY29tcHJlc3Npb24uCi0qKSB1c2VfbHo3Nzogd2hldGhlciBvciBub3QgdG8gdXNlIExaNzcgZm9yIGNvbXByZXNzZWQgYmxvY2sgdHlwZXMuIFNob3VsZCBiZQotICAgdHJ1ZSBmb3IgcHJvcGVyIGNvbXByZXNzaW9uLgotKikgd2luZG93c2l6ZTogdGhlIHdpbmRvdyBzaXplIHVzZWQgYnkgdGhlIExaNzcgZW5jb2RlciAoMSAtIDMyNzY4KS4gSGFzIHZhbHVlCi0gICAyMDQ4IGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgc2V0IHRvIDMyNzY4IGZvciBiZXR0ZXIsIGJ1dCBzbG93LCBjb21wcmVzc2lvbi4KLSopIGZvcmNlX3BhbGV0dGU6IGlmIGNvbG9ydHlwZSBpcyAyIG9yIDYsIHlvdSBjYW4gbWFrZSB0aGUgZW5jb2RlciB3cml0ZSBhIFBMVEUKLSAgIGNodW5rIGlmIGZvcmNlX3BhbGV0dGUgaXMgdHJ1ZS4gVGhpcyBjYW4gdXNlZCBhcyBzdWdnZXN0ZWQgcGFsZXR0ZSB0byBjb252ZXJ0Ci0gICB0byBieSB2aWV3ZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gMjU2IGNvbG9ycyAoaWYgdGhvc2Ugc3RpbGwgZXhpc3QpCi0qKSBhZGRfaWQ6IGFkZCB0ZXh0IGNodW5rICJFbmNvZGVyOiBMb2RlUE5HIDx2ZXJzaW9uPiIgdG8gdGhlIGltYWdlLgotKikgdGV4dF9jb21wcmVzc2lvbjogZGVmYXVsdCAxLiBJZiAxLCBpdCdsbCBzdG9yZSB0ZXh0cyBhcyB6VFh0IGluc3RlYWQgb2YgdEVYdCBjaHVua3MuCi0gIHpUWHQgY2h1bmtzIHVzZSB6bGliIGNvbXByZXNzaW9uIG9uIHRoZSB0ZXh0LiBUaGlzIGdpdmVzIGEgc21hbGxlciByZXN1bHQgb24KLSAgbGFyZ2UgdGV4dHMgYnV0IGEgbGFyZ2VyIHJlc3VsdCBvbiBzbWFsbCB0ZXh0cyAoc3VjaCBhcyBhIHNpbmdsZSBwcm9ncmFtIG5hbWUpLgotICBJdCdzIGFsbCB0RVh0IG9yIGFsbCB6VFh0IHRob3VnaCwgdGhlcmUncyBubyBzZXBhcmF0ZSBzZXR0aW5nIHBlciB0ZXh0IHlldC4KLQotCi02LiBjb2xvciBjb252ZXJzaW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQW4gaW1wb3J0YW50IHRoaW5nIHRvIG5vdGUgYWJvdXQgTG9kZVBORywgaXMgdGhhdCB0aGUgY29sb3IgdHlwZSBvZiB0aGUgUE5HLCBhbmQKLXRoZSBjb2xvciB0eXBlIG9mIHRoZSByYXcgaW1hZ2UsIGFyZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50LiBCeSBkZWZhdWx0LCB3aGVuCi15b3UgZGVjb2RlIGEgUE5HLCB5b3UgZ2V0IHRoZSByZXN1bHQgYXMgYSByYXcgaW1hZ2UgaW4gdGhlIGNvbG9yIHR5cGUgeW91IHdhbnQsCi1ubyBtYXR0ZXIgd2hldGhlciB0aGUgUE5HIHdhcyBlbmNvZGVkIHdpdGggYSBwYWxldHRlLCBncmF5c2NhbGUgb3IgUkdCQSBjb2xvci4KLUFuZCBpZiB5b3UgZW5jb2RlIGFuIGltYWdlLCBieSBkZWZhdWx0IExvZGVQTkcgd2lsbCBhdXRvbWF0aWNhbGx5IGNob29zZSB0aGUgUE5HCi1jb2xvciB0eXBlIHRoYXQgZ2l2ZXMgZ29vZCBjb21wcmVzc2lvbiBiYXNlZCBvbiB0aGUgdmFsdWVzIG9mIGNvbG9ycyBhbmQgYW1vdW50Ci1vZiBjb2xvcnMgaW4gdGhlIGltYWdlLiBJdCBjYW4gYmUgY29uZmlndXJlZCB0byBsZXQgeW91IGNvbnRyb2wgaXQgaW5zdGVhZCBhcwotd2VsbCwgdGhvdWdoLgotCi1UbyBiZSBhYmxlIHRvIGRvIHRoaXMsIExvZGVQTkcgZG9lcyBjb252ZXJzaW9ucyBmcm9tIG9uZSBjb2xvciBtb2RlIHRvIGFub3RoZXIuCi1JdCBjYW4gY29udmVydCBmcm9tIGFsbW9zdCBhbnkgY29sb3IgdHlwZSB0byBhbnkgb3RoZXIgY29sb3IgdHlwZSwgZXhjZXB0IHRoZQotZm9sbG93aW5nIGNvbnZlcnNpb25zOiBSR0IgdG8gZ3JheXNjYWxlIGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCBjb252ZXJ0aW5nIHRvIGEKLXBhbGV0dGUgd2hlbiB0aGUgcGFsZXR0ZSBkb2Vzbid0IGhhdmUgYSByZXF1aXJlZCBjb2xvciBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGlzCi1ub3Qgc3VwcG9ydGVkIG9uIHB1cnBvc2U6IHRoaXMgaXMgaW5mb3JtYXRpb24gbG9zcyB3aGljaCByZXF1aXJlcyBhIGNvbG9yCi1yZWR1Y3Rpb24gYWxnb3JpdGhtIHRoYXQgaXMgYmV5b25nIHRoZSBzY29wZSBvZiBhIFBORyBlbmNvZGVyICh5ZXMsIFJHQiB0byBncmF5Ci1pcyBlYXN5LCBidXQgdGhlcmUgYXJlIG11bHRpcGxlIHdheXMgaWYgeW91IHdhbnQgdG8gZ2l2ZSBzb21lIGNoYW5uZWxzIG1vcmUKLXdlaWdodCkuCi0KLUJ5IGRlZmF1bHQsIHdoZW4gZGVjb2RpbmcsIHlvdSBnZXQgdGhlIHJhdyBpbWFnZSBpbiAzMi1iaXQgUkdCQSBvciAyNC1iaXQgUkdCCi1jb2xvciwgbm8gbWF0dGVyIHdoYXQgY29sb3IgdHlwZSB0aGUgUE5HIGhhcy4gQW5kIGJ5IGRlZmF1bHQgd2hlbiBlbmNvZGluZywKLUxvZGVQTkcgYXV0b21hdGljYWxseSBwaWNrcyB0aGUgYmVzdCBjb2xvciBtb2RlbCBmb3IgdGhlIG91dHB1dCBQTkcsIGFuZCBleHBlY3RzCi10aGUgaW5wdXQgaW1hZ2UgdG8gYmUgMzItYml0IFJHQkEgb3IgMjQtYml0IFJHQi4gU28sIHVubGVzcyB5b3Ugd2FudCB0byBjb250cm9sCi10aGUgY29sb3IgZm9ybWF0IG9mIHRoZSBpbWFnZXMgeW91cnNlbGYsIHlvdSBjYW4gc2tpcCB0aGlzIGNoYXB0ZXIuCi0KLTYuMS4gUE5HIGNvbG9yIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BIFBORyBpbWFnZSBjYW4gaGF2ZSBtYW55IGNvbG9yIHR5cGVzLCByYW5naW5nIGZyb20gMS1iaXQgY29sb3IgdG8gNjQtYml0IGNvbG9yLAotYXMgd2VsbCBhcyBwYWxldHRpemVkIGNvbG9yIG1vZGVzLiBBZnRlciB0aGUgemxpYiBkZWNvbXByZXNzaW9uIGFuZCB1bmZpbHRlcmluZwotaW4gdGhlIFBORyBpbWFnZSBpcyBkb25lLCB0aGUgcmF3IHBpeGVsIGRhdGEgd2lsbCBoYXZlIHRoYXQgY29sb3IgdHlwZSBhbmQgdGh1cwotYSBjZXJ0YWluIGFtb3VudCBvZiBiaXRzIHBlciBwaXhlbC4gSWYgeW91IHdhbnQgdGhlIG91dHB1dCByYXcgaW1hZ2UgYWZ0ZXIKLWRlY29kaW5nIHRvIGhhdmUgYW5vdGhlciBjb2xvciB0eXBlLCBhIGNvbnZlcnNpb24gaXMgZG9uZSBieSBMb2RlUE5HLgotCi1UaGUgUE5HIHNwZWNpZmljYXRpb24gZ2l2ZXMgdGhlIGZvbGxvd2luZyBjb2xvciB0eXBlczoKLQotMDogZ3JheXNjYWxlLCBiaXQgZGVwdGhzIDEsIDIsIDQsIDgsIDE2Ci0yOiBSR0IsIGJpdCBkZXB0aHMgOCBhbmQgMTYKLTM6IHBhbGV0dGUsIGJpdCBkZXB0aHMgMSwgMiwgNCBhbmQgOAotNDogZ3JheXNjYWxlIHdpdGggYWxwaGEsIGJpdCBkZXB0aHMgOCBhbmQgMTYKLTY6IFJHQkEsIGJpdCBkZXB0aHMgOCBhbmQgMTYKLQotQml0IGRlcHRoIGlzIHRoZSBhbW91bnQgb2YgYml0cyBwZXIgcGl4ZWwgcGVyIGNvbG9yIGNoYW5uZWwuIFNvIHRoZSB0b3RhbCBhbW91bnQKLW9mIGJpdHMgcGVyIHBpeGVsIGlzOiBhbW91bnQgb2YgY2hhbm5lbHMgKiBiaXRkZXB0aC4KLQotNi4yLiBjb2xvciBjb252ZXJzaW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BcyBleHBsYWluZWQgaW4gdGhlIHNlY3Rpb25zIGFib3V0IHRoZSBlbmNvZGVyIGFuZCBkZWNvZGVyLCB5b3UgY2FuIHNwZWNpZnkKLWNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzIGluIGluZm9fcG5nIGFuZCBpbmZvX3JhdyB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKLWJlaGF2aW91ci4KLQotSWYsIHdoZW4gZGVjb2RpbmcsIHlvdSB3YW50IHRoZSByYXcgaW1hZ2UgdG8gYmUgc29tZXRoaW5nIGVsc2UgdGhhbiB0aGUgZGVmYXVsdCwKLXlvdSBuZWVkIHRvIHNldCB0aGUgY29sb3IgdHlwZSBhbmQgYml0IGRlcHRoIHlvdSB3YW50IGluIHRoZSBMb2RlUE5HQ29sb3JNb2RlLAotb3IgdGhlIHBhcmFtZXRlcnMgY29sb3J0eXBlIGFuZCBiaXRkZXB0aCBvZiB0aGUgc2ltcGxlIGRlY29kaW5nIGZ1bmN0aW9uLgotCi1JZiwgd2hlbiBlbmNvZGluZywgeW91IHVzZSBhbm90aGVyIGNvbG9yIHR5cGUgdGhhbiB0aGUgZGVmYXVsdCBpbiB0aGUgcmF3IGlucHV0Ci1pbWFnZSwgeW91IG5lZWQgdG8gc3BlY2lmeSBpdHMgY29sb3IgdHlwZSBhbmQgYml0IGRlcHRoIGluIHRoZSBMb2RlUE5HQ29sb3JNb2RlCi1vZiB0aGUgcmF3IGltYWdlLCBvciB1c2UgdGhlIHBhcmFtZXRlcnMgY29sb3J0eXBlIGFuZCBiaXRkZXB0aCBvZiB0aGUgc2ltcGxlCi1lbmNvZGluZyBmdW5jdGlvbi4KLQotSWYsIHdoZW4gZW5jb2RpbmcsIHlvdSBkb24ndCB3YW50IExvZGVQTkcgdG8gY2hvb3NlIHRoZSBvdXRwdXQgUE5HIGNvbG9yIHR5cGUKLWJ1dCBjb250cm9sIGl0IHlvdXJzZWxmLCB5b3UgbmVlZCB0byBzZXQgYXV0b19jb252ZXJ0IGluIHRoZSBlbmNvZGVyIHNldHRpbmdzCi10byBmYWxzZSwgYW5kIHNwZWNpZnkgdGhlIGNvbG9yIHR5cGUgeW91IHdhbnQgaW4gdGhlIExvZGVQTkdJbmZvIG9mIHRoZQotZW5jb2RlciAoaW5jbHVkaW5nIHBhbGV0dGU6IGl0IGNhbiBnZW5lcmF0ZSBhIHBhbGV0dGUgaWYgYXV0b19jb252ZXJ0IGlzIHRydWUsCi1vdGhlcndpc2Ugbm90KS4KLQotSWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29sb3IgdHlwZSBkaWZmZXIgKHdoZXRoZXIgdXNlciBjaG9zZW4gb3IgYXV0byBjaG9zZW4pLAotTG9kZVBORyB3aWxsIGRvIGEgY29sb3IgY29udmVyc2lvbiwgd2hpY2ggZm9sbG93cyB0aGUgcnVsZXMgYmVsb3csIGFuZCBtYXkKLXNvbWV0aW1lcyByZXN1bHQgaW4gYW4gZXJyb3IuCi0KLVRvIGF2b2lkIHNvbWUgY29uZnVzaW9uOgotLXRoZSBkZWNvZGVyIGNvbnZlcnRzIGZyb20gUE5HIHRvIHJhdyBpbWFnZQotLXRoZSBlbmNvZGVyIGNvbnZlcnRzIGZyb20gcmF3IGltYWdlIHRvIFBORwotLXRoZSBjb2xvcnR5cGUgYW5kIGJpdGRlcHRoIGluIExvZGVQTkdDb2xvck1vZGUgaW5mb19yYXcsIGFyZSB0aG9zZSBvZiB0aGUgcmF3IGltYWdlCi0tdGhlIGNvbG9ydHlwZSBhbmQgYml0ZGVwdGggaW4gdGhlIGNvbG9yIGZpZWxkIG9mIExvZGVQTkdJbmZvIGluZm9fcG5nLCBhcmUgdGhvc2Ugb2YgdGhlIFBORwotLXdoZW4gZW5jb2RpbmcsIHRoZSBjb2xvciB0eXBlIGluIExvZGVQTkdJbmZvIGlzIGlnbm9yZWQgaWYgYXV0b19jb252ZXJ0Ci0gaXMgZW5hYmxlZCwgaXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaW5zdGVhZAotLXdoZW4gZGVjb2RpbmcsIHRoZSBjb2xvciB0eXBlIGluIExvZGVQTkdJbmZvIGlzIHNldCBieSB0aGUgZGVjb2RlciB0byB0aGF0IG9mIHRoZSBvcmlnaW5hbAotIFBORyBpbWFnZSwgYnV0IGl0IGNhbiBiZSBpZ25vcmVkIHNpbmNlIHRoZSByYXcgaW1hZ2UgaGFzIHRoZSBjb2xvciB0eXBlIHlvdSByZXF1ZXN0ZWQgaW5zdGVhZAotLWlmIHRoZSBjb2xvciB0eXBlIG9mIHRoZSBMb2RlUE5HQ29sb3JNb2RlIGFuZCBQTkcgaW1hZ2UgYXJlbid0IHRoZSBzYW1lLCBhIGNvbnZlcnNpb24KLSBiZXR3ZWVuIHRoZSBjb2xvciB0eXBlcyBpcyBkb25lIGlmIHRoZSBjb2xvciB0eXBlcyBhcmUgc3VwcG9ydGVkLiBJZiBpdCBpcyBub3QKLSBzdXBwb3J0ZWQsIGFuIGVycm9yIGlzIHJldHVybmVkLiBJZiB0aGUgdHlwZXMgYXJlIHRoZSBzYW1lLCBubyBjb252ZXJzaW9uIGlzIGRvbmUuCi0tZXZlbiB0aG91Z2ggc29tZSBjb252ZXJzaW9ucyBhcmVuJ3Qgc3VwcG9ydGVkLCBMb2RlUE5HIHN1cHBvcnRzIGxvYWRpbmcgUE5HcyBmcm9tIGFueQotIGNvbG9ydHlwZSBhbmQgc2F2aW5nIFBOR3MgdG8gYW55IGNvbG9ydHlwZSwgc29tZXRpbWVzIGl0IGp1c3QgcmVxdWlyZXMgcHJlcGFyaW5nCi0gdGhlIHJhdyBpbWFnZSBjb3JyZWN0bHkgYmVmb3JlIGVuY29kaW5nLgotLWJvdGggZW5jb2RlciBhbmQgZGVjb2RlciB1c2UgdGhlIHNhbWUgY29sb3IgY29udmVydGVyLgotCi1UaGUgZnVuY3Rpb24gbG9kZXBuZ19jb252ZXJ0IGRvZXMgdGhlIGNvbG9yIGNvbnZlcnNpb24uIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUKLWludGVyZmFjZSBidXQgbm9ybWFsbHkgaXNuJ3QgbmVlZGVkIHNpbmNlIHRoZSBlbmNvZGVyIGFuZCBkZWNvZGVyIGFscmVhZHkgY2FsbAotaXQuCi0KLU5vbiBzdXBwb3J0ZWQgY29sb3IgY29udmVyc2lvbnM6Ci0tY29sb3IgdG8gZ3JheXNjYWxlIHdoZW4gbm9uLWdyYXkgcGl4ZWxzIGFyZSBwcmVzZW50OiBubyBlcnJvciBpcyB0aHJvd24sIGJ1dAotdGhlIHJlc3VsdCB3aWxsIGxvb2sgdWdseSBiZWNhdXNlIG9ubHkgdGhlIHJlZCBjaGFubmVsIGlzIHRha2VuIChpdCBhc3N1bWVzIGFsbAotdGhyZWUgY2hhbm5lbHMgYXJlIHRoZSBzYW1lIGluIHRoaXMgY2FzZSBzbyBpZ25vcmVzIGdyZWVuIGFuZCBibHVlKS4gVGhlIHJlYXNvbgotbm8gZXJyb3IgaXMgZ2l2ZW4gaXMgdG8gYWxsb3cgY29udmVydGluZyBmcm9tIHRocmVlLWNoYW5uZWwgZ3JheXNjYWxlIGltYWdlcyB0bwotb25lLWNoYW5uZWwgZXZlbiBpZiB0aGVyZSBhcmUgbnVtZXJpY2FsIGltcHJlY2lzaW9ucy4KLS1hbnl0aGluZyB0byBwYWxldHRlIHdoZW4gdGhlIHBhbGV0dGUgZG9lcyBub3QgaGF2ZSBhbiBleGFjdCBtYXRjaCBmb3IgYSBmcm9tLWNvbG9yCi1pbiBpdDogaW4gdGhpcyBjYXNlIGFuIGVycm9yIGlzIHRocm93bgotCi1TdXBwb3J0ZWQgY29sb3IgY29udmVyc2lvbnM6Ci0tYW55dGhpbmcgdG8gOC1iaXQgUkdCLCA4LWJpdCBSR0JBLCAxNi1iaXQgUkdCLCAxNi1iaXQgUkdCQQotLWFueSBncmF5IG9yIGdyYXkrYWxwaGEsIHRvIGdyYXkgb3IgZ3JheSthbHBoYQotLWFueXRoaW5nIHRvIGEgcGFsZXR0ZSwgYXMgbG9uZyBhcyB0aGUgcGFsZXR0ZSBoYXMgdGhlIHJlcXVlc3RlZCBjb2xvcnMgaW4gaXQKLS1yZW1vdmluZyBhbHBoYSBjaGFubmVsCi0taGlnaGVyIHRvIHNtYWxsZXIgYml0ZGVwdGgsIGFuZCB2aWNlIHZlcnNhCi0KLUlmIHlvdSB3YW50IG5vIGNvbG9yIGNvbnZlcnNpb24gdG8gYmUgZG9uZSAoZS5nLiBmb3Igc3BlZWQgb3IgY29udHJvbCk6Ci0tSW4gdGhlIGVuY29kZXIsIHlvdSBjYW4gbWFrZSBpdCBzYXZlIGEgUE5HIHdpdGggYW55IGNvbG9yIHR5cGUgYnkgZ2l2aW5nIHRoZQotcmF3IGNvbG9yIG1vZGUgYW5kIExvZGVQTkdJbmZvIHRoZSBzYW1lIGNvbG9yIG1vZGUsIGFuZCBzZXR0aW5nIGF1dG9fY29udmVydCB0bwotZmFsc2UuCi0tSW4gdGhlIGRlY29kZXIsIHlvdSBjYW4gbWFrZSBpdCBzdG9yZSB0aGUgcGl4ZWwgZGF0YSBpbiB0aGUgc2FtZSBjb2xvciB0eXBlCi1hcyB0aGUgUE5HIGhhcywgYnkgc2V0dGluZyB0aGUgY29sb3JfY29udmVydCBzZXR0aW5nIHRvIGZhbHNlLiBTZXR0aW5ncyBpbgotaW5mb19yYXcgYXJlIHRoZW4gaWdub3JlZC4KLQotNi4zLiBwYWRkaW5nIGJpdHMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUluIHRoZSBQTkcgZmlsZSBmb3JtYXQsIGlmIGEgbGVzcyB0aGFuIDgtYml0IHBlciBwaXhlbCBjb2xvciB0eXBlIGlzIHVzZWQgYW5kIHRoZSBzY2FubGluZXMKLWhhdmUgYSBiaXQgYW1vdW50IHRoYXQgaXNuJ3QgYSBtdWx0aXBsZSBvZiA4LCB0aGVuIHBhZGRpbmcgYml0cyBhcmUgdXNlZCBzbyB0aGF0IGVhY2gKLXNjYW5saW5lIHN0YXJ0cyBhdCBhIGZyZXNoIGJ5dGUuIEJ1dCB0aGF0IGlzIE5PVCB0cnVlIGZvciB0aGUgTG9kZVBORyByYXcgaW5wdXQgYW5kIG91dHB1dC4KLVRoZSByYXcgaW5wdXQgaW1hZ2UgeW91IGdpdmUgdG8gdGhlIGVuY29kZXIsIGFuZCB0aGUgcmF3IG91dHB1dCBpbWFnZSB5b3UgZ2V0IGZyb20gdGhlIGRlY29kZXIKLXdpbGwgTk9UIGhhdmUgdGhlc2UgcGFkZGluZyBiaXRzLCBlLmcuIGluIHRoZSBjYXNlIG9mIGEgMS1iaXQgaW1hZ2Ugd2l0aCBhIHdpZHRoCi1vZiA3IHBpeGVscywgdGhlIGZpcnN0IHBpeGVsIG9mIHRoZSBzZWNvbmQgc2NhbmxpbmUgd2lsbCB0aGUgdGhlIDh0aCBiaXQgb2YgdGhlIGZpcnN0IGJ5dGUsCi1ub3QgdGhlIGZpcnN0IGJpdCBvZiBhIG5ldyBieXRlLgotCi02LjQuIEEgbm90ZSBhYm91dCAxNi1iaXRzIHBlciBjaGFubmVsIGFuZCBlbmRpYW5uZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxvZGVQTkcgdXNlcyB1bnNpZ25lZCBjaGFyIGFycmF5cyBmb3IgMTYtYml0IHBlciBjaGFubmVsIGNvbG9ycyB0b28sIGp1c3QgbGlrZQotZm9yIGFueSBvdGhlciBjb2xvciBmb3JtYXQuIFRoZSAxNi1iaXQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYmlnIGVuZGlhbiAobW9zdAotc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCkgaW4gdGhlc2UgYXJyYXlzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvcmRlciBvZiB0aGUKLWxpdHRsZSBlbmRpYW4gdXNlZCBieSB4ODYgQ1BVJ3MuCi0KLUxvZGVQTkcgYWx3YXlzIHVzZXMgYmlnIGVuZGlhbiBiZWNhdXNlIHRoZSBQTkcgZmlsZSBmb3JtYXQgZG9lcyBzbyBpbnRlcm5hbGx5LgotQ29udmVyc2lvbnMgdG8gb3RoZXIgZm9ybWF0cyB0aGFuIFBORyB1c2VzIGludGVybmFsbHkgYXJlIG5vdCBzdXBwb3J0ZWQgYnkKLUxvZGVQTkcgb24gcHVycG9zZSwgdGhlcmUgYXJlIG15cmlhZHMgb2YgZm9ybWF0cywgaW5jbHVkaW5nIGVuZGlhbm5lc3Mgb2YgMTYtYml0Ci1jb2xvcnMsIHRoZSBvcmRlciBpbiB3aGljaCB5b3Ugc3RvcmUgUiwgRywgQiBhbmQgQSwgYW5kIHNvIG9uLiBTdXBwb3J0aW5nIGFuZAotY29udmVydGluZyB0by9mcm9tIGFsbCB0aGF0IGlzIG91dHNpZGUgdGhlIHNjb3BlIG9mIExvZGVQTkcuCi0KLVRoaXMgbWF5IG1lYW4gdGhhdCwgZGVwZW5kaW5nIG9uIHlvdXIgdXNlIGNhc2UsIHlvdSBtYXkgd2FudCB0byBjb252ZXJ0IHRoZSBiaWcKLWVuZGlhbiBvdXRwdXQgb2YgTG9kZVBORyB0byBsaXR0bGUgZW5kaWFuIHdpdGggYSBmb3IgbG9vcC4gVGhpcyBpcyBjZXJ0YWlubHkgbm90Ci1hbHdheXMgbmVlZGVkLCBtYW55IGFwcGxpY2F0aW9ucyBhbmQgbGlicmFyaWVzIHN1cHBvcnQgYmlnIGVuZGlhbiAxNi1iaXQgY29sb3JzCi1hbnl3YXksIGJ1dCBpdCBtZWFucyB5b3UgY2Fubm90IHNpbXBseSBjYXN0IHRoZSB1bnNpZ25lZCBjaGFyKiBidWZmZXIgdG8gYW4KLXVuc2lnbmVkIHNob3J0KiBidWZmZXIgb24geDg2IENQVXMuCi0KLQotNy4gZXJyb3IgdmFsdWVzCi0tLS0tLS0tLS0tLS0tLS0KLQotQWxsIGZ1bmN0aW9ucyBpbiBMb2RlUE5HIHRoYXQgcmV0dXJuIGFuIGVycm9yIGNvZGUsIHJldHVybiAwIGlmIGV2ZXJ5dGhpbmcgd2VudAotT0ssIG9yIGEgbm9uLXplcm8gY29kZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCi0KLVRoZSBtZWFuaW5nIG9mIHRoZSBMb2RlUE5HIGVycm9yIHZhbHVlcyBjYW4gYmUgcmV0cmlldmVkIHdpdGggdGhlIGZ1bmN0aW9uCi1sb2RlcG5nX2Vycm9yX3RleHQ6IGdpdmVuIHRoZSBudW1lcmljYWwgZXJyb3IgY29kZSwgaXQgcmV0dXJucyBhIGRlc2NyaXB0aW9uCi1vZiB0aGUgZXJyb3IgaW4gRW5nbGlzaCBhcyBhIHN0cmluZy4KLQotQ2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGxvZGVwbmdfZXJyb3JfdGV4dCB0byBzZWUgdGhlIG1lYW5pbmcgb2YgZWFjaCBjb2RlLgotCi0KLTguIGNodW5rcyBhbmQgUE5HIGVkaXRpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IHdhbnQgdG8gYWRkIGV4dHJhIGNodW5rcyB0byBhIFBORyB5b3UgZW5jb2RlLCBvciB1c2UgTG9kZVBORyBmb3IgYSBQTkcKLWVkaXRvciB0aGF0IHNob3VsZCBmb2xsb3cgdGhlIHJ1bGVzIGFib3V0IGhhbmRsaW5nIG9mIHVua25vd24gY2h1bmtzLCBvciBpZiB5b3VyCi1wcm9ncmFtIGlzIGFibGUgdG8gcmVhZCBvdGhlciB0eXBlcyBvZiBjaHVua3MgdGhhbiB0aGUgb25lcyBoYW5kbGVkIGJ5IExvZGVQTkcsCi10aGVuIHRoYXQncyBwb3NzaWJsZSB3aXRoIHRoZSBjaHVuayBmdW5jdGlvbnMgb2YgTG9kZVBORy4KLQotQSBQTkcgY2h1bmsgaGFzIHRoZSBmb2xsb3dpbmcgbGF5b3V0OgotCi00IGJ5dGVzIGxlbmd0aAotNCBieXRlcyB0eXBlIG5hbWUKLWxlbmd0aCBieXRlcyBkYXRhCi00IGJ5dGVzIENSQwotCi04LjEuIGl0ZXJhdGluZyB0aHJvdWdoIGNodW5rcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IGhhdmUgYSBidWZmZXIgY29udGFpbmluZyB0aGUgUE5HIGltYWdlIGRhdGEsIHRoZW4gdGhlIGZpcnN0IGNodW5rICh0aGUKLUlIRFIgY2h1bmspIHN0YXJ0cyBhdCBieXRlIG51bWJlciA4IG9mIHRoYXQgYnVmZmVyLiBUaGUgZmlyc3QgOCBieXRlcyBhcmUgdGhlCi1zaWduYXR1cmUgb2YgdGhlIFBORyBhbmQgYXJlIG5vdCBwYXJ0IG9mIGEgY2h1bmsuIEJ1dCBpZiB5b3Ugc3RhcnQgYXQgYnl0ZSA4Ci10aGVuIHlvdSBoYXZlIGEgY2h1bmssIGFuZCBjYW4gY2hlY2sgdGhlIGZvbGxvd2luZyB0aGluZ3Mgb2YgaXQuCi0KLU5PVEU6IG5vbmUgb2YgdGhlc2UgZnVuY3Rpb25zIGNoZWNrIGZvciBtZW1vcnkgYnVmZmVyIGJvdW5kYXJpZXMuIFRvIGF2b2lkCi1leHBsb2l0cywgYWx3YXlzIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGNvbnRhaW5zIGFsbCB0aGUgZGF0YSBvZiB0aGUgY2h1bmtzLgotV2hlbiB1c2luZyBsb2RlcG5nX2NodW5rX25leHQsIG1ha2Ugc3VyZSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgd2l0aGluIHRoZQotYWxsb2NhdGVkIG1lbW9yeS4KLQotdW5zaWduZWQgbG9kZXBuZ19jaHVua19sZW5ndGgoY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspOgotCi1HZXQgdGhlIGxlbmd0aCBvZiB0aGUgY2h1bmsncyBkYXRhLiBUaGUgdG90YWwgY2h1bmsgbGVuZ3RoIGlzIHRoaXMgbGVuZ3RoICsgMTIuCi0KLXZvaWQgbG9kZXBuZ19jaHVua190eXBlKGNoYXIgdHlwZVs1XSwgY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspOgotdW5zaWduZWQgY2hhciBsb2RlcG5nX2NodW5rX3R5cGVfZXF1YWxzKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rLCBjb25zdCBjaGFyKiB0eXBlKToKLQotR2V0IHRoZSB0eXBlIG9mIHRoZSBjaHVuayBvciBjb21wYXJlIGlmIGl0J3MgYSBjZXJ0YWluIHR5cGUKLQotdW5zaWduZWQgY2hhciBsb2RlcG5nX2NodW5rX2NyaXRpY2FsKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKToKLXVuc2lnbmVkIGNoYXIgbG9kZXBuZ19jaHVua19wcml2YXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKToKLXVuc2lnbmVkIGNoYXIgbG9kZXBuZ19jaHVua19zYWZldG9jb3B5KGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKToKLQotQ2hlY2sgaWYgdGhlIGNodW5rIGlzIGNyaXRpY2FsIGluIHRoZSBQTkcgc3RhbmRhcmQgKG9ubHkgSUhEUiwgUExURSwgSURBVCBhbmQgSUVORCBhcmUpLgotQ2hlY2sgaWYgdGhlIGNodW5rIGlzIHByaXZhdGUgKHB1YmxpYyBjaHVua3MgYXJlIHBhcnQgb2YgdGhlIHN0YW5kYXJkLCBwcml2YXRlIG9uZXMgbm90KS4KLUNoZWNrIGlmIHRoZSBjaHVuayBpcyBzYWZlIHRvIGNvcHkuIElmIGl0J3Mgbm90LCB0aGVuLCB3aGVuIG1vZGlmeWluZyBkYXRhIGluIGEgY3JpdGljYWwKLWNodW5rLCB1bnNhZmUgdG8gY29weSBjaHVua3Mgb2YgdGhlIG9sZCBpbWFnZSBtYXkgTk9UIGJlIHNhdmVkIGluIHRoZSBuZXcgb25lIGlmIHlvdXIKLXByb2dyYW0gZG9lc24ndCBoYW5kbGUgdGhhdCB0eXBlIG9mIHVua25vd24gY2h1bmsuCi0KLXVuc2lnbmVkIGNoYXIqIGxvZGVwbmdfY2h1bmtfZGF0YSh1bnNpZ25lZCBjaGFyKiBjaHVuayk6Ci1jb25zdCB1bnNpZ25lZCBjaGFyKiBsb2RlcG5nX2NodW5rX2RhdGFfY29uc3QoY29uc3QgdW5zaWduZWQgY2hhciogY2h1bmspOgotCi1HZXQgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBvZiB0aGUgY2h1bmsuCi0KLXVuc2lnbmVkIGxvZGVwbmdfY2h1bmtfY2hlY2tfY3JjKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNodW5rKToKLXZvaWQgbG9kZXBuZ19jaHVua19nZW5lcmF0ZV9jcmModW5zaWduZWQgY2hhciogY2h1bmspOgotCi1DaGVjayBpZiB0aGUgY3JjIGlzIGNvcnJlY3Qgb3IgZ2VuZXJhdGUgYSBjb3JyZWN0IG9uZS4KLQotdW5zaWduZWQgY2hhciogbG9kZXBuZ19jaHVua19uZXh0KHVuc2lnbmVkIGNoYXIqIGNodW5rKToKLWNvbnN0IHVuc2lnbmVkIGNoYXIqIGxvZGVwbmdfY2h1bmtfbmV4dF9jb25zdChjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuayk6Ci0KLUl0ZXJhdGUgdG8gdGhlIG5leHQgY2h1bmsuIFRoaXMgd29ya3MgaWYgeW91IGhhdmUgYSBidWZmZXIgd2l0aCBjb25zZWN1dGl2ZSBjaHVua3MuIE5vdGUgdGhhdCB0aGVzZQotZnVuY3Rpb25zIGRvIG5vIGJvdW5kYXJ5IGNoZWNraW5nIG9mIHRoZSBhbGxvY2F0ZWQgZGF0YSB3aGF0c29ldmVyLCBzbyBtYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoCi1kYXRhIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyIHRvIGJlIGFibGUgdG8gZ28gdG8gdGhlIG5leHQgY2h1bmsuCi0KLXVuc2lnbmVkIGxvZGVwbmdfY2h1bmtfYXBwZW5kKHVuc2lnbmVkIGNoYXIqKiBvdXQsIHNpemVfdCogb3V0bGVuZ3RoLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBjaHVuayk6Ci11bnNpZ25lZCBsb2RlcG5nX2NodW5rX2NyZWF0ZSh1bnNpZ25lZCBjaGFyKiogb3V0LCBzaXplX3QqIG91dGxlbmd0aCwgdW5zaWduZWQgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSk6Ci0KLVRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjcmVhdGUgbmV3IGNodW5rcyB0aGF0IGFyZSBhcHBlbmRlZCB0byB0aGUgZGF0YSBpbiAqb3V0IHRoYXQgaGFzCi1sZW5ndGggKm91dGxlbmd0aC4gVGhlIGFwcGVuZCBmdW5jdGlvbiBhcHBlbmRzIGFuIGV4aXN0aW5nIGNodW5rIHRvIHRoZSBuZXcgZGF0YS4gVGhlIGNyZWF0ZQotZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyBjaHVuayB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGFuZCBhcHBlbmRzIGl0LiBUeXBlIGlzIHRoZSA0LWxldHRlcgotbmFtZSBvZiB0aGUgY2h1bmsuCi0KLTguMi4gY2h1bmtzIGluIGluZm9fcG5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgTG9kZVBOR0luZm8gc3RydWN0IGNvbnRhaW5zIGZpZWxkcyB3aXRoIHRoZSB1bmtub3duIGNodW5rIGluIGl0LiBJdCBoYXMgMwotYnVmZmVycyAoZWFjaCB3aXRoIHNpemUpIHRvIGNvbnRhaW4gMyB0eXBlcyBvZiB1bmtub3duIGNodW5rczoKLXRoZSBvbmVzIHRoYXQgY29tZSBiZWZvcmUgdGhlIFBMVEUgY2h1bmssIHRoZSBvbmVzIHRoYXQgY29tZSBiZXR3ZWVuIHRoZSBQTFRFCi1hbmQgdGhlIElEQVQgY2h1bmtzLCBhbmQgdGhlIG9uZXMgdGhhdCBjb21lIGFmdGVyIHRoZSBJREFUIGNodW5rcy4KLUl0J3MgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIGRpc3Rpb25jdGlvbiBiZXR3ZWVuIHRoZXNlIDMgY2FzZXMgYmVjYXVzZSB0aGUgUE5HCi1zdGFuZGFyZCBmb3JjZXMgdG8ga2VlcCB0aGUgb3JkZXJpbmcgb2YgdW5rbm93biBjaHVua3MgY29tcGFyZWQgdG8gdGhlIGNyaXRpY2FsCi1jaHVua3MsIGJ1dCBkb2VzIG5vdCBmb3JjZSBhbnkgb3RoZXIgb3JkZXJpbmcgcnVsZXMuCi0KLWluZm9fcG5nLnVua25vd25fY2h1bmtzX2RhdGFbMF0gaXMgdGhlIGNodW5rcyBiZWZvcmUgUExURQotaW5mb19wbmcudW5rbm93bl9jaHVua3NfZGF0YVsxXSBpcyB0aGUgY2h1bmtzIGFmdGVyIFBMVEUsIGJlZm9yZSBJREFUCi1pbmZvX3BuZy51bmtub3duX2NodW5rc19kYXRhWzJdIGlzIHRoZSBjaHVua3MgYWZ0ZXIgSURBVAotCi1UaGUgY2h1bmtzIGluIHRoZXNlIDMgYnVmZmVycyBjYW4gYmUgaXRlcmF0ZWQgdGhyb3VnaCBhbmQgcmVhZCBieSB1c2luZyB0aGUgc2FtZQotd2F5IGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc3ViY2hhcHRlci4KLQotV2hlbiB1c2luZyB0aGUgZGVjb2RlciB0byBkZWNvZGUgYSBQTkcsIHlvdSBjYW4gbWFrZSBpdCBzdG9yZSBhbGwgdW5rbm93biBjaHVua3MKLWlmIHlvdSBzZXQgdGhlIG9wdGlvbiBzZXR0aW5ncy5yZW1lbWJlcl91bmtub3duX2NodW5rcyB0byAxLiBCeSBkZWZhdWx0LCB0aGlzCi1vcHRpb24gaXMgb2ZmICgwKS4KLQotVGhlIGVuY29kZXIgd2lsbCBhbHdheXMgZW5jb2RlIHVua25vd24gY2h1bmtzIHRoYXQgYXJlIHN0b3JlZCBpbiB0aGUgaW5mb19wbmcuCi1JZiB5b3UgbmVlZCBpdCB0byBhZGQgYSBwYXJ0aWN1bGFyIGNodW5rIHRoYXQgaXNuJ3Qga25vd24gYnkgTG9kZVBORywgeW91IGNhbgotdXNlIGxvZGVwbmdfY2h1bmtfYXBwZW5kIG9yIGxvZGVwbmdfY2h1bmtfY3JlYXRlIHRvIHRoZSBjaHVuayBkYXRhIGluCi1pbmZvX3BuZy51bmtub3duX2NodW5rc19kYXRhW3hdLgotCi1DaHVua3MgdGhhdCBhcmUga25vd24gYnkgTG9kZVBORyBzaG91bGQgbm90IGJlIGFkZGVkIGluIHRoYXQgd2F5LiBFLmcuIHRvIG1ha2UKLUxvZGVQTkcgYWRkIGEgYktHRCBjaHVuaywgc2V0IGJhY2tncm91bmRfZGVmaW5lZCB0byB0cnVlIGFuZCBhZGQgdGhlIGNvcnJlY3QKLXBhcmFtZXRlcnMgdGhlcmUgaW5zdGVhZC4KLQotCi05LiBjb21waWxlciBzdXBwb3J0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5vIGxpYnJhcmllcyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IHN0YW5kYXJkIEMgbGlicmFyeSBhcmUgbmVlZGVkIHRvIGNvbXBpbGUKLUxvZGVQTkcuIEZvciB0aGUgQysrIHZlcnNpb24sIG9ubHkgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5IGlzIG5lZWRlZCBvbiB0b3AuCi1BZGQgdGhlIGZpbGVzIGxvZGVwbmcuYyhwcCkgYW5kIGxvZGVwbmcuaCB0byB5b3VyIHByb2plY3QsIGluY2x1ZGUKLWxvZGVwbmcuaCB3aGVyZSBuZWVkZWQsIGFuZCB5b3VyIHByb2dyYW0gY2FuIHJlYWQvd3JpdGUgUE5HIGZpbGVzLgotCi1JdCBpcyBjb21wYXRpYmxlIHdpdGggQzkwIGFuZCB1cCwgYW5kIEMrKzAzIGFuZCB1cC4KLQotSWYgcGVyZm9ybWFuY2UgaXMgaW1wb3J0YW50LCB1c2Ugb3B0aW1pemF0aW9uIHdoZW4gY29tcGlsaW5nISBGb3IgYm90aCB0aGUKLWVuY29kZXIgYW5kIGRlY29kZXIsIHRoaXMgbWFrZXMgYSBsYXJnZSBkaWZmZXJlbmNlLgotCi1NYWtlIHN1cmUgdGhhdCBMb2RlUE5HIGlzIGNvbXBpbGVkIHdpdGggdGhlIHNhbWUgY29tcGlsZXIgb2YgdGhlIHNhbWUgdmVyc2lvbgotYW5kIHdpdGggdGhlIHNhbWUgc2V0dGluZ3MgYXMgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0sIG9yIHRoZSBpbnRlcmZhY2VzIHdpdGgKLXN0ZDo6dmVjdG9ycyBhbmQgc3RkOjpzdHJpbmdzIGluIEMrKyBjYW4gYmUgaW5jb21wYXRpYmxlLgotCi1DSEFSX0JJVFMgbXVzdCBiZSA4IG9yIGhpZ2hlciwgYmVjYXVzZSBMb2RlUE5HIHVzZXMgdW5zaWduZWQgY2hhcnMgZm9yIG9jdGV0cy4KLQotKikgZ2NjIGFuZCBnKysKLQotTG9kZVBORyBpcyBkZXZlbG9wZWQgaW4gZ2NjIHNvIHRoaXMgY29tcGlsZXIgaXMgbmF0aXZlbHkgc3VwcG9ydGVkLiBJdCBnaXZlcyBubwotd2FybmluZ3Mgd2l0aCBjb21waWxlciBvcHRpb25zICItV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtYW5zaSIsIHdpdGggZ2NjIGFuZCBnKysKLXZlcnNpb24gNC43LjEgb24gTGludXgsIDMyLWJpdCBhbmQgNjQtYml0LgotCi0qKSBDbGFuZwotCi1GdWxseSBzdXBwb3J0ZWQgYW5kIHdhcm5pbmctZnJlZS4KLQotKikgTWluZ3cKLQotVGhlIE1pbmd3IGNvbXBpbGVyIChhIHBvcnQgb2YgZ2NjIGZvciBXaW5kb3dzKSBzaG91bGQgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5Ci1Mb2RlUE5HLgotCi0qKSBWaXN1YWwgU3R1ZGlvIGFuZCBWaXN1YWwgQysrIEV4cHJlc3MgRWRpdGlvbgotCi1Mb2RlUE5HIHNob3VsZCBiZSB3YXJuaW5nLWZyZWUgd2l0aCB3YXJuaW5nIGxldmVsIFc0LiBUd28gd2FybmluZ3Mgd2VyZSBkaXNhYmxlZAotd2l0aCBwcmFnbWFzIHRob3VnaDogd2FybmluZyA0MjQ0IGFib3V0IGltcGxpY2l0IGNvbnZlcnNpb25zLCBhbmQgd2FybmluZyA0OTk2Ci13aGVyZSBpdCB3YW50cyB0byB1c2UgYSBub24tc3RhbmRhcmQgZnVuY3Rpb24gZm9wZW5fcyBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBDCi1mb3Blbi4KLQotVmlzdWFsIFN0dWRpbyBtYXkgd2FudCAic3RkYWZ4LmgiIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIGVhY2ggc291cmNlIGZpbGUgYW5kCi1naXZlIGFuIGVycm9yICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIHdoaWxlIGxvb2tpbmcgZm9yIHByZWNvbXBpbGVkIGhlYWRlciIuCi1UaGlzIGlzIG5vdCBzdGFuZGFyZCBDKysgYW5kIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBzdG9jayBMb2RlUE5HLiBZb3UgY2FuCi1kaXNhYmxlIGl0IGZvciBsb2RlcG5nLmNwcCBvbmx5IGJ5IHJpZ2h0IGNsaWNraW5nIGl0LCBQcm9wZXJ0aWVzLCBDL0MrKywKLVByZWNvbXBpbGVkIEhlYWRlcnMsIGFuZCBzZXQgaXQgdG8gTm90IFVzaW5nIFByZWNvbXBpbGVkIEhlYWRlcnMgdGhlcmUuCi0KLU5PVEU6IE1vZGVybiB2ZXJzaW9ucyBvZiBWUyBzaG91bGQgYmUgZnVsbHkgc3VwcG9ydGVkLCBidXQgb2xkIHZlcnNpb25zLCBlLmcuCi1WUzYsIGFyZSBub3QgZ3VhcmFudGVlZCB0byB3b3JrLgotCi0qKSBDb21waWxlcnMgb24gTWFjaW50b3NoCi0KLUxvZGVQTkcgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gd29yayBib3RoIHdpdGggZ2NjIGFuZCBMTFZNIGZvciBNYWNpbnRvc2gsIGJvdGggZm9yCi1DIGFuZCBDKysuCi0KLSopIE90aGVyIENvbXBpbGVycwotCi1JZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zIG9uIGFueSBjb21waWxlcnMsIGZlZWwgZnJlZSB0byBsZXQgbWUga25vdyBhbmQgSSBtYXkKLXRyeSB0byBmaXggaXQgaWYgdGhlIGNvbXBpbGVyIGlzIG1vZGVybiBhbmQgc3RhbmRhcmRzIGNvbXBsaWVudC4KLQotCi0xMC4gZXhhbXBsZXMKLS0tLS0tLS0tLS0tLQotCi1UaGlzIGRlY29kZXIgZXhhbXBsZSBzaG93cyB0aGUgbW9zdCBiYXNpYyB1c2FnZSBvZiBMb2RlUE5HLiBNb3JlIGNvbXBsZXgKLWV4YW1wbGVzIGNhbiBiZSBmb3VuZCBvbiB0aGUgTG9kZVBORyB3ZWJzaXRlLgotCi0xMC4xLiBkZWNvZGVyIEMrKyBleGFtcGxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpbmNsdWRlICJsb2RlcG5nLmgiCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgY29uc3QgY2hhciogZmlsZW5hbWUgPSBhcmdjID4gMSA/IGFyZ3ZbMV0gOiAidGVzdC5wbmciOwotCi0gIC8vbG9hZCBhbmQgZGVjb2RlCi0gIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGltYWdlOwotICB1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OwotICB1bnNpZ25lZCBlcnJvciA9IGxvZGVwbmc6OmRlY29kZShpbWFnZSwgd2lkdGgsIGhlaWdodCwgZmlsZW5hbWUpOwotCi0gIC8vaWYgdGhlcmUncyBhbiBlcnJvciwgZGlzcGxheSBpdAotICBpZihlcnJvcikgc3RkOjpjb3V0IDw8ICJkZWNvZGVyIGVycm9yICIgPDwgZXJyb3IgPDwgIjogIiA8PCBsb2RlcG5nX2Vycm9yX3RleHQoZXJyb3IpIDw8IHN0ZDo6ZW5kbDsKLQotICAvL3RoZSBwaXhlbHMgYXJlIG5vdyBpbiB0aGUgdmVjdG9yICJpbWFnZSIsIDQgYnl0ZXMgcGVyIHBpeGVsLCBvcmRlcmVkIFJHQkFSR0JBLi4uLCB1c2UgaXQgYXMgdGV4dHVyZSwgZHJhdyBpdCwgLi4uCi19Ci0KLTEwLjIuIGRlY29kZXIgQyBleGFtcGxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaW5jbHVkZSAibG9kZXBuZy5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0gIHVuc2lnbmVkIGVycm9yOwotICB1bnNpZ25lZCBjaGFyKiBpbWFnZTsKLSAgc2l6ZV90IHdpZHRoLCBoZWlnaHQ7Ci0gIGNvbnN0IGNoYXIqIGZpbGVuYW1lID0gYXJnYyA+IDEgPyBhcmd2WzFdIDogInRlc3QucG5nIjsKLQotICBlcnJvciA9IGxvZGVwbmdfZGVjb2RlMzJfZmlsZSgmaW1hZ2UsICZ3aWR0aCwgJmhlaWdodCwgZmlsZW5hbWUpOwotCi0gIGlmKGVycm9yKSBwcmludGYoImRlY29kZXIgZXJyb3IgJXU6ICVzXG4iLCBlcnJvciwgbG9kZXBuZ19lcnJvcl90ZXh0KGVycm9yKSk7Ci0KLSAgLyAqIHVzZSBpbWFnZSBoZXJlICogLwotCi0gIGZyZWUoaW1hZ2UpOwotICByZXR1cm4gMDsKLX0KLQotMTEuIHN0YXRlIHNldHRpbmdzIHJlZmVyZW5jZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BIHF1aWNrIHJlZmVyZW5jZSBvZiBzb21lIHNldHRpbmdzIHRvIHNldCBvbiB0aGUgTG9kZVBOR1N0YXRlCi0KLUZvciBkZWNvZGluZzoKLQotc3RhdGUuZGVjb2Rlci56bGlic2V0dGluZ3MuaWdub3JlX2FkbGVyMzI6IGlnbm9yZSBBRExFUjMyIGNoZWNrc3Vtcwotc3RhdGUuZGVjb2Rlci56bGlic2V0dGluZ3MuY3VzdG9tXy4uLjogdXNlIGN1c3RvbSBpbmZsYXRlIGZ1bmN0aW9uCi1zdGF0ZS5kZWNvZGVyLmlnbm9yZV9jcmM6IGlnbm9yZSBDUkMgY2hlY2tzdW1zCi1zdGF0ZS5kZWNvZGVyLmlnbm9yZV9jcml0aWNhbDogaWdub3JlIHVua25vd24gY3JpdGljYWwgY2h1bmtzCi1zdGF0ZS5kZWNvZGVyLmlnbm9yZV9lbmQ6IGlnbm9yZSBtaXNzaW5nIElFTkQgY2h1bmsuIE1heSBmYWlsIGlmIHRoaXMgY29ycnVwdGlvbiBjYXVzZXMgb3RoZXIgZXJyb3JzCi1zdGF0ZS5kZWNvZGVyLmNvbG9yX2NvbnZlcnQ6IGNvbnZlcnQgaW50ZXJuYWwgUE5HIGNvbG9yIHRvIGNob3NlbiBvbmUKLXN0YXRlLmRlY29kZXIucmVhZF90ZXh0X2NodW5rczogd2hldGhlciB0byByZWFkIGluIHRleHQgbWV0YWRhdGEgY2h1bmtzCi1zdGF0ZS5kZWNvZGVyLnJlbWVtYmVyX3Vua25vd25fY2h1bmtzOiB3aGV0aGVyIHRvIHJlYWQgaW4gdW5rbm93biBjaHVua3MKLXN0YXRlLmluZm9fcmF3LmNvbG9ydHlwZTogZGVzaXJlZCBjb2xvciB0eXBlIGZvciBkZWNvZGVkIGltYWdlCi1zdGF0ZS5pbmZvX3Jhdy5iaXRkZXB0aDogZGVzaXJlZCBiaXQgZGVwdGggZm9yIGRlY29kZWQgaW1hZ2UKLXN0YXRlLmluZm9fcmF3Li4uLjogbW9yZSBjb2xvciBzZXR0aW5ncywgc2VlIHN0cnVjdCBMb2RlUE5HQ29sb3JNb2RlCi1zdGF0ZS5pbmZvX3BuZy4uLi46IG5vIHNldHRpbmdzIGZvciBkZWNvZGVyIGJ1dCBvdXB1dCwgc2VlIHN0cnVjdCBMb2RlUE5HSW5mbwotCi1Gb3IgZW5jb2Rpbmc6Ci0KLXN0YXRlLmVuY29kZXIuemxpYnNldHRpbmdzLmJ0eXBlOiBkaXNhYmxlIGNvbXByZXNzaW9uIGJ5IHNldHRpbmcgaXQgdG8gMAotc3RhdGUuZW5jb2Rlci56bGlic2V0dGluZ3MudXNlX2x6Nzc6IHVzZSBMWjc3IGluIGNvbXByZXNzaW9uCi1zdGF0ZS5lbmNvZGVyLnpsaWJzZXR0aW5ncy53aW5kb3dzaXplOiB0d2VhayBMWjc3IHdpbmRvd3NpemUKLXN0YXRlLmVuY29kZXIuemxpYnNldHRpbmdzLm1pbm1hdGNoOiB0d2VhayBtaW4gTFo3NyBsZW5ndGggdG8gbWF0Y2gKLXN0YXRlLmVuY29kZXIuemxpYnNldHRpbmdzLm5pY2VtYXRjaDogdHdlYWsgTFo3NyBtYXRjaCB3aGVyZSB0byBzdG9wIHNlYXJjaGluZwotc3RhdGUuZW5jb2Rlci56bGlic2V0dGluZ3MubGF6eW1hdGNoaW5nOiB0cnkgb25lIG1vcmUgTFo3NyBtYXRjaGluZwotc3RhdGUuZW5jb2Rlci56bGlic2V0dGluZ3MuY3VzdG9tXy4uLjogdXNlIGN1c3RvbSBkZWZsYXRlIGZ1bmN0aW9uCi1zdGF0ZS5lbmNvZGVyLmF1dG9fY29udmVydDogY2hvb3NlIG9wdGltYWwgUE5HIGNvbG9yIHR5cGUsIGlmIDAgdXNlcyBpbmZvX3BuZwotc3RhdGUuZW5jb2Rlci5maWx0ZXJfcGFsZXR0ZV96ZXJvOiBQTkcgZmlsdGVyIHN0cmF0ZWd5IGZvciBwYWxldHRlCi1zdGF0ZS5lbmNvZGVyLmZpbHRlcl9zdHJhdGVneTogUE5HIGZpbHRlciBzdHJhdGVneSB0byBlbmNvZGUgd2l0aAotc3RhdGUuZW5jb2Rlci5mb3JjZV9wYWxldHRlOiBhZGQgcGFsZXR0ZSBldmVuIGlmIG5vdCBlbmNvZGluZyB0byBvbmUKLXN0YXRlLmVuY29kZXIuYWRkX2lkOiBhZGQgTG9kZVBORyBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIGFzIGEgdGV4dCBjaHVuawotc3RhdGUuZW5jb2Rlci50ZXh0X2NvbXByZXNzaW9uOiB1c2UgY29tcHJlc3NlZCB0ZXh0IGNodW5rcyBmb3IgbWV0YWRhdGEKLXN0YXRlLmluZm9fcmF3LmNvbG9ydHlwZTogY29sb3IgdHlwZSBvZiByYXcgaW5wdXQgaW1hZ2UgeW91IHByb3ZpZGUKLXN0YXRlLmluZm9fcmF3LmJpdGRlcHRoOiBiaXQgZGVwdGggb2YgcmF3IGlucHV0IGltYWdlIHlvdSBwcm92aWRlCi1zdGF0ZS5pbmZvX3JhdzogbW9yZSBjb2xvciBzZXR0aW5ncywgc2VlIHN0cnVjdCBMb2RlUE5HQ29sb3JNb2RlCi1zdGF0ZS5pbmZvX3BuZy5jb2xvci5jb2xvcnR5cGU6IGRlc2lyZWQgY29sb3IgdHlwZSBpZiBhdXRvX2NvbnZlcnQgaXMgZmFsc2UKLXN0YXRlLmluZm9fcG5nLmNvbG9yLmJpdGRlcHRoOiBkZXNpcmVkIGJpdCBkZXB0aCBpZiBhdXRvX2NvbnZlcnQgaXMgZmFsc2UKLXN0YXRlLmluZm9fcG5nLmNvbG9yLi4uLjogbW9yZSBjb2xvciBzZXR0aW5ncywgc2VlIHN0cnVjdCBMb2RlUE5HQ29sb3JNb2RlCi1zdGF0ZS5pbmZvX3BuZy4uLi46IG1vcmUgUE5HIHJlbGF0ZWQgc2V0dGluZ3MsIHNlZSBzdHJ1Y3QgTG9kZVBOR0luZm8KLQotCi0xMi4gY2hhbmdlcwotLS0tLS0tLS0tLS0KLQotVGhlIHZlcnNpb24gbnVtYmVyIG9mIExvZGVQTkcgaXMgdGhlIGRhdGUgb2YgdGhlIGNoYW5nZSBnaXZlbiBpbiB0aGUgZm9ybWF0Ci15eXl5bW1kZC4KLQotU29tZSBjaGFuZ2VzIGFyZW4ndCBiYWNrd2FyZHMgY29tcGF0aWJsZS4gVGhvc2UgYXJlIGluZGljYXRlZCB3aXRoIGEgKCEpCi1zeW1ib2wuCi0KLSopIDMwIGRlYyAyMDE4OiBjb2RlIHN0eWxlIGNoYW5nZXMgb25seTogcmVtb3ZlZCBuZXdsaW5lcyBiZWZvcmUgb3BlbmluZyBicmFjZXMuCi0qKSAxMCBzZXAgMjAxODogYWRkZWQgd2F5IHRvIGluc3BlY3QgbWV0YWRhdGEgY2h1bmtzIHdpdGhvdXQgZnVsbCBkZWNvZGluZy4KLSopIDE5IGF1ZyAyMDE4ICghKTogZml4ZWQgY29sb3IgbW9kZSBiS0dEIGlzIGVuY29kZWQgd2l0aCBhbmQgbWFkZSBpdCB1c2UKLSAgIHBhbGV0dGUgaW5kZXggaW4gY2FzZSBvZiBwYWxldHRlLgotKikgMTAgYXVnIDIwMTggKCEpOiBhZGRlZCBzdXBwb3J0IGZvciBnQU1BLCBjSFJNLCBzUkdCIGFuZCBpQ0NQIGNodW5rcy4gVGhpcwotICAgY2hhbmdlIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHVubGVzcyB5b3UgcmVsaWVkIG9uIHVua25vd25fY2h1bmtzIGZvciB0aG9zZS4KLSopIDExIGp1biAyMDE4OiBsZXNzIHJlc3RyaWN0aXZlIGNoZWNrIGZvciBwaXhlbCBzaXplIGludGVnZXIgb3ZlcmZsb3cKLSopIDE0IGphbiAyMDE4OiBhbGxvdyBvcHRpb25hbGx5IGlnbm9yaW5nIGEgZmV3IG1vcmUgcmVjb3ZlcmFibGUgZXJyb3JzCi0qKSAxNyBzZXAgMjAxNzogZml4IG1lbW9yeSBsZWFrIGZvciBzb21lIGVuY29kZXIgaW5wdXQgZXJyb3IgY2FzZXMKLSopIDI3IG5vdiAyMDE2OiBncmV5K2FscGhhIGF1dG8gY29sb3IgbW9kZWwgZGV0ZWN0aW9uIGJ1Z2ZpeAotKikgMTggYXByIDIwMTY6IENoYW5nZWQgcXNvcnQgdG8gY3VzdG9tIHN0YWJsZSBzb3J0IChmb3IgcGxhdGZvcm1zIHcvbyBxc29ydCkuCi0qKSAwOSBhcHIgMjAxNjogRml4ZWQgY29sb3JrZXkgdXNhZ2UgZGV0ZWN0aW9uLCBhbmQgYmV0dGVyIGZpbGUgbG9hZGluZyAod2l0aGluCi0gICB0aGUgbGltaXRzIG9mIHB1cmUgQzkwKS4KLSopIDA4IGRlYyAyMDE1OiBNYWRlIGxvYWRfZmlsZSBmdW5jdGlvbiByZXR1cm4gZXJyb3IgaWYgZmlsZSBjYW4ndCBiZSBvcGVuZWQuCi0qKSAyNCBva3QgMjAxNTogQnVnZml4IHdpdGggZGVjb2RpbmcgdG8gcGFsZXR0ZSBvdXRwdXQuCi0qKSAxOCBhcHIgMjAxNTogQm91bmRhcnkgUE0gaW5zdGVhZCBvZiBqdXN0IHBhY2thZ2UtbWVyZ2UgZm9yIGZhc3RlciBlbmNvZGluZy4KLSopIDIzIGF1ZyAyMDE0OiBSZWR1Y2VkIG5lZWRsZXNzIG1lbW9yeSB1c2FnZSBvZiBkZWNvZGVyLgotKikgMjgganVuIDIwMTQ6IFJlbW92ZWQgZml4X3BuZyBzZXR0aW5nLCBhbHdheXMgc3VwcG9ydCBwYWxldHRlIE9PQiBmb3IKLSAgICBzaW1wbGljaXR5LiBNYWRlIENvbG9yUHJvZmlsZSBwdWJsaWMuCi0qKSAwOSBqdW4gMjAxNDogRmFzdGVyIGVuY29kZXIgYnkgZml4aW5nIGhhc2ggYnVnIGFuZCBtb3JlIHplcm9zIG9wdGltaXphdGlvbi4KLSopIDIyIGRlYyAyMDEzOiBQb3dlciBvZiB0d28gd2luZG93c2l6ZSByZXF1aXJlZCBmb3Igb3B0aW1pemF0aW9uLgotKikgMTUgYXByIDIwMTM6IEZpeGVkIGJ1ZyB3aXRoIExBQ19BTFBIQSBhbmQgY29sb3Iga2V5LgotKikgMjUgbWFyIDIwMTM6IEFkZGVkIGFuIG9wdGlvbmFsIGZlYXR1cmUgdG8gaWdub3JlIHNvbWUgUE5HIGVycm9ycyAoZml4X3BuZykuCi0qKSAxMSBtYXIgMjAxMyAoISk6IEJ1Z2ZpeCB3aXRoIGN1c3RvbSBmcmVlLiBDaGFuZ2VkIGZyb20gIm15IiB0byAibG9kZXBuZ18iCi0gICAgcHJlZml4IGZvciB0aGUgY3VzdG9tIGFsbG9jYXRvcnMgYW5kIG1hZGUgaXQgcG9zc2libGUgd2l0aCBhIG5ldyAjZGVmaW5lIHRvCi0gICAgdXNlIGN1c3RvbSBvbmVzIGluIHlvdXIgcHJvamVjdCB3aXRob3V0IG5lZWRpbmcgdG8gY2hhbmdlIGxvZGVwbmcncyBjb2RlLgotKikgMjggamFuIDIwMTM6IEJ1Z2ZpeCB3aXRoIGNvbG9yIGtleS4KLSopIDI3IG9rdCAyMDEyOiBUd2Vha3MgaW4gdGV4dCBjaHVuayBrZXl3b3JkIGxlbmd0aCBlcnJvciBoYW5kbGluZy4KLSopIDggb2t0IDIwMTIgKCEpOiBBZGRlZCBuZXcgZmlsdGVyIHN0cmF0ZWd5IChlbnRyb3B5KSBhbmQgbmV3IGF1dG8gY29sb3IgbW9kZS4KLSAgICAobm8gcGFsZXR0ZSkuIEJldHRlciBkZWZsYXRlIHRyZWUgZW5jb2RpbmcuIE5ldyBjb21wcmVzc2lvbiB0d2VhayBzZXR0aW5ncy4KLSAgICBGYXN0ZXIgY29sb3IgY29udmVyc2lvbnMgd2hpbGUgZGVjb2RpbmcuIFNvbWUgaW50ZXJuYWwgY2xlYW51cHMuCi0qKSAyMyBzZXAgMjAxMjogUmVkdWNlZCB3YXJuaW5ncyBpbiBWaXN1YWwgU3R1ZGlvIGEgbGl0dGxlIGJpdC4KLSopIDEgc2VwIDIwMTIgKCEpOiBSZW1vdmVkICNkZWZpbmUncyBmb3IgZ2l2aW5nIGN1c3RvbSAoZGUpY29tcHJlc3Npb24gZnVuY3Rpb25zCi0gICAgYW5kIG1hZGUgaXQgd29yayB3aXRoIGZ1bmN0aW9uIHBvaW50ZXJzIGluc3RlYWQuCi0qKSAyMyBqdW4gMjAxMjogQWRkZWQgbW9yZSBmaWx0ZXIgc3RyYXRlZ2llcy4gTWFkZSBpdCBlYXNpZXIgdG8gdXNlIGN1c3RvbSBhbGxvYwotICAgIGFuZCBmcmVlIGZ1bmN0aW9ucyBhbmQgdG9nZ2xlICNkZWZpbmVzIGZyb20gY29tcGlsZXIgZmxhZ3MuIFNtYWxsIGZpeGVzLgotKikgNiBtYXkgMjAxMiAoISk6IE1hZGUgcGx1Z2dpbmcgaW4gY3VzdG9tIHpsaWIvZGVmbGF0ZSBmdW5jdGlvbnMgbW9yZSBmbGV4aWJsZS4KLSopIDIyIGFwciAyMDEyICghKTogTWFkZSBpbnRlcmZhY2UgbW9yZSBjb25zaXN0ZW50LCByZW5hbWluZyBhIGxvdC4gUmVtb3ZlZAotICAgIHJlZHVuZGFudCBDKysgY29kZWMgY2xhc3Nlcy4gUmVkdWNlZCBhbW91bnQgb2Ygc3RydWN0cy4gRXZlcnl0aGluZyBjaGFuZ2VkLAotICAgIGJ1dCBpdCBpcyBjbGVhbmVyIG5vdyBpbWhvIGFuZCBmdW5jdGlvbmFsaXR5IHJlbWFpbnMgdGhlIHNhbWUuIEFsc28gZml4ZWQKLSAgICBzZXZlcmFsIGJ1Z3MgYW5kIHNocnVuayB0aGUgaW1wbGVtZW50YXRpb24gY29kZS4gTWFkZSBuZXcgc2FtcGxlcy4KLSopIDYgbm92IDIwMTEgKCEpOiBCeSBkZWZhdWx0LCB0aGUgZW5jb2RlciBub3cgYXV0b21hdGljYWxseSBjaG9vc2VzIHRoZSBiZXN0Ci0gICAgUE5HIGNvbG9yIG1vZGVsIGFuZCBiaXQgZGVwdGgsIGJhc2VkIG9uIHRoZSBhbW91bnQgYW5kIHR5cGUgb2YgY29sb3JzIG9mIHRoZQotICAgIHJhdyBpbWFnZS4gRm9yIHRoaXMsIGF1dG9MZWF2ZU91dEFscGhhQ2hhbm5lbCByZXBsYWNlZCBieSBhdXRvX2Nob29zZV9jb2xvci4KLSopIDkgb2t0IDIwMTE6IHNpbXBsZXIgaGFzaCBjaGFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGVuY29kZXIuCi0qKSA4IHNlcCAyMDExOiBsejc3IGVuY29kZXIgbGF6eSBtYXRjaGluZyBpbnN0ZWFkIG9mIGdyZWVkeSBtYXRjaGluZy4KLSopIDIzIGF1ZyAyMDExOiB0d2Vha2VkIHRoZSB6bGliIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYWZ0ZXIgYmVuY2htYXJraW5nLgotICAgIEEgYnVnIHdpdGggdGhlIFBORyBmaWx0ZXJ0eXBlIGhldXJpc3RpYyB3YXMgZml4ZWQsIHNvIHRoYXQgaXQgY2hvb3NlcyBtdWNoCi0gICAgYmV0dGVyIG9uZXMgKGl0J3MgcXVpdGUgc2lnbmlmaWNhbnQpLiBBIHNldHRpbmcgdG8gZG8gYW4gZXhwZXJpbWVudGFsLCBzbG93LAotICAgIGJydXRlIGZvcmNlIHNlYXJjaCBmb3IgUE5HIGZpbHRlciB0eXBlcyBpcyBhZGRlZC4KLSopIDE3IGF1ZyAyMDExICghKTogY2hhbmdlZCBzb21lIEMgemxpYiByZWxhdGVkIGZ1bmN0aW9uIG5hbWVzLgotKikgMTYgYXVnIDIwMTE6IG1hZGUgdGhlIGNvZGUgbGVzcyB3aWRlIChtYXggMTIwIGNoYXJhY3RlcnMgcGVyIGxpbmUpLgotKikgMTcgYXByIDIwMTE6IGNvZGUgY2xlYW51cC4gQnVnZml4ZXMuIENvbnZlcnQgbG93IHRvIDE2LWJpdCBwZXIgc2FtcGxlIGNvbG9ycy4KLSopIDIxIGZlYiAyMDExOiBmaXhlZCBjb21waWxpbmcgZm9yIEM5MC4gRml4ZWQgY29tcGlsaW5nIHdpdGggc2VjdGlvbnMgZGlzYWJsZWQuCi0qKSAxMSBkZWMgMjAxMDogZW5jb2RpbmcgaXMgbWFkZSBmYXN0ZXIsIGJhc2VkIG9uIHN1Z2dlc3Rpb24gYnkgUGV0ZXIgRWFzdG1hbgotICAgIHRvIG9wdGltaXplIGxvbmcgc2VxdWVuY2VzIG9mIHplcm9zLgotKikgMTMgbm92IDIwMTA6IGFkZGVkIExvZGVQTkdfSW5mb0NvbG9yX2hhc1BhbGV0dGVBbHBoYSBhbmQKLSAgICBMb2RlUE5HX0luZm9Db2xvcl9jYW5IYXZlQWxwaGEgZnVuY3Rpb25zIGZvciBjb252ZW5pZW5jZS4KLSopIDcgbm92IDIwMTA6IGFkZGVkIExvZGVQTkdfZXJyb3JfdGV4dCBmdW5jdGlvbiB0byBnZXQgZXJyb3IgY29kZSBkZXNjcmlwdGlvbi4KLSopIDMwIG9rdCAyMDEwOiBtYWRlIGRlY29kaW5nIHNsaWdodGx5IGZhc3RlcgotKikgMjYgb2t0IDIwMTA6ICghKSBjaGFuZ2VkIHNvbWUgQyBmdW5jdGlvbiBhbmQgc3RydWN0IG5hbWVzIChtb3JlIGNvbnNpc3RlbnQpLgotICAgICBSZW9yZ2FuaXplZCB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIGRlY2xhcmF0aW9uIG9yZGVyIGluIHRoZSBoZWFkZXIuCi0qKSAwOCBhdWcgMjAxMDogb25seSBjaGFuZ2VkIHNvbWUgY29tbWVudHMgYW5kIGV4dGVybmFsIHNhbXBsZXMuCi0qKSAwNSBqdWwgMjAxMDogZml4ZWQgYnVnIHRoYW5rcyB0byB3YXJuaW5ncyBpbiB0aGUgbmV3IGdjYyB2ZXJzaW9uLgotKikgMTQgbWFyIDIwMTA6IGZpeGVkIGJ1ZyB3aGVyZSB0b28gbXVjaCBtZW1vcnkgd2FzIGFsbG9jYXRlZCBmb3IgY2hhciBidWZmZXJzLgotKikgMDIgc2VwIDIwMDg6IGZpeGVkIGJ1ZyB3aGVyZSBpdCBjb3VsZCBjcmVhdGUgZW1wdHkgdHJlZSB0aGF0IGxpbnV4IGFwcHMgY291bGQKLSAgICByZWFkIGJ5IGlnbm9yaW5nIHRoZSBwcm9ibGVtIGJ1dCB3aW5kb3dzIGFwcHMgY291bGRuJ3QuCi0qKSAwNiBqdW4gMjAwODogYWRkZWQgbW9yZSBlcnJvciBjaGVja3MgZm9yIG91dCBvZiBtZW1vcnkgY2FzZXMuCi0qKSAyNiBhcHIgMjAwODogYWRkZWQgYSBmZXcgbW9yZSBjaGVja3MgaGVyZSBhbmQgdGhlcmUgdG8gZW5zdXJlIG1vcmUgc2FmZXR5LgotKikgMDYgbWFyIDIwMDg6IGNyYXNoIHdpdGggZW5jb2Rpbmcgb2Ygc3RyaW5ncyBmaXhlZAotKikgMDIgZmViIDIwMDg6IHN1cHBvcnQgZm9yIGludGVybmF0aW9uYWwgdGV4dCBjaHVua3MgYWRkZWQgKGlUWHQpCi0qKSAyMyBqYW4gMjAwODogc21hbGwgY2xlYW51cHMsIGFuZCAjZGVmaW5lcyB0byBkaXZpZGUgY29kZSBpbiBzZWN0aW9ucwotKikgMjAgamFuIDIwMDg6IHN1cHBvcnQgZm9yIHVua25vd24gY2h1bmtzIGFsbG93aW5nIHVzaW5nIExvZGVQTkcgZm9yIGFuIGVkaXRvci4KLSopIDE4IGphbiAyMDA4OiBzdXBwb3J0IGZvciB0SU1FIGFuZCBwSFlzIGNodW5rcyBhZGRlZCB0byBlbmNvZGVyIGFuZCBkZWNvZGVyLgotKikgMTcgamFuIDIwMDg6IGFiaWxpdHkgdG8gZW5jb2RlIGFuZCBkZWNvZGUgY29tcHJlc3NlZCB6VFh0IGNodW5rcyBhZGRlZAotICAgIEFsc28gdmFyaW91cyBmaXhlcywgc3VjaCBhcyBpbiB0aGUgZGVmbGF0ZSBhbmQgdGhlIHBhZGRpbmcgYml0cyBjb2RlLgotKikgMTMgamFuIDIwMDg6IEFkZGVkIGFiaWxpdHkgdG8gZW5jb2RlIEFkYW03LWludGVybGFjZWQgaW1hZ2VzLiBJbXByb3ZlZAotICAgIGZpbHRlcmluZyBjb2RlIG9mIGVuY29kZXIuCi0qKSAwNyBqYW4gMjAwODogKCEpIGNoYW5nZWQgTG9kZVBORyB0byB1c2UgSVNPIEM5MCBpbnN0ZWFkIG9mIEMrKy4gQQotICAgIEMrKyB3cmFwcGVyIGFyb3VuZCB0aGlzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBhbG1vc3QgaWRlbnRpY2FsIHRvIGJlZm9yZS4KLSAgICBIYXZpbmcgTG9kZVBORyBiZSBwdXJlIElTTyBDOTAgbWFrZXMgaXQgbW9yZSBwb3J0YWJsZS4gVGhlIEMgYW5kIEMrKyBjb2RlCi0gICAgYXJlIHRvZ2V0aGVyIGluIHRoZXNlIGZpbGVzIGJ1dCBpdCB3b3JrcyBib3RoIGZvciBDIGFuZCBDKysgY29tcGlsZXJzLgotKikgMjkgZGVjIDIwMDc6ICghKSBjaGFuZ2VkIG1vc3QgaW50ZWdlciB0eXBlcyB0byB1bnNpZ25lZCBpbnQgKyBvdGhlciB0d2Vha3MKLSopIDMwIGF1ZyAyMDA3OiBidWcgZml4ZWQgd2hpY2ggbWFrZXMgdGhpcyBCb3JsYW5kIEMrKyBjb21wYXRpYmxlCi0qKSAwOSBhdWcgMjAwNzogc29tZSBWUzIwMDUgd2FybmluZ3MgcmVtb3ZlZCBhZ2FpbgotKikgMjEganVsIDIwMDc6IGRlZmxhdGUgY29kZSBwbGFjZWQgaW4gbmV3IG5hbWVzcGFjZSBzZXBhcmF0ZSBmcm9tIHpsaWIgY29kZQotKikgMDgganVuIDIwMDc6IGZpeGVkIGJ1ZyB3aXRoIDItIGFuZCA0LWJpdCBjb2xvciwgYW5kIHNtYWxsIGludGVybGFjZWQgaW1hZ2VzCi0qKSAwNCBqdW4gMjAwNzogaW1wcm92ZWQgc3VwcG9ydCBmb3IgVmlzdWFsIFN0dWRpbyAyMDA1OiBjcmFzaCB3aXRoIGFjY2Vzc2luZwotICAgIGludmFsaWQgc3RkOjp2ZWN0b3IgZWxlbWVudCBbMF0gZml4ZWQsIGFuZCBsZXZlbCAzIGFuZCA0IHdhcm5pbmdzIHJlbW92ZWQKLSopIDAyIGp1biAyMDA3OiBtYWRlIHRoZSBlbmNvZGVyIGFkZCBhIHRhZyB3aXRoIHZlcnNpb24gYnkgZGVmYXVsdAotKikgMjcgbWF5IDIwMDc6IHpsaWIgYW5kIHBuZyBjb2RlIHNlcGFyYXRlZCAoYnV0IHN0aWxsIGluIHRoZSBzYW1lIGZpbGUpLAotICAgIHNpbXBsZSBlbmNvZGVyL2RlY29kZXIgZnVuY3Rpb25zIGFkZGVkIGZvciBtb3JlIHNpbXBsZSB1c2FnZSBjYXNlcwotKikgMTkgbWF5IDIwMDc6IG1pbm9yIGZpeGVzLCBzb21lIGNvZGUgY2xlYW5pbmcsIG5ldyBlcnJvciBhZGRlZCAoZXJyb3IgNjkpLAotICAgIG1vdmVkIHNvbWUgZXhhbXBsZXMgZnJvbSBoZXJlIHRvIGxvZGVwbmdfZXhhbXBsZXMuY3BwCi0qKSAxMiBtYXkgMjAwNzogcGFsZXR0ZSBkZWNvZGluZyBidWcgZml4ZWQKLSopIDI0IGFwciAyMDA3OiBjaGFuZ2VkIHRoZSBsaWNlbnNlIGZyb20gQlNEIHRvIHRoZSB6bGliIGxpY2Vuc2UKLSopIDExIG1hciAyMDA3OiB2ZXJ5IHNpbXBsZSBhZGRpdGlvbjogYWJpbGl0eSB0byBlbmNvZGUgYktHRCBjaHVua3MuCi0qKSAwNCBtYXIgMjAwNzogKCEpIHRFWHQgY2h1bmsgcmVsYXRlZCBmaXhlcywgYW5kIHN1cHBvcnQgZm9yIGVuY29kaW5nCi0gICAgcGFsZXR0aXplZCBQTkcgaW1hZ2VzLiBQbHVzIGxpdHRsZSBpbnRlcmZhY2UgY2hhbmdlIHdpdGggcGFsZXR0ZSBhbmQgdGV4dHMuCi0qKSAwMyBtYXIgMjAwNzogTWFkZSBpdCBlbmNvZGUgZHluYW1pYyBIdWZmbWFuIHNob3J0ZXIgd2l0aCByZXBlYXQgY29kZXMuCi0gICAgRml4ZWQgYSBidWcgd2hlcmUgdGhlIGVuZCBjb2RlIG9mIGEgYmxvY2sgaGFkIGxlbmd0aCAwIGluIHRoZSBIdWZmbWFuIHRyZWUuCi0qKSAyNiBmZWIgMjAwNzogSHVmZm1hbiBjb21wcmVzc2lvbiB3aXRoIGR5bmFtaWMgdHJlZXMgKEJUWVBFIDIpIG5vdyBpbXBsZW1lbnRlZAotICAgIGFuZCBzdXBwb3J0ZWQgYnkgdGhlIGVuY29kZXIsIHJlc3VsdGluZyBpbiBzbWFsbGVyIFBOR3MgYXQgdGhlIG91dHB1dC4KLSopIDI3IGphbiAyMDA3OiBNYWRlIHRoZSBBZGxlci0zMiB0ZXN0IGZhc3RlciBzbyB0aGF0IGEgdGltZXdhc3RlIGlzIGdvbmUuCi0qKSAyNCBqYW4gMjAwNzogZ2F2ZSBlbmNvZGVyIGFuIGVycm9yIGludGVyZmFjZS4gQWRkZWQgY29sb3IgY29udmVyc2lvbiBmcm9tIGFueQotICAgIGdyZXlzY2FsZSB0eXBlIHRvIDgtYml0IGdyZXlzY2FsZSB3aXRoIG9yIHdpdGhvdXQgYWxwaGEuCi0qKSAyMSBqYW4gMjAwNzogKCEpIFRvdGFsbHkgY2hhbmdlZCB0aGUgaW50ZXJmYWNlLiBJdCBhbGxvd3MgbW9yZSBjb2xvciB0eXBlcwotICAgIHRvIGNvbnZlcnQgdG8gYW5kIGlzIG1vcmUgdW5pZm9ybS4gU2VlIHRoZSBtYW51YWwgZm9yIGhvdyBpdCB3b3JrcyBub3cuCi0qKSAwNyBqYW4gMjAwNzogU29tZSBjbGVhbnVwICYgZml4ZXMsIGFuZCBhIGZldyBjaGFuZ2VzIG92ZXIgdGhlIGxhc3QgZGF5czoKLSAgICBlbmNvZGUvZGVjb2RlIGN1c3RvbSB0RVh0IGNodW5rcywgc2VwYXJhdGUgY2xhc3NlcyBmb3IgemxpYiAmIGRlZmxhdGUsIGFuZAotICAgIGF0IGxhc3QgbWFkZSB0aGUgZGVjb2RlciBnaXZlIGVycm9ycyBmb3IgaW5jb3JyZWN0IEFkbGVyMzIgb3IgQ3JjLgotKikgMDEgamFuIDIwMDc6IEZpeGVkIGJ1ZyB3aXRoIGVuY29kaW5nIFBOR3Mgd2l0aCBsZXNzIHRoYW4gOCBiaXRzIHBlciBjaGFubmVsLgotKikgMjkgZGVjIDIwMDY6IEFkZGVkIHN1cHBvcnQgZm9yIGVuY29kaW5nIGltYWdlcyB3aXRob3V0IGFscGhhIGNoYW5uZWwsIGFuZAotICAgIGNsZWFuZWQgb3V0IGNvZGUgYXMgd2VsbCBhcyBtYWtpbmcgY2VydGFpbiBwYXJ0cyBmYXN0ZXIuCi0qKSAyOCBkZWMgMjAwNjogQWRkZWQgIlNldHRpbmdzIiB0byB0aGUgZW5jb2Rlci4KLSopIDI2IGRlYyAyMDA2OiBUaGUgZW5jb2RlciBub3cgZG9lcyBMWjc3IGVuY29kaW5nIGFuZCBwcm9kdWNlcyBtdWNoIHNtYWxsZXIgZmlsZXMgbm93LgotICAgIFJlbW92ZWQgc29tZSBjb2RlIGR1cGxpY2F0aW9uIGluIHRoZSBkZWNvZGVyLiBGaXhlZCBsaXR0bGUgYnVnIGluIGFuIGV4YW1wbGUuCi0qKSAwOSBkZWMgMjAwNjogKCEpIFBsYWNlZCBvdXRwdXQgcGFyYW1ldGVycyBvZiBwdWJsaWMgZnVuY3Rpb25zIGFzIGZpcnN0IHBhcmFtZXRlci4KLSAgICBGaXhlZCBhIGJ1ZyBvZiB0aGUgZGVjb2RlciB3aXRoIDE2LWJpdCBwZXIgY29sb3IuCi0qKSAxNSBva3QgMjAwNjogQ2hhbmdlZCBkb2N1bWVudGF0aW9uIHN0cnVjdHVyZQotKikgMDkgb2t0IDIwMDY6IEVuY29kZXIgY2xhc3MgYWRkZWQuIEl0IGVuY29kZXMgYSB2YWxpZCBQTkcgaW1hZ2UgZnJvbSB0aGUKLSAgICBnaXZlbiBpbWFnZSBidWZmZXIsIGhvd2V2ZXIgZm9yIG5vdyBpdCdzIG5vdCBjb21wcmVzc2VkLgotKikgMDggc2VwIDIwMDY6ICghKSBDaGFuZ2VkIHRvIGludGVyZmFjZSB3aXRoIGEgRGVjb2RlciBjbGFzcwotKikgMzAganVsIDIwMDY6ICghKSBMb2RlUE5HX0luZm9QbmcgLCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBub3cgcmV0cmlldmVkIGluIGRpZmZlcmVudAotICAgIHdheS4gUmVuYW1lZCBkZWNvZGVQTkcgdG8gZGVjb2RlUE5HR2VuZXJpYy4KLSopIDI5IGp1bCAyMDA2OiAoISkgQ2hhbmdlZCB0aGUgaW50ZXJmYWNlOiBpbWFnZSBpbmZvIGlzIG5vdyByZXR1cm5lZCBhcyBhCi0gICAgc3RydWN0IG9mIHR5cGUgTG9kZVBORzo6TG9kZVBOR19JbmZvLCBpbnN0ZWFkIG9mIGEgdmVjdG9yLCB3aGljaCB3YXMgYSBiaXQgY2x1bXN5LgotKikgMjgganVsIDIwMDY6IENsZWFuZWQgdGhlIGNvZGUgYW5kIGFkZGVkIG5ldyBlcnJvciBjaGVja3MuCi0gICAgQ29ycmVjdGVkIHRlcm1pbm9sb2d5ICJkZWZsYXRlIiBpbnRvICJpbmZsYXRlIi4KLSopIDIzIGp1biAyMDA2OiBBZGRlZCBTREwgZXhhbXBsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpbiB0aGUgaGVhZGVyLCB0aGlzCi0gICAgZXhhbXBsZSBhbGxvd3MgZWFzeSBkZWJ1Z2dpbmcgYnkgZGlzcGxheWluZyB0aGUgUE5HIGFuZCBpdHMgdHJhbnNwYXJlbmN5LgotKikgMjIganVuIDIwMDY6ICghKSBDaGFuZ2VkIHdheSB0byBvYnRhaW4gZXJyb3IgdmFsdWUuIEFkZGVkCi0gICAgbG9hZEZpbGUgZnVuY3Rpb24gZm9yIGNvbnZlbmllbmNlLiBNYWRlIGRlY29kZVBORzMyIGZhc3Rlci4KLSopIDIxIGp1biAyMDA2OiAoISkgQ2hhbmdlZCB0eXBlIG9mIGluZm8gdmVjdG9yIHRvIHVuc2lnbmVkLgotICAgIENoYW5nZWQgcG9zaXRpb24gb2YgcGFsZXR0ZSBpbiBpbmZvIHZlY3Rvci4gRml4ZWQgYW4gaW1wb3J0YW50IGJ1ZyB0aGF0Ci0gICAgaGFwcGVuZWQgb24gUE5HcyB3aXRoIGFuIHVuY29tcHJlc3NlZCBibG9jay4KLSopIDE2IGp1biAyMDA2OiBJbnRlcm5hbGx5IGNoYW5nZWQgdW5zaWduZWQgaW50byB1bnNpZ25lZCB3aGVyZQotICAgIG5lZWRlZCwgYW5kIHBlcmZvcm1lZCBzb21lIG9wdGltaXphdGlvbnMuCi0qKSAwNyBqdW4gMjAwNjogKCEpIFJlbmFtZWQgZnVuY3Rpb25zIHRvIGRlY29kZVBORyBhbmQgcGxhY2VkIHRoZW0KLSAgICBpbiBMb2RlUE5HIG5hbWVzcGFjZS4gQ2hhbmdlZCB0aGUgb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMuIFJld3JvdGUgdGhlCi0gICAgZG9jdW1lbnRhdGlvbiBpbiB0aGUgaGVhZGVyLiBSZW5hbWVkIGZpbGVzIHRvIGxvZGVwbmcuY3BwIGFuZCBsb2RlcG5nLmgKLSopIDIyIGFwciAyMDA2OiBPcHRpbWl6ZWQgYW5kIGltcHJvdmVkIHNvbWUgY29kZQotKikgMDcgc2VwIDIwMDU6ICghKSBDaGFuZ2VkIHRvIHN0ZDo6dmVjdG9yIGludGVyZmFjZQotKikgMTIgYXVnIDIwMDU6IEluaXRpYWwgcmVsZWFzZSAoQysrLCBkZWNvZGVyIG9ubHkpCi0KLQotMTMuIGNvbnRhY3QgaW5mb3JtYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZlZWwgZnJlZSB0byBjb250YWN0IG1lIHdpdGggc3VnZ2VzdGlvbnMsIHByb2JsZW1zLCBjb21tZW50cywgLi4uIGNvbmNlcm5pbmcKLUxvZGVQTkcuIElmIHlvdSBlbmNvdW50ZXIgYSBQTkcgaW1hZ2UgdGhhdCBkb2Vzbid0IHdvcmsgcHJvcGVybHkgd2l0aCB0aGlzCi1kZWNvZGVyLCBmZWVsIGZyZWUgdG8gc2VuZCBpdCBhbmQgSSdsbCB1c2UgaXQgdG8gZmluZCBhbmQgZml4IHRoZSBwcm9ibGVtLgotCi1NeSBlbWFpbCBhZGRyZXNzIGlzIChwdXp6bGUgdGhlIGFjY291bnQgYW5kIGRvbWFpbiB0b2dldGhlciB3aXRoIGFuIEAgc3ltYm9sKToKLURvbWFpbjogZ21haWwgZG90IGNvbS4KLUFjY291bnQ6IGxvZGUgZG90IHZhbmRldmVubmUuCi0KLQotQ29weXJpZ2h0IChjKSAyMDA1LTIwMTkgTG9kZSBWYW5kZXZlbm5lCi0qLwpkaWZmIC0tZ2l0IGEvZW5jb2Rlci9wdnBuZ3JlYWRlci5jcHAgYi9lbmNvZGVyL3B2cG5ncmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjYzOWYyCi0tLSAvZGV2L251bGwKKysrIGIvZW5jb2Rlci9wdnBuZ3JlYWRlci5jcHAKQEAgLTAsMCArMSwyNjYyIEBACisvLyBwbmdyZWFkZXIuY3BwIC0gUHVibGljIERvbWFpbiAtIHNlZSB1bmxpY2Vuc2UgYXQgYm90dG9tIG9mIGZpbGUuCisvLworLy8gTm90ZXM6IAorLy8gVGhpcyBpcyBhbmNpZW50IGNvZGUgZnJvbSB+MTk5NSBwb3J0ZWQgdG8gQysrLiBJdCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGZvciBhIAorLy8gRE9TIGFwcCB3aXRoIHZlcnkgbGltaXRlZCBtZW1vcnkuIEl0J3Mgbm90IGFzIGZhc3QgYXMgaXQgc2hvdWxkIGJlLCBidXQgaXQgd29ya3MuIAorLy8gVGhlIGxvdy1sZXZlbCBQTkcgcmVhZGVyIGNsYXNzIHdhcyB3cml0dGVuIGFzc3VtaW5nIHRoZSBQTkcgZmlsZSBjb3VsZCBub3QgZml0IAorLy8gZW50aXJlbHkgaW50byBtZW1vcnksIHdoaWNoIGRpY3RhdGVkIGhvdyBpdCB3YXMgd3JpdHRlbi9zdHJ1Y3R1cmVkLgorLy8gSXQgaGFzIGJlZW4gbW9kaWZpZWQgdG8gdXNlIGVpdGhlciB6bGliIG9yIG1pbml6LgorLy8gSXQgc3VwcG9ydHMgYWxsIFBORyBjb2xvciB0eXBlcy9iaXQgZGVwdGhzL2ludGVybGFjaW5nLCBob3dldmVyIDE2LWJpdC9jb21wb25lbnQgCisvLyBpbWFnZXMgYXJlIGNvbnZlcnRlZCB0byA4LWJpdC4KKy8vIFRSTlMgY2h1bmtzIGFyZSBjb252ZXJ0ZWQgdG8gYWxwaGEgYXMgbmVlZGVkLgorLy8gR0FNQSBjaHVuayBpcyByZWFkLCBidXQgbm90IGFwcGxpZWQuCisKKyNpbmNsdWRlICIuLi90cmFuc2NvZGVyL2Jhc2lzdS5oIgorCisjZGVmaW5lIE1JTklaX0hFQURFUl9GSUxFX09OTFkKKyNkZWZpbmUgTUlOSVpfTk9fWkxJQl9DT01QQVRJQkxFX05BTUVTCisjaW5jbHVkZSAiYmFzaXN1X21pbml6LmgiCisKKyNpbmNsdWRlICJwdnBuZ3JlYWRlci5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIFBWUE5HX0lEQVRfQ1JDX0NIRUNLSU5HICgxKQorI2RlZmluZSBQVlBOR19BRExFUjMyX0NIRUNLSU5HICgxKQorCituYW1lc3BhY2UgcHZfcG5nCit7CisKK2NvbnN0IHVpbnQzMl90IE1JTl9QTkdfU0laRSA9IDggKyAxMyArIDggKyAxICsgNCArIDEyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUz4gaW5saW5lIFMgbWF4aW11bShTIGEsIFMgYikgeyByZXR1cm4gKGEgPiBiKSA/IGEgOiBiOyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUz4gaW5saW5lIFMgbWluaW11bShTIGEsIFMgYikgeyByZXR1cm4gKGEgPCBiKSA/IGEgOiBiOyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCBjbGVhcl9vYmooVCYgb2JqKSB7IG1lbXNldCgmb2JqLCAwLCBzaXplb2Yob2JqKSk7IH0KKworI2RlZmluZSBNQVhfU1VQUE9SVEVEX1JFUyAoMzI3NjgpCisjZGVmaW5lIEZBTFNFICgwKQorI2RlZmluZSBUUlVFICgxKQorI2RlZmluZSBQTkdfTUFYX0FMTE9DX0JMT0NLUyAoMTYpCisKK2VudW0KK3sKKwlQTkdfREVDRVJST1IgPSAtMywKKwlQTkdfQUxMRE9ORSA9IC01LAorCVBOR19SRUFEUEFTVEVPRiA9IC0xMSwKKwlQTkdfVU5LTk9XTlRZUEUgPSAtMTYsCisJUE5HX0ZJTEVSRUFERVJST1IgPSAtMTcsCisJUE5HX05PVEVOT1VHSE1FTSA9IC0xMDgsCisJUE5HX0JBRF9DSFVOS19DUkMzMiA9IC0xMzAwMCwKKwlQTkdfTk9fSUhEUiA9IC0xMzAwMSwKKwlQTkdfQkFEX1dJRFRIID0gLTEzMDAyLAorCVBOR19CQURfSEVJR0hUID0gLTEzMDAzLAorCVBOR19VTlNfQ09NUFJFU1NJT04gPSAtMTMwMDQsCisJUE5HX1VOU19GSUxURVIgPSAtMTMwMDUsCisJUE5HX1VOU19JTEFDRSA9IC0xMzAwNiwKKwlQTkdfVU5TX0NPTE9SX1RZUEUgPSAtMTMwMDcsCisJUE5HX0JBRF9CSVRfREVQVEggPSAtMTMwMDgsCisJUE5HX0JBRF9DSFVOS19TSVpFID0gLTEzMDA5LAorCVBOR19VTlNfQ1JJVElDQUxfQ0hVTksgPSAtMTMwMTAsCisJUE5HX0JBRF9UUk5TX0NIVU5LID0gLTEzMDExLAorCVBOR19CQURfUExURV9DSFVOSyA9IC0xMzAxMiwKKwlQTkdfVU5TX1JFU09MVVRJT04gPSAtMTMwMTMsCisJUE5HX0lOVkFMSURfREFUQV9TVFJFQU0gPSAtMTMwMTQsCisJUE5HX01JU1NJTkdfUEFMRVRURSA9IC0xMzAxNSwKKwlQTkdfVU5TX1BSRURJQ1RPUiA9IC0xMzAxNiwKKwlQTkdfSU5DT01QTEVURV9JTUFHRSA9IC0xMzAxNywKKwlQTkdfVE9PX01VQ0hfREFUQSA9IC0xMzAxOAorfTsKKworI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9QQUxfTUFTSyAgICAgICAgKDEpCisjZGVmaW5lIFBOR19DT0xPUl9UWVBFX0NPTF9NQVNLICAgICAgICAoMikKKyNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfQUxQX01BU0sgICAgICAgICg0KQorCisjZGVmaW5lIFBOR19JTkZMQVRFX1NSQ19CVUZfU0laRSAgICAgICAoNDA5NikKKworc3RydWN0IGloZHJfc3RydWN0Cit7CisJdWludDMyX3QgbV93aWR0aDsKKwl1aW50MzJfdCBtX2hlaWdodDsKKwl1aW50OF90IG1fYml0X2RlcHRoOworCXVpbnQ4X3QgbV9jb2xvcl90eXBlOworCXVpbnQ4X3QgbV9jb21wX3R5cGU7CisJdWludDhfdCBtX2ZpbHRlcl90eXBlOworCXVpbnQ4X3QgbV9pbGFjZV90eXBlOworfTsKKworY2xhc3MgcG5nX2ZpbGUKK3sKK3B1YmxpYzoKKwlwbmdfZmlsZSgpIHsgfQorCXZpcnR1YWwgfnBuZ19maWxlKCkgeyB9CisKKwl2aXJ0dWFsIGJvb2wgcmVzaXplKHVpbnQ2NF90IG5ld19zaXplKSA9IDA7CisJdmlydHVhbCB1aW50NjRfdCBnZXRfc2l6ZSgpID0gMDsKKwl2aXJ0dWFsIHVpbnQ2NF90IHRlbGwoKSA9IDA7CisJdmlydHVhbCBib29sIHNlZWsodWludDY0X3Qgb2ZzKSA9IDA7CisJdmlydHVhbCBzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IGxlbikgPSAwOworCXZpcnR1YWwgc2l6ZV90IHJlYWQodm9pZCogcEJ1Ziwgc2l6ZV90IGxlbikgPSAwOworfTsKKworY2xhc3MgcG5nX21lbW9yeV9maWxlIDogcHVibGljIHBuZ19maWxlCit7CitwdWJsaWM6CisJc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9idWY7CisJdWludDY0X3QgbV9vZnM7CisJCisJcG5nX21lbW9yeV9maWxlKCkgOiAKKwkJcG5nX2ZpbGUoKSwKKwkJbV9vZnMoMCkKKwl7IAorCX0KKwkKKwl2aXJ0dWFsIH5wbmdfbWVtb3J5X2ZpbGUoKQorCXsgCisJfQorCisJc3RkOjp2ZWN0b3I8dWludDhfdD4mIGdldF9idWYoKSB7IHJldHVybiBtX2J1ZjsgfQorCWNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBnZXRfYnVmKCkgY29uc3QgeyByZXR1cm4gbV9idWY7IH0KKwkgCisJdm9pZCBpbml0KCkKKwl7CisJCW1fb2ZzID0gMDsKKwkJbV9idWYucmVzaXplKDApOworCX0KKworCXZpcnR1YWwgYm9vbCByZXNpemUodWludDY0X3QgbmV3X3NpemUpCisJeworCQlpZiAoKHNpemVvZihzaXplX3QpID09IHNpemVvZih1aW50MzJfdCkpICYmIChuZXdfc2l6ZSA+PSAweDdGRkZGRkZGKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQltX2J1Zi5yZXNpemUoKHNpemVfdCluZXdfc2l6ZSk7CisJCW1fb2ZzID0gbV9idWYuc2l6ZSgpOworCisJCXJldHVybiB0cnVlOworCX0KKworCXZpcnR1YWwgdWludDY0X3QgZ2V0X3NpemUoKQorCXsKKwkJcmV0dXJuIG1fYnVmLnNpemUoKTsKKwl9CisKKwl2aXJ0dWFsIHVpbnQ2NF90IHRlbGwoKQorCXsKKwkJcmV0dXJuIG1fb2ZzOworCX0KKworCXZpcnR1YWwgYm9vbCBzZWVrKHVpbnQ2NF90IG9mcykKKwl7CisJCW1fb2ZzID0gb2ZzOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl2aXJ0dWFsIHNpemVfdCB3cml0ZShjb25zdCB2b2lkKiBwQnVmLCBzaXplX3QgbGVuKQorCXsKKwkJdWludDY0X3QgbmV3X3NpemUgPSBtX29mcyArIGxlbjsKKwkJaWYgKG5ld19zaXplID4gbV9idWYuc2l6ZSgpKQorCQl7CisJCQlpZiAoKHNpemVvZihzaXplX3QpID09IHNpemVvZih1aW50MzJfdCkpICYmIChuZXdfc2l6ZSA+IDB4N0ZGRkZGRkZVTCkpCisJCQkJcmV0dXJuIDA7CisJCQltX2J1Zi5yZXNpemUobmV3X3NpemUpOworCQl9CisKKwkJbWVtY3B5KCZtX2J1Zlsoc2l6ZV90KW1fb2ZzXSwgcEJ1ZiwgbGVuKTsKKwkJbV9vZnMgKz0gbGVuOworCisJCXJldHVybiBsZW47CisJfQorCisJdmlydHVhbCBzaXplX3QgcmVhZCh2b2lkKiBwQnVmLCBzaXplX3QgbGVuKQorCXsKKwkJaWYgKG1fb2ZzID49IG1fYnVmLnNpemUoKSkKKwkJCXJldHVybiAwOworCisJCXVpbnQ2NF90IG1heF9ieXRlcyA9IG1pbmltdW08dWludDY0X3Q+KGxlbiwgbV9idWYuc2l6ZSgpIC0gbV9vZnMpOworCQltZW1jcHkocEJ1ZiwgJm1fYnVmWyhzaXplX3QpbV9vZnNdLCBtYXhfYnl0ZXMpOworCisJCW1fb2ZzICs9IG1heF9ieXRlczsKKworCQlyZXR1cm4gbWF4X2J5dGVzOworCX0KK307CisKK2NsYXNzIHBuZ19yZWFkb25seV9tZW1vcnlfZmlsZSA6IHB1YmxpYyBwbmdfZmlsZQoreworcHVibGljOgorCWNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZjsKKwlzaXplX3QgbV9idWZfc2l6ZTsKKwl1aW50NjRfdCBtX29mczsKKworCXBuZ19yZWFkb25seV9tZW1vcnlfZmlsZSgpIDoKKwkJcG5nX2ZpbGUoKSwKKwkJbV9wQnVmKG51bGxwdHIpLAorCQltX2J1Zl9zaXplKDApLAorCQltX29mcygwKQorCXsKKwl9CisKKwl2aXJ0dWFsIH5wbmdfcmVhZG9ubHlfbWVtb3J5X2ZpbGUoKQorCXsKKwl9CisKKwl2b2lkIGluaXQoY29uc3Qgdm9pZCAqcEJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKQorCXsKKwkJbV9wQnVmID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBCdWYpOworCQltX2J1Zl9zaXplID0gYnVmX3NpemU7CisJCW1fb2ZzID0gMDsKKwl9CisKKwl2aXJ0dWFsIGJvb2wgcmVzaXplKHVpbnQ2NF90IG5ld19zaXplKQorCXsKKwkJKHZvaWQpbmV3X3NpemU7CisJCWFzc2VydCgwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXZpcnR1YWwgdWludDY0X3QgZ2V0X3NpemUoKQorCXsKKwkJcmV0dXJuIG1fYnVmX3NpemU7CisJfQorCisJdmlydHVhbCB1aW50NjRfdCB0ZWxsKCkKKwl7CisJCXJldHVybiBtX29mczsKKwl9CisKKwl2aXJ0dWFsIGJvb2wgc2Vlayh1aW50NjRfdCBvZnMpCisJeworCQltX29mcyA9IG9mczsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJdmlydHVhbCBzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IGxlbikKKwl7CisJCSh2b2lkKXBCdWY7CisJCSh2b2lkKWxlbjsKKwkJYXNzZXJ0KDApOworCQlyZXR1cm4gMDsKKwl9CisKKwl2aXJ0dWFsIHNpemVfdCByZWFkKHZvaWQqIHBCdWYsIHNpemVfdCBsZW4pCisJeworCQlpZiAobV9vZnMgPj0gbV9idWZfc2l6ZSkKKwkJCXJldHVybiAwOworCisJCXVpbnQ2NF90IG1heF9ieXRlcyA9IG1pbmltdW08dWludDY0X3Q+KGxlbiwgbV9idWZfc2l6ZSAtIG1fb2ZzKTsKKwkJbWVtY3B5KHBCdWYsICZtX3BCdWZbKHNpemVfdCltX29mc10sIG1heF9ieXRlcyk7CisKKwkJbV9vZnMgKz0gbWF4X2J5dGVzOworCisJCXJldHVybiBtYXhfYnl0ZXM7CisJfQorfTsKKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIGZ0ZWxsNjQgX2Z0ZWxsaTY0CisjZGVmaW5lIGZzZWVrNjQgX2ZzZWVraTY0CisjZWxzZQorI2RlZmluZSBmdGVsbDY0IGZ0ZWxsbworI2RlZmluZSBmc2VlazY0IGZzZWVrbworI2VuZGlmCisKK2NsYXNzIHBuZ19jZmlsZSA6IHB1YmxpYyBwbmdfZmlsZQoreworcHVibGljOgorCUZJTEUqIG1fcEZpbGU7CisJCisJcG5nX2NmaWxlKCkgOiAKKwkJcG5nX2ZpbGUoKSwKKwkJbV9wRmlsZShudWxscHRyKQorCXsKKwl9CisKKwl2aXJ0dWFsIH5wbmdfY2ZpbGUoKQorCXsKKwkJY2xvc2UoKTsKKwl9CisKKwlib29sIGluaXQoY29uc3QgY2hhciAqcEZpbGVuYW1lLCBjb25zdCBjaGFyICpwTW9kZSkKKwl7CisJCWNsb3NlKCk7CisJCQorCQltX3BGaWxlID0gbnVsbHB0cjsKKwkJCisjaWZkZWYgX01TQ19WRVIKKwkJZm9wZW5fcygmbV9wRmlsZSwgcEZpbGVuYW1lLCBwTW9kZSk7CisjZWxzZQorCQltX3BGaWxlID0gZm9wZW4ocEZpbGVuYW1lLCBwTW9kZSk7CisjZW5kaWYKKworCQlyZXR1cm4gbV9wRmlsZSAhPSBudWxscHRyOworCX0KKworCWJvb2wgY2xvc2UoKQorCXsKKwkJYm9vbCBzdGF0dXMgPSB0cnVlOworCQlpZiAobV9wRmlsZSkKKwkJeworCQkJaWYgKGZjbG9zZShtX3BGaWxlKSA9PSBFT0YpCisJCQkJc3RhdHVzID0gZmFsc2U7CisJCQltX3BGaWxlID0gbnVsbHB0cjsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXZpcnR1YWwgYm9vbCByZXNpemUodWludDY0X3QgbmV3X3NpemUpCisJeworCQlpZiAobmV3X3NpemUpCisJCXsKKwkJCWlmICghc2VlayhuZXdfc2l6ZSAtIDEpKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJaW50IHYgPSAwOworCQkJaWYgKHdyaXRlKCZ2LCAxKSAhPSAxKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICghc2VlaygwKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl2aXJ0dWFsIHVpbnQ2NF90IGdldF9zaXplKCkKKwl7CisJCWludDY0X3QgY3VyX29mcyA9IGZ0ZWxsNjQobV9wRmlsZSk7CisJCWlmIChjdXJfb2ZzIDwgMCkKKwkJCXJldHVybiAwOworCQkKKwkJaWYgKGZzZWVrNjQobV9wRmlsZSwgMCwgU0VFS19FTkQpICE9IDApCisJCQlyZXR1cm4gMDsKKwkJCisJCWNvbnN0IGludDY0X3QgY3VyX3NpemUgPSBmdGVsbDY0KG1fcEZpbGUpOworCQlpZiAoY3VyX3NpemUgPCAwKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGZzZWVrNjQobV9wRmlsZSwgY3VyX29mcywgU0VFS19TRVQpICE9IDApCisJCQlyZXR1cm4gMDsKKwkJCisJCXJldHVybiBjdXJfc2l6ZTsKKwl9CisKKwl2aXJ0dWFsIHVpbnQ2NF90IHRlbGwoKQorCXsKKwkJaW50NjRfdCBjdXJfb2ZzID0gZnRlbGw2NChtX3BGaWxlKTsKKwkJaWYgKGN1cl9vZnMgPCAwKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIGN1cl9vZnM7CisJfQorCisJdmlydHVhbCBib29sIHNlZWsodWludDY0X3Qgb2ZzKQorCXsKKwkJcmV0dXJuIGZzZWVrNjQobV9wRmlsZSwgb2ZzLCBTRUVLX1NFVCkgPT0gMDsKKwl9CisKKwl2aXJ0dWFsIHNpemVfdCB3cml0ZShjb25zdCB2b2lkKiBwQnVmLCBzaXplX3QgbGVuKQorCXsKKwkJcmV0dXJuIChzaXplX3QpZndyaXRlKHBCdWYsIDEsIGxlbiwgbV9wRmlsZSk7CisJfQorCisJdmlydHVhbCBzaXplX3QgcmVhZCh2b2lkKiBwQnVmLCBzaXplX3QgbGVuKQorCXsKKwkJcmV0dXJuIChzaXplX3QpZnJlYWQocEJ1ZiwgMSwgbGVuLCBtX3BGaWxlKTsKKwl9Cit9OworCisvLyBUaGlzIGxvdy1sZXZlbCBoZWxwZXIgY2xhc3MgaGFuZGxlcyB0aGUgYWN0dWFsIGRlY29kaW5nIG9mIFBORyBmaWxlcy4KK2NsYXNzIHBuZ19kZWNvZGVyCit7CitwdWJsaWM6CisJcG5nX2RlY29kZXIoKTsKKwl+cG5nX2RlY29kZXIoKTsKKworCS8vIFNjYW5zIHRoZSBQTkcgZmlsZSwgYnV0IGRvZXNuJ3QgZGVjb2RlIHRoZSBJREFUIGRhdGEuIAorCS8vIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlLgorCS8vIElmIHRoZSByZXR1cm5lZCBzdGF0dXMgaXMgbm9uLXplcm8sIG9yIG1faW1nX3N1cHBvcnRlZF9mbGFnPT1GQUxTRSB0aGUgaW1hZ2UgZWl0aGVyIHRoZSBpbWFnZSBpcyBjb3JydXB0ZWQvbm90IFBORyBvciBpcyB1bnN1cHBvcnRlZCBpbiBzb21lIHdheS4KKwlpbnQgcG5nX3NjYW4ocG5nX2ZpbGUgKnBGaWxlKTsKKworCS8vIERlY29kZXMgYSBzaW5nbGUgc2NhbmxpbmUgb2YgUE5HIGltYWdlIGRhdGEuCisJLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNjYW5saW5lJ3MgcGl4ZWwgZGF0YSBhbmQgaXRzIHNpemUgaW4gYnl0ZXMuIAorCS8vIFRoaXMgZGF0YSBpcyBvbmx5IG1pbmltYWxseSBwcm9jZXNzZWQgZnJvbSB0aGUgaW50ZXJuYWwgUE5HIHBpeGVsIGRhdGEuCisJLy8gVGhlIGNhbGxlciBtdXN0IHVzZSB0aGUgaWhkciwgdHJuc19mbGFnIGFuZCB2YWx1ZXMsIGFuZCB0aGUgcGFsZXR0ZSB0byBhY3R1YWxseSBkZWNvZGUgdGhlIHBpeGVsIGRhdGEuCisJLy8KKwkvLyBQb3NzaWJsZSByZXR1cm5lZCBwaXhlbCBmb3JtYXRzIGlzIHNvbWV3aGF0IGNvbXBsZXggZHVlIHRvIHRoZSBoaXN0b3J5IG9mIHRoaXMgY29kZToKKwkvLyA4LWJpdCBSR0JBLCBhbHdheXMgNCBieXRlcy9waXhlbCAtIDI0YnBwIFBORydzIGFyZSBjb252ZXJ0ZWQgdG8gMzJicHAgYW5kIFRSTlMgcHJvY2Vzc2luZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgKDgvMTZicHAgUkdCIG9yIFJHQkEgUE5HIGZpbGVzKQorCS8vIDEvMi80LzgtYml0IGdyYXlzY2FsZSwgMSBieXRlIHBlciBwaXhlbCAtIG11c3QgY29udmVydCB0byBbMCwyNTVdIHVzaW5nIHRoZSBwYWxldHRlIG9yIHNvbWUgb3RoZXIgbWVhbnMsIG11c3Qgb3B0aW9uYWxseSB1c2UgdGhlIFRSTlMgY2h1bmsgZm9yIGFscGhhICgxLzIvNC84IEdyYXlzY2FsZSBQTkcgZmlsZXMgLSBub3QgMTZicHAgdGhvdWdoISkKKwkvLyAxLzIvNC84LWJpdCBwYWxldHRpemVkLCAxIGJ5dGUgcGVyIHBpeGVsIC0gbXVzdCBjb252ZXJ0IHRvIFJHQiB1c2luZyB0aGUgMjRicHAgcGFsZXR0ZSBhbmQgb3B0aW9uYWxseSB0aGUgVFJOUyBjaHVuayBmb3IgYWxwaGEgKDEvMi80LzhicHAgcGFsZXR0aXplZCBQTkcgZmlsZXMpCisJLy8gOC1iaXQgZ3JheXNjYWxlIHdpdGggYWxwaGEsIDIgYnl0ZXMgcGVyIHBpeGVsIC0gVFJOUyBwcm9jZXNzaW5nIHdpbGwgYmUgZG9uZSBmb3IgeW91IG9uIDE2YnBwIGltYWdlcyAodGhlcmUncyBhIHNwZWNpYWwgY2FzZSBoZXJlIGZvciAxNmJwcCBHcmV5IGZpbGVzKSAoOC8xNmJwcCBHcmF5LUFscGhhICpvciAxNmJwcCBHcmF5c2NhbGUqIFBORyBmaWxlcykKKwkvLworCS8vIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhIG5vbi16ZXJvIGVycm9yIGNvZGUsIG9yIFBOR19BTExET05FLgorCWludCBwbmdfZGVjb2RlKHZvaWQqKiBwcEltZ19wdHIsIHVpbnQzMl90KiBwSW1nX2xlbik7CisJCisJLy8gU3RhcnRzIGRlY29kaW5nLiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCisJaW50IHBuZ19kZWNvZGVfc3RhcnQoKTsKKwkKKwkvLyBEZWluaXRpYWxpemVzIHRoZSBkZWNvZGVyLCBmcmVlaW5nIGFsbCBhbGxvY2F0aW9ucy4KKwl2b2lkIHBuZ19kZWNvZGVfZW5kKCk7CisKKwlwbmdfZmlsZSogbV9wRmlsZTsKKwkJCisJLy8gSW1hZ2UncyAyNGJwcCBwYWxldHRlIC0gMyBieXRlcyBwZXIgZW50cnkKKwl1aW50OF90IG1fcGx0ZV9mbGFnOworCXVpbnQ4X3QgbV9pbWdfcGFsWzc2OF07CisJCQorCWludCBtX2ltZ19zdXBwb3J0ZWRfZmxhZzsKKwkJCisJaWhkcl9zdHJ1Y3QgbV9paGRyOworCisJdWludDhfdCBtX2NodW5rX2ZsYWc7CisJdWludDMyX3QgbV9jaHVua19zaXplOworCXVpbnQzMl90IG1fY2h1bmtfbGVmdDsKKwl1aW50MzJfdCBtX2NodW5rX2NyYzMyOworCXVpbnQ4X3QgbV9jaHVua19uYW1lWzRdOworCisJdWludDhfdCBtX2VuZF9vZl9pZGF0X2NodW5rczsKKworCXZvaWQqIG1fcE1hbGxvY19ibG9ja3NbUE5HX01BWF9BTExPQ19CTE9DS1NdOworCisJdWludDMyX3QgbV9kZWNfYnl0ZXNfcGVyX3BpeGVsOyAvLyBieXRlcyBwZXIgcGl4ZWwgZGVjb2RlZCBmcm9tIHRoZSBQTkcgZmlsZSAobWluaW11bSAxIGZvciAxLzIvNCBicHApLCBmYWN0b3JzIGluIHRoZSBQTkcgOC8xNiBiaXQvY29tcG9uZW50IGJpdCBkZXB0aCwgbWF5IGJlIHVwIHRvIDggYnl0ZXMgKDIqNCkKKwl1aW50MzJfdCBtX2RzdF9ieXRlc19wZXJfcGl4ZWw7IC8vIGJ5dGVzIHBlciBwaXhlbCByZXR1cm5lZCB0byB0aGUgY2FsbGVyICgxLTQpLCBhbHdheXMgaGFzIGFscGhhIGlmIHRoZSBQTkcgaGFzIGFscGhhLCAxNi1iaXQgY29tcG9uZW50cyBhbHdheXMgY29udmVydGVkIHRvIDgtYml0cy9jb21wb25lbnQKKworCXVpbnQzMl90IG1fZGVjX2J5dGVzX3Blcl9saW5lOwkvLyBieXRlcyBwZXIgbGluZSBkZWNvZGVkIGZyb20gdGhlIFBORyBmaWxlIChiZWZvcmUgMS8yLzQgZXhwYW5zaW9uKSwgKzEgZm9yIHRoZSBmaWx0ZXIgYnl0ZQorCXVpbnQzMl90IG1fc3JjX2J5dGVzX3Blcl9saW5lOwkvLyBkZWNvZGVkIFBORyBieXRlcyBwZXIgbGluZSwgYmVmb3JlIDEvMi80IGJwcCBleHBhbnNpb24sIG5vdCBjb3VudGluZyB0aGUgZmlsdGVyIGJ5dGUsIHVwZGF0ZWQgZHVyaW5nIGFkYW03IGRlaW50ZXJsYWNpbmcKKwl1aW50MzJfdCBtX2RzdF9ieXRlc19wZXJfbGluZTsJLy8gYnl0ZXMgcGVyIGxpbmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoMS00IHRpbWVzIHdpZHRoKQorCisJaW50ICgqbV9wUHJvY2Vzc19mdW5jKSh1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHBpeGVscywgcG5nX2RlY29kZXIqIHB3aSk7CisKKwl1aW50OF90KiBtX3BQcmVfbGluZV9idWY7CisJdWludDhfdCogbV9wQ3VyX2xpbmVfYnVmOworCXVpbnQ4X3QqIG1fcFByb19saW5lX2J1ZjsKKworCXVpbnQ4X3QgbV9ia2dkX2ZsYWc7CisJdWludDMyX3QgIG1fYmtnZF92YWx1ZVszXTsKKworCXVpbnQ4X3QgbV9nYW1hX2ZsYWc7CisJdWludDMyX3QgbV9nYW1hX3ZhbHVlOworCQkJCisJdWludDhfdCBtX3RybnNfZmxhZzsKKwl1aW50MzJfdCBtX3RybnNfdmFsdWVbMjU2XTsKKworCWJ1bWluaXo6Om16X3N0cmVhbSBtX2luZmxhdG9yOworCisJdWludDhfdCBpbmZsYXRlX3NyY19idWZbUE5HX0lORkxBVEVfU1JDX0JVRl9TSVpFXTsKKworCXVpbnQzMl90IG1faW5mbGF0ZV9zcmNfYnVmX29mczsKKwl1aW50MzJfdCBtX2luZmxhdGVfc3JjX2J1Zl9zaXplOworCXVpbnQzMl90IG1faW5mbGF0ZV9kc3RfYnVmX29mczsKKworCWludCBtX2luZmxhdGVfZW9mX2ZsYWc7CisJCQorCXVpbnQ4X3QgbV9nYW1tYV90YWJsZVsyNTZdOworCisJaW50IG1fcGFzc194X3NpemU7CisJaW50IG1fcGFzc195X2xlZnQ7CisKKwlpbnQgbV9hZGFtN19wYXNzX251bTsKKwlpbnQgbV9hZGFtN19wYXNzX3k7CisJaW50IG1fYWRhbTdfcGFzc19zaXplX3hbN107CisJaW50IG1fYWRhbTdfcGFzc19zaXplX3lbN107CisKKwlzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX2FkYW03X2ltYWdlX2J1ZjsKKwkJCisJaW50IG1fYWRhbTdfZGVjb2RlZF9mbGFnOworCQorCWJvb2wgbV9zY2FubmVkX2ZsYWc7CisJCQorCWludCBtX3Rlcm1pbmF0ZV9zdGF0dXM7CisJCQorI2RlZmluZSBURU1QX0JVRl9TSVpFICgzODQpCisJdWludDhfdCBtX3RlbXBfYnVmW1RFTVBfQlVGX1NJWkUgKiA0XTsKKwkJCQorCXZvaWQgY2xlYXIoKTsKKwl2b2lkIHVuaW5pdGlhbGl6ZSgpOworCWludCB0ZXJtaW5hdGUoaW50IHN0YXR1cyk7CisJdm9pZCogcG5nX21hbGxvYyh1aW50MzJfdCBpKTsKKwl2b2lkKiBwbmdfY2FsbG9jKHVpbnQzMl90IGkpOworCWludCBibG9ja19yZWFkKHZvaWQqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKwlpbnQ2NF90IGJsb2NrX3JlYWRfZHdvcmQoKTsKKwlpbnQgZmV0Y2hfbmV4dF9jaHVua19kYXRhKHVpbnQ4X3QqIGJ1ZiwgaW50IGJ5dGVzKTsKKwlpbnQgZmV0Y2hfbmV4dF9jaHVua19ieXRlKCk7CisJaW50IGZldGNoX25leHRfY2h1bmtfd29yZCgpOworCWludDY0X3QgZmV0Y2hfbmV4dF9jaHVua19kd29yZCgpOworCWludCBmZXRjaF9uZXh0X2NodW5rX2luaXQoKTsKKwlpbnQgdW5jaHVua19kYXRhKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgYnl0ZXMsIHVpbnQzMl90KiBwdHJfYnl0ZXNfcmVhZCk7CisJaW5saW5lIHZvaWQgYWRhbTdfd3JpdGVfcGl4ZWxfOChpbnQgeCwgaW50IHksIGludCBjKTsKKwlpbmxpbmUgdm9pZCBhZGFtN193cml0ZV9waXhlbF8xNihpbnQgeCwgaW50IHksIGludCByLCBpbnQgZyk7CisJaW5saW5lIHZvaWQgYWRhbTdfd3JpdGVfcGl4ZWxfMjQoaW50IHgsIGludCB5LCBpbnQgciwgaW50IGcsIGludCBiKTsKKwlpbmxpbmUgdm9pZCBhZGFtN193cml0ZV9waXhlbF8zMihpbnQgeCwgaW50IHksIGludCByLCBpbnQgZywgaW50IGIsIGludCBhKTsKKwl2b2lkIHVucHJlZGljdF9zdWIodWludDhfdCogbHN0LCB1aW50OF90KiBjdXIsIHVpbnQzMl90IGJ5dGVzLCBpbnQgYnBwKTsKKwl2b2lkIHVucHJlZGljdF91cCh1aW50OF90KiBsc3QsIHVpbnQ4X3QqIGN1ciwgdWludDMyX3QgYnl0ZXMsIGludCBicHApOworCXZvaWQgdW5wcmVkaWN0X2F2ZXJhZ2UodWludDhfdCogbHN0LCB1aW50OF90KiBjdXIsIHVpbnQzMl90IGJ5dGVzLCBpbnQgYnBwKTsKKwlpbmxpbmUgdWludDhfdCBwYWV0aF9wcmVkaWN0b3IoaW50IGEsIGludCBiLCBpbnQgYyk7CisJdm9pZCB1bnByZWRpY3RfcGFldGgodWludDhfdCogbHN0LCB1aW50OF90KiBjdXIsIHVpbnQzMl90IGJ5dGVzLCBpbnQgYnBwKTsKKwlpbnQgYWRhbTdfcGFzc19zaXplKGludCBzaXplLCBpbnQgc3RhcnQsIGludCBzdGVwKTsKKwlpbnQgZGVjb21wcmVzc19saW5lKHVpbnQzMl90KiBieXRlc19kZWNvZGVkKTsKKwlpbnQgZmluZF9pZW5kX2NodW5rKCk7CisJdm9pZCBjYWxjX2dhbW1hX3RhYmxlKCk7CisJdm9pZCBjcmVhdGVfZ3JleV9wYWxldHRlKCk7CisJaW50IHJlYWRfc2lnbmF0dXJlKCk7CisJaW50IHJlYWRfaWhkcl9jaHVuaygpOworCWludCByZWFkX2JrZ2RfY2h1bmsoKTsKKwlpbnQgcmVhZF9nYW1hX2NodW5rKCk7CisJaW50IHJlYWRfdHJuc19jaHVuaygpOworCWludCByZWFkX3BsdGVfY2h1bmsoKTsKKwlpbnQgZmluZF9pZGF0X2NodW5rKCk7Cit9OworCit2b2lkIHBuZ19kZWNvZGVyOjp1bmluaXRpYWxpemUoKQoreworCW1fcEZpbGUgPSBudWxscHRyOworCQkJCQorCWZvciAoaW50IGkgPSAwOyBpIDwgUE5HX01BWF9BTExPQ19CTE9DS1M7IGkrKykKKwl7CisJCWZyZWUobV9wTWFsbG9jX2Jsb2Nrc1tpXSk7CisJCW1fcE1hbGxvY19ibG9ja3NbaV0gPSBudWxscHRyOworCX0KKworCW16X2luZmxhdGVFbmQoJm1faW5mbGF0b3IpOworfQorCitpbnQgcG5nX2RlY29kZXI6OnRlcm1pbmF0ZShpbnQgc3RhdHVzKQoreworCWlmIChtX3Rlcm1pbmF0ZV9zdGF0dXMgPT0gMCkKKwkJbV90ZXJtaW5hdGVfc3RhdHVzID0gc3RhdHVzOworCisJdW5pbml0aWFsaXplKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCogcG5nX2RlY29kZXI6OnBuZ19tYWxsb2ModWludDMyX3QgbGVuKQoreworCWlmICghbGVuKQorCQlsZW4rKzsKKworCXZvaWQqIHAgPSBtYWxsb2MobGVuKTsKKworCWlmICghcCkKKwkJcmV0dXJuIG51bGxwdHI7CisKKwlpbnQgajsKKwlmb3IgKGogPSAwOyBqIDwgUE5HX01BWF9BTExPQ19CTE9DS1M7IGorKykKKwkJaWYgKCFtX3BNYWxsb2NfYmxvY2tzW2pdKQorCQkJYnJlYWs7CisKKwlpZiAoaiA9PSBQTkdfTUFYX0FMTE9DX0JMT0NLUykKKwkJcmV0dXJuIG51bGxwdHI7CisKKwltX3BNYWxsb2NfYmxvY2tzW2pdID0gcDsKKworCXJldHVybiBwOworfQorCit2b2lkKiBwbmdfZGVjb2Rlcjo6cG5nX2NhbGxvYyh1aW50MzJfdCBsZW4pCit7CisJdm9pZCogcCA9IHBuZ19tYWxsb2MobGVuKTsKKwlpZiAoIXApCisJCXJldHVybiBudWxscHRyOworCisJaWYgKHApCisJCW1lbXNldChwLCAwLCBsZW4pOworCisJcmV0dXJuIHA7Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6YmxvY2tfcmVhZCh2b2lkKiBidWYsIHVpbnQzMl90IGxlbikKK3sKKwlzaXplX3QgYnl0ZXNfcmVhZCA9IG1fcEZpbGUtPnJlYWQoYnVmLCBsZW4pOworCWlmIChieXRlc19yZWFkICE9IGxlbikKKwkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfUkVBRFBBU1RFT0YpOworCXJldHVybiAwOworfQorCitpbnQ2NF90IHBuZ19kZWNvZGVyOjpibG9ja19yZWFkX2R3b3JkKCkKK3sKKwl1aW50OF90IGJ1Zls0XTsKKworCWludCBzdGF0dXMgPSBibG9ja19yZWFkKGJ1ZiwgNCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJdWludDMyX3QgdiA9IGJ1ZlszXSArICgodWludDMyX3QpYnVmWzJdIDw8IDgpICsgKCh1aW50MzJfdClidWZbMV0gPDwgMTYpICsgKCh1aW50MzJfdClidWZbMF0gPDwgMjQpOworCXJldHVybiAoaW50NjRfdCl2OworfQorCitpbnQgcG5nX2RlY29kZXI6OmZldGNoX25leHRfY2h1bmtfZGF0YSh1aW50OF90KiBidWYsIGludCBieXRlcykKK3sKKwlpZiAoIW1fY2h1bmtfZmxhZykKKwkJcmV0dXJuIDA7CisKKwlieXRlcyA9IG1pbmltdW08aW50PihieXRlcywgbV9jaHVua19sZWZ0KTsKKworCWludCBzdGF0dXMgPSBibG9ja19yZWFkKGJ1ZiwgYnl0ZXMpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHN0YXR1czsKKwkJCQkKKyNpZiBQVlBOR19JREFUX0NSQ19DSEVDS0lORworCWJvb2wgY2hlY2tfY3JjMzIgPSB0cnVlOworI2Vsc2UKKwljb25zdCBib29sIGlzX2lkYXQgPSAobV9jaHVua19uYW1lWzBdID09ICdJJykgJiYgKG1fY2h1bmtfbmFtZVsxXSA9PSAnRCcpICYmIChtX2NodW5rX25hbWVbMl0gPT0gJ0EnKSAmJiAobV9jaHVua19uYW1lWzNdID09ICdUJyk7CisJYm9vbCBjaGVja19jcmMzMiA9ICFpc19pZGF0OworI2VuZGlmCisKKwlpZiAoY2hlY2tfY3JjMzIpCisJCW1fY2h1bmtfY3JjMzIgPSBidW1pbml6Ojptel9jcmMzMihtX2NodW5rX2NyYzMyLCBidWYsIGJ5dGVzKTsKKworCWlmICgobV9jaHVua19sZWZ0IC09IGJ5dGVzKSA9PSAwKQorCXsKKwkJaW50NjRfdCByZXMgPSBibG9ja19yZWFkX2R3b3JkKCk7CisJCWlmIChyZXMgPCAwKQorCQkJcmV0dXJuIChpbnQpcmVzOworCisJCWlmIChjaGVja19jcmMzMikKKwkJeworCQkJaWYgKG1fY2h1bmtfY3JjMzIgIT0gKHVpbnQzMl90KXJlcykKKwkJCQlyZXR1cm4gdGVybWluYXRlKFBOR19CQURfQ0hVTktfQ1JDMzIpOworCQl9CisKKwkJbV9jaHVua19mbGFnID0gRkFMU0U7CisJfQorCisJcmV0dXJuIGJ5dGVzOworfQorCitpbnQgcG5nX2RlY29kZXI6OmZldGNoX25leHRfY2h1bmtfYnl0ZSgpCit7CisJdWludDhfdCBidWZbMV07CisKKwlpbnQgc3RhdHVzID0gZmV0Y2hfbmV4dF9jaHVua19kYXRhKGJ1ZiwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoc3RhdHVzICE9IDEpCisJCXJldHVybiB0ZXJtaW5hdGUoUE5HX0JBRF9DSFVOS19TSVpFKTsKKworCXJldHVybiBidWZbMF07Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6ZmV0Y2hfbmV4dF9jaHVua193b3JkKCkKK3sKKwl1aW50OF90IGJ1ZlsyXTsKKworCWludCBzdGF0dXMgPSBmZXRjaF9uZXh0X2NodW5rX2RhdGEoYnVmLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChzdGF0dXMgIT0gMikKKwkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfQkFEX0NIVU5LX1NJWkUpOworCisJcmV0dXJuIGJ1ZlsxXSArICgodWludDMyX3QpYnVmWzBdIDw8IDgpOworfQorCitpbnQ2NF90IHBuZ19kZWNvZGVyOjpmZXRjaF9uZXh0X2NodW5rX2R3b3JkKCkKK3sKKwl1aW50OF90IGJ1Zls0XTsKKworCWludCBzdGF0dXMgPSBmZXRjaF9uZXh0X2NodW5rX2RhdGEoYnVmLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChzdGF0dXMgIT0gNCkKKwkJdGVybWluYXRlKFBOR19CQURfQ0hVTktfU0laRSk7CisKKwl1aW50MzJfdCB2ID0gYnVmWzNdICsgKCh1aW50MzJfdClidWZbMl0gPDwgOCkgKyAoKHVpbnQzMl90KWJ1ZlsxXSA8PCAxNikgKyAoKHVpbnQzMl90KWJ1ZlswXSA8PCAyNCk7CisJcmV0dXJuIChpbnQ2NF90KXY7Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6ZmV0Y2hfbmV4dF9jaHVua19pbml0KCkKK3sKKwl3aGlsZSAobV9jaHVua19mbGFnKQorCXsKKwkJaW50IHN0YXR1cyA9IGZldGNoX25leHRfY2h1bmtfZGF0YShtX3RlbXBfYnVmLCBURU1QX0JVRl9TSVpFICogNCk7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCQorCWludDY0X3QgbiA9IGJsb2NrX3JlYWRfZHdvcmQoKTsKKwlpZiAobiA8IDApCisJCXJldHVybiAoaW50KW47CisKKwltX2NodW5rX3NpemUgPSAodWludDMyX3QpbjsKKworCW1fY2h1bmtfZmxhZyA9IFRSVUU7CisJbV9jaHVua19sZWZ0ID0gbV9jaHVua19zaXplICsgNDsKKwltX2NodW5rX2NyYzMyID0gMDsKKworCWludCBzdGF0dXMgPSBmZXRjaF9uZXh0X2NodW5rX2RhdGEobV9jaHVua19uYW1lLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXJldHVybiAwOworfQorCitpbnQgcG5nX2RlY29kZXI6OnVuY2h1bmtfZGF0YSh1aW50OF90KiBidWYsIHVpbnQzMl90IGJ5dGVzLCB1aW50MzJfdCogcHRyX2J5dGVzX3JlYWQpCit7CisJdWludDMyX3QgYnl0ZXNfcmVhZCA9IDA7CisKKwlpZiAoKCFieXRlcykgfHwgKG1fZW5kX29mX2lkYXRfY2h1bmtzKSkKKwl7CisJCSpwdHJfYnl0ZXNfcmVhZCA9IDA7CisJCXJldHVybiBUUlVFOworCX0KKworCXdoaWxlIChieXRlc19yZWFkICE9IGJ5dGVzKQorCXsKKwkJaWYgKCFtX2NodW5rX2ZsYWcpCisJCXsKKwkJCWludCByZXMgPSBmZXRjaF9uZXh0X2NodW5rX2luaXQoKTsKKwkJCWlmIChyZXMgPCAwKQorCQkJCXJldHVybiByZXM7CisKKwkJCWlmICgobV9jaHVua19uYW1lWzBdICE9ICdJJykgfHwKKwkJCQkobV9jaHVua19uYW1lWzFdICE9ICdEJykgfHwKKwkJCQkobV9jaHVua19uYW1lWzJdICE9ICdBJykgfHwKKwkJCQkobV9jaHVua19uYW1lWzNdICE9ICdUJykpCisJCQl7CisJCQkJKnB0cl9ieXRlc19yZWFkID0gYnl0ZXNfcmVhZDsKKwkJCQltX2VuZF9vZl9pZGF0X2NodW5rcyA9IFRSVUU7CisJCQkJcmV0dXJuIFRSVUU7CisJCQl9CisJCX0KKworCQlpbnQgcmVzID0gZmV0Y2hfbmV4dF9jaHVua19kYXRhKGJ1ZiArIGJ5dGVzX3JlYWQsIGJ5dGVzIC0gYnl0ZXNfcmVhZCk7CisJCWlmIChyZXMgPCAwKQorCQkJcmV0dXJuIHJlczsKKworCQlieXRlc19yZWFkICs9ICh1aW50MzJfdClyZXM7CisJfQorCisJKnB0cl9ieXRlc19yZWFkID0gYnl0ZXNfcmVhZDsKKworCXJldHVybiBGQUxTRTsKK30KKworaW5saW5lIHZvaWQgcG5nX2RlY29kZXI6OmFkYW03X3dyaXRlX3BpeGVsXzgoaW50IHgsIGludCB5LCBpbnQgYykKK3sKKwltX2FkYW03X2ltYWdlX2J1Zlt4ICsgeSAqIG1fZHN0X2J5dGVzX3Blcl9saW5lXSA9ICh1aW50OF90KWM7Cit9CisKK2lubGluZSB2b2lkIHBuZ19kZWNvZGVyOjphZGFtN193cml0ZV9waXhlbF8xNihpbnQgeCwgaW50IHksIGludCByLCBpbnQgZykKK3sKKwl1aW50MzJfdCBvZnMgPSB4ICogMiArIHkgKiBtX2RzdF9ieXRlc19wZXJfbGluZTsKKwltX2FkYW03X2ltYWdlX2J1ZltvZnMgKyAwXSA9ICh1aW50OF90KXI7CisJbV9hZGFtN19pbWFnZV9idWZbb2ZzICsgMV0gPSAodWludDhfdClnOworfQorCitpbmxpbmUgdm9pZCBwbmdfZGVjb2Rlcjo6YWRhbTdfd3JpdGVfcGl4ZWxfMjQoaW50IHgsIGludCB5LCBpbnQgciwgaW50IGcsIGludCBiKQoreworCXVpbnQzMl90IG9mcyA9IHggKiAzICsgeSAqIG1fZHN0X2J5dGVzX3Blcl9saW5lOworCW1fYWRhbTdfaW1hZ2VfYnVmW29mcyArIDBdID0gKHVpbnQ4X3QpcjsKKwltX2FkYW03X2ltYWdlX2J1ZltvZnMgKyAxXSA9ICh1aW50OF90KWc7CisJbV9hZGFtN19pbWFnZV9idWZbb2ZzICsgMl0gPSAodWludDhfdCliOworfQorCitpbmxpbmUgdm9pZCBwbmdfZGVjb2Rlcjo6YWRhbTdfd3JpdGVfcGl4ZWxfMzIoaW50IHgsIGludCB5LCBpbnQgciwgaW50IGcsIGludCBiLCBpbnQgYSkKK3sKKwl1aW50MzJfdCBvZnMgPSB4ICogNCArIHkgKiBtX2RzdF9ieXRlc19wZXJfbGluZTsKKwltX2FkYW03X2ltYWdlX2J1ZltvZnMgKyAwXSA9ICh1aW50OF90KXI7CisJbV9hZGFtN19pbWFnZV9idWZbb2ZzICsgMV0gPSAodWludDhfdClnOworCW1fYWRhbTdfaW1hZ2VfYnVmW29mcyArIDJdID0gKHVpbnQ4X3QpYjsKKwltX2FkYW03X2ltYWdlX2J1ZltvZnMgKyAzXSA9ICh1aW50OF90KWE7Cit9CisKK3N0YXRpYyB2b2lkIFBpeGVsRGVQYWNrMih2b2lkKiBzcmMsIHZvaWQqIGRzdCwgaW50IG51bWJ5dGVzKQoreworCXVpbnQ4X3QqIHNyYzggPSAodWludDhfdCopc3JjOworCXVpbnQ4X3QqIGRzdDggPSAodWludDhfdCopZHN0OworCisJd2hpbGUgKG51bWJ5dGVzKQorCXsKKwkJdWludDhfdCB2ID0gKnNyYzgrKzsKKwkJCisJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCA4OyBpKyspCisJCQlkc3Q4WzcgLSBpXSA9ICh2ID4+IGkpICYgMTsKKworCQlkc3Q4ICs9IDg7CisJCW51bWJ5dGVzLS07CisJfQorfQorCitzdGF0aWMgdm9pZCBQaXhlbERlUGFjazE2KHZvaWQqIHNyYywgdm9pZCogZHN0LCBpbnQgbnVtYnl0ZXMpCit7CisJdWludDhfdCogc3JjOCA9ICh1aW50OF90KilzcmM7CisJdWludDhfdCogZHN0OCA9ICh1aW50OF90Kilkc3Q7CisKKwl3aGlsZSAobnVtYnl0ZXMpCisJeworCQl1aW50OF90IHYgPSAqc3JjOCsrOworCisJCWRzdDhbMF0gPSAodWludDhfdCl2ID4+IDQ7CisJCWRzdDhbMV0gPSAodWludDhfdCl2ICYgMHhGOworCQlkc3Q4ICs9IDI7CisKKwkJbnVtYnl0ZXMtLTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdW5wYWNrX2dyZXlfMSh1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHBpeGVscywgcG5nX2RlY29kZXIgKnB3aSkKK3sKKwkodm9pZClwd2k7CisJUGl4ZWxEZVBhY2syKHNyYywgZHN0LCBwaXhlbHMgPj4gMyk7CisKKwlkc3QgKz0gKHBpeGVscyAmIDB4RkZGOCk7CisKKwlpZiAoKHBpeGVscyAmIDcpICE9IDApCisJeworCQl1aW50OF90IGMgPSBzcmNbcGl4ZWxzID4+IDNdOworCisJCXBpeGVscyAmPSA3OworCisJCXdoaWxlIChwaXhlbHMtLSkKKwkJeworCQkJKmRzdCsrID0gKChjICYgMTI4KSA+PiA3KTsKKworCQkJYyA8PD0gMTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IHVucGFja19ncmV5XzIodWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBwaXhlbHMsIHBuZ19kZWNvZGVyKiBwd2kpCit7CisJKHZvaWQpcHdpOworCWludCBpID0gcGl4ZWxzOworCXVpbnQ4X3QgYzsKKworCXdoaWxlIChpID49IDQpCisJeworCQljID0gKnNyYysrOworCisJCSpkc3QrKyA9IChjID4+IDYpOworCQkqZHN0KysgPSAoYyA+PiA0KSAmIDM7CisJCSpkc3QrKyA9IChjID4+IDIpICYgMzsKKwkJKmRzdCsrID0gKGMpICYgMzsKKworCQlpIC09IDQ7CisJfQorCisJaWYgKGkpCisJeworCQljID0gKnNyYzsKKworCQl3aGlsZSAoaS0tKQorCQl7CisJCQkqZHN0KysgPSAoYyA+PiA2KTsKKworCQkJYyA8PD0gMjsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IHVucGFja19ncmV5XzQodWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBwaXhlbHMsIHBuZ19kZWNvZGVyKiBwd2kpCit7CisJKHZvaWQpcHdpOworCisJUGl4ZWxEZVBhY2sxNihzcmMsIGRzdCwgcGl4ZWxzID4+IDEpOworCisJaWYgKHBpeGVscyAmIDEpCisJCWRzdFtwaXhlbHMgJiAweEZGRkVdID0gKHNyY1twaXhlbHMgPj4gMV0gPj4gNCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCB1bnBhY2tfZ3JleV84KHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgcGl4ZWxzLCBwbmdfZGVjb2RlciogcHdpKQoreworCSh2b2lkKXNyYzsKKwkodm9pZClkc3Q7CisJKHZvaWQpcGl4ZWxzOworCSh2b2lkKXB3aTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgdW5wYWNrX2dyZXlfMTYodWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBwaXhlbHMsIHBuZ19kZWNvZGVyKiBwd2kpCit7CisJKHZvaWQpcHdpOworCXdoaWxlIChwaXhlbHMtLSkKKwl7CisJCSpkc3QrKyA9ICpzcmMrKzsKKworCQlzcmMrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCB1bnBhY2tfZ3JleV8xNl8yKHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgcGl4ZWxzLCBwbmdfZGVjb2RlciogcHdpKQoreworCWlmIChwd2ktPm1fdHJuc19mbGFnKQorCXsKKwkJd2hpbGUgKHBpeGVscy0tKQorCQl7CisJCQl1aW50MzJfdCB2ID0gKHNyY1swXSA8PCA4KSArIHNyY1sxXTsKKwkJCXNyYyArPSAyOworCisJCQkqZHN0KysgPSAodWludDhfdCkodiA+PiA4KTsKKwkJCSpkc3QrKyA9ICh2ID09IHB3aS0+bV90cm5zX3ZhbHVlWzBdKSA/IDAgOiAyNTU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJd2hpbGUgKHBpeGVscy0tKQorCQl7CisJCQkqZHN0KysgPSAqc3JjKys7CisJCQkqZHN0KysgPSAweEZGOworCisJCQlzcmMrKzsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IHVucGFja190cnVlXzgodWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBwaXhlbHMsIHBuZ19kZWNvZGVyKiBwd2kpCit7CisJaWYgKHB3aS0+bV90cm5zX2ZsYWcpCisJeworCQljb25zdCB1aW50MzJfdCB0ciA9IHB3aS0+bV90cm5zX3ZhbHVlWzBdOworCQljb25zdCB1aW50MzJfdCB0ZyA9IHB3aS0+bV90cm5zX3ZhbHVlWzFdOworCQljb25zdCB1aW50MzJfdCB0YiA9IHB3aS0+bV90cm5zX3ZhbHVlWzJdOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspCisJCXsKKwkJCXVpbnQ4X3QgciA9IHNyY1tpICogMyArIDBdOworCQkJdWludDhfdCBnID0gc3JjW2kgKiAzICsgMV07CisJCQl1aW50OF90IGIgPSBzcmNbaSAqIDMgKyAyXTsKKwkJCQorCQkJZHN0W2kgKiA0ICsgMF0gPSByOworCQkJZHN0W2kgKiA0ICsgMV0gPSBnOworCQkJZHN0W2kgKiA0ICsgMl0gPSBiOworCQkJZHN0W2kgKiA0ICsgM10gPSAoKHIgPT0gdHIpICYmIChnID09IHRnKSAmJiAoYiA9PSB0YikpID8gMCA6IDI1NTsKKwkJfQorCX0KKwllbHNlCisJeworCQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKQorCQl7CisJCQlkc3RbaSAqIDQgKyAwXSA9IHNyY1tpICogMyArIDBdOworCQkJZHN0W2kgKiA0ICsgMV0gPSBzcmNbaSAqIDMgKyAxXTsKKwkJCWRzdFtpICogNCArIDJdID0gc3JjW2kgKiAzICsgMl07CisJCQlkc3RbaSAqIDQgKyAzXSA9IDI1NTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IHVucGFja190cnVlXzE2KHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgcGl4ZWxzLCBwbmdfZGVjb2RlciogcHdpKQoreworCWlmIChwd2ktPm1fdHJuc19mbGFnKQorCXsKKwkJY29uc3QgdWludDMyX3QgdHIgPSBwd2ktPm1fdHJuc192YWx1ZVswXTsKKwkJY29uc3QgdWludDMyX3QgdGcgPSBwd2ktPm1fdHJuc192YWx1ZVsxXTsKKwkJY29uc3QgdWludDMyX3QgdGIgPSBwd2ktPm1fdHJuc192YWx1ZVsyXTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKQorCQl7CisJCQl1aW50MzJfdCByID0gKHNyY1tpICogNiArIDBdIDw8IDgpICsgc3JjW2kgKiA2ICsgMV07CisJCQl1aW50MzJfdCBnID0gKHNyY1tpICogNiArIDJdIDw8IDgpICsgc3JjW2kgKiA2ICsgM107CisJCQl1aW50MzJfdCBiID0gKHNyY1tpICogNiArIDRdIDw8IDgpICsgc3JjW2kgKiA2ICsgNV07CisKKwkJCWRzdFtpICogNCArIDBdID0gKHVpbnQ4X3QpKHIgPj4gOCk7CisJCQlkc3RbaSAqIDQgKyAxXSA9ICh1aW50OF90KShnID4+IDgpOworCQkJZHN0W2kgKiA0ICsgMl0gPSAodWludDhfdCkoYiA+PiA4KTsKKwkJCWRzdFtpICogNCArIDNdID0gKChyID09IHRyKSAmJiAoZyA9PSB0ZykgJiYgKGIgPT0gdGIpKSA/IDAgOiAyNTU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJd2hpbGUgKHBpeGVscy0tKQorCQl7CisJCQlkc3RbMF0gPSBzcmNbMF07CisJCQlkc3RbMV0gPSBzcmNbMl07CisJCQlkc3RbMl0gPSBzcmNbNF07CisJCQlkc3RbM10gPSAyNTU7CisJCQkKKwkJCWRzdCArPSA0OworCQkJc3JjICs9IDY7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCB1bnBhY2tfZ3JleV9hbHBoYV84KHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgcGl4ZWxzLCBwbmdfZGVjb2RlciogcHdpKQoreworCSh2b2lkKXB3aTsKKwl3aGlsZSAocGl4ZWxzLS0pCisJeworCQlkc3RbMF0gPSBzcmNbMF07CisJCWRzdFsxXSA9IHNyY1sxXTsKKwkJZHN0ICs9IDI7CisJCXNyYyArPSAyOworCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IHVucGFja19ncmV5X2FscGhhXzE2KHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgcGl4ZWxzLCBwbmdfZGVjb2RlciogcHdpKQoreworCSh2b2lkKXB3aTsKKwl3aGlsZSAocGl4ZWxzLS0pCisJeworCQlkc3RbMF0gPSBzcmNbMF07CisJCWRzdFsxXSA9IHNyY1syXTsKKwkJZHN0ICs9IDI7CisJCXNyYyArPSA0OworCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IHVucGFja190cnVlX2FscGhhXzgodWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBwaXhlbHMsIHBuZ19kZWNvZGVyKiBwd2kpCit7CisJKHZvaWQpc3JjOworCSh2b2lkKWRzdDsKKwkodm9pZClwaXhlbHM7CisJKHZvaWQpcHdpOworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCB1bnBhY2tfdHJ1ZV9hbHBoYV8xNih1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHBpeGVscywgcG5nX2RlY29kZXIqIHB3aSkKK3sKKwkodm9pZClwd2k7CisJd2hpbGUgKHBpeGVscy0tKQorCXsKKwkJZHN0WzBdID0gc3JjWzBdOworCQlkc3RbMV0gPSBzcmNbMl07CisJCWRzdFsyXSA9IHNyY1s0XTsKKwkJZHN0WzNdID0gc3JjWzZdOworCQlkc3QgKz0gNDsKKwkJc3JjICs9IDg7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgcG5nX2RlY29kZXI6OnVucHJlZGljdF9zdWIodWludDhfdCogbHN0LCB1aW50OF90KiBjdXIsIHVpbnQzMl90IGJ5dGVzLCBpbnQgYnBwKQoreworCSh2b2lkKWxzdDsKKwlpZiAoYnl0ZXMgPT0gKHVpbnQzMl90KWJwcCkKKwkJcmV0dXJuOworCisJY3VyICs9IGJwcDsKKwlieXRlcyAtPSBicHA7CisKKwl3aGlsZSAoYnl0ZXMtLSkKKwl7CisJCSpjdXIgKz0gKihjdXIgLSBicHApOworCQljdXIrKzsKKwl9Cit9CisKK3ZvaWQgcG5nX2RlY29kZXI6OnVucHJlZGljdF91cCh1aW50OF90KiBsc3QsIHVpbnQ4X3QqIGN1ciwgdWludDMyX3QgYnl0ZXMsIGludCBicHApCit7CisJKHZvaWQpYnBwOworCXdoaWxlIChieXRlcy0tKQorCQkqY3VyKysgKz0gKmxzdCsrOworfQorCit2b2lkIHBuZ19kZWNvZGVyOjp1bnByZWRpY3RfYXZlcmFnZSh1aW50OF90KiBsc3QsIHVpbnQ4X3QqIGN1ciwgdWludDMyX3QgYnl0ZXMsIGludCBicHApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnBwOyBpKyspCisJCSpjdXIrKyArPSAoKmxzdCsrID4+IDEpOworCisJaWYgKGJ5dGVzID09ICh1aW50MzJfdClicHApCisJCXJldHVybjsKKworCWJ5dGVzIC09IGJwcDsKKworCXdoaWxlIChieXRlcy0tKQorCXsKKwkJKmN1ciArPSAoKCpsc3QrKyArICooY3VyIC0gYnBwKSkgPj4gMSk7CisJCWN1cisrOworCX0KK30KKworaW5saW5lIHVpbnQ4X3QgcG5nX2RlY29kZXI6OnBhZXRoX3ByZWRpY3RvcihpbnQgYSwgaW50IGIsIGludCBjKQoreworCWludCBwLCBwYSwgcGIsIHBjOworCisJLyogYSA9IGxlZnQsIGIgPSBhYm92ZSwgYyA9IHVwcGVyIGxlZnQgKi8KKworCXAgPSBhICsgYiAtIGM7CisKKwlwYSA9IGFicyhwIC0gYSk7CisJcGIgPSBhYnMocCAtIGIpOworCXBjID0gYWJzKHAgLSBjKTsKKworCWlmICgocGEgPD0gcGIpICYmIChwYSA8PSBwYykpCisJCXJldHVybiAodWludDhfdClhOworCWVsc2UgaWYgKHBiIDw9IHBjKQorCQlyZXR1cm4gKHVpbnQ4X3QpYjsKKwllbHNlCisJCXJldHVybiAodWludDhfdCljOworfQorCit2b2lkIHBuZ19kZWNvZGVyOjp1bnByZWRpY3RfcGFldGgodWludDhfdCogbHN0LCB1aW50OF90KiBjdXIsIHVpbnQzMl90IGJ5dGVzLCBpbnQgYnBwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJwcDsgaSsrKQorCQkqY3VyKysgKz0gcGFldGhfcHJlZGljdG9yKDAsICpsc3QrKywgMCk7CisKKwlpZiAoYnl0ZXMgPT0gKHVpbnQzMl90KWJwcCkKKwkJcmV0dXJuOworCisJYnl0ZXMgLT0gYnBwOworCisJd2hpbGUgKGJ5dGVzLS0pCisJeworCQlpbnQgcCwgYSwgYiwgYywgcGEsIHBiLCBwYzsKKworCQlhID0gKihjdXIgLSBicHApOworCQliID0gKmxzdDsKKwkJYyA9ICoobHN0IC0gYnBwKTsKKworCQlwID0gYSArIGIgLSBjOworCisJCXBhID0gYWJzKHAgLSBhKTsKKwkJcGIgPSBhYnMocCAtIGIpOworCQlwYyA9IGFicyhwIC0gYyk7CisKKwkJaWYgKChwYSA8PSBwYikgJiYgKHBhIDw9IHBjKSkKKwkJCSpjdXIrKyArPSAodWludDhfdClhOworCQllbHNlIGlmIChwYiA8PSBwYykKKwkJCSpjdXIrKyArPSAodWludDhfdCliOworCQllbHNlCisJCQkqY3VyKysgKz0gKHVpbnQ4X3QpYzsKKworCQlsc3QrKzsKKwl9Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6YWRhbTdfcGFzc19zaXplKGludCBzaXplLCBpbnQgc3RhcnQsIGludCBzdGVwKQoreworCWlmIChzaXplID4gc3RhcnQpCisJCXJldHVybiAxICsgKChzaXplIC0gMSkgLSBzdGFydCkgLyBzdGVwOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8vIFRSVUUgaWYgbm8gbW9yZSBkYXRhLCBuZWdhdGl2ZSBvbiBlcnJvciwgRkFMU0UgaWYgT0sKK2ludCBwbmdfZGVjb2Rlcjo6ZGVjb21wcmVzc19saW5lKHVpbnQzMl90KiBieXRlc19kZWNvZGVkKQoreworCWludCBzdGF0dXM7CisJdWludDMyX3QgdGVtcCwgc3JjX2J5dGVzX2xlZnQsIGRzdF9ieXRlc19sZWZ0OworCisJbV9pbmZsYXRlX2RzdF9idWZfb2ZzID0gMDsKKworCWZvciAoOyA7ICkKKwl7CisJCWlmIChtX2luZmxhdGVfc3JjX2J1Zl9vZnMgPT0gUE5HX0lORkxBVEVfU1JDX0JVRl9TSVpFKQorCQl7CisJCQlpbnQgcmVzID0gdW5jaHVua19kYXRhKGluZmxhdGVfc3JjX2J1ZiwgUE5HX0lORkxBVEVfU1JDX0JVRl9TSVpFLCAmdGVtcCk7CisJCQlpZiAocmVzIDwgMCkKKwkJCQlyZXR1cm4gcmVzOworCQkJbV9pbmZsYXRlX2VvZl9mbGFnID0gcmVzOworCisJCQltX2luZmxhdGVfc3JjX2J1Zl9zaXplID0gdGVtcDsKKworCQkJbV9pbmZsYXRlX3NyY19idWZfb2ZzID0gMDsKKwkJfQorCisJCWZvciAoOyA7ICkKKwkJeworCQkJc3JjX2J5dGVzX2xlZnQgPSBtX2luZmxhdGVfc3JjX2J1Zl9zaXplIC0gbV9pbmZsYXRlX3NyY19idWZfb2ZzOworCQkJZHN0X2J5dGVzX2xlZnQgPSBtX2RlY19ieXRlc19wZXJfbGluZSAtIG1faW5mbGF0ZV9kc3RfYnVmX29mczsKKworCQkJbV9pbmZsYXRvci5uZXh0X2luID0gaW5mbGF0ZV9zcmNfYnVmICsgbV9pbmZsYXRlX3NyY19idWZfb2ZzOworCQkJbV9pbmZsYXRvci5hdmFpbF9pbiA9IHNyY19ieXRlc19sZWZ0OworCQkJCisJCQltX2luZmxhdG9yLm5leHRfb3V0ID0gbV9wQ3VyX2xpbmVfYnVmICsgbV9pbmZsYXRlX2RzdF9idWZfb2ZzOworCQkJbV9pbmZsYXRvci5hdmFpbF9vdXQgPSBkc3RfYnl0ZXNfbGVmdDsKKwkJCQkJCQorCQkJc3RhdHVzID0gYnVtaW5pejo6bXpfaW5mbGF0ZTIoJm1faW5mbGF0b3IsIGJ1bWluaXo6Ok1aX05PX0ZMVVNILCBQVlBOR19BRExFUjMyX0NIRUNLSU5HKTsKKworCQkJY29uc3QgdWludDMyX3Qgc3JjX2J5dGVzX2NvbnN1bWVkID0gc3JjX2J5dGVzX2xlZnQgLSBtX2luZmxhdG9yLmF2YWlsX2luOworCQkJY29uc3QgdWludDMyX3QgZHN0X2J5dGVzX3dyaXR0ZW4gPSBkc3RfYnl0ZXNfbGVmdCAtIG1faW5mbGF0b3IuYXZhaWxfb3V0OworCQkJCisJCQltX2luZmxhdGVfc3JjX2J1Zl9vZnMgKz0gc3JjX2J5dGVzX2NvbnN1bWVkOworCQkJbV9pbmZsYXRlX2RzdF9idWZfb2ZzICs9IGRzdF9ieXRlc193cml0dGVuOworCisJCQlpZiAoc3RhdHVzICE9IGJ1bWluaXo6Ok1aX09LKQorCQkJeworCQkJCWlmIChzdGF0dXMgIT0gYnVtaW5pejo6TVpfU1RSRUFNX0VORCkKKwkJCQkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfSU5WQUxJRF9EQVRBX1NUUkVBTSk7CisKKwkJCQlpZiAoYnl0ZXNfZGVjb2RlZCkKKwkJCQkJKmJ5dGVzX2RlY29kZWQgPSBtX2luZmxhdGVfZHN0X2J1Zl9vZnM7CisKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0KKworCQkJaWYgKG1faW5mbGF0ZV9kc3RfYnVmX29mcyA9PSBtX2RlY19ieXRlc19wZXJfbGluZSkKKwkJCXsKKwkJCQlpZiAoYnl0ZXNfZGVjb2RlZCkKKwkJCQkJKmJ5dGVzX2RlY29kZWQgPSBtX2luZmxhdGVfZHN0X2J1Zl9vZnM7CisKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisKKwkJCWlmICgobV9pbmZsYXRlX3NyY19idWZfb2ZzID09IG1faW5mbGF0ZV9zcmNfYnVmX3NpemUpICYmCisJCQkJKG1faW5mbGF0ZV9lb2ZfZmxhZyA9PSBGQUxTRSkpCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6ZmluZF9pZW5kX2NodW5rKCkKK3sKKwl1aW50MzJfdCBkdW1teTsKKworCXdoaWxlICghbV9lbmRfb2ZfaWRhdF9jaHVua3MpCisJeworCQlpbnQgcmVzID0gdW5jaHVua19kYXRhKG1fdGVtcF9idWYsIFRFTVBfQlVGX1NJWkUgKiA0LCAmZHVtbXkpOworCQlpZiAocmVzIDwgMCkKKwkJCXJldHVybiByZXM7CisJfQorCisJZm9yICg7IDsgKQorCXsKKwkJaWYgKChtX2NodW5rX25hbWVbMF0gPT0gJ0knKSAmJgorCQkJKG1fY2h1bmtfbmFtZVsxXSA9PSAnRScpICYmCisJCQkobV9jaHVua19uYW1lWzJdID09ICdOJykgJiYKKwkJCShtX2NodW5rX25hbWVbM10gPT0gJ0QnKSkKKwkJCWJyZWFrOworCisJCWludCByZXMgPSBmZXRjaF9uZXh0X2NodW5rX2luaXQoKTsKKwkJaWYgKHJlcyA8IDApCisJCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcG5nX2RlY29kZXI6OnBuZ19kZWNvZGUodm9pZCoqIHBwSW1nX3B0ciwgdWludDMyX3QqIHBJbWdfbGVuKQoreworCWludCBzdGF0dXM7CisJdWludDhfdCogZGVjb2RlZF9saW5lOworCXVpbnQzMl90IGJ5dGVzX2RlY29kZWQ7CisKKwlpZiAobV9hZGFtN19kZWNvZGVkX2ZsYWcpCisJeworCQlpZiAobV9wYXNzX3lfbGVmdCA9PSAwKQorCQkJcmV0dXJuIFBOR19BTExET05FOworCQkJCQorCQkqcHBJbWdfcHRyID0gJm1fYWRhbTdfaW1hZ2VfYnVmWyhtX2loZHIubV9oZWlnaHQgLSBtX3Bhc3NfeV9sZWZ0KSAqIG1fZHN0X2J5dGVzX3Blcl9saW5lXTsKKwkJKnBJbWdfbGVuID0gbV9kc3RfYnl0ZXNfcGVyX2xpbmU7CisJCQkJCisJCW1fcGFzc195X2xlZnQtLTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobV9wYXNzX3lfbGVmdCA9PSAwKQorCXsKKwkJaWYgKG1faWhkci5tX2lsYWNlX3R5cGUgPT0gMCkKKwkJeworCQkJc3RhdHVzID0gZmluZF9pZW5kX2NodW5rKCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlyZXR1cm4gc3RhdHVzOworCisJCQlyZXR1cm4gUE5HX0FMTERPTkU7CisJCX0KKworCQlmb3IgKDsgOyApCisJCXsKKwkJCWlmICgrK21fYWRhbTdfcGFzc19udW0gPT0gNykKKwkJCXsKKwkJCQlzdGF0dXMgPSBmaW5kX2llbmRfY2h1bmsoKTsKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQkJCQkJCisJCQkJcmV0dXJuIFBOR19BTExET05FOworCQkJfQorCisJCQlpZiAoKChtX3Bhc3NfeV9sZWZ0ID0gbV9hZGFtN19wYXNzX3NpemVfeVttX2FkYW03X3Bhc3NfbnVtXSkgIT0gMCkgJiYKKwkJCQkoKG1fcGFzc194X3NpemUgPSBtX2FkYW03X3Bhc3Nfc2l6ZV94W21fYWRhbTdfcGFzc19udW1dKSAhPSAwKSkKKwkJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAobV9hZGFtN19wYXNzX251bSkKKwkJeworCQljYXNlIDA6CisJCWNhc2UgMToKKwkJY2FzZSAzOgorCQljYXNlIDU6CisJCQltX2FkYW03X3Bhc3NfeSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbV9hZGFtN19wYXNzX3kgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCW1fYWRhbTdfcGFzc195ID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQltX2FkYW03X3Bhc3NfeSA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAobV9paGRyLm1fY29sb3JfdHlwZSkKKwkJeworCQljYXNlIFBOR19DT0xPUl9UWVBFX0dSRVlTQ0FMRToKKwkJY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRJWkVEOgorCQl7CisJCQltX3NyY19ieXRlc19wZXJfbGluZSA9ICgoKHVpbnQzMl90KW1fcGFzc194X3NpemUgKiBtX2loZHIubV9iaXRfZGVwdGgpICsgNykgLyA4OworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBQTkdfQ09MT1JfVFlQRV9UUlVFQ09MT1I6CisJCXsKKwkJCW1fc3JjX2J5dGVzX3Blcl9saW5lID0gKCh1aW50MzJfdCltX3Bhc3NfeF9zaXplICogbV9kZWNfYnl0ZXNfcGVyX3BpeGVsKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUE5HX0NPTE9SX1RZUEVfR1JFWVNDQUxFX0FMUEhBOgorCQl7CisJCQltX3NyY19ieXRlc19wZXJfbGluZSA9ICgodWludDMyX3QpbV9wYXNzX3hfc2l6ZSAqIG1fZGVjX2J5dGVzX3Blcl9waXhlbCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFBOR19DT0xPUl9UWVBFX1RSVUVDT0xPUl9BTFBIQToKKwkJeworCQkJbV9zcmNfYnl0ZXNfcGVyX2xpbmUgPSAoKHVpbnQzMl90KW1fcGFzc194X3NpemUgKiBtX2RlY19ieXRlc19wZXJfcGl4ZWwpOworCQkJYnJlYWs7CisJCX0KKwkJfQorCisJCW1fZGVjX2J5dGVzX3Blcl9saW5lID0gbV9zcmNfYnl0ZXNfcGVyX2xpbmUgKyAxOworCisJCW1lbXNldChtX3BQcmVfbGluZV9idWYsIDAsIG1fc3JjX2J5dGVzX3Blcl9saW5lKTsKKwl9CisKKwlpbnQgcmVzID0gZGVjb21wcmVzc19saW5lKCZieXRlc19kZWNvZGVkKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHRlcm1pbmF0ZShyZXMpOworCisJaWYgKHJlcykKKwl7CisJCWlmIChtX2loZHIubV9pbGFjZV90eXBlID09IDApCisJCXsKKwkJCWlmIChtX3Bhc3NfeV9sZWZ0ICE9IDEpCisJCQkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfSU5DT01QTEVURV9JTUFHRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKG1fcGFzc195X2xlZnQgIT0gMSkgJiYgKG1fYWRhbTdfcGFzc19udW0gIT0gNikpCisJCQkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfSU5DT01QTEVURV9JTUFHRSk7CisJCX0KKwl9CisKKwlpZiAoYnl0ZXNfZGVjb2RlZCAhPSBtX2RlY19ieXRlc19wZXJfbGluZSkKKwkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfSU5DT01QTEVURV9JTUFHRSk7CisKKwlkZWNvZGVkX2xpbmUgPSAmbV9wQ3VyX2xpbmVfYnVmWzFdOworCisJc3dpdGNoIChtX3BDdXJfbGluZV9idWZbMF0pCisJeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAxOgorCXsKKwkJdW5wcmVkaWN0X3N1YihtX3BQcmVfbGluZV9idWYsIG1fcEN1cl9saW5lX2J1ZiArIDEsIG1fc3JjX2J5dGVzX3Blcl9saW5lLCBtX2RlY19ieXRlc19wZXJfcGl4ZWwpOworCQlicmVhazsKKwl9CisJY2FzZSAyOgorCXsKKwkJdW5wcmVkaWN0X3VwKG1fcFByZV9saW5lX2J1ZiwgbV9wQ3VyX2xpbmVfYnVmICsgMSwgbV9zcmNfYnl0ZXNfcGVyX2xpbmUsIG1fZGVjX2J5dGVzX3Blcl9waXhlbCk7CisJCWJyZWFrOworCX0KKwljYXNlIDM6CisJeworCQl1bnByZWRpY3RfYXZlcmFnZShtX3BQcmVfbGluZV9idWYsIG1fcEN1cl9saW5lX2J1ZiArIDEsIG1fc3JjX2J5dGVzX3Blcl9saW5lLCBtX2RlY19ieXRlc19wZXJfcGl4ZWwpOworCQlicmVhazsKKwl9CisJY2FzZSA0OgorCXsKKwkJdW5wcmVkaWN0X3BhZXRoKG1fcFByZV9saW5lX2J1ZiwgbV9wQ3VyX2xpbmVfYnVmICsgMSwgbV9zcmNfYnl0ZXNfcGVyX2xpbmUsIG1fZGVjX2J5dGVzX3Blcl9waXhlbCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gdGVybWluYXRlKFBOR19VTlNfUFJFRElDVE9SKTsKKwl9CisKKwltZW1tb3ZlKG1fcFByZV9saW5lX2J1ZiwgbV9wQ3VyX2xpbmVfYnVmICsgMSwgbV9zcmNfYnl0ZXNfcGVyX2xpbmUpOworCisJaWYgKG1fcFByb2Nlc3NfZnVuYykKKwl7CisJCWlmICgoKm1fcFByb2Nlc3NfZnVuYykobV9wQ3VyX2xpbmVfYnVmICsgMSwgbV9wUHJvX2xpbmVfYnVmLCBtX3Bhc3NfeF9zaXplLCB0aGlzKSkKKwkJCWRlY29kZWRfbGluZSA9IG1fcFByb19saW5lX2J1ZjsKKwl9CisJCQorCWlmIChtX2loZHIubV9pbGFjZV90eXBlID09IDApCisJeworCQkqcHBJbWdfcHRyID0gZGVjb2RlZF9saW5lOworCQkqcEltZ19sZW4gPSBtX2RzdF9ieXRlc19wZXJfbGluZTsKKworCQlpZiAoLS1tX3Bhc3NfeV9sZWZ0ID09IDApCisJCXsKKwkJCXJlcyA9IGRlY29tcHJlc3NfbGluZSgmYnl0ZXNfZGVjb2RlZCk7CisJCQlpZiAocmVzIDwgMCkKKwkJCQlyZXR1cm4gdGVybWluYXRlKHJlcyk7CisKKwkJCWlmIChyZXMgPT0gRkFMU0UpCisJCQkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfVE9PX01VQ0hfREFUQSk7CisKKwkJCWlmIChieXRlc19kZWNvZGVkKQorCQkJCXJldHVybiB0ZXJtaW5hdGUoUE5HX1RPT19NVUNIX0RBVEEpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWludCBpLCB4X29mcyA9IDAsIHlfb2ZzID0gMCwgeF9zdHAgPSAwOworCQl1aW50OF90KiBwID0gZGVjb2RlZF9saW5lOworCisJCXN3aXRjaCAobV9hZGFtN19wYXNzX251bSkKKwkJeworCQljYXNlIDA6IHsgeF9vZnMgPSAwOyB4X3N0cCA9IDg7IGJyZWFrOyB9CisJCWNhc2UgMTogeyB4X29mcyA9IDQ7IHhfc3RwID0gODsgYnJlYWs7IH0KKwkJY2FzZSAyOiB7IHhfb2ZzID0gMDsgeF9zdHAgPSA0OyBicmVhazsgfQorCQljYXNlIDM6IHsgeF9vZnMgPSAyOyB4X3N0cCA9IDQ7IGJyZWFrOyB9CisJCWNhc2UgNDogeyB4X29mcyA9IDA7IHhfc3RwID0gMjsgYnJlYWs7IH0KKwkJY2FzZSA1OiB7IHhfb2ZzID0gMTsgeF9zdHAgPSAyOyBicmVhazsgfQorCQljYXNlIDY6IHsgeF9vZnMgPSAwOyB4X3N0cCA9IDE7IGJyZWFrOyB9CisJCX0KKworCQl5X29mcyA9IG1fYWRhbTdfcGFzc195OworCisJCWFzc2VydCh4X29mcyA8IChpbnQpbV9paGRyLm1fd2lkdGgpOworCQlhc3NlcnQoeV9vZnMgPCAoaW50KW1faWhkci5tX2hlaWdodCk7CisKKwkJaWYgKG1fZHN0X2J5dGVzX3Blcl9waXhlbCA9PSAxKQorCQl7CisJCQlmb3IgKGkgPSBtX3Bhc3NfeF9zaXplOyBpID4gMDsgaS0tLCB4X29mcyArPSB4X3N0cCkKKwkJCQlhZGFtN193cml0ZV9waXhlbF84KHhfb2ZzLCB5X29mcywgKnArKyk7CisJCX0KKwkJZWxzZSBpZiAobV9kc3RfYnl0ZXNfcGVyX3BpeGVsID09IDIpCisJCXsKKwkJCWZvciAoaSA9IG1fcGFzc194X3NpemU7IGkgPiAwOyBpLS0sIHhfb2ZzICs9IHhfc3RwLCBwICs9IDIpCisJCQkJYWRhbTdfd3JpdGVfcGl4ZWxfMTYoeF9vZnMsIHlfb2ZzLCBwWzBdLCBwWzFdKTsKKwkJfQorCQllbHNlIGlmIChtX2RzdF9ieXRlc19wZXJfcGl4ZWwgPT0gMykKKwkJeworCQkJZm9yIChpID0gbV9wYXNzX3hfc2l6ZTsgaSA+IDA7IGktLSwgeF9vZnMgKz0geF9zdHAsIHAgKz0gMykKKwkJCQlhZGFtN193cml0ZV9waXhlbF8yNCh4X29mcywgeV9vZnMsIHBbMF0sIHBbMV0sIHBbMl0pOworCQl9CisJCWVsc2UgaWYgKG1fZHN0X2J5dGVzX3Blcl9waXhlbCA9PSA0KQorCQl7CisJCQlmb3IgKGkgPSBtX3Bhc3NfeF9zaXplOyBpID4gMDsgaS0tLCB4X29mcyArPSB4X3N0cCwgcCArPSA0KQorCQkJCWFkYW03X3dyaXRlX3BpeGVsXzMyKHhfb2ZzLCB5X29mcywgcFswXSwgcFsxXSwgcFsyXSwgcFszXSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhc3NlcnQoMCk7CisJCX0KKworCQlzd2l0Y2ggKG1fYWRhbTdfcGFzc19udW0pCisJCXsKKwkJY2FzZSAwOgorCQljYXNlIDE6CisJCWNhc2UgMjogeyBtX2FkYW03X3Bhc3NfeSArPSA4OyBicmVhazsgfQorCQljYXNlIDM6CisJCWNhc2UgNDogeyBtX2FkYW03X3Bhc3NfeSArPSA0OyBicmVhazsgfQorCQljYXNlIDU6CisJCWNhc2UgNjogeyBtX2FkYW03X3Bhc3NfeSArPSAyOyBicmVhazsgfQorCQl9CisKKwkJaWYgKCgtLW1fcGFzc195X2xlZnQgPT0gMCkgJiYgKG1fYWRhbTdfcGFzc19udW0gPT0gNikpCisJCXsKKwkJCXJlcyA9IGRlY29tcHJlc3NfbGluZSgmYnl0ZXNfZGVjb2RlZCk7CisJCQlpZiAocmVzIDwgMCkKKwkJCQlyZXR1cm4gdGVybWluYXRlKHJlcyk7CisKKwkJCWlmIChyZXMgPT0gRkFMU0UpCisJCQkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfVE9PX01VQ0hfREFUQSk7CisKKwkJCWlmIChieXRlc19kZWNvZGVkKQorCQkJCXJldHVybiB0ZXJtaW5hdGUoUE5HX1RPT19NVUNIX0RBVEEpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcG5nX2RlY29kZXI6OnBuZ19kZWNvZGVfZW5kKCkKK3sKKwl1bmluaXRpYWxpemUoKTsKK30KKworaW50IHBuZ19kZWNvZGVyOjpwbmdfZGVjb2RlX3N0YXJ0KCkKK3sKKwlpbnQgc3RhdHVzOworCQorCWlmIChtX2ltZ19zdXBwb3J0ZWRfZmxhZyAhPSBUUlVFKQorCQlyZXR1cm4gdGVybWluYXRlKG1faW1nX3N1cHBvcnRlZF9mbGFnKTsKKwkJCisJc3dpdGNoIChtX2loZHIubV9jb2xvcl90eXBlKQorCXsKKwljYXNlIFBOR19DT0xPUl9UWVBFX0dSRVlTQ0FMRToKKwl7CisJCWlmIChtX2loZHIubV9iaXRfZGVwdGggPT0gMTYpCisJCXsKKwkJCS8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIFdlIGNhbid0IHBhc3MgYmFjayA4LWJpdCBzYW1wbGVzIGFuZCBsZXQgdGhlIGNhbGxlciBkZWNpZGUgb24gdHJhbnNwYXJlbmN5IGJlY2F1c2UgdGhlIFBORyBpcyAxNi1iaXRzLiAKKwkJCS8vIFNvIHdlIGV4cGFuZCB0byA4LWJpdCBHcmF5LUFscGhhIGFuZCBoYW5kbGUgdHJhbnNwYXJlbmN5IGR1cmluZyBkZWNvZGluZy4KKwkJCS8vIFdlIGRvbid0IGRvIHRoaXMgd2l0aCBhbGwgZ3JheXNjYWxlIGNhc2VzIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIG1vcmUgY29kZSB0byBkZWFsIHdpdGggMS8yLzRicHAgZXhwYW5zaW9uLgorCQkJbV9kZWNfYnl0ZXNfcGVyX3BpeGVsID0gKG1faWhkci5tX2JpdF9kZXB0aCArIDcpIC8gODsKKwkJCW1fZHN0X2J5dGVzX3Blcl9waXhlbCA9IDI7CisKKwkJCW1fc3JjX2J5dGVzX3Blcl9saW5lID0gKCgodWludDMyX3QpbV9paGRyLm1fd2lkdGggKiBtX2loZHIubV9iaXRfZGVwdGgpICsgNykgLyA4OworCQkJbV9kc3RfYnl0ZXNfcGVyX2xpbmUgPSAyICogbV9paGRyLm1fd2lkdGg7CisKKwkJCW1fcFByb2Nlc3NfZnVuYyA9IHVucGFja19ncmV5XzE2XzI7CisJCX0KKwkJZWxzZQorCQl7CisJCQltX2RlY19ieXRlc19wZXJfcGl4ZWwgPSAobV9paGRyLm1fYml0X2RlcHRoICsgNykgLyA4OworCQkJbV9kc3RfYnl0ZXNfcGVyX3BpeGVsID0gMTsKKworCQkJbV9zcmNfYnl0ZXNfcGVyX2xpbmUgPSAoKCh1aW50MzJfdCltX2loZHIubV93aWR0aCAqIG1faWhkci5tX2JpdF9kZXB0aCkgKyA3KSAvIDg7CisJCQltX2RzdF9ieXRlc19wZXJfbGluZSA9IG1faWhkci5tX3dpZHRoOworCisJCQlpZiAobV9paGRyLm1fYml0X2RlcHRoID09IDEpCisJCQkJbV9wUHJvY2Vzc19mdW5jID0gdW5wYWNrX2dyZXlfMTsKKwkJCWVsc2UgaWYgKG1faWhkci5tX2JpdF9kZXB0aCA9PSAyKQorCQkJCW1fcFByb2Nlc3NfZnVuYyA9IHVucGFja19ncmV5XzI7CisJCQllbHNlIGlmIChtX2loZHIubV9iaXRfZGVwdGggPT0gNCkKKwkJCQltX3BQcm9jZXNzX2Z1bmMgPSB1bnBhY2tfZ3JleV80OworCQkJZWxzZSAKKwkJCQltX3BQcm9jZXNzX2Z1bmMgPSB1bnBhY2tfZ3JleV84OworCQl9CisKKwkJYnJlYWs7CisJfQorCWNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRUSVpFRDoKKwl7CisJCW1fZGVjX2J5dGVzX3Blcl9waXhlbCA9IChtX2loZHIubV9iaXRfZGVwdGggKyA3KSAvIDg7CisJCW1fZHN0X2J5dGVzX3Blcl9waXhlbCA9IDE7CisKKwkJbV9zcmNfYnl0ZXNfcGVyX2xpbmUgPSAoKCh1aW50MzJfdCltX2loZHIubV93aWR0aCAqIG1faWhkci5tX2JpdF9kZXB0aCkgKyA3KSAvIDg7CisJCW1fZHN0X2J5dGVzX3Blcl9saW5lID0gbV9paGRyLm1fd2lkdGg7CisKKwkJaWYgKG1faWhkci5tX2JpdF9kZXB0aCA9PSAxKQorCQkJbV9wUHJvY2Vzc19mdW5jID0gdW5wYWNrX2dyZXlfMTsKKwkJZWxzZSBpZiAobV9paGRyLm1fYml0X2RlcHRoID09IDIpCisJCQltX3BQcm9jZXNzX2Z1bmMgPSB1bnBhY2tfZ3JleV8yOworCQllbHNlIGlmIChtX2loZHIubV9iaXRfZGVwdGggPT0gNCkKKwkJCW1fcFByb2Nlc3NfZnVuYyA9IHVucGFja19ncmV5XzQ7CisJCWVsc2UgaWYgKG1faWhkci5tX2JpdF9kZXB0aCA9PSA4KQorCQkJbV9wUHJvY2Vzc19mdW5jID0gdW5wYWNrX2dyZXlfODsKKwkJZWxzZSBpZiAobV9paGRyLm1fYml0X2RlcHRoID09IDE2KQorCQkJbV9wUHJvY2Vzc19mdW5jID0gdW5wYWNrX2dyZXlfMTY7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgUE5HX0NPTE9SX1RZUEVfVFJVRUNPTE9SOgorCXsKKwkJLy8gV2UgYWx3YXlzIHBhc3MgYmFjayBhbHBoYSB3aXRoIHRyYW5zcGFyZW5jeSBoYW5kbGluZy4KKwkJbV9kZWNfYnl0ZXNfcGVyX3BpeGVsID0gMyAqIChtX2loZHIubV9iaXRfZGVwdGggLyA4KTsKKwkJbV9kc3RfYnl0ZXNfcGVyX3BpeGVsID0gNDsKKworCQltX3NyY19ieXRlc19wZXJfbGluZSA9ICgodWludDMyX3QpbV9paGRyLm1fd2lkdGggKiBtX2RlY19ieXRlc19wZXJfcGl4ZWwpOworCQltX2RzdF9ieXRlc19wZXJfbGluZSA9IDQgKiBtX2loZHIubV93aWR0aDsKKworCQlpZiAobV9paGRyLm1fYml0X2RlcHRoID09IDgpCisJCQltX3BQcm9jZXNzX2Z1bmMgPSB1bnBhY2tfdHJ1ZV84OworCQllbHNlIGlmIChtX2loZHIubV9iaXRfZGVwdGggPT0gMTYpCisJCQltX3BQcm9jZXNzX2Z1bmMgPSB1bnBhY2tfdHJ1ZV8xNjsKKworCQlicmVhazsKKwl9CisJY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEVfQUxQSEE6CisJeworCQltX2RlY19ieXRlc19wZXJfcGl4ZWwgPSAyICogKG1faWhkci5tX2JpdF9kZXB0aCAvIDgpOworCQltX2RzdF9ieXRlc19wZXJfcGl4ZWwgPSAyOworCisJCW1fc3JjX2J5dGVzX3Blcl9saW5lID0gKCh1aW50MzJfdCltX2loZHIubV93aWR0aCAqIG1fZGVjX2J5dGVzX3Blcl9waXhlbCk7CisJCW1fZHN0X2J5dGVzX3Blcl9saW5lID0gbV9paGRyLm1fd2lkdGggKiAyOworCisJCWlmIChtX2loZHIubV9iaXRfZGVwdGggPT0gOCkKKwkJCW1fcFByb2Nlc3NfZnVuYyA9IHVucGFja19ncmV5X2FscGhhXzg7CisJCWVsc2UgaWYgKG1faWhkci5tX2JpdF9kZXB0aCA9PSAxNikKKwkJCW1fcFByb2Nlc3NfZnVuYyA9IHVucGFja19ncmV5X2FscGhhXzE2OworCisJCWJyZWFrOworCX0KKwljYXNlIFBOR19DT0xPUl9UWVBFX1RSVUVDT0xPUl9BTFBIQToKKwl7CisJCW1fZGVjX2J5dGVzX3Blcl9waXhlbCA9IDQgKiAobV9paGRyLm1fYml0X2RlcHRoIC8gOCk7CisJCW1fZHN0X2J5dGVzX3Blcl9waXhlbCA9IDQ7CisKKwkJbV9zcmNfYnl0ZXNfcGVyX2xpbmUgPSAoKHVpbnQzMl90KW1faWhkci5tX3dpZHRoICogbV9kZWNfYnl0ZXNfcGVyX3BpeGVsKTsKKwkJbV9kc3RfYnl0ZXNfcGVyX2xpbmUgPSA0ICogbV9paGRyLm1fd2lkdGg7CisKKwkJaWYgKG1faWhkci5tX2JpdF9kZXB0aCA9PSA4KQorCQkJbV9wUHJvY2Vzc19mdW5jID0gdW5wYWNrX3RydWVfYWxwaGFfODsKKwkJZWxzZQorCQkJbV9wUHJvY2Vzc19mdW5jID0gdW5wYWNrX3RydWVfYWxwaGFfMTY7CisKKwkJYnJlYWs7CisJfQorCX0KKworCW1fZGVjX2J5dGVzX3Blcl9saW5lID0gbV9zcmNfYnl0ZXNfcGVyX2xpbmUgKyAxOworCisJbV9wUHJlX2xpbmVfYnVmID0gKHVpbnQ4X3QqKXBuZ19jYWxsb2MobV9zcmNfYnl0ZXNfcGVyX2xpbmUpOworCW1fcEN1cl9saW5lX2J1ZiA9ICh1aW50OF90KilwbmdfY2FsbG9jKG1fZGVjX2J5dGVzX3Blcl9saW5lKTsKKwltX3BQcm9fbGluZV9idWYgPSAodWludDhfdCopcG5nX2NhbGxvYyhtX2RzdF9ieXRlc19wZXJfbGluZSk7CisKKwlpZiAoIW1fcFByZV9saW5lX2J1ZiB8fCAhbV9wQ3VyX2xpbmVfYnVmIHx8ICFtX3BQcm9fbGluZV9idWYpCisJCXJldHVybiB0ZXJtaW5hdGUoUE5HX05PVEVOT1VHSE1FTSk7CisKKwltX2luZmxhdGVfc3JjX2J1Zl9vZnMgPSBQTkdfSU5GTEFURV9TUkNfQlVGX1NJWkU7CisKKwlpbnQgcmVzID0gbXpfaW5mbGF0ZUluaXQoJm1faW5mbGF0b3IpOworCWlmIChyZXMgIT0gMCkKKwkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfREVDRVJST1IpOworCisJaWYgKG1faWhkci5tX2lsYWNlX3R5cGUgPT0gMSkKKwl7CisJCWludCBpOworCQl1aW50MzJfdCB0b3RhbF9saW5lcywgbGluZXNfcHJvY2Vzc2VkOworCisJCW1fYWRhbTdfcGFzc19zaXplX3hbMF0gPSBhZGFtN19wYXNzX3NpemUobV9paGRyLm1fd2lkdGgsIDAsIDgpOworCQltX2FkYW03X3Bhc3Nfc2l6ZV94WzFdID0gYWRhbTdfcGFzc19zaXplKG1faWhkci5tX3dpZHRoLCA0LCA4KTsKKwkJbV9hZGFtN19wYXNzX3NpemVfeFsyXSA9IGFkYW03X3Bhc3Nfc2l6ZShtX2loZHIubV93aWR0aCwgMCwgNCk7CisJCW1fYWRhbTdfcGFzc19zaXplX3hbM10gPSBhZGFtN19wYXNzX3NpemUobV9paGRyLm1fd2lkdGgsIDIsIDQpOworCQltX2FkYW03X3Bhc3Nfc2l6ZV94WzRdID0gYWRhbTdfcGFzc19zaXplKG1faWhkci5tX3dpZHRoLCAwLCAyKTsKKwkJbV9hZGFtN19wYXNzX3NpemVfeFs1XSA9IGFkYW03X3Bhc3Nfc2l6ZShtX2loZHIubV93aWR0aCwgMSwgMik7CisJCW1fYWRhbTdfcGFzc19zaXplX3hbNl0gPSBhZGFtN19wYXNzX3NpemUobV9paGRyLm1fd2lkdGgsIDAsIDEpOworCisJCW1fYWRhbTdfcGFzc19zaXplX3lbMF0gPSBhZGFtN19wYXNzX3NpemUobV9paGRyLm1faGVpZ2h0LCAwLCA4KTsKKwkJbV9hZGFtN19wYXNzX3NpemVfeVsxXSA9IGFkYW03X3Bhc3Nfc2l6ZShtX2loZHIubV9oZWlnaHQsIDAsIDgpOworCQltX2FkYW03X3Bhc3Nfc2l6ZV95WzJdID0gYWRhbTdfcGFzc19zaXplKG1faWhkci5tX2hlaWdodCwgNCwgOCk7CisJCW1fYWRhbTdfcGFzc19zaXplX3lbM10gPSBhZGFtN19wYXNzX3NpemUobV9paGRyLm1faGVpZ2h0LCAwLCA0KTsKKwkJbV9hZGFtN19wYXNzX3NpemVfeVs0XSA9IGFkYW03X3Bhc3Nfc2l6ZShtX2loZHIubV9oZWlnaHQsIDIsIDQpOworCQltX2FkYW03X3Bhc3Nfc2l6ZV95WzVdID0gYWRhbTdfcGFzc19zaXplKG1faWhkci5tX2hlaWdodCwgMCwgMik7CisJCW1fYWRhbTdfcGFzc19zaXplX3lbNl0gPSBhZGFtN19wYXNzX3NpemUobV9paGRyLm1faGVpZ2h0LCAxLCAyKTsKKwkJCQkKKwkJbV9hZGFtN19pbWFnZV9idWYucmVzaXplKG1fZHN0X2J5dGVzX3Blcl9saW5lICogbV9paGRyLm1faGVpZ2h0KTsKKwkJCQkJCQkJCisJCW1fYWRhbTdfcGFzc19udW0gPSAtMTsKKworCQltX3Bhc3NfeV9sZWZ0ID0gMDsKKworCQl0b3RhbF9saW5lcyA9IGxpbmVzX3Byb2Nlc3NlZCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJCXRvdGFsX2xpbmVzICs9IG1fYWRhbTdfcGFzc19zaXplX3lbaV07CisKKwkJZm9yICg7IDsgKQorCQl7CisJCQl2b2lkKiBkdW1teV9wdHIgPSBudWxscHRyOworCQkJdWludDMyX3QgZHVtbXlfbGVuID0gMDsKKworCQkJc3RhdHVzID0gcG5nX2RlY29kZSgmZHVtbXlfcHRyLCAmZHVtbXlfbGVuKTsKKworCQkJaWYgKHN0YXR1cykKKwkJCXsKKwkJCQlpZiAoc3RhdHVzID09IFBOR19BTExET05FKQorCQkJCQlicmVhazsKKwkJCQllbHNlCisJCQkJeworCQkJCQl1bmluaXRpYWxpemUoKTsKKworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKwkJCX0KKworCQkJbGluZXNfcHJvY2Vzc2VkKys7CisJCX0KKworCQltX2FkYW03X2RlY29kZWRfZmxhZyA9IFRSVUU7CisJCW1fcGFzc195X2xlZnQgPSBtX2loZHIubV9oZWlnaHQ7CisJfQorCWVsc2UKKwl7CisJCW1fcGFzc194X3NpemUgPSBtX2loZHIubV93aWR0aDsKKwkJbV9wYXNzX3lfbGVmdCA9IG1faWhkci5tX2hlaWdodDsKKwl9CisJCQorCXJldHVybiAwOworfQorCit2b2lkIHBuZ19kZWNvZGVyOjpjYWxjX2dhbW1hX3RhYmxlKCkKK3sKKwlpZiAobV9nYW1hX3ZhbHVlID09IDQ1MDAwKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCW1fZ2FtbWFfdGFibGVbaV0gPSAodWludDhfdClpOworCQlyZXR1cm47CisJfQorCisJZmxvYXQgZ2FtbWEgPSAoZmxvYXQpKG1fZ2FtYV92YWx1ZSkgLyAxMDAwMDAuMGY7CisKKwlnYW1tYSA9IDEuMGYgLyAoZ2FtbWEgKiAyLjJmKTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisJeworCQlmbG9hdCB0ZW1wID0gcG93ZigoZmxvYXQpKGkpIC8gMjU1LjBmLCBnYW1tYSkgKiAyNTUuMGY7CisKKwkJaW50IGogPSAoaW50KSh0ZW1wICsgLjVmKTsKKworCQlpZiAoaiA8IDApCisJCQlqID0gMDsKKwkJZWxzZSBpZiAoaiA+IDI1NSkKKwkJCWogPSAyNTU7CisKKwkJbV9nYW1tYV90YWJsZVtpXSA9ICh1aW50OF90KWo7CisJfQorfQorCit2b2lkIHBuZ19kZWNvZGVyOjpjcmVhdGVfZ3JleV9wYWxldHRlKCkKK3sKKwlpbnQgaSwgajsKKwl1aW50OF90KiBwID0gbV9pbWdfcGFsOworCisJY29uc3QgaW50IGltZ19jb2xvcnMgPSBtaW5pbXVtKDI1NiwgMSA8PCBtX2loZHIubV9iaXRfZGVwdGgpOworCWZvciAoaSA9IDA7IGkgPCBpbWdfY29sb3JzOyBpKyspCisJeworCQlqID0gKCh1aW50MzJfdCkyNTUgKiAodWludDMyX3QpaSkgLyAoaW1nX2NvbG9ycyAtIDEpOworCisJCSpwKysgPSAodWludDhfdClqOworCQkqcCsrID0gKHVpbnQ4X3QpajsKKwkJKnArKyA9ICh1aW50OF90KWo7CisJfQorfQorCitpbnQgcG5nX2RlY29kZXI6OnJlYWRfc2lnbmF0dXJlKCkKK3sKKwlpZiAobV9wRmlsZS0+cmVhZChtX3RlbXBfYnVmLCA4KSAhPSA4KQorCQlyZXR1cm4gdGVybWluYXRlKFBOR19VTktOT1dOVFlQRSk7CisKKwlpZiAoKG1fdGVtcF9idWZbMF0gIT0gMTM3KSB8fAorCQkobV90ZW1wX2J1ZlsxXSAhPSA4MCkgfHwKKwkJKG1fdGVtcF9idWZbMl0gIT0gNzgpIHx8CisJCShtX3RlbXBfYnVmWzNdICE9IDcxKSB8fAorCQkobV90ZW1wX2J1Zls0XSAhPSAxMykgfHwKKwkJKG1fdGVtcF9idWZbNV0gIT0gMTApIHx8CisJCShtX3RlbXBfYnVmWzZdICE9IDI2KSB8fAorCQkobV90ZW1wX2J1Zls3XSAhPSAxMCkpCisJeworCQlyZXR1cm4gdGVybWluYXRlKFBOR19VTktOT1dOVFlQRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6cmVhZF9paGRyX2NodW5rKCkKK3sKKwlpbnQgcmVzID0gZmV0Y2hfbmV4dF9jaHVua19pbml0KCk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlpZiAoKG1fY2h1bmtfbmFtZVswXSAhPSAnSScpIHx8IChtX2NodW5rX25hbWVbMV0gIT0gJ0gnKSB8fCAobV9jaHVua19uYW1lWzJdICE9ICdEJykgfHwgKG1fY2h1bmtfbmFtZVszXSAhPSAnUicpIHx8IChtX2NodW5rX3NpemUgIT0gMTMpKQorCQlyZXR1cm4gdGVybWluYXRlKFBOR19OT19JSERSKTsKKworCWludDY0X3QgdjY0ID0gZmV0Y2hfbmV4dF9jaHVua19kd29yZCgpOworCWlmICh2NjQgPCAwKQorCQlyZXR1cm4gKGludCl2NjQ7CisJbV9paGRyLm1fd2lkdGggPSAodWludDMyX3QpdjY0OworCisJdjY0ID0gZmV0Y2hfbmV4dF9jaHVua19kd29yZCgpOworCWlmICh2NjQgPCAwKQorCQlyZXR1cm4gKGludCl2NjQ7CisJbV9paGRyLm1faGVpZ2h0ID0gKHVpbnQzMl90KXY2NDsKKworCWlmICgobV9paGRyLm1fd2lkdGggPT0gMCkgfHwgKG1faWhkci5tX3dpZHRoID4gTUFYX1NVUFBPUlRFRF9SRVMpKQorCQlyZXR1cm4gdGVybWluYXRlKFBOR19CQURfV0lEVEgpOworCisJaWYgKChtX2loZHIubV9oZWlnaHQgPT0gMCkgfHwgKG1faWhkci5tX2hlaWdodCA+IE1BWF9TVVBQT1JURURfUkVTKSkKKwkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfQkFEX0hFSUdIVCk7CisKKwlpbnQgdiA9IGZldGNoX25leHRfY2h1bmtfYnl0ZSgpOyAKKwlpZiAodiA8IDApIAorCQlyZXR1cm4gdjsKKwltX2loZHIubV9iaXRfZGVwdGggPSAodWludDhfdCl2OworCisJdiA9IGZldGNoX25leHRfY2h1bmtfYnl0ZSgpOyAKKwlpZiAodiA8IDApIAorCQlyZXR1cm4gdjsKKwltX2loZHIubV9jb2xvcl90eXBlID0gKHVpbnQ4X3QpdjsKKworCXYgPSBmZXRjaF9uZXh0X2NodW5rX2J5dGUoKTsKKwlpZiAodiA8IDApCisJCXJldHVybiB2OworCW1faWhkci5tX2NvbXBfdHlwZSA9ICh1aW50OF90KXY7CisKKwl2ID0gZmV0Y2hfbmV4dF9jaHVua19ieXRlKCk7CisJaWYgKHYgPCAwKQorCQlyZXR1cm4gdjsKKwltX2loZHIubV9maWx0ZXJfdHlwZSA9ICh1aW50OF90KXY7CisKKwl2ID0gZmV0Y2hfbmV4dF9jaHVua19ieXRlKCk7CisJaWYgKHYgPCAwKQorCQlyZXR1cm4gdjsKKwltX2loZHIubV9pbGFjZV90eXBlID0gKHVpbnQ4X3QpdjsKKworCWlmIChtX2loZHIubV9jb21wX3R5cGUgIT0gMCkKKwkJbV9pbWdfc3VwcG9ydGVkX2ZsYWcgPSBQTkdfVU5TX0NPTVBSRVNTSU9OOworCisJaWYgKG1faWhkci5tX2ZpbHRlcl90eXBlICE9IDApCisJCW1faW1nX3N1cHBvcnRlZF9mbGFnID0gUE5HX1VOU19GSUxURVI7CisKKwlpZiAobV9paGRyLm1faWxhY2VfdHlwZSA+IDEpCisJCW1faW1nX3N1cHBvcnRlZF9mbGFnID0gUE5HX1VOU19JTEFDRTsKKwkJCisJc3dpdGNoIChtX2loZHIubV9jb2xvcl90eXBlKQorCXsKKwljYXNlIFBOR19DT0xPUl9UWVBFX0dSRVlTQ0FMRToKKwl7CisJCXN3aXRjaCAobV9paGRyLm1fYml0X2RlcHRoKQorCQl7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgODoKKwkJY2FzZSAxNjoKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiB0ZXJtaW5hdGUoUE5HX0JBRF9CSVRfREVQVEgpOworCQl9CisKKwkJYnJlYWs7CisJfQorCWNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRUSVpFRDoKKwl7CisJCXN3aXRjaCAobV9paGRyLm1fYml0X2RlcHRoKQorCQl7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgODoKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiB0ZXJtaW5hdGUoUE5HX0JBRF9CSVRfREVQVEgpOworCQl9CisKKwkJYnJlYWs7CisJfQorCWNhc2UgUE5HX0NPTE9SX1RZUEVfVFJVRUNPTE9SOgorCWNhc2UgUE5HX0NPTE9SX1RZUEVfR1JFWVNDQUxFX0FMUEhBOgorCWNhc2UgUE5HX0NPTE9SX1RZUEVfVFJVRUNPTE9SX0FMUEhBOgorCXsKKwkJc3dpdGNoIChtX2loZHIubV9iaXRfZGVwdGgpCisJCXsKKwkJY2FzZSA4OgorCQljYXNlIDE2OgorCQl7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfQkFEX0JJVF9ERVBUSCk7CisJCX0KKworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfVU5TX0NPTE9SX1RZUEUpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcG5nX2RlY29kZXI6OnJlYWRfYmtnZF9jaHVuaygpCit7CisJbV9ia2dkX2ZsYWcgPSBUUlVFOworCisJaWYgKG1faWhkci5tX2NvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRUSVpFRCkKKwl7CisJCWludCB2ID0gZmV0Y2hfbmV4dF9jaHVua19ieXRlKCk7CisJCWlmICh2IDwgMCkKKwkJCXJldHVybiB2OworCQltX2JrZ2RfdmFsdWVbMF0gPSB2OworCX0KKwllbHNlIGlmICgobV9paGRyLm1fY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEUpIHx8IChtX2loZHIubV9jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSRVlTQ0FMRV9BTFBIQSkpCisJeworCQlpbnQgdiA9IGZldGNoX25leHRfY2h1bmtfd29yZCgpOworCQlpZiAodiA8IDApCisJCQlyZXR1cm4gdjsKKwkJbV9ia2dkX3ZhbHVlWzBdID0gdjsKKwl9CisJZWxzZSBpZiAoKG1faWhkci5tX2NvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfVFJVRUNPTE9SKSB8fCAobV9paGRyLm1fY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9UUlVFQ09MT1JfQUxQSEEpKQorCXsKKwkJaW50IHYgPSBmZXRjaF9uZXh0X2NodW5rX3dvcmQoKTsKKwkJaWYgKHYgPCAwKQorCQkJcmV0dXJuIHY7CisJCW1fYmtnZF92YWx1ZVswXSA9IHY7CisKKwkJdiA9IGZldGNoX25leHRfY2h1bmtfd29yZCgpOworCQlpZiAodiA8IDApCisJCQlyZXR1cm4gdjsKKwkJbV9ia2dkX3ZhbHVlWzFdID0gdjsKKwkJCisJCXYgPSBmZXRjaF9uZXh0X2NodW5rX3dvcmQoKTsKKwkJaWYgKHYgPCAwKQorCQkJcmV0dXJuIHY7CisJCW1fYmtnZF92YWx1ZVsyXSA9IHY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6cmVhZF9nYW1hX2NodW5rKCkKK3sKKwltX2dhbWFfZmxhZyA9IFRSVUU7CisKKwlpbnQ2NF90IHYgPSBmZXRjaF9uZXh0X2NodW5rX2R3b3JkKCk7CisJaWYgKHYgPCAwKQorCQlyZXR1cm4gKGludCl2OworCisJbV9nYW1hX3ZhbHVlID0gKHVpbnQzMl90KXY7CisJCisJcmV0dXJuIDA7Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6cmVhZF90cm5zX2NodW5rKCkKK3sKKwlpbnQgaTsKKworCW1fdHJuc19mbGFnID0gVFJVRTsKKworCWlmIChtX2loZHIubV9jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVElaRUQpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQltX3RybnNfdmFsdWVbaV0gPSAyNTU7CisKKwkJY29uc3QgdWludDMyX3QgaW1nX2NvbG9ycyA9IDEgPDwgbV9paGRyLm1fYml0X2RlcHRoOworCQlpZiAobV9jaHVua19zaXplID4gKHVpbnQzMl90KWltZ19jb2xvcnMpCisJCQlyZXR1cm4gdGVybWluYXRlKFBOR19CQURfVFJOU19DSFVOSyk7CisKKwkJZm9yIChpID0gMDsgaSA8IChpbnQpbV9jaHVua19zaXplOyBpKyspCisJCXsKKwkJCWludCB2ID0gZmV0Y2hfbmV4dF9jaHVua19ieXRlKCk7CisJCQlpZiAodiA8IDApCisJCQkJcmV0dXJuIHY7CisJCQltX3RybnNfdmFsdWVbaV0gPSB2OworCQl9CisJfQorCWVsc2UgaWYgKG1faWhkci5tX2NvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JFWVNDQUxFKQorCXsKKwkJaW50IHYgPSBmZXRjaF9uZXh0X2NodW5rX3dvcmQoKTsKKwkJaWYgKHYgPCAwKQorCQkJcmV0dXJuIHY7CisJCW1fdHJuc192YWx1ZVswXSA9IHY7CisJfQorCWVsc2UgaWYgKG1faWhkci5tX2NvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfVFJVRUNPTE9SKQorCXsKKwkJaW50IHYgPSBmZXRjaF9uZXh0X2NodW5rX3dvcmQoKTsKKwkJaWYgKHYgPCAwKQorCQkJcmV0dXJuIHY7CisJCW1fdHJuc192YWx1ZVswXSA9IHY7CisJCQorCQl2ID0gZmV0Y2hfbmV4dF9jaHVua193b3JkKCk7CisJCWlmICh2IDwgMCkKKwkJCXJldHVybiB2OworCQltX3RybnNfdmFsdWVbMV0gPSB2OworCQkKKwkJdiA9IGZldGNoX25leHRfY2h1bmtfd29yZCgpOworCQlpZiAodiA8IDApCisJCQlyZXR1cm4gdjsKKwkJbV90cm5zX3ZhbHVlWzJdID0gdjsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfQkFEX1RSTlNfQ0hVTkspOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHBuZ19kZWNvZGVyOjpyZWFkX3BsdGVfY2h1bmsoKQoreworCWludCBpLCBqOworCXVpbnQ4X3QqIHA7CisKKwlpZiAobV9wbHRlX2ZsYWcpCisJCXJldHVybiB0ZXJtaW5hdGUoUE5HX0JBRF9QTFRFX0NIVU5LKTsKKworCW1fcGx0ZV9mbGFnID0gVFJVRTsKKworCW1lbXNldChtX2ltZ19wYWwsIDAsIDc2OCk7CisKKwlpZiAobV9jaHVua19zaXplICUgMykKKwkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfQkFEX1BMVEVfQ0hVTkspOworCisJaiA9IG1fY2h1bmtfc2l6ZSAvIDM7CisKKwljb25zdCBpbnQgaW1nX2NvbG9ycyA9IG1pbmltdW0oMjU2LCAxIDw8IG1faWhkci5tX2JpdF9kZXB0aCk7CisJaWYgKGogPiBpbWdfY29sb3JzKQorCQlyZXR1cm4gdGVybWluYXRlKFBOR19CQURfUExURV9DSFVOSyk7CisKKwlpZiAoKG1faWhkci5tX2NvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JFWVNDQUxFKSB8fAorCQkobV9paGRyLm1fY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEVfQUxQSEEpKQorCQlyZXR1cm4gdGVybWluYXRlKFBOR19CQURfUExURV9DSFVOSyk7CisKKwlwID0gbV9pbWdfcGFsOworCisJZm9yIChpID0gMDsgaSA8IGo7IGkrKykKKwl7CisJCWludCB2ID0gZmV0Y2hfbmV4dF9jaHVua19ieXRlKCk7CisJCWlmICh2IDwgMCkKKwkJCXJldHVybiB2OworCQkqcCsrID0gKHVpbnQ4X3QpdjsKKwkJCisJCXYgPSBmZXRjaF9uZXh0X2NodW5rX2J5dGUoKTsKKwkJaWYgKHYgPCAwKQorCQkJcmV0dXJuIHY7CisJCSpwKysgPSAodWludDhfdCl2OworCisJCXYgPSBmZXRjaF9uZXh0X2NodW5rX2J5dGUoKTsKKwkJaWYgKHYgPCAwKQorCQkJcmV0dXJuIHY7CisJCSpwKysgPSAodWludDhfdCl2OworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworaW50IHBuZ19kZWNvZGVyOjpmaW5kX2lkYXRfY2h1bmsoKQoreworCWZvciAoOyA7ICkKKwl7CisJCWludCByZXMgPSBmZXRjaF9uZXh0X2NodW5rX2luaXQoKTsKKwkJaWYgKHJlcyA8IDApCisJCQlyZXR1cm4gcmVzOworCisJCWlmIChtX2NodW5rX25hbWVbMF0gJiAzMikgIC8qIGFuY2lsbGFyeT8gKi8KKwkJeworCQkJaWYgKChtX2NodW5rX25hbWVbMF0gPT0gJ2InKSAmJiAobV9jaHVua19uYW1lWzFdID09ICdLJykgJiYgKG1fY2h1bmtfbmFtZVsyXSA9PSAnRycpICYmIChtX2NodW5rX25hbWVbM10gPT0gJ0QnKSkKKwkJCXsKKwkJCQlyZXMgPSByZWFkX2JrZ2RfY2h1bmsoKTsKKwkJCQlpZiAocmVzIDwgMCkKKwkJCQkJcmV0dXJuIHJlczsKKwkJCX0KKwkJCWVsc2UgaWYgKChtX2NodW5rX25hbWVbMF0gPT0gJ2cnKSAmJiAobV9jaHVua19uYW1lWzFdID09ICdBJykgJiYgKG1fY2h1bmtfbmFtZVsyXSA9PSAnTScpICYmIChtX2NodW5rX25hbWVbM10gPT0gJ0EnKSkKKwkJCXsKKwkJCQlyZXMgPSByZWFkX2dhbWFfY2h1bmsoKTsKKwkJCQlpZiAocmVzIDwgMCkKKwkJCQkJcmV0dXJuIHJlczsKKwkJCX0KKwkJCWVsc2UgaWYgKChtX2NodW5rX25hbWVbMF0gPT0gJ3QnKSAmJiAobV9jaHVua19uYW1lWzFdID09ICdSJykgJiYgKG1fY2h1bmtfbmFtZVsyXSA9PSAnTicpICYmIChtX2NodW5rX25hbWVbM10gPT0gJ1MnKSkKKwkJCXsKKwkJCQlyZXMgPSByZWFkX3RybnNfY2h1bmsoKTsKKwkJCQlpZiAocmVzIDwgMCkKKwkJCQkJcmV0dXJuIHJlczsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgobV9jaHVua19uYW1lWzBdID09ICdQJykgJiYgKG1fY2h1bmtfbmFtZVsxXSA9PSAnTCcpICYmIChtX2NodW5rX25hbWVbMl0gPT0gJ1QnKSAmJiAobV9jaHVua19uYW1lWzNdID09ICdFJykpCisJCQl7CisJCQkJcmVzID0gcmVhZF9wbHRlX2NodW5rKCk7CisJCQkJaWYgKHJlcyA8IDApCisJCQkJCXJldHVybiByZXM7CisJCQl9CisJCQllbHNlIGlmICgobV9jaHVua19uYW1lWzBdID09ICdJJykgJiYgKG1fY2h1bmtfbmFtZVsxXSA9PSAnRCcpICYmIChtX2NodW5rX25hbWVbMl0gPT0gJ0EnKSAmJiAobV9jaHVua19uYW1lWzNdID09ICdUJykpCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbV9pbWdfc3VwcG9ydGVkX2ZsYWcgPSBQTkdfVU5TX0NSSVRJQ0FMX0NIVU5LOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3BuZ19kZWNvZGVyOjpwbmdfZGVjb2RlcigpCit7CisJY2xlYXIoKTsKK30KKworcG5nX2RlY29kZXI6On5wbmdfZGVjb2RlcigpCit7CisJdW5pbml0aWFsaXplKCk7Cit9CisKK3ZvaWQgcG5nX2RlY29kZXI6OmNsZWFyKCkKK3sKKwljbGVhcl9vYmoobV9wTWFsbG9jX2Jsb2Nrcyk7CisKKwltX3BGaWxlID0gbnVsbHB0cjsKKworCWNsZWFyX29iaihtX2ltZ19wYWwpOworCisJbV9pbWdfc3VwcG9ydGVkX2ZsYWcgPSBGQUxTRTsKKworCW1fYWRhbTdfaW1hZ2VfYnVmLmNsZWFyKCk7CisKKwljbGVhcl9vYmoobV9paGRyKTsKKworCW1fY2h1bmtfZmxhZyA9IEZBTFNFOworCW1fY2h1bmtfc2l6ZSA9IDA7CisJbV9jaHVua19sZWZ0ID0gMDsKKwltX2NodW5rX2NyYzMyID0gMDsKKwljbGVhcl9vYmoobV9jaHVua19uYW1lKTsKKworCW1fZW5kX29mX2lkYXRfY2h1bmtzID0gMDsKKworCW1fZGVjX2J5dGVzX3Blcl9waXhlbCA9IDA7CisJbV9kc3RfYnl0ZXNfcGVyX3BpeGVsID0gMDsKKworCW1fZGVjX2J5dGVzX3Blcl9saW5lID0gMDsKKwltX3NyY19ieXRlc19wZXJfbGluZSA9IDA7CisJbV9kc3RfYnl0ZXNfcGVyX2xpbmUgPSAwOworCisJbV9wUHJvY2Vzc19mdW5jID0gbnVsbHB0cjsKKworCW1fcFByZV9saW5lX2J1ZiA9IG51bGxwdHI7CisJbV9wQ3VyX2xpbmVfYnVmID0gbnVsbHB0cjsKKwltX3BQcm9fbGluZV9idWYgPSBudWxscHRyOworCisJbV9ia2dkX2ZsYWcgPSBGQUxTRTsKKwljbGVhcl9vYmoobV9ia2dkX3ZhbHVlKTsKKworCW1fZ2FtYV9mbGFnID0gRkFMU0U7CisJbV9nYW1hX3ZhbHVlID0gMDsKKworCW1fcGx0ZV9mbGFnID0gRkFMU0U7CisKKwltX3RybnNfZmxhZyA9IEZBTFNFOworCWNsZWFyX29iaihtX3RybnNfdmFsdWUpOworCisJY2xlYXJfb2JqKG1faW5mbGF0b3IpOworCisJbV9pbmZsYXRlX3NyY19idWZfb2ZzID0gMDsKKwltX2luZmxhdGVfc3JjX2J1Zl9zaXplID0gMDsKKwltX2luZmxhdGVfZHN0X2J1Zl9vZnMgPSAwOworCisJbV9pbmZsYXRlX2VvZl9mbGFnID0gRkFMU0U7CisJCQorCWNsZWFyX29iaihtX3RybnNfdmFsdWUpOworCisJbV9wYXNzX3hfc2l6ZSA9IDA7CisJbV9wYXNzX3lfbGVmdCA9IDA7CisKKwltX2FkYW03X3Bhc3NfbnVtID0gMDsKKwltX2FkYW03X3Bhc3NfeSA9IDA7CisJY2xlYXJfb2JqKG1fYWRhbTdfcGFzc19zaXplX3gpOworCWNsZWFyX29iaihtX2FkYW03X3Bhc3Nfc2l6ZV95KTsKKwkJCisJbV9hZGFtN19kZWNvZGVkX2ZsYWcgPSBGQUxTRTsKKwkKKwltX3NjYW5uZWRfZmxhZyA9IGZhbHNlOworCQkJCQorCW1fdGVybWluYXRlX3N0YXR1cyA9IDA7Cit9CisKK2ludCBwbmdfZGVjb2Rlcjo6cG5nX3NjYW4ocG5nX2ZpbGUgKnBGaWxlKQoreworCW1fcEZpbGUgPSBwRmlsZTsKKwkJCisJbV9pbWdfc3VwcG9ydGVkX2ZsYWcgPSBUUlVFOworCW1fdGVybWluYXRlX3N0YXR1cyA9IDA7CisKKwlpbnQgcmVzID0gcmVhZF9zaWduYXR1cmUoKTsKKwlpZiAocmVzICE9IDApCisJCXJldHVybiByZXM7CisKKwlyZXMgPSByZWFkX2loZHJfY2h1bmsoKTsKKwlpZiAocmVzICE9IDApCisJCXJldHVybiByZXM7CisJCQorCXJlcyA9IGZpbmRfaWRhdF9jaHVuaygpOworCWlmIChyZXMgIT0gMCkKKwkJcmV0dXJuIHJlczsKKwkJCQkKKwlpZiAobV9nYW1hX2ZsYWcpCisJCWNhbGNfZ2FtbWFfdGFibGUoKTsKKworCWlmIChtX2loZHIubV9jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVElaRUQpCisJeworCQlpZiAoIW1fcGx0ZV9mbGFnKQorCQkJcmV0dXJuIHRlcm1pbmF0ZShQTkdfTUlTU0lOR19QQUxFVFRFKTsKKwl9CisJZWxzZSBpZiAoKG1faWhkci5tX2NvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JFWVNDQUxFKSB8fCAobV9paGRyLm1fY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEVfQUxQSEEpKQorCXsKKwkJY3JlYXRlX2dyZXlfcGFsZXR0ZSgpOworCX0KKworCW1fc2Nhbm5lZF9mbGFnID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZ2V0XzcwOV9sdW1hKHVpbnQzMl90IHIsIHVpbnQzMl90IGcsIHVpbnQzMl90IGIpCit7IAorCXJldHVybiAodWludDhfdCkoKDEzOTM4VSAqIHIgKyA0Njg2OVUgKiBnICsgNDcyOVUgKiBiICsgMzI3NjhVKSA+PiAxNlUpOworfQorCitib29sIGdldF9wbmdfaW5mbyhjb25zdCB2b2lkKiBwSW1hZ2VfYnVmLCBzaXplX3QgYnVmX3NpemUsIHBuZ19pbmZvICZpbmZvKQoreworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJCisJaWYgKCghcEltYWdlX2J1ZikgfHwgKGJ1Zl9zaXplIDwgTUlOX1BOR19TSVpFKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcG5nX3JlYWRvbmx5X21lbW9yeV9maWxlIG1mOworCW1mLmluaXQocEltYWdlX2J1ZiwgYnVmX3NpemUpOworCisJcG5nX2RlY29kZXIgZGVjOworCisJaW50IHN0YXR1cyA9IGRlYy5wbmdfc2NhbigmbWYpOworCWlmICgoc3RhdHVzICE9IDApIHx8IChkZWMubV9pbWdfc3VwcG9ydGVkX2ZsYWcgIT0gVFJVRSkpCisJCXJldHVybiBmYWxzZTsKKworCWluZm8ubV93aWR0aCA9IGRlYy5tX2loZHIubV93aWR0aDsKKwlpbmZvLm1faGVpZ2h0ID0gZGVjLm1faWhkci5tX2hlaWdodDsKKwlpbmZvLm1fYml0X2RlcHRoID0gZGVjLm1faWhkci5tX2JpdF9kZXB0aDsKKwlpbmZvLm1fY29sb3JfdHlwZSA9IGRlYy5tX2loZHIubV9jb2xvcl90eXBlOworCWluZm8ubV9oYXNfZ2FtbWEgPSBkZWMubV9nYW1hX2ZsYWcgIT0gMDsKKwlpbmZvLm1fZ2FtbWFfdmFsdWUgPSBkZWMubV9nYW1hX3ZhbHVlOworCWluZm8ubV9oYXNfdHJucyA9IGRlYy5tX3RybnNfZmxhZyAhPSAwOworCisJc3dpdGNoIChkZWMubV9paGRyLm1fY29sb3JfdHlwZSkKKwl7CisJY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEU6CisJCWluZm8ubV9udW1fY2hhbnMgPSBkZWMubV90cm5zX2ZsYWcgPyAyIDogMTsKKwkJYnJlYWs7CisJY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEVfQUxQSEE6CisJCWluZm8ubV9udW1fY2hhbnMgPSAyOworCQlicmVhazsKKwljYXNlIFBOR19DT0xPUl9UWVBFX1BBTEVUVElaRUQ6CisJY2FzZSBQTkdfQ09MT1JfVFlQRV9UUlVFQ09MT1I6CisJCWluZm8ubV9udW1fY2hhbnMgPSBkZWMubV90cm5zX2ZsYWcgPyA0IDogMzsKKwkJYnJlYWs7CisJY2FzZSBQTkdfQ09MT1JfVFlQRV9UUlVFQ09MT1JfQUxQSEE6CisJCWluZm8ubV9udW1fY2hhbnMgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhc3NlcnQoMCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB0cnVlOworfQorCit2b2lkKiBsb2FkX3BuZyhjb25zdCB2b2lkKiBwSW1hZ2VfYnVmLCBzaXplX3QgYnVmX3NpemUsIHVpbnQzMl90IGRlc2lyZWRfY2hhbnMsIHVpbnQzMl90JiB3aWR0aCwgdWludDMyX3QmIGhlaWdodCwgdWludDMyX3QmIG51bV9jaGFucykKK3sKKwl3aWR0aCA9IDA7CisJaGVpZ2h0ID0gMDsKKwludW1fY2hhbnMgPSAwOworCQkKKwlpZiAoKCFwSW1hZ2VfYnVmKSB8fCAoYnVmX3NpemUgPCBNSU5fUE5HX1NJWkUpKQorCXsKKwkJYXNzZXJ0KDApOworCQlyZXR1cm4gbnVsbHB0cjsKKwl9CisKKwlpZiAoZGVzaXJlZF9jaGFucyA+IDQpCisJeworCQlhc3NlcnQoMCk7CisJCXJldHVybiBudWxscHRyOworCX0KKworCXBuZ19yZWFkb25seV9tZW1vcnlfZmlsZSBtZjsKKwltZi5pbml0KHBJbWFnZV9idWYsIGJ1Zl9zaXplKTsKKworCXBuZ19kZWNvZGVyIGRlYzsKKwkJCisJaW50IHN0YXR1cyA9IGRlYy5wbmdfc2NhbigmbWYpOworCWlmICgoc3RhdHVzICE9IDApIHx8IChkZWMubV9pbWdfc3VwcG9ydGVkX2ZsYWcgIT0gVFJVRSkpCisJCXJldHVybiBudWxscHRyOworCisJdWludDMyX3QgY29sb3J0eXBlID0gZGVjLm1faWhkci5tX2NvbG9yX3R5cGU7CisJc3dpdGNoIChjb2xvcnR5cGUpCisJeworCWNhc2UgUE5HX0NPTE9SX1RZUEVfR1JFWVNDQUxFOgorCQludW1fY2hhbnMgPSBkZWMubV90cm5zX2ZsYWcgPyAyIDogMTsKKwkJYnJlYWs7CisJY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEVfQUxQSEE6CisJCW51bV9jaGFucyA9IDI7CisJCWJyZWFrOworCWNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRUSVpFRDoKKwljYXNlIFBOR19DT0xPUl9UWVBFX1RSVUVDT0xPUjoKKwkJbnVtX2NoYW5zID0gZGVjLm1fdHJuc19mbGFnID8gNCA6IDM7CisJCWJyZWFrOworCWNhc2UgUE5HX0NPTE9SX1RZUEVfVFJVRUNPTE9SX0FMUEhBOgorCQludW1fY2hhbnMgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhc3NlcnQoMCk7CisJCWJyZWFrOworCX0KKworCWlmICghZGVzaXJlZF9jaGFucykKKwkJZGVzaXJlZF9jaGFucyA9IG51bV9jaGFuczsKKworI2lmIDAKKwlwcmludGYoImxvZGVfcG5nOiAldXgldSBiaXRkZXB0aDogJXUgY29sb3J0eXBlOiAldSB0cm5zOiAldSBpbGFjZTogJXVcbiIsCisJCWRlYy5tX2loZHIubV93aWR0aCwKKwkJZGVjLm1faWhkci5tX2hlaWdodCwKKwkJZGVjLm1faWhkci5tX2JpdF9kZXB0aCwKKwkJZGVjLm1faWhkci5tX2NvbG9yX3R5cGUsCisJCWRlYy5tX3RybnNfZmxhZywKKwkJZGVjLm1faWhkci5tX2lsYWNlX3R5cGUpOworI2VuZGlmCisKKwl3aWR0aCA9IGRlYy5tX2loZHIubV93aWR0aDsKKwloZWlnaHQgPSBkZWMubV9paGRyLm1faGVpZ2h0OworCXVpbnQzMl90IGJpdGRlcHRoID0gZGVjLm1faWhkci5tX2JpdF9kZXB0aDsKKwl1aW50MzJfdCBwaXRjaCA9IHdpZHRoICogZGVzaXJlZF9jaGFuczsKKworCXVpbnQ2NF90IHRvdGFsX3NpemUgPSAodWludDY0X3QpcGl0Y2ggKiBoZWlnaHQ7CisJaWYgKHRvdGFsX3NpemUgPiAweDdGRkZGRkZGVUxMKQorCQlyZXR1cm4gbnVsbHB0cjsKKwkKKwl1aW50OF90KiBwQnVmID0gKHVpbnQ4X3QqKW1hbGxvYygoc2l6ZV90KXRvdGFsX3NpemUpOworCWlmICghcEJ1ZikKKwkJcmV0dXJuIG51bGxwdHI7CisJCisJaWYgKGRlYy5wbmdfZGVjb2RlX3N0YXJ0KCkgIT0gMCkKKwl7CisJCWZyZWUocEJ1Zik7CisJCXJldHVybiBudWxscHRyOworCX0KKworCXVpbnQ4X3QqIHBEc3QgPSBwQnVmOworCisJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrLCBwRHN0ICs9IHBpdGNoKQorCXsKKwkJdWludDhfdCogcExpbmU7CisJCXVpbnQzMl90IGxpbmVfYnl0ZXM7CisJCWlmIChkZWMucG5nX2RlY29kZSgodm9pZCoqKSZwTGluZSwgJmxpbmVfYnl0ZXMpICE9IDApCisJCXsKKwkJCWZyZWUocEJ1Zik7CisJCQlyZXR1cm4gbnVsbHB0cjsKKwkJfQorCisJCS8vIFRoaXMgY29udmVyc2lvbiBtYXRyaXggaGFuZGxlcyBjb252ZXJ0aW5nIFJHQi0+THVtYSwgY29udmVydGluZyBncmF5c2NhbGUgc2FtcGxlcyB0byA4LWJpdCBzYW1wbGVzLCBjb252ZXJ0aW5nIHBhbGV0dGl6ZWQgaW1hZ2VzLCBhbmQgUE5HIHRyYW5zcGFyZW5jeS4KKwkJc3dpdGNoIChjb2xvcnR5cGUpCisJCXsKKwkJY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEU6CisJCXsKKwkJCXVpbnQzMl90IHRyYW5zX3ZhbHVlID0gZGVjLm1fdHJuc192YWx1ZVswXTsKKworCQkJc3dpdGNoIChkZXNpcmVkX2NoYW5zKQorCQkJeworCQkJY2FzZSAxOgorCQkJCWlmIChiaXRkZXB0aCA9PSAxNikKKwkJCQl7CisJCQkJCWFzc2VydChsaW5lX2J5dGVzID09IHdpZHRoICogMik7CisKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCQlwRHN0W2ldID0gZGVjLm1faW1nX3BhbFtwTGluZVtpICogMiArIDBdICogM107CisJCQkJfQorCQkJCWVsc2UgaWYgKGJpdGRlcHRoID09IDgpCisJCQkJeworCQkJCQlhc3NlcnQobGluZV9ieXRlcyA9PSB3aWR0aCk7CisJCQkJCW1lbWNweShwRHN0LCBwTGluZSwgcGl0Y2gpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhc3NlcnQobGluZV9ieXRlcyA9PSB3aWR0aCk7CisJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCQkJCQkJcERzdFtpXSA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaV0gKiAzXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJaWYgKGJpdGRlcHRoID09IDE2KQorCQkJCXsKKwkJCQkJYXNzZXJ0KGxpbmVfYnl0ZXMgPT0gd2lkdGggKiAyKTsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCXsKKwkJCQkJCXBEc3RbaSAqIDIgKyAwXSA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaSAqIDIgKyAwXSAqIDNdOworCQkJCQkJcERzdFtpICogMiArIDFdID0gcExpbmVbaSAqIDIgKyAxXTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChkZWMubV90cm5zX2ZsYWcpCisJCQkJeworCQkJCQlhc3NlcnQobGluZV9ieXRlcyA9PSB3aWR0aCk7CisJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCQkJCQl7CisJCQkJCQlwRHN0W2kgKiAyICsgMF0gPSBkZWMubV9pbWdfcGFsW3BMaW5lW2ldICogM107CisJCQkJCQlwRHN0W2kgKiAyICsgMV0gPSAocExpbmVbaV0gPT0gdHJhbnNfdmFsdWUpID8gMCA6IDI1NTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhc3NlcnQobGluZV9ieXRlcyA9PSB3aWR0aCk7CisJCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCQkJCQl7CisJCQkJCQlwRHN0W2kgKiAyICsgMF0gPSBkZWMubV9pbWdfcGFsW3BMaW5lW2ldICogM107CisJCQkJCQlwRHN0W2kgKiAyICsgMV0gPSAyNTU7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJaWYgKGJpdGRlcHRoID09IDE2KQorCQkJCXsKKwkJCQkJYXNzZXJ0KGxpbmVfYnl0ZXMgPT0gd2lkdGggKiAyKTsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCXsKKwkJCQkJCXVpbnQ4X3QgYyA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaSAqIDIgKyAwXSAqIDNdOworCQkJCQkJcERzdFtpICogMyArIDBdID0gYzsKKwkJCQkJCXBEc3RbaSAqIDMgKyAxXSA9IGM7CisJCQkJCQlwRHN0W2kgKiAzICsgMl0gPSBjOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWFzc2VydChsaW5lX2J5dGVzID09IHdpZHRoKTsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCXsKKwkJCQkJCXVpbnQ4X3QgYyA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaV0gKiAzXTsKKwkJCQkJCXBEc3RbaSAqIDMgKyAwXSA9IGM7CisJCQkJCQlwRHN0W2kgKiAzICsgMV0gPSBjOworCQkJCQkJcERzdFtpICogMyArIDJdID0gYzsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlpZiAoYml0ZGVwdGggPT0gMTYpCisJCQkJeworCQkJCQlhc3NlcnQobGluZV9ieXRlcyA9PSB3aWR0aCAqIDIpOworCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCQkJeworCQkJCQkJdWludDhfdCBjID0gZGVjLm1faW1nX3BhbFtwTGluZVtpICogMiArIDBdICogM107CisJCQkJCQlwRHN0W2kgKiA0ICsgMF0gPSBjOworCQkJCQkJcERzdFtpICogNCArIDFdID0gYzsKKwkJCQkJCXBEc3RbaSAqIDQgKyAyXSA9IGM7CisJCQkJCQlwRHN0W2kgKiA0ICsgM10gPSBwTGluZVtpICogMiArIDFdOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKGRlYy5tX3RybnNfZmxhZykKKwkJCQl7CisJCQkJCWFzc2VydChsaW5lX2J5dGVzID09IHdpZHRoKTsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCXsKKwkJCQkJCXVpbnQ4X3QgYyA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaV0gKiAzXTsKKwkJCQkJCXBEc3RbaSAqIDQgKyAwXSA9IGM7CisJCQkJCQlwRHN0W2kgKiA0ICsgMV0gPSBjOworCQkJCQkJcERzdFtpICogNCArIDJdID0gYzsKKwkJCQkJCXBEc3RbaSAqIDQgKyAzXSA9IChwTGluZVtpXSA9PSB0cmFuc192YWx1ZSkgPyAwIDogMjU1OworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWFzc2VydChsaW5lX2J5dGVzID09IHdpZHRoKTsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCXsKKwkJCQkJCXVpbnQ4X3QgYyA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaV0gKiAzXTsKKwkJCQkJCXBEc3RbaSAqIDQgKyAwXSA9IGM7CisJCQkJCQlwRHN0W2kgKiA0ICsgMV0gPSBjOworCQkJCQkJcERzdFtpICogNCArIDJdID0gYzsKKwkJCQkJCXBEc3RbaSAqIDQgKyAzXSA9IDI1NTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEVfQUxQSEE6CisJCXsKKwkJCWFzc2VydChsaW5lX2J5dGVzID09IHdpZHRoICogMik7CisKKwkJCXN3aXRjaCAoZGVzaXJlZF9jaGFucykKKwkJCXsKKwkJCWNhc2UgMToKKwkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCQkJcERzdFtpXSA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaSAqIDIgKyAwXSAqIDNdOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWFzc2VydChsaW5lX2J5dGVzID09IHBpdGNoKTsKKwkJCQlpZiAoYml0ZGVwdGggPj0gOCkKKwkJCQkJbWVtY3B5KHBEc3QsIHBMaW5lLCBwaXRjaCk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCXsKKwkJCQkJCXBEc3RbaSAqIDIgKyAwXSA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaSAqIDIgKyAwXSAqIDNdOworCQkJCQkJcERzdFtpICogMiArIDFdID0gcExpbmVbaSAqIDIgKyAxXTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCQl7CisJCQkJCXVpbnQ4X3QgYyA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaSAqIDIgKyAwXSAqIDNdOworCQkJCQlwRHN0W2kgKiAzICsgMF0gPSBjOworCQkJCQlwRHN0W2kgKiAzICsgMV0gPSBjOworCQkJCQlwRHN0W2kgKiAzICsgMl0gPSBjOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCQl7CisJCQkJCXVpbnQ4X3QgYyA9IGRlYy5tX2ltZ19wYWxbcExpbmVbaSAqIDIgKyAwXSAqIDNdOworCQkJCQlwRHN0W2kgKiA0ICsgMF0gPSBjOworCQkJCQlwRHN0W2kgKiA0ICsgMV0gPSBjOworCQkJCQlwRHN0W2kgKiA0ICsgMl0gPSBjOworCQkJCQlwRHN0W2kgKiA0ICsgM10gPSBwTGluZVtpICogMiArIDFdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRJWkVEOgorCQl7CisJCQlhc3NlcnQobGluZV9ieXRlcyA9PSB3aWR0aCk7CisKKwkJCXN3aXRjaCAoZGVzaXJlZF9jaGFucykKKwkJCXsKKwkJCWNhc2UgMToKKwkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCQl7CisJCQkJCWNvbnN0IHVpbnQ4X3QqIHAgPSAmZGVjLm1faW1nX3BhbFtwTGluZVtpXSAqIDNdOworCQkJCQlwRHN0W2ldID0gZ2V0XzcwOV9sdW1hKHBbMF0sIHBbMV0sIHBbMl0pOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpZiAoZGVjLm1fdHJuc19mbGFnKQorCQkJCXsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCXsKKwkJCQkJCWNvbnN0IHVpbnQ4X3QqIHAgPSAmZGVjLm1faW1nX3BhbFtwTGluZVtpXSAqIDNdOworCQkJCQkJcERzdFtpICogMiArIDBdID0gZ2V0XzcwOV9sdW1hKHBbMF0sIHBbMV0sIHBbMl0pOworCQkJCQkJcERzdFtpICogMiArIDFdID0gKHVpbnQ4X3QpZGVjLm1fdHJuc192YWx1ZVtwTGluZVtpXV07CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJCXsKKwkJCQkJCWNvbnN0IHVpbnQ4X3QqIHAgPSAmZGVjLm1faW1nX3BhbFtwTGluZVtpXSAqIDNdOworCQkJCQkJcERzdFtpICogMiArIDBdID0gZ2V0XzcwOV9sdW1hKHBbMF0sIHBbMV0sIHBbMl0pOworCQkJCQkJcERzdFtpICogMiArIDFdID0gMjU1OworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCQkJCXsKKwkJCQkJY29uc3QgdWludDhfdCogcCA9ICZkZWMubV9pbWdfcGFsW3BMaW5lW2ldICogM107CisJCQkJCXBEc3RbaSAqIDMgKyAwXSA9IHBbMF07CisJCQkJCXBEc3RbaSAqIDMgKyAxXSA9IHBbMV07CisJCQkJCXBEc3RbaSAqIDMgKyAyXSA9IHBbMl07CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWlmIChkZWMubV90cm5zX2ZsYWcpCisJCQkJeworCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCQkJeworCQkJCQkJY29uc3QgdWludDhfdCogcCA9ICZkZWMubV9pbWdfcGFsW3BMaW5lW2ldICogM107CisJCQkJCQlwRHN0W2kgKiA0ICsgMF0gPSBwWzBdOworCQkJCQkJcERzdFtpICogNCArIDFdID0gcFsxXTsKKwkJCQkJCXBEc3RbaSAqIDQgKyAyXSA9IHBbMl07CisJCQkJCQlwRHN0W2kgKiA0ICsgM10gPSAodWludDhfdClkZWMubV90cm5zX3ZhbHVlW3BMaW5lW2ldXTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCQkJeworCQkJCQkJY29uc3QgdWludDhfdCogcCA9ICZkZWMubV9pbWdfcGFsW3BMaW5lW2ldICogM107CisJCQkJCQlwRHN0W2kgKiA0ICsgMF0gPSBwWzBdOworCQkJCQkJcERzdFtpICogNCArIDFdID0gcFsxXTsKKwkJCQkJCXBEc3RbaSAqIDQgKyAyXSA9IHBbMl07CisJCQkJCQlwRHN0W2kgKiA0ICsgM10gPSAyNTU7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUE5HX0NPTE9SX1RZUEVfVFJVRUNPTE9SOgorCQljYXNlIFBOR19DT0xPUl9UWVBFX1RSVUVDT0xPUl9BTFBIQToKKwkJeworCQkJYXNzZXJ0KGxpbmVfYnl0ZXMgPT0gd2lkdGggKiA0KTsKKworCQkJc3dpdGNoIChkZXNpcmVkX2NoYW5zKQorCQkJeworCQkJY2FzZSAxOgorCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCQkJCXsKKwkJCQkJY29uc3QgdWludDhfdCogcCA9ICZwTGluZVtpICogNF07CisJCQkJCXBEc3RbaV0gPSBnZXRfNzA5X2x1bWEocFswXSwgcFsxXSwgcFsyXSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCQkJCXsKKwkJCQkJY29uc3QgdWludDhfdCogcCA9ICZwTGluZVtpICogNF07CisJCQkJCXBEc3RbaSAqIDIgKyAwXSA9IGdldF83MDlfbHVtYShwWzBdLCBwWzFdLCBwWzJdKTsKKwkJCQkJcERzdFtpICogMiArIDFdID0gcFszXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQkJeworCQkJCQljb25zdCB1aW50OF90KiBwID0gJnBMaW5lW2kgKiA0XTsKKwkJCQkJcERzdFtpICogMyArIDBdID0gcFswXTsKKwkJCQkJcERzdFtpICogMyArIDFdID0gcFsxXTsKKwkJCQkJcERzdFtpICogMyArIDJdID0gcFsyXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJbWVtY3B5KHBEc3QsIHBMaW5lLCBwaXRjaCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlhc3NlcnQoMCk7CisJCQlicmVhazsKKwkJfQorCisJfSAvLyB5CisKKwlyZXR1cm4gcEJ1ZjsKK30KKworfSAvLyBuYW1lc3BhY2UgcHZfcG5nCisKKy8qCisJVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKworCUFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvcgorCWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZAorCWJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55CisJbWVhbnMuCisKKwlJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnMKKwlvZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKwlzb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0CisJb2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kCisJc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2YKKwlyZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXMKKwlzb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LgorCisJVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisJRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisJTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorCUlOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisJT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisJQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisJT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPgorCisJUmljaGFyZCBHZWxkcmVpY2gsIEpyLgorCTEvMjAvMjAyMgorKi8KZGlmZiAtLWdpdCBhL2VuY29kZXIvcHZwbmdyZWFkZXIuaCBiL2VuY29kZXIvcHZwbmdyZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNmZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZW5jb2Rlci9wdnBuZ3JlYWRlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIHBuZ3JlYWRlci5oIC0gUHVibGljIERvbWFpbiAtIHNlZSB1bmxpY2Vuc2UgYXQgYm90dG9tIG9mIHB2cG5ncmVhZGVyLmNwcAorI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBwdl9wbmcKK3sKKwkvLyBQTkcgY29sb3IgdHlwZXMKKwllbnVtCisJeworCQlQTkdfQ09MT1JfVFlQRV9HUkVZU0NBTEUgPSAwLAorCQlQTkdfQ09MT1JfVFlQRV9UUlVFQ09MT1IgPSAyLAorCQlQTkdfQ09MT1JfVFlQRV9QQUxFVFRJWkVEID0gMywKKwkJUE5HX0NPTE9SX1RZUEVfR1JFWVNDQUxFX0FMUEhBID0gNCwKKwkJUE5HX0NPTE9SX1RZUEVfVFJVRUNPTE9SX0FMUEhBID0gNgorCX07CisKKwkvLyBQTkcgZmlsZSBkZXNjcmlwdGlvbgorCXN0cnVjdCBwbmdfaW5mbworCXsKKwkJdWludDMyX3QgbV93aWR0aDsKKwkJdWludDMyX3QgbV9oZWlnaHQ7CisJCQkJCisJCXVpbnQzMl90IG1fbnVtX2NoYW5zOwkvLyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzLCBmYWN0b3JpbmcgaW4gdHJhbnNwYXJlbmN5LiBSYW5nZXMgZnJvbSBbMS00XS4KKworCQl1aW50MzJfdCBtX2JpdF9kZXB0aDsJLy8gUE5HIGloZHIgYml0IGRlcHRoOiAxLCAyLCA0LCA4IG9yIDE2CisJCXVpbnQzMl90IG1fY29sb3JfdHlwZTsJLy8gUE5HIGloZHIgY29sb3IgdHlwZSwgUE5HX0NPTE9SX1RZUEVfR1JBWVNDQUxFIGV0Yy4KKworCQlib29sIG1faGFzX2dhbW1hOwkJLy8gdHJ1ZSBpZiB0aGUgUE5HIGZpbGUgaGFkIGEgR0FNQSBjaHVuaworCQl1aW50MzJfdCBtX2dhbW1hX3ZhbHVlOyAvLyBQTkcgR0FNQSBjaHVuayB2YWx1ZSwgc2NhbGVkIGJ5IDEwMDAwMAorCisJCWJvb2wgbV9oYXNfdHJuczsJCS8vIHRydWUgaWYgdGhlIFBORyBmaWxlIHVzZWQgY29sb3JrZXkgdHJhbnNwYXJlbmN5CisJfTsKKworCS8vIFJldHJpZXZlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgUE5HIGZpbGUuCisJLy8gUmV0dXJucyBmYWxzZSBvbiBhbnkgZXJyb3JzLgorCWJvb2wgZ2V0X3BuZ19pbmZvKGNvbnN0IHZvaWQqIHBJbWFnZV9idWYsIHNpemVfdCBidWZfc2l6ZSwgcG5nX2luZm8mIGluZm8pOworCisJLy8gSW5wdXQgcGFyYW1ldGVyczoKKwkvLyBwSW1hZ2VfYnVmLCBidWZfc2l6ZSAtIHBvaW50ZXIgdG8gUE5HIGltYWdlIGRhdGEKKwkvLyBkZXNpcmVkX2NoYW5zIC0gZGVzaXJlZCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiAwPWF1dG8sIDE9Z3JheXNjYWxlLCAyPWdyYXlzY2FsZSBhbHBoYSwgMz0yNGJwcCBSR0IsIDQ9MzJicHAgUkdCQQorCS8vCisJLy8gT3V0cHV0IHBhcmFtZXRlcnM6CisJLy8gd2lkdGgsIGhlaWdodCAtIFBORyBpbWFnZSByZXNvbHV0aW9uCisJLy8gbnVtX2NoYW5zIC0gYWN0dWFsIG51bWJlciBvZiBjaGFubmVscyBpbiBQTkcsIGZyb20gWzEsNF0gKGZhY3RvcmluZyBpbiB0cmFuc3BhcmVuY3kpCisJLy8KKwkvLyBSZXR1cm5zIG51bGxwdHIgb24gYW55IGVycm9ycy4KKwl2b2lkKiBsb2FkX3BuZyhjb25zdCB2b2lkKiBwSW1hZ2VfYnVmLCBzaXplX3QgYnVmX3NpemUsIHVpbnQzMl90IGRlc2lyZWRfY2hhbnMsIHVpbnQzMl90ICZ3aWR0aCwgdWludDMyX3QgJmhlaWdodCwgdWludDMyX3QmIG51bV9jaGFucyk7Cit9CmRpZmYgLS1naXQgYS9mb3JtYXQuc2ggYi9mb3JtYXQuc2gKaW5kZXggNWQ5MDM5My4uNTc2MGFlYyAxMDA3NTUKLS0tIGEvZm9ybWF0LnNoCisrKyBiL2Zvcm1hdC5zaApAQCAtMTQsNiArMTQsOCBAQAogICAgICAgICBjb250aW51ZQogICAgIGVsaWYgW1sgJGYgPT0gKiJtaW4uanMiIF1dOyB0aGVuCiAgICAgICAgIGNvbnRpbnVlCisgICAgZWxpZiBbWyAkZiA9PSAqImNvZGVyLmpzIiBdXTsgdGhlbgorICAgICAgICBjb250aW51ZQogICAgIGZpCiAgICAgIyBFbnN1cmVzIHRoYXQgZmlsZXMgYXJlIFVURi04IGZvcm1hdHRlZC4KICAgICByZWNvZGUgVVRGLTggJGYgMj4gL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2FscGhhMC5wbmcgYi90ZXN0X2ZpbGVzL2FscGhhMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMmZiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RfZmlsZXMvYWxwaGEwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2JsYWNrXzF4MS5wbmcgYi90ZXN0X2ZpbGVzL2JsYWNrXzF4MS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MzViYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RfZmlsZXMvYmxhY2tfMXgxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDEucG5nIGIvdGVzdF9maWxlcy9rb2RpbTAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMxN2YwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTAxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDIucG5nIGIvdGVzdF9maWxlcy9rb2RpbTAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM3MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTAyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDMucG5nIGIvdGVzdF9maWxlcy9rb2RpbTAzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTdlOGJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTAzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDQucG5nIGIvdGVzdF9maWxlcy9rb2RpbTA0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA5OTFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTA0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDUucG5nIGIvdGVzdF9maWxlcy9rb2RpbTA1LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDBlNGNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTA1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDYucG5nIGIvdGVzdF9maWxlcy9rb2RpbTA2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDlkMWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTA2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDcucG5nIGIvdGVzdF9maWxlcy9rb2RpbTA3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQzNzRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTA3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDgucG5nIGIvdGVzdF9maWxlcy9rb2RpbTA4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjI4ODAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTA4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMDkucG5nIGIvdGVzdF9maWxlcy9rb2RpbTA5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ3MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTA5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTAucG5nIGIvdGVzdF9maWxlcy9rb2RpbTEwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTRiMThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTEwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTEucG5nIGIvdGVzdF9maWxlcy9rb2RpbTExLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzY2NTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTExLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTIucG5nIGIvdGVzdF9maWxlcy9rb2RpbTEyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWRiMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTEyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTMucG5nIGIvdGVzdF9maWxlcy9rb2RpbTEzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzVjOWQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTEzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTQucG5nIGIvdGVzdF9maWxlcy9rb2RpbTE0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2IzMjgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTE0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTUucG5nIGIvdGVzdF9maWxlcy9rb2RpbTE1LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzVlYWNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTE1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTYucG5nIGIvdGVzdF9maWxlcy9rb2RpbTE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGIwZDBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTcucG5nIGIvdGVzdF9maWxlcy9rb2RpbTE3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ1ODNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTE3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTgucG5nIGIvdGVzdF9maWxlcy9rb2RpbTE4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODA5N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTE4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMTkucG5nIGIvdGVzdF9maWxlcy9rb2RpbTE5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzU5YTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTE5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMjAucG5nIGIvdGVzdF9maWxlcy9rb2RpbTIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmUyODM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTIwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMjEucG5nIGIvdGVzdF9maWxlcy9rb2RpbTIxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q0YzNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTIxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMjIucG5nIGIvdGVzdF9maWxlcy9rb2RpbTIyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmJjZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTIyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMjMucG5nIGIvdGVzdF9maWxlcy9rb2RpbTIzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjIyZTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTIzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL2tvZGltMjQucG5nIGIvdGVzdF9maWxlcy9rb2RpbTI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWJkNjRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdF9maWxlcy9rb2RpbTI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL3doaXRlXzF4MS5wbmcgYi90ZXN0X2ZpbGVzL3doaXRlXzF4MS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiY2E5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RfZmlsZXMvd2hpdGVfMXgxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0X2ZpbGVzL3dpa2lwZWRpYS5wbmcgYi90ZXN0X2ZpbGVzL3dpa2lwZWRpYS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5MGZjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RfZmlsZXMvd2lraXBlZGlhLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cmFuc2NvZGVyL2Jhc2lzdS5oIGIvdHJhbnNjb2Rlci9iYXNpc3UuaAppbmRleCBmMzNiYWY2Li4xMjMwYjU5IDEwMDY0NAotLS0gYS90cmFuc2NvZGVyL2Jhc2lzdS5oCisrKyBiL3RyYW5zY29kZXIvYmFzaXN1LmgKQEAgLTIxLDYgKzIxLDExIEBACiAJI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDEyNykgLy8gd2FybmluZyBDNDEyNzogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAogCSNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ1MzApIC8vIEMrKyBleGNlcHRpb24gaGFuZGxlciB1c2VkLCBidXQgdW53aW5kIHNlbWFudGljcyBhcmUgbm90IGVuYWJsZWQuCiAKKwkvLyBTbGFtbWluZyB0aGlzIG9mZiBhbHdheXMgZm9yIHYxLjE2IGJlY2F1c2Ugd2UndmUgZ290dGVuIHJpZCBvZiBtb3N0IHN0ZCBjb250YWluZXJzLgorCSNpZm5kZWYgQkFTSVNVX05PX0lURVJBVE9SX0RFQlVHX0xFVkVMCisJCSNkZWZpbmUgQkFTSVNVX05PX0lURVJBVE9SX0RFQlVHX0xFVkVMICgxKQorCSNlbmRpZgorCiAJI2lmbmRlZiBCQVNJU1VfTk9fSVRFUkFUT1JfREVCVUdfTEVWRUwKIAkJLy8jZGVmaW5lIF9IQVNfSVRFUkFUT1JfREVCVUdHSU5HIDAKIApAQCAtMTY1LDYgKzE3MCwxMCBAQAogCXsgCiAJCWlmIChuKQogCQl7CisJCQlpZiAodmVjLnNpemUoKSkKKwkJCXsKKwkJCQlhc3NlcnQoKHBPYmpzICsgbikgPD0gdmVjLmJlZ2luKCkgfHwgKHBPYmpzID49IHZlYy5lbmQoKSkpOworCQkJfQogCQkJY29uc3Qgc2l6ZV90IGN1cl9zID0gdmVjLnNpemUoKTsKIAkJCXZlYy5yZXNpemUoY3VyX3MgKyBuKTsKIAkJCW1lbWNweSgmdmVjW2N1cl9zXSwgcE9ianMsIHNpemVvZihSKSAqIG4pOwpAQCAtMTczLDYgKzE4Miw3IEBACiAKIAl0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCBhcHBlbmRfdmVjdG9yKFQgJnZlYywgY29uc3QgVCAmb3RoZXJfdmVjKQogCXsKKwkJYXNzZXJ0KCZ2ZWMgIT0gJm90aGVyX3ZlYyk7CiAJCWlmIChvdGhlcl92ZWMuc2l6ZSgpKQogCQkJYXBwZW5kX3ZlY3Rvcih2ZWMsICZvdGhlcl92ZWNbMF0sIG90aGVyX3ZlYy5zaXplKCkpOwogCX0KZGlmZiAtLWdpdCBhL3RyYW5zY29kZXIvYmFzaXN1X2NvbnRhaW5lcnMuaCBiL3RyYW5zY29kZXIvYmFzaXN1X2NvbnRhaW5lcnMuaAppbmRleCAxY2E0YmFiLi5kM2UxNDM2IDEwMDY0NAotLS0gYS90cmFuc2NvZGVyL2Jhc2lzdV9jb250YWluZXJzLmgKKysrIGIvdHJhbnNjb2Rlci9iYXNpc3VfY29udGFpbmVycy5oCkBAIC0xMiw2ICsxMiwxMiBAQAogI2RlZmluZSBIQVNfTUFMTE9DX1VTQUJMRV9TSVpFIDEKICNlbmRpZgogCisvLyBTZXQgdG8gMSB0byBhbHdheXMgY2hlY2sgdmVjdG9yIG9wZXJhdG9yW10sIGZyb250KCksIGFuZCBiYWNrKCkgZXZlbiBpbiByZWxlYXNlLgorI2RlZmluZSBCQVNJU1VfVkVDVE9SX0ZPUkNFX0NIRUNLSU5HIDAKKworLy8gSWYgMSwgdGhlIHZlY3RvciBjb250YWluZXIgd2lsbCBub3QgcXVlcnkgdGhlIENSVCB0byBnZXQgdGhlIHNpemUgb2YgcmVzaXplZCBtZW1vcnkgYmxvY2tzLgorI2RlZmluZSBCQVNJU1VfVkVDVE9SX0RFVEVSTUlOSVNUSUMgMQorCiAjaWZkZWYgX01TQ19WRVIKICNkZWZpbmUgQkFTSVNVX0ZPUkNFX0lOTElORSBfX2ZvcmNlaW5saW5lCiAjZWxzZQpAQCAtMjc5LDcgKzI4NSwxMCBAQAogICAgICAgICAgbV9zaXplID0gb3RoZXIubV9zaXplOwogCiAgICAgICAgICBpZiAoQkFTSVNVX0lTX0JJVFdJU0VfQ09QWUFCTEUoVCkpCi0gICAgICAgICAgICBtZW1jcHkobV9wLCBvdGhlci5tX3AsIG1fc2l6ZSAqIHNpemVvZihUKSk7CisgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKChtX3ApICYmIChvdGhlci5tX3ApKQorICAgICAgICAgICAgICAgIG1lbWNweShtX3AsIG90aGVyLm1fcCwgbV9zaXplICogc2l6ZW9mKFQpKTsKKyAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgIFQqIHBEc3QgPSBtX3A7CkBAIC0zMjAsNyArMzI5LDEwIEBACiAgICAgICAgICB9CiAKICAgICAgICAgIGlmIChCQVNJU1VfSVNfQklUV0lTRV9DT1BZQUJMRShUKSkKLSAgICAgICAgICAgIG1lbWNweShtX3AsIG90aGVyLm1fcCwgb3RoZXIubV9zaXplICogc2l6ZW9mKFQpKTsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKG1fcCkgJiYgKG90aGVyLm1fcCkpCisgICAgICAgICAgICAgICAgbWVtY3B5KG1fcCwgb3RoZXIubV9wLCBvdGhlci5tX3NpemUgKiBzaXplb2YoVCkpOworICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICAgVCogcERzdCA9IG1fcDsKQEAgLTM0OCwyMCArMzYwLDgxIEBACiAgICAgICAvLyBvcGVyYXRvcltdIHdpbGwgYXNzZXJ0IG9uIG91dCBvZiByYW5nZSBpbmRpY2VzLCBidXQgaW4gZmluYWwgYnVpbGRzIHRoZXJlIGlzIChhbmQgd2lsbCBuZXZlciBiZSkgYW55IHJhbmdlIGNoZWNraW5nIG9uIHRoaXMgbWV0aG9kLgogICAgICAgLy9CQVNJU1VfRk9SQ0VfSU5MSU5FIGNvbnN0IFQmIG9wZXJhdG9yW10gKHVpbnQzMl90IGkpIGNvbnN0IHsgYXNzZXJ0KGkgPCBtX3NpemUpOyByZXR1cm4gbV9wW2ldOyB9CiAgICAgICAvL0JBU0lTVV9GT1JDRV9JTkxJTkUgVCYgb3BlcmF0b3JbXSAodWludDMyX3QgaSkgeyBhc3NlcnQoaSA8IG1fc2l6ZSk7IHJldHVybiBtX3BbaV07IH0KLQorICAgICAgICAgICAgCisjaWYgIUJBU0lTVV9WRUNUT1JfRk9SQ0VfQ0hFQ0tJTkcKICAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgY29uc3QgVCYgb3BlcmF0b3JbXSAoc2l6ZV90IGkpIGNvbnN0IHsgYXNzZXJ0KGkgPCBtX3NpemUpOyByZXR1cm4gbV9wW2ldOyB9CiAgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIFQmIG9wZXJhdG9yW10gKHNpemVfdCBpKSB7IGFzc2VydChpIDwgbV9zaXplKTsgcmV0dXJuIG1fcFtpXTsgfQorI2Vsc2UKKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgY29uc3QgVCYgb3BlcmF0b3JbXSAoc2l6ZV90IGkpIGNvbnN0IAorICAgICAgeyAKKyAgICAgICAgICBpZiAoaSA+PSBtX3NpemUpCisgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9wZXJhdG9yW10gaW52YWxpZCBpbmRleDogJXUsIG1heCBlbnRyaWVzICV1LCB0eXBlIHNpemUgJXVcbiIsICh1aW50MzJfdClpLCBtX3NpemUsICh1aW50MzJfdClzaXplb2YoVCkpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbV9wW2ldOyAKKyAgICAgIH0KKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCYgb3BlcmF0b3JbXSAoc2l6ZV90IGkpIAorICAgICAgeyAKKyAgICAgICAgICBpZiAoaSA+PSBtX3NpemUpCisgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9wZXJhdG9yW10gaW52YWxpZCBpbmRleDogJXUsIG1heCBlbnRyaWVzICV1LCB0eXBlIHNpemUgJXVcbiIsICh1aW50MzJfdClpLCBtX3NpemUsICh1aW50MzJfdClzaXplb2YoVCkpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbV9wW2ldOyAKKyAgICAgIH0KKyNlbmRpZgogCiAgICAgICAvLyBhdCgpIGFsd2F5cyBpbmNsdWRlcyByYW5nZSBjaGVja2luZywgZXZlbiBpbiBmaW5hbCBidWlsZHMsIHVubGlrZSBvcGVyYXRvciBbXS4KICAgICAgIC8vIFRoZSBmaXJzdCBlbGVtZW50IGlzIHJldHVybmVkIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCiAgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIGNvbnN0IFQmIGF0KHNpemVfdCBpKSBjb25zdCB7IGFzc2VydChpIDwgbV9zaXplKTsgcmV0dXJuIChpID49IG1fc2l6ZSkgPyBtX3BbMF0gOiBtX3BbaV07IH0KICAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCYgYXQoc2l6ZV90IGkpIHsgYXNzZXJ0KGkgPCBtX3NpemUpOyByZXR1cm4gKGkgPj0gbV9zaXplKSA/IG1fcFswXSA6IG1fcFtpXTsgfQotCisgICAgICAgICAgICAKKyNpZiAhQkFTSVNVX1ZFQ1RPUl9GT1JDRV9DSEVDS0lORwogICAgICAgQkFTSVNVX0ZPUkNFX0lOTElORSBjb25zdCBUJiBmcm9udCgpIGNvbnN0IHsgYXNzZXJ0KG1fc2l6ZSk7IHJldHVybiBtX3BbMF07IH0KICAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCYgZnJvbnQoKSB7IGFzc2VydChtX3NpemUpOyByZXR1cm4gbV9wWzBdOyB9CiAKICAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgY29uc3QgVCYgYmFjaygpIGNvbnN0IHsgYXNzZXJ0KG1fc2l6ZSk7IHJldHVybiBtX3BbbV9zaXplIC0gMV07IH0KICAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCYgYmFjaygpIHsgYXNzZXJ0KG1fc2l6ZSk7IHJldHVybiBtX3BbbV9zaXplIC0gMV07IH0KKyNlbHNlCisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIGNvbnN0IFQmIGZyb250KCkgY29uc3QgCisgICAgICB7IAorICAgICAgICAgIGlmICghbV9zaXplKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmcm9udDogdmVjdG9yIGlzIGVtcHR5LCB0eXBlIHNpemUgJXVcbiIsICh1aW50MzJfdClzaXplb2YoVCkpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbV9wWzBdOyAKKyAgICAgIH0KKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCYgZnJvbnQoKSAKKyAgICAgIHsgCisgICAgICAgICAgaWYgKCFtX3NpemUpCisgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZyb250OiB2ZWN0b3IgaXMgZW1wdHksIHR5cGUgc2l6ZSAldVxuIiwgKHVpbnQzMl90KXNpemVvZihUKSk7CisgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBtX3BbMF07IAorICAgICAgfQorCisgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIGNvbnN0IFQmIGJhY2soKSBjb25zdCAKKyAgICAgIHsgCisgICAgICAgICAgaWYoIW1fc2l6ZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFjazogdmVjdG9yIGlzIGVtcHR5LCB0eXBlIHNpemUgJXVcbiIsICh1aW50MzJfdClzaXplb2YoVCkpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbV9wW21fc2l6ZSAtIDFdOyAKKyAgICAgIH0KKyAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCYgYmFjaygpIAorICAgICAgeyAKKyAgICAgICAgICBpZiAoIW1fc2l6ZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFjazogdmVjdG9yIGlzIGVtcHR5LCB0eXBlIHNpemUgJXVcbiIsICh1aW50MzJfdClzaXplb2YoVCkpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbV9wW21fc2l6ZSAtIDFdOyAKKyAgICAgIH0KKyNlbmRpZgogCiAgICAgICBCQVNJU1VfRk9SQ0VfSU5MSU5FIGNvbnN0IFQqIGdldF9wdHIoKSBjb25zdCB7IHJldHVybiBtX3A7IH0KICAgICAgIEJBU0lTVV9GT1JDRV9JTkxJTkUgVCogZ2V0X3B0cigpIHsgcmV0dXJuIG1fcDsgfQpAQCAtOTUyLDYgKzEwMjUsOCBAQAogCiAgICAgICAvLyBDYWxsZXIgaXMgZ3JhbnRpbmcgb3duZXJzaGlwIG9mIHRoZSBpbmRpY2F0ZWQgaGVhcCBibG9jay4KICAgICAgIC8vIEJsb2NrIG11c3QgaGF2ZSBzaXplIGNvbnN0cnVjdGVkIGVsZW1lbnRzLCBhbmQgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgY2FwYWNpdHkgZWxlbWVudHMuCisgICAgICAvLyBUaGUgYmxvY2sgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHVzaW5nIG1hbGxvYygpLgorICAgICAgLy8gSW1wb3J0YW50OiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIEJhc2lzIFVuaXZlcnNhbC4gSWYgeW91IGNoYW5nZSBob3cgdGhpcyBjb250YWluZXIgYWxsb2NhdGVzIG1lbW9yeSwgeW91J2xsIG5lZWQgdG8gY2hhbmdlIGFueSB1c2VycyBvZiB0aGlzIG1ldGhvZC4KICAgICAgIGlubGluZSBib29sIGdyYW50X293bmVyc2hpcChUKiBwLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBjYXBhY2l0eSkKICAgICAgIHsKICAgICAgICAgIC8vIFRvIHRvIHByZXZlbnQgdGhlIGNhbGxlciBmcm9tIG9idmlvdXNseSBzaG9vdGluZyB0aGVtc2VsdmVzIGluIHRoZSBmb290LgpkaWZmIC0tZ2l0IGEvdHJhbnNjb2Rlci9iYXNpc3VfY29udGFpbmVyc19pbXBsLmggYi90cmFuc2NvZGVyL2Jhc2lzdV9jb250YWluZXJzX2ltcGwuaAppbmRleCA2NTU1MTcxLi5kNWNiNjE1IDEwMDY0NAotLS0gYS90cmFuc2NvZGVyL2Jhc2lzdV9jb250YWluZXJzX2ltcGwuaAorKysgYi90cmFuc2NvZGVyL2Jhc2lzdV9jb250YWluZXJzX2ltcGwuaApAQCAtNTUsNyArNTUsOSBAQAogICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgIH0KIAotI2lmZGVmIF9NU0NfVkVSCisjaWYgQkFTSVNVX1ZFQ1RPUl9ERVRFUk1JTklTVElDCisgICAgICAgICBhY3R1YWxfc2l6ZSA9IGRlc2lyZWRfc2l6ZTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCiAgICAgICAgICBhY3R1YWxfc2l6ZSA9IF9tc2l6ZShuZXdfcCk7CiAjZWxpZiBIQVNfTUFMTE9DX1VTQUJMRV9TSVpFCiAgICAgICAgICBhY3R1YWxfc2l6ZSA9IG1hbGxvY191c2FibGVfc2l6ZShuZXdfcCk7CkBAIC04Miw3ICs4NCw5IEBACiAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgfQogCi0jaWZkZWYgX01TQ19WRVIKKyNpZiBCQVNJU1VfVkVDVE9SX0RFVEVSTUlOSVNUSUMKKyAgICAgICAgIGFjdHVhbF9zaXplID0gZGVzaXJlZF9zaXplOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKICAgICAgICAgIGFjdHVhbF9zaXplID0gX21zaXplKG5ld19wKTsKICNlbGlmIEhBU19NQUxMT0NfVVNBQkxFX1NJWkUKICAgICAgICAgIGFjdHVhbF9zaXplID0gbWFsbG9jX3VzYWJsZV9zaXplKG5ld19wKTsKZGlmZiAtLWdpdCBhL3RyYW5zY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9jYi5oIGIvdHJhbnNjb2Rlci9iYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX2NiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjUwOTguLjAwMDAwMDAKLS0tIGEvdHJhbnNjb2Rlci9iYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX2NiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgQmlub21pYWwgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0weDAsIDB4NTA1LCAweDU1NTUsIDB4NUY1RiwgMHg1MDU1MDUwLCAweDUwNTVGNUYsIDB4NTBBQUE1NTEsIDB4RkFBNUE1QUEsIDB4NkFBQTUwOTUsIDB4NDFFNkZCQUIsIDB4MTlBRTk5RjUsIDB4MTA1N0FBQTQsIDB4NTQwMDVBMUEsIDB4NDQ1OUFFQUYsIDB4NTYwMTVCLCAweEJBQTlBNTU0LAotMHg0MzM1RTVFMCwgMHhEOUZFNUZCQiwgMHgyNTI1MjU2QSwgMHg5QUU4OTIsIDB4QzBENUZBRjUsIDB4NUJBNUU2NDEsIDB4N0VERUM4QjgsIDB4QkI2NzEyMTEsIDB4NEM5ODQ0RUUsIDB4RUUwNDI0MTUsIDB4RTU2NjNFQUUsIDB4OTA5MDkwOTEsIDB4QUFBNDVBRkYsIDB4MTU1NTZFMUQsIDB4QTY5NTkxOTUsIDB4NEJGRjhCRiwKLTB4NTE2NkFBRiwgMHgxNTQ5MDA2NSwgMHg2RjVCQUZBRiwgMHhGRjAwRkYwMCwgMHhEOTY5NTZBQSwgMHgxNUFGNkIsIDB4RkY1QTAwQUEsIDB4RTBFNTU3QUEsIDB4MUE2RjE5QkQsIDB4Njk2NTU1NTUsIDB4RDA1MDAxNTgsIDB4RUVFREQ4OTQsIDB4RTRFNEZFLCAweEM3MUI3QjEwLCAweDU1QUE1QUFGLCAweDUwQUE1OUJFLAotMHhFNEU5OTBFNCwgMHg1MzUzQjYzQiwgMHhGRUU1RDBFNCwgMHg5NkFGMDUxQSwgMHgzQ0M5NUE2LCAweDcwQjVBNDBELCAweDk1MDQxOTZFLCAweDRBMEJEN0EzLCAweDExQjg5NTkyLCAweEFBRkY0MDk1LCAweDU1QTVENEUwLCAweEJCQTU1MDUwLCAweDExMTE2NjYsIDB4QTU1NDQwMDAsIDB4RUQ5OTQ0NDQsIDB4NUE1NkJGLAotMHg5NEE5NTRCOSwgMHhGQjY1MTAwMCwgMHg2MDRFNjMzRSwgMHgxNDI5MUExNSwgMHg1Njk2NTk1NiwgMHhCOEUwRDBDMCwgMHg1QTU2NUE1NSwgMHg2NUE2MUE2QSwgMHhFNDkwRjk5MCwgMHhDQTg3QUFGNSwgMHg2MDYwQTBCLCAweDI0QzIzMTQzLCAweDU1QUE5QTQwLCAweDUwNUUxNjA1LCAweENFQzA0ODZFLCAweDE1NkU1NUVBLAotMHg3OTk3OEIwQiwgMHg0NTk1RjUzQywgMHg0MDVDNEFGNywgMHhDMTg5N0Q3NSwgMHhENUY0MEJBNiwgMHg5NTQ0NDAxNywgMHgxNEFENjkzNSwgMHg4N0M3QTdCRCwgMHg0QTRFODU5NywgMHhGRjFEN0U1NSwgMHg0NTE0MDBGOSwgMHgxMTEyMjc3QiwgMHg5QTA1OTBGOCwgMHg1M0UzNDkyRSwgMHhFNTkwRTk5NSwgMHg3RTczMEE5QSwKLTB4OTI5Njk3RTcsIDB4MkU3ODE2MDksIDB4RTIyMzE3QTEsIDB4RURFOUQ4ODQsIDB4RERENzVDREQsIDB4QUYxQjZGMUEsIDB4RTY5MDkwNDcsIDB4QTc3REFENUQsIDB4MTg0QzBENUQsIDB4RkFCNTYwMTAsIDB4NUVBNEYxRDAsIDB4MTExNjZCNkIsIDB4RjUxQTdBRDYsIDB4Rjc5OTUwRjQsIDB4MUI2QjFCMTEsIDB4OUE2RDY0NjksCi0weDQ0MTk5N0UsIDB4NDU0Njg2OUEsIDB4OTVBQTY5NjUsIDB4MTU1QTZBLCAweDZFNjhCMEU2LCAweDVBNTVBNjY1LCAweDFCMDUxNjA1LCAweDYwMUQ4QkU2LCAweEJEMkYxQjA2LCAweDQwOUE0MjlCLCAweDIzMjcyNzIxLCAweEIwNzQ1NEE5LCAweDdFNjZBM0ExLCAweDFCNkE1NTAwLCAweEEwRTBGNUE2LCAweEJGNUEwNTAwLAotMHg1NUE1QTlBOSwgMHg5OUQ5RTk5NSwgMHhFNDQwNTY2RiwgMHg2NTUwQkU5OSwgMHgyMjY3Nzc3QiwgMHhGQTUwRkU1MCwgMHhBNjU3QjQ0MSwgMHhCNEUyOTM0MywgMHg1NTUwOTBFNSwgMHg0NTQ2NUI2QiwgMHhFNjU0RTYsIDB4RUE5MDQ2OUIsIDB4MkUwNUQyRjQsIDB4OTk1OTQ0NDQsIDB4RjFDMjA3NDYsIDB4Mjk1QUQyRTAsCi0weEY5OTBFQTk1LCAweDgwNDQ1OUFFLCAweEE5OTk5ODk0LCAweDFGNDFFNEE1LCAweDQwNDBFNUU1LCAweDU0ODFFMUYyLCAweDJBRkY1OUYxLCAweDZCNkIxNzEyLCAweEE3MTMxMDUxLCAweEY5NDA2RjE2LCAweDFCMkI1QjlFLCAweDU4N0UwRjJGLCAweDU0N0UxOTE5LCAweEQwRjU2NDVCLCAweEIxQjFCMUIsIDB4NTc1NkE0RkUsCi0weDQ2QTlCOTY1LCAweDE1MjlGOTlELCAweEU0OTBFNDkwLCAweDQ0OTVGRSwgMHg5ODVFMEIwNiwgMHg1RkQyRDIzQSwgMHg1RDBFOTVBLCAweEY2OTEwM0Y0LCAweDQwMjk3OTAsIDB4MUIwNjJGMUIsIDB4RUU1OTQ1MDAsIDB4QjY1MzlCNUEsIDB4MTA2MTY1QkEsIDB4RDI2QjdDOEQsIDB4OEIyQTI1QTUsIDB4NTVFQUQ1RTMsCi0weDQzMUZCOEUxLCAweEJFQjRFNjQ2LCAweDlBNUE0NTQ1LCAweDUwMTVBNkIsIDB4OTBENEI4M0QsIDB4REI4QTk5QTQsIDB4OUU4OTQ5MDUsIDB4REQ3RDExMDEsIDB4QTk1RTAwQkYsIDB4NTc5RkE1QTUsIDB4QTI5MkQxNDUsIDB4OTMyOTJDOTYsIDB4RjlBOTk1QTUsIDB4QkZFOEE0NTAsIDB4Qjk5MEQxNUIsIDB4NDVEMUUwMUEsCi0weDRCRDNGNzY3LCAweEYyNDM0NzlBLCAweDdFNDIwOTI3LCAweEY5RTVFMDkwLCAweEExQzg2OUYsIDB4MjUzQTM2LCAweDlCQUI1NjlBLCAweDQxNDcwMzFGLCAweEEwNTlBRkUsIDB4RTBENjU5MEYsIDB4RDVFQUQ1RTYsIDB4OUE0QjQ2NDEsIDB4NUFBQTQ0MDYsIDB4NTVFQTkwRTQsIDB4MTAxNzlCQzQsIDB4NDQ0ODU5OTksCi0weDUxNTYyNTNFLCAweDFGMjlFMDU0LCAweENEREFBNzczLCAweDU2MDFBQjA1LCAweDk0RkM5NEMwLCAweDExNjE2NkJCLCAweEJGOTY0MDA2LCAweDQxNDE5NkVCLCAweDg0OThEOUVELCAweEI1RTA4Njg3LCAweEJENTY0MTUwLCAweDJCOEQ5REY4LCAweDdGMTIwMTdFLCAweDkwOTA0NzQ3LCAweDUwQjU2QUIsIDB4REJEMTk0OTAsCi0weEJCNUE1NjU5LCAweEJBRjQwRTQsIDB4NkQ2NDkwMTQsIDB4MUQyOTE2NkYsIDB4NDE0RjNENzUsIDB4NkY5Mjk1NDAsIDB4NTY1QUFGMDUsIDB4QkQ5ODg0RTUsIDB4RjUzNDJBMjUsIDB4MTU3OTE1QUUsIDB4MUEwNTVBNTUsIDB4OTAxOUExOUYsIDB4NjRCOTZBMDUsIDB4MzU2ODlDQ0MsIDB4OTk2MDEyRTIsIDB4NTI1MjY3N0IsCi0weDE1NkFBNDAxLCAweDI1QkNFNDgzLCAweEFBNjY1NTU1LCAweEQ2QUY0QjBGLCAweDNGNEJCREUwLCAweDk0MDRBOUFGLCAweEE1OTBGOUU0LCAweDgxOTFBNUZELCAweDU2ODE5MEI0LCAweDU5MUE2NjE2LCAweDkyQzExRDNFLCAweDk3RDJFNUZDLCAweEY1QTU1QTZGLCAweEJFRTA5NjlCLCAweDg5MThCNENBLCAweEUwOTE1Mzk3LAotMHg1MjQzNDcyRiwgMHg5NUVBNDA1NSwgMHg1NUU2RTBBNCwgMHg5QUVCRDE4MSwgMHhGNEEyNTM1NywgMHgxMTExNTY2NiwgMHhGRTQ1RkYwQSwgMHg4QkM3RDJFMSwgMHg4MDA1NTZCQiwgMHg3NTdENkE5NiwgMHhGQTkwOUE1QiwgMHg2ODk2MkZEQiwgMHhFQjAwNTZBQSwgMHg2OTk3MDI0MSwgMHhBQTU4QUQ2NCwgMHhDNEQ5REVENSwKLTB4NUE1QkYyRjAsIDB4QkQwOTA1QjQsIDB4MTk3RDc4MDEsIDB4ODk4N0VEQzQsIDB4RkY0MDU2NUEsIDB4NDYwOTc4QTQsIDB4RTQwNjdGRTQsIDB4NURBMjMxNTMsIDB4QjkwNTY1QUUsIDB4NUUxNEI5NDYsIDB4NEUzNTg3OUYsIDB4QzcyRjg2NjYsIDB4MTgxNjQ3MkYsIDB4OUE1QTQ5NDksIDB4NjRBMEQxRTUsIDB4QzcwMjVCMUEsCi0weDFCMDYxQjU1LCAweEZGQUEwNTFCLCAweEFGNURFREExLCAweEFBOTU1MDk0LCAweDY2NTk5NjVBLCAweDk5QTk1REFELCAweDk0NTBBNUE1LCAweEE1NTBBNTk1LCAweDY5MTRCOTUwLCAweEVGNDU0OTQ0LCAweDkwNkJCOTkwLCAweEQ2ODA5NDRCLCAweEUwOTE0NjFCLCAweDUzNjNCN0JCLCAweEYwNzQzOTA2LCAweDY2NTY2QTY5LAotMHg0Qjg1RDBCQywgMHg0MEU0OTRBNSwgMHgxMTYxQjZCNiwgMHg1MTlCRDU5LCAweDU5OTg0MDEsIDB4MTY1MUYyNkIsIDB4NTcwOUJCMUIsIDB4NkFFMUQxQjksIDB4RDE5Mjk3QkYsIDB4MUE2OUZFRTQsIDB4NjA2NkI1QSwgMHg3NEE1NjQ5MSwgMHhCNDY2MTE1MSwgMHg1NTkxOTFBNCwgMHg5Njc1NkE2OCwgMHhGNUM3OTFBNiwKLTB4MjAyOTdBMTUsIDB4NkI2NjAxMDAsIDB4MzEzMTc3QTIsIDB4NTUwNTQxNTAsIDB4NkE5Njk2NjksIDB4RjBCODIxMTEsIDB4NTU1QTY5OTYsIDB4QjY2NjI5NUEsIDB4MUVBOTU0NDEsIDB4NkExNjZCQTUsIDB4OEMxODU2NkQsIDB4Mjc5NzI3OEEsIDB4ODJBNTUyQkQsIDB4Rjk2NEJEMTQsIDB4NDE1NDA2NjgsIDB4NTA3ODc4NUEsCi0weDU3NTRGRSwgMHhGOUUwRTVGQSwgMHgxNTQ1M0QzRiwgMHg1QTk2OTlBOSwgMHhEOTg1NDE0NywgMHg4NDk0OTRFOSwgMHgxREMzOTczNCwgMHg2N0U3OTdCMywgMHgxMDcwNjZGLCAweEFFRDk5ODZDLCAweEFCNTY0MTQwLCAweDlCNTFBNkI3LCAweDVGRDNFMkY0LCAweDVBNTQyOUY5LCAweEY5QTA1MTYxLCAweDVBNUE2OTY1LAotMHhEREQ4ODQ4NCwgMHhGQTUwRkE1NSwgMHg5MEU1RTRGQSwgMHg2QkYxNjZCLCAweDY1NjY2NjVBLCAweEU0NTBBNkU1LCAweEVCNDVBQTA0LCAweERBOUE0NjQ2LCAweEQ3QTM3MjM1LCAweDExNDMxQjk3LCAweEQ0MUQ2RTY0LCAweEQzRDNBMUEwLCAweDVENTQwRTksIDB4NjI3Nzc3QkIsIDB4NTA1NEE0QkUsIDB4NTkzQTA1RUQsCi0weDJFQkU0NTRCLCAweDFBQkExMDE1LCAweDdDNjRCNDYwLCAweEMzNThCNDdGLCAweDE3NkY0MjkzLCAweEE2RTQxN0FCLCAweEY2MTE3NTZFLCAweDFGNDBENDk5LCAweDg0ODg1RDVGLCAweDJGMEI5QjlCLCAweDE0QkUwNSwgMHhFNTkxOTU5MCwgMHgxMDFCMTQ2RSwgMHg3QjI2MTE5MCwgMHhEQzk2RjhCMCwgMHhGNDYwMjU3RSwKLTB4MzRCMEFGQzAsIDB4RUI5MTQwRkUsIDB4QzVDNTg5REQsIDB4MUY2RDY4NjUsIDB4RjUxMDAxOTUsIDB4QUY1NjA2MDcsIDB4NTA1MDY2QjUsIDB4N0U1OTA5OTksIDB4MTNFMTkwRTQsIDB4QTU2QUJENTksIDB4QzIxQjY4RDcsIDB4RTU5NEU0LCAweEY2NTc2RTUwLCAweEZGQTc1MUQxLCAweDE5QTE3OUNCLCAweDI3MjY3OTcsCi0weEExOTMxQzdDLCAweEUxRDkwRjFCLCAweDdGMkIyNTEwLCAweDZBRjkwMDU1LCAweDVGMUU0Qzg4LCAweEU0MTA3NTdBLCAweDk1NzAyMjEyLCAweDdCNzYyMTAwLCAweDFCMDVCRjZBLCAweDE2RjA1QUIsIDB4RERDNUM5QzksIDB4NzJCRTU5NCwgMHhFNDkwRTU1NSwgMHhDNUU1MDEwNiwgMHg4MTZEQUMxNiwgMHg1NTQwRkE5MCwKLTB4MTU2NjA1RkYsIDB4M0IzNzI2MjEsIDB4MkI1N0E2N0QsIDB4NkM2NjFFMTYsIDB4MUU5N0E5MTcsIDB4RTZFMkQzODMsIDB4MUI0MEY5MUIsIDB4RDlBNjMzMzMsIDB4MzRFMTg2MjksIDB4QTcxNjE2RTksIDB4ODQ5NDZEOTksIDB4MUI2OTA2QUYsIDB4RUZERTg5MDQsIDB4ODhGNTI0NzAsIDB4NTBFOTkwRjgsIDB4NDE4MkUxQjQsCi0weEJBRTE4NjVCLCAweEY0OEU0RjQsIDB4NjRBMDUxN0YsIDB4QTFGNDU5MDIsIDB4MTIxNzdCRjUsIDB4NDY1RUJEOTEsIDB4MzdBNzQ3LCAweEYwQTUxMDYsIDB4NEM0RThBNSwgMHg2Mjc3OUU2NSwgMHhERTQ5NDk4OSwgMHg3QjY3OTZEMSwgMHhDNUM1QzU4QSwgMHhFNDc4NkIwNywgMHg2RjA3RTBGOSwgMHg1NTU0QTU1MCwKLTB4OTU1NTkzMzMsIDB4NzQ3QTZCNSwgMHhBNEE0NTUwMCwgMHhFOTk4NDQ0LCAweEY1OTY2MzcxLCAweDExMTExNkJCLCAweDc4M0E2NzksIDB4OTU0MDlBRkYsIDB4RkY5NjkwRTQsIDB4NjA3NDNFQkQsIDB4MUM1QTkwRkQsIDB4MkIwNTFFRTksIDB4NUI3QTE2MjQsIDB4RUI0MTU3MDEsIDB4MUI2QjAxNTUsIDB4OUJDQjg1ODYsCi0weDU5OUU1QzUxLCAweDUxMDA2NEJFLCAweDUwRkE2MDYwLCAweDE2MDY2QjVCLCAweDU0REE4OUQ1LCAweEEwMTQ2OEI1LCAweEMxNjU1RTUsIDB4NTVGRjY2NTcsIDB4RTQ5ODVFOSwgMHhENzM4QkUyNywgMHg2OTM4RDQ1MCwgMHg0N0QwRTRGRSwgMHg0ODU4OTg2RSwgMHhFNzkzNDMxRSwgMHgxQTA1RkZGRCwgMHgxODkzOTE0MSwKLTB4MTVFRTQ2MjAsIDB4NzlFNDUxNTEsIDB4NjYzQUE1NTYsIDB4RDEyNjZERDksIDB4N0UwNjU1RTAsIDB4QjZBNzY3NkQsIDB4NTRBOTZBQTUsIDB4MTY2NDA5MkIsIDB4NTY1MTdBQTAsIDB4RDY0MDJDQjgsIDB4NDBBNzc3M0MsIDB4NTU0RjA2NDYsIDB4NDg4RDVGMkYsIDB4RTRFNDkwOTUsIDB4MUM3Q0I0RTAsIDB4N0MyNzUyOUEsCi0weEY2RkFBMTUxLCAweENDNzM1OEQ2LCAweEU4NDA2RDE1LCAweDZFMDc0QjVGLCAweDYzODM1OUY3LCAweEQ0RTlBODhDLCAweEU4ODgwNTBGLCAweEU2NTQ2QTBCLCAweEI5OTA0RUJELCAweDc1NTA2MUFGLCAweEEzNzEyODVDLCAweEU5NUExOTA0LCAweENBREQwNDJELCAweDc1N0Y2RUQ2LCAweEU0QTkxRjA2LCAweDZENUQwOTA5LAotMHhFNDk1NTlCOCwgMHhGNEIwNTY5QiwgMHg4NDU0QjVCOSwgMHgyMTYxQjVCNiwgMHg4NTVBQURFRSwgMHg1NzVCMDU0NCwgMHhCRkU0RDA4NiwgMHhFNDg0Q0JFQiwgMHhGOUY1NDI2RiwgMHhDQzY1MzM2NiwgMHhBMzUyNDY1NiwgMHg5QTU5ODlFNCwgMHgxMDQ1MTQ2NiwgMHg3MUYxNjU1LCAweDlCOTBBNEVELCAweDE0NTk5RkYsCi0weDk2NjZBQTkxLCAweDVBOTlBOTQ1LCAweDk2ODVDRDhGLCAweEI4NTA2QTkxLCAweEI0MjdFMEY4LCAweDUwQTk5MEZFLCAweEE1RkE5MDkwLCAweDYwRDREQTgwLCAweDI4RTM1Q0IzLCAweDU1RTRBQSwgMHhEMjBCNTVBNCwgMHhFMTVGODYsIDB4MzZFNjk5NUUsIDB4NTQwMzZGRkYsIDB4QTc5RDIyNTAsIDB4QkExMUE1MDAsCi0weDQwNDYwM0FDLCAweDY0MTA2NUEwLCAweDlERDg0QTBBLCAweDk2OUIwNjFCLCAweDM2NzM3MzEzLCAweDdCNjU2MzFBLCAweEE0RTRDMDk5LCAweDk1OTA0NDhGLCAweEQ1N0YwNjgwLCAweDYwOTREODZELCAweDE1RDhFM0JELCAweDc1N0Y3REQ3LCAweEI0NUI4NTQsIDB4NjU2MEZBOTgsIDB4N0E4MDU2MzcsIDB4RDY4NDE2QkIsCi0weDdCNzY3MTMxLCAweDkwRjlFOEZFLCAweEE0RTU0MDQ1LCAweEUwNDExRjZFLCAweEQ1N0Q3RERELCAweDMzQ0IxQzMzLCAweDU4QUREMDEwLCAweDlCMUZBNUM2LCAweEE0MDFCRTk1LCAweEE5NTBGOTk0LCAweEE4NTE5NzFFLCAweDMzQ0MzM0NDLCAweDEwRjBCMTY0LCAweDE1MUE2RjAxLCAweDc4QjU2NjBDLCAweDMzMzMzMjI1LAotMHg0MTE2MjQwMiwgMHg1RjA1MDZDQiwgMHhGRDk2MTY2RiwgMHhFNDQxNzY0MywgMHg1NkE1MUE5NCwgMHg1MzIzQkZFQSwgMHhEMTJERDEyRCwgMHhBOTk5OTU5QSwgMHg1NDdDNjQ4MiwgMHg0OTlFRTY1MiwgMHg0QUM3RDFFNSwgMHgyRDNEQUQwNywgMHg2QjE3MTIwMSwgMHhBRjA2NTg1NCwgMHhENkM0ODkxRCwgMHhDQzczOUNFNywKLTB4OUQ2OTI2NjMsIDB4M0U0MTU5N0MsIDB4RjM4MzE0QkIsIDB4MTE1MEE0RjQsIDB4RTFFNTBGQSwgMHhGNEQ2MEI2RiwgMHg1QTU0RTU5MCwgMHgyMjdBQjVGMCwgMHg3M0EzRDdGQywgMHhENzQyMEE1OSwgMHgxMjAxNUE1OSwgMHg0RjE5OTlENSwgMHhBOTBFRTQ0QSwgMHgxMDY1QjlCNSwgMHhEMTA1MzNFMywgMHhCQTkxODQwOSwKLTB4RTU0MDlGRUYsIDB4NDU0OTA0N0YsIDB4NkI1N0E2QTUsIDB4RTk0NjkxQUEsIDB4MTExQTZFN0UsIDB4NDU0OTZCQSwgMHg0OUZEOTk5LCAweDQxNEQ1QjhELCAweEFCMTBFRjVFLCAweEU5ODc4NTA1LCAweDhDOTEwNDk5LCAweEMwQzVEQTNFLCAweDZGMUI3Mjk4LCAweDE3N0Q3OEQwLCAweDY4N0I1NjY1LCAweDNGNDcwMzUzLAotMHgxNDQxQTU5MCwgMHhFMTk2NUY2RiwgMHg1QTVCNEE4RCwgMHg0N0Q3Qzk4LCAweEQxNDA0MTE1LCAweEI4OUEwNTNGLCAweDhDNDA5NUZFLCAweDQ4NjFFMDU1LCAweDNCNDE3NjA3LCAweEY5RTBFNEUwLCAweDY1QjA1MDYsIDB4OTM2MzMyMzYsIDB4QUEwN0E1RTQsIDB4Nzc3NDcwODAsIDB4Nzc2MTYwRjAsIDB4MTY3MkIwNSwKLTB4QTU0RTA0MjgsIDB4NTIwQTk2MjUsIDB4RTU4MTA2NSwgMHg5MEM3NkQ3NiwgMHgyMTU3QjJCMywgMHg1QzVCRTA2LCAweDE1MUE1QTAxLCAweEE5RDVDMDgxLCAweENCQ0Q5ODU0LCAweEZERDEwNjFGLCAweEI2NjExMUIxLCAweDlEQzNEN0IwLCAweDY1MEE3NjQyLCAweDgwOTU3MzRELCAweEQwNTIwMTFCLCAweEUwQTE0NzlCLAotMHg5NTAxQkZGOCwgMHhFOUQ5QkQwRCwgMHg3QTAxNzkyNSwgMHg2OUE2NzM3MywgMHg0MUUwRTU1NywgMHg1Rjg0NDEyNCwgMHhFQUIwNjk1RSwgMHg1NjZCNTA0MCwgMHhDQ0M5RDY5MywgMHhBNzk2ODRERSwgMHg2QjVCQzNDMSwgMHg5NTk1NjY3QiwgMHg5QzMzQ0E1QywgMHg4OTg0QzVDNSwgMHg0NTlCQkRFOSwgMHgxRjEwQTVGNCwKLTB4MjJBNTVBQSwgMHg5N0MzNDMwRCwgMHhBQTU2OUE1NSwgMHg1NTJFMUUwMCwgMHhEM0MzQzc4QiwgMHg4MkM3NTIxRSwgMHg1QjA2MDVFQSwgMHg1RkY2OTI2OCwgMHhEMDgxNDYwQiwgMHhFNDUxN0YwNiwgMHg0NDQ4QzlDRSwgMHgyRjY5Rjk0MCwgMHg0NzZEQTQ3MCwgMHg5Rjk2RkUxMiwgMHg0RDhEOUU4RSwgMHg2QTZBMTZCNSwKLTB4MUQwNUJFNjYsIDB4ODRGNUJELCAweDY5MUUxQjQxLCAweEUwOTM5QjE3LCAweDE1OTA1OUFBLCAweDFFNTc5MkI5LCAweDI1QTcwMUE1LCAweDQzOTE2MkUsIDB4RTk5NDA3N0MsIDB4NUNDMzk2QUEsIDB4MUQwRDlBQTUsIDB4NEE0QTU5OEQsIDB4MUI2RjE1NkIsIDB4MUExQjBGNDAsIDB4MzRDQjM0Q0IsIDB4NkY1NDJFLAotMHgzMkNDNzM5QywgMHg5NEVCOTY2OSwgMHhEQThENEUxRCwgMHhDNkM1QzQ2RSwgMHgxMDE1MkIzRiwgMHg4Nzg3RjlGOSwgMHg1RTQyRDA2NCwgMHg2OTlCMDVFOSwgMHg3MDMwMjk1RSwgMHg0OTVFMDlCRSwgMHhFRTE5MTAxNiwgMHg4MDFEMkQ1NiwgMHgzQTAwOTlGOSwgMHhFQTA5MDU5RSwgMHg1QkFCNTEwMCwgMHgzOTNENDlDLAotMHgxMEUxNURDMiwgMHhCMDU2REQ0LCAweDM1MzY5MTUsIDB4RTBDMTg3MTksIDB4RUI5NjQwOTAsIDB4NjE3MjcyNywgMHhGRDU5MDBGQSwgMHhEMTBCNzhEMSwgMHgzMzMzMjYyNiwgMHg1MEY5OTBGOSwgMHg3ODYwMEE1QiwgMHhFMkI1NDAxQiwgMHhBRTVFOTQwNCwgMHhGMkNGMEMwLCAweDlFOUQ4MDgwLCAweDg0RTRGNEY5LAotMHg0MUYwRTU5RiwgMHg5MDc4N0UxMiwgMHhFNEUxOTE0MywgMHg3NjFENjcwNiwgMHg2NTYwQkNFNSwgMHgxMzRBOUJEMywgMHgyMzc2ODk5NSwgMHgyMkFERjYsIDB4NDM0QTVDNzIsIDB4RDQ5ODU0NDQsIDB4NzA5MzZCRkYsIDB4QUI1NEUwRTcsIDB4NDVFN0E2ODIsIDB4N0E3ODZEOTAsIDB4Rjg1NDZBMDAsIDB4NUY1RTQ1NDAsCi0weDk5OUE2NTFFLCAweEY5RTI5N0ZELCAweEFGODZFNSwgMHhEMDBCNkU1NCwgMHg1NDQyODc4QSwgMHg1MEU5NDBBNSwgMHg2MUY2QUYxLCAweDQ3OTcwMUFBLCAweEFFNDU1RTVELCAweDY1NjAxMjNFLCAweDIyRDE3NjI1LCAweDgzMDcxQjY0LCAweEY5NDYwMjUxLCAweDVGNEIwNjRBLCAweDg3NDI0MTdDLCAweDVGODlDNTFBLAotMHgxNEEyOUY1MCwgMHg1MDEzQkY2QiwgMHg3NjM5NTY3NiwgMHg1NEE1OTBGOSwgMHg0MDkxNUFBNywgMHhFQjk1RTA0MSwgMHg3RTU2MDUwNCwgMHg2NUI5RTREMSwgMHgzRjYzQTU5NCwgMHgxNzQ0ODIxNiwgMHgxQTRGODdGMSwgMHhGOTkwRTY5NiwgMHhFQ0U4OUE1MCwgMHgyMjY2QjE3LCAweDZBOTU5QTk4LCAweDUwRjUwMDFBLAotMHhCRjA1NkE1NSwgMHg3NDQ3MEZGRSwgMHg2NTI1MTAxMSwgMHg5RjdENjU5NywgMHg1MUJCOTYyLCAweEEwRDA0Mjk3LCAweEEyNTdGMEQxLCAweDVCMTU2OUQ1LCAweDRGNDA5NTlFLCAweEVDNUQxRDBELCAweDUxQTFBLCAweDFERjU2NDYyLCAweEM0NDkxQTZGLCAweDRCNEE1NUVGLCAweEZENzQxRDVGLCAweEUxNTI2NzEzLAotMHg4NzUxNTNFMiwgMHg5NzUyQTJFMiwgMHhFRkRBODUwNCwgMHhGMEU4NDc1NiwgMHhFMEExOTZFOSwgMHg1RkFGNUM0MCwgMHg5QTMzNTlDQywgMHhFMDU2MDYyRSwgMHhCMDdCNzFENywgMHg1OTY2NDc1RCwgMHg2NjE2MTEwMCwgMHg0NDRBMDE1MSwgMHhEQUM3RDZGNSwgMHhGQkU4RTMxNCwgMHgzNTA5ODUxMiwgMHgxQTdGNzY5MCwKLTB4QUY5NzAxNTgsIDB4NjY2QTY5OTYsIDB4RDFEMTA5MzgsIDB4NzQyOTY5QiwgMHg0NTQyQTVGRSwgMHg2RUJFNTBBMSwgMHg4MTZFNzk1NSwgMHg2NEUxRDBDMSwgMHgxMDUxNTZBQSwgMHg2QTlBRDBGNSwgMHhCNDkwOUUyRSwgMHg1NUE2QTk1OSwgMHg0NUI0OTk5RiwgMHgzMjY2Q0MyNiwgMHg5QjkxNUVFLCAweDk3NjlFNThCLAotMHgyRUY1OTk2OCwgMHgzRjJGMDcxMSwgMHg3OTc5ODQ2OSwgMHg2MTYxQjZCNiwgMHhBNzk1MDRCMSwgMHg5QjkyQTM1MSwgMHg2MUMwODU3MywgMHhBQjFCNjU2RiwgMHgzNzI3MTYwMSwgMHhFNDg0MDk3OSwgMHg0NUQxQzFEQSwgMHhBNEM0OTYxQiwgMHg1OUE3RjJGMCwgMHhFQTlGQzE0NywgMHg2MzUzNjJCMCwgMHg5NTYxRUFGLAotMHg2QjY3NjJBMSwgMHg1ODVBNDNEMywgMHg4NDg0ODE5RiwgMHhEMUMzMEQ1RCwgMHgyMTIzMTAxRCwgMHhBMEY4RTRGOSwgMHg2MzY3NjIyMCwgMHgxN0VCNkE1LCAweDkwRTYzRjI3LCAweEREMjU2MDQ1LCAweDdCNjZBMUEwLCAweDY0MTQzRjYsIDB4NDFENDc5RDcsIDB4RjE1MjBGODIsIDB4MTJCNDQ2ODcsIDB4MTUwNEJFMUEsCi0weDkwRTQ1NDAxLCAweEM0Qzk4RTRGLCAweDkxOTA5N0MsIDB4QTdBNTI5MTksIDB4QjlCNjIzMTMsIDB4OTY5NUMwODksIDB4MzBDNUU2QkQsIDB4QUE1NTY2OUIsIDB4RDE5RjA2NDUsIDB4MTE1MEUyRkYsIDB4MzYyMTMxMjEsIDB4MUYxRjBBMDUsIDB4MkEzMTUwOTksIDB4MkExRTA0MTQsIDB4QTNFM0QwNCwgMHhENTk5Mjg1MSwKLTB4MTlBNTZBNDUsIDB4NUQwNjY5RTUsIDB4QTdDMUY4QzAsIDB4ODREMUU1QUEsIDB4NzI5MkE0NjQsIDB4OTA0MEY1RTQsIDB4RjE4NTQwNSwgMHgxRkFFNDUwOSwgMHhGOTE2OTBCRSwgMHg1NTQwQTU0MCwgMHhBMUQyODc0QiwgMHg1NjBCNjVGOCwgMHhDMjA3RTFFNiwgMHg2NDZEMEY5LCAweDVBMTQ0MCwgMHhCQjQ1NDExNiwKLTB4MTM1OTcyNDIsIDB4NDEzQTQ1MDQsIDB4NjZFN0QyRDIsIDB4NjFEQTY5NTAsIDB4NTE5REYwQTAsIDB4RDI5MjZFQjQsIDB4QTU4MzA2MEIsIDB4MjQ3RTE1ODcsIDB4RTUwNTkwQkQsIDB4RUZGNTAxNDYsIDB4NjI1MkI3MjIsIDB4NEI5QUY1NTIsIDB4NDI0NDVBNSwgMHg1RDA4NDREMCwgMHhEN0MxRDE4LCAweDZCNTM5MDAsCi0weDdERDY4NDM0LCAweEU2OTY0MjQ3LCAweEUwQTUwQjUsIDB4NzI2MzUzNDcsIDB4NjY5QTZCMDYsIDB4OTE1NDlBNjUsIDB4OEYwOTdDQTUsIDB4ODQ5NDU4RUMsIDB4RjlCMDkyNzUsIDB4NzEzOTBENUEsIDB4NDc4QkM5RDYsIDB4NUQ1NzlBQTUsIDB4OUVEMDg2MDUsIDB4Q0ExQzM1RDMsIDB4MTAyOTY2OSwgMHgxMzQ0RkVBNywKLTB4NUI0NjhCODcsIDB4QTdGMjk5OTAsIDB4NjBCREI4NTUsIDB4MzQzMEI1NzQsIDB4NTQ0NDYxRkYsIDB4QzVDOTU1MEUsIDB4NjlFNzE2QTcsIDB4MTEyMzM2LCAweDNGMTFEMkQ3LCAweDJGMDc5NkU0LCAweEI1MjUwQjAwLCAweDMzQ0MzM0RELCAweDIwMzU3Njc2LCAweDdCNkY5MjcyLCAweDExNEIwOUJCLCAweEE3RjZDOTg3LAotMHgzMjk1OTgzMywgMHg0MEQyNUJCNiwgMHgxMzE3MDM1MywgMHhENTJFNTk0OSwgMHg5MzYyNjUzOCwgMHg0MzQ0OUE1NiwgMHg2NTU4OTBCQSwgMHgyRjU2ODExQiwgMHhFNUU0Qzg4LCAweEE2MDc5NTAwLCAweEE0RjkwNTA3LCAweDY0NjBBMDU1LCAweEU5OTA5MDZELCAweDE1NkY1NkFDLCAweDU0Q0YwMCwgMHgxODFENUEwQSwKLTB4N0MwOUU5NDcsIDB4QUQ5RTg5OEMsIDB4RkY5MTQyMTIsIDB4NjkzM0E3Q0MsIDB4QjI5MzVCMkUsIDB4NDQ1NEQ4QTIsIDB4QTZBNTYwQjYsIDB4NTE5RTIwNzUsIDB4NTc1RkE2QTUsIDB4QjhCMDY5MTYsIDB4NTk4QjQ3MUIsIDB4MTA2ODZBRDEsIDB4NDVFQTAxNzAsIDB4RDA0NzBCOUIsIDB4M0I1MTFFMEIsIDB4NTNENzlEMCwKLTB4Q0JDQUM1QzUsIDB4REFENTRDRDAsIDB4MzU0MkVFNzksIDB4QjRBRDRGRCwgMHg2NDJERkYwMSwgMHhCOTkxMDlCOSwgMHhFMTkxOUI5RiwgMHg5N0I4NDE2MiwgMHhFOTk1NDYwQSwgMHgxMDYwRjVGNSwgMHgxNjZEQkNGMSwgMHg0MjE0OTU3QSwgMHg2QzYwNjI2LCAweDUwRkU0RjBCLCAweEI0NjY0NzBBLCAweDgwODU5NkUyLAotMHg3MEQxNDQwRCwgMHg4MTg2MTdCNiwgMHhDOEU4RERFRCwgMHg0MDQ0MzQ3NCwgMHgxMDNFMDc1MCwgMHgxNTU5QTksIDB4MTZFMjlGRiwgMHg1NEZFMDQ0NywgMHgzNENBQjI1QywgMHg5QjMwNzU2QSwgMHhCMEU3NEIwNSwgMHhFMTkwNTFELCAweDQwMkU3NDUwLCAweEY1RTBEMUFCLCAweDg3OTc5QjVGLCAweDg3MDdCQTcxLAotMHg5MEI0QTQ5MSwgMHgxQTJGNTMwMSwgMHg2QzQ0RDMxOCwgMHg4QUMwQTFGNCwgMHg1QTZGMDMwNiwgMHhFMTE1OTA5MCwgMHhGOUE1NDE4MywgMHg0Q0M3MzIxQywgMHg3RTY0ODY4QiwgMHhGREU2MDU4MiwgMHg0QkU3NzAxNCwgMHgxQjkwMkQwMSwgMHgxMDREOEZBNywgMHgxNkE3Q0QsIDB4OTQ2OTM5MTIsIDB4NjJFNzU5QSwKLTB4NTk0QkE5MDYsIDB4NUQwMjM3NDcsIDB4REY5NzU3QUQsIDB4OTczNjRDQ0EsIDB4RkEwMTEyNjUsIDB4MTJFMTYxMTYsIDB4N0E2MTU2MDAsIDB4NTAxMTk2RjksIDB4NTA2N0UyNDcsIDB4MkE3NUIwNzAsIDB4QkMwMTk2QkUsIDB4MTlGRDg5MDcsIDB4Q0E4NTExQUUsIDB4N0I2NzEyMTAsIDB4QjhGMDk2NkYsIDB4NjAwQUU1RjQsCi0weDQxNDY4NThFLCAweEE1NzlDMTI0LCAweDE5RjI2QzEzLCAweDIzMjA3NzYsIDB4NTk1QkY5MDAsIDB4RkIwNTkwNTUsIDB4NkZENkU0NjAsIDB4ODZDQUQ1RCwgMHg5NDgxNTNBNSwgMHhDNkM1NDZGRiwgMHhFMTk5QUQ1QSwgMHg2NTZBNTY2QSwgMHg4MTI1Njk5NCwgMHg3QzI4NTQwMCwgMHgzN0NENkEzNywgMHg0Q0Y0RTFCLAotMHhEMTgxRTBCNSwgMHg5MEY4OUY0NiwgMHg1QUQyRDA3MiwgMHhGMUY0NEQ0LCAweEI1RTA5MUM2LCAweEZGOTBFNzY0LCAweDY1NkI5OTY1LCAweDgzMzQ3MUM3LCAweEU2NDcwNzAwLCAweDUyMUE1MTcsIDB4NTY2MjBCRiwgMHg3QTY0NThDOSwgMHg1NjY5NTlBNiwgMHg1QTVGRjNEMiwgMHhEMDUwMDYzRiwgMHg5QUMxN0MzOSwKLTB4QzFGMDNEMTksIDB4RTc5MzkzNDMsIDB4MzUzMTI0MDQsIDB4NzY2NzEyMjMsIDB4QTBEMDU4MDQsIDB4N0I3NzMyNjIsIDB4NUUyRTY0NjUsIDB4RTY4NjA1MTksIDB4REU5MDlCNUEsIDB4QjVDMDk0RTQsIDB4QUYwMTlCMTUsIDB4MUE1NzAyN0YsIDB4Nzg3NEU3RDMsIDB4QjM1Njc0QSwgMHhEMDg1NEZCNiwgMHg5MTY1MDlGRCwKLTB4NDMxRjkxRkYsIDB4OUI2MDU0MjAsIDB4NTY2OTc4QjQsIDB4RThEMTA0MkQsIDB4MjUzMzA3NCwgMHhFQzkwNDQ0MywgMHhENDA0QTREMSwgMHhCOTk4NDk0NSwgMHg0MzUxODFFNiwgMHhERkQwNTIwQSwgMHgzN0ZDNjFELCAweDE1NDBGQTk0LCAweDg3NkRCODUzLCAweDlENjg2QzlELCAweDVEN0RFNjQyLCAweDU1NkE2NjY5LAotMHg2QjE2NkYwNSwgMHhGMEYwNjYxNiwgMHhFNDkwMDUxRiwgMHgxNDdCMDYwNiwgMHhGRDc2RDlEOSwgMHgzQjgxNEU1RCwgMHgxNkU2NDYwLCAweDkxRjA1NDA2LCAweDM3NDQ0RDM0LCAweDFCMTdCRjAwLCAweEE4NDY1QTA1LCAweDEyNDI5RDFDLCAweDc5NzUzOTM1LCAweDYzOTI5MUY0LCAweDY3NjFGMEY0LCAweEJDNzg5NDYwLAotMHhGODkwRDc5RSwgMHg1NDc4MDc0MywgMHgxMTMxMzY3QiwgMHhENjQ4N0M2NCwgMHg4RTU4MkU0RiwgMHg2QTk3MkE2NSwgMHgxQkE2RDBFNSwgMHgxN0Q2MDA3QSwgMHg4MjU5MDcyNywgMHg5NUQwRkEsIDB4MTU0MEU0N0UsIDB4NTZCOTFBMEIsIDB4OEE4NUM0RDQsIDB4OUY4MjA1RTQsIDB4ODBENEM1OEIsIDB4NzVEM0U2NDcsCi0weDU5NTZEOTY2LCAweDc0RUQ0NTAwLCAweDE2N0VBNDQwLCAweDI1NUUxOTEsIDB4MzE4MTE1MTUsIDB4ODI5OTlEREYsIDB4MTE2NzBCQjgsIDB4MkJEQUQ5NjUsIDB4NUFBNTY2OUEsIDB4NTVCRjEwNUEsIDB4ODg0OTZFNTksIDB4NUFGNTY2MDAsIDB4NDg1OEU3NTEsIDB4RjQ4MTFCQjksIDB4QjUwMUE3QjAsIDB4MTFCMjZEQiwKLTB4NzY3Qzk4ODcsIDB4NjAyRDc3MDMsIDB4MTIxOUY4RkQsIDB4NDY0Mjk3RCwgMHhGRjA2REI5NSwgMHgxNTZBMDRCRiwgMHg1MDUwQTM5QywgMHgzNUNBNEY5NCwgMHg3RjAwRUYxQiwgMHg2ODM1MzI3MywgMHgxNTA2NjNCNiwgMHg3OTY2NjE5MCwgMHhEQTY1MDY0NywgMHhBOTYyOTU5QSwgMHg5NkU1OTZGRiwgMHg1MzdFMTdBMywKLTB4NTdGOUU0NDAsIDB4MTAxNDU4RkYsIDB4QTRENEU0NDEsIDB4MTg5OEM0RTAsIDB4N0UxODk0ODEsIDB4QjZDNzE5MDQsIDB4OUE5NUVEREQsIDB4OTQ0NDQ5RkYsIDB4NjFFNEM5OTcsIDB4NTJERjhGNSwgMHg2QTUxRjQ2RSwgMHg5MTQ1QUQsIDB4RDlBOERERDIsIDB4ODc4NEU2M0QsIDB4RkY1QjkwNkUsIDB4Mjk5OEE1NTksCi0weENDQ0M2NjMzLCAweEI5NTRDMEQwLCAweDcwQjU2NjNCLCAweDUzMUM4QjI1LCAweEZGQkEwMTkxLCAweEY0RTM1QjkwLCAweDQwRkY3MTUwLCAweDFGMDc1QUU1LCAweEQwMDE1QkZGLCAweERDQzNENkRCLCAweDRFNTRBMDdGLCAweDdFOTY0N0EsIDB4QTE5RDRFMSwgMHg1MTUwNDQwNCwgMHhFN0Q2OEE4QSwgMHhBRjEwQTQ1MCwKLTB4NzFCNzExODQsIDB4Nzk5NDBBMEUsIDB4ODIxQjE5NkUsIDB4NTA0MTNBNUIsIDB4NTcwNzk2MkQsIDB4RDFCNjM5NjIsIDB4ODE5REVERTQsIDB4RUVDNUNCNTQsIDB4MjUxREJBRCwgMHg1MEJENkQxRCwgMHgyMDk3NkU3NCwgMHhEREM5OEE0RiwgMHg0NTEwNzlFOSwgMHg2OTE0NkUsIDB4Njg1OTAzMTEsIDB4ODA0NUE5RjQsCi0weEVFQzU4Qjk2LCAweDk4Q0NDOTk2LCAweDk0Nzg0NDUxLCAweEU2RDYwMTVCLCAweDMwMzVCOTUsIDB4MTJFMzlGNiwgMHg1MEVFNDA1OCwgMHg0RDFDNzRBMCwgMHhBNDI5MTUwNSwgMHg5MzZCNjdENCwgMHgyQUMxNDQ5RCwgMHhBNDAxNUE2RCwgMHhBRkNCNDQxNCwgMHg3NEE1MDAzOCwgMHhERUQwNTFDOCwgMHgzNDdCNzZEQSwKLTB4ODE3RUQwMUIsIDB4REQyRDc5RDIsIDB4NUExQTAxMUIsIDB4QTA0MEY1NTYsIDB4NTQwMjQ2QjgsIDB4RjJCNDVBMDYsIDB4NkE0OTk5QjQsIDB4NEI2N0QwQkYsIDB4MzE2MTQ3MDEsIDB4NDU2Qzg0QzEsIDB4QjhGNDgxNEMsIDB4RkYwMDk2NjksIDB4NEY0QTQ5OTksIDB4OTA3RDk1QUIsIDB4QjdBNDk0MDIsIDB4NTI2RTYxRCwKLTB4NUE5NTQyRDMsIDB4Rjg3OTI2MDYsIDB4QTkxMzU2OSwgMHgzMTkzNTM0QiwgMHg3QTYxRDA3NCwgMHg1MUE0NTJFMywgMHg0MEU0OTBFNSwgMHg0MTA2Mzc3LCAweDQwNEExNzA5LCAweDE1NjI3MjcsIDB4QzBCODk5OTYsIDB4NDQ0MDc4MUUsIDB4NzhGQTkwNTMsIDB4NUQxRTAwRTgsIDB4MUMzQzc1RDAsIDB4RDU4MUFCMDUsCi0weDg1QzU4QTQsIDB4NDRFNDkwRTQsIDB4Q0Q5NENEQ0EsIDB4QjI1MkU2RDYsIDB4MUZDMzQ1QUIsIDB4NDBDNUI5MDUsIDB4MjY2OTM4NTEsIDB4RUMzNzQxRCwgMHgxQjU4NjlCLCAweEExNjE1MTAsIDB4RTA2MTk3N0IsIDB4OEE1ODA1MTAsIDB4RDk2MEQ1NTQsIDB4QjUzRTA5MSwgMHgxNEI5MDBGQSwgMHgzRTA5NDY1OSwKLTB4NjA5MDkwNiwgMHhFNkI0N0MxNywgMHhFQ0VDOTg0MCwgMHhGOUE0MDVGQSwgMHg5MEY5OTRGQSwgMHgyQjc1MEE1LCAweDgwM0IzRDI1LCAweDE0QUU0MDVGLCAweDZGOTdFMEZELCAweENEMzRFMzhDLCAweERFRDBENEFGLCAweDk2RDFDMDM4LCAweDUxRTc4MTg3LCAweDkzRDdDQUNELCAweEQ0RDA1MkE3LCAweEU2NTU4QjRGLAotMHhGNjAyNTc2NiwgMHhFNTQwNzRCMCwgMHg2NjEzMjUyQywgMHgyNTdBNzUsIDB4MUIxMjY2QjUsIDB4Rjk1NkUwQjYsIDB4NDREM0UzQjksIDB4QzVDNUU5RTYsIDB4RUJENjk1OTksIDB4OUY5MUQwRjgsIDB4QjBBMDUyNTMsIDB4NkUwRjE3NjEsIDB4NDI1RkU0ODAsIDB4QTVBMDUxRkYsIDB4QjEzODREQzcsIDB4MUNFMzFDRDMsCi0weEVCRjY3MDFCLCAweDZCMTUyOTk4LCAweDM1QTYyNTEwLCAweEQxNDBFNUU2LCAweDkwNzA3OTFELCAweDNDQTZEMSwgMHhEQUM5ODk4NSwgMHg5MDkxN0U5NywgMHgxOUJDRjkxLCAweEQwQzdDQkM3LCAweEI1NDY2QjM3LCAweEIxMTFEMjVCLCAweDlBMjk5NzhDLCAweDMxOTZDNTAsIDB4Q0FDNUMxRkYsIDB4NEY0QTQxOTIsCi0weEIxNEU3MDhCLCAweEQ1RTk1OEQzLCAweDczNzQ3RTI0LCAweEVERTBENkEyLCAweDFCOTE0MzZFLCAweDc5MjUyNTExLCAweENCQzU4QzQ0LCAweDdFNjRGODkwLCAweDlGMDVCOUY0LCAweDFCNTVFMEQwLCAweDIxRDFFOTY5LCAweEY0NTU4MDI4LCAweEY5RTVDM0MyLCAweDE5NzQzMjVCLCAweDZBOTRFMEYwLCAweEQxMDFBNUJELAotMHgxQTE3MDc1LCAweDVCMkQ3OEUxLCAweDE3MTk0ODA3LCAweEY1QzI0QjFELCAweEZBNDBFNjU1LCAweDdBMDk1NTE1LCAweEUxMDZGOTkzLCAweDU2NUExMTAzLCAweDVBNTRGNkUwLCAweEY1RTAwMTZFLCAweEQ2Q0JDNUMxLCAweEY5NDBFNjk2LCAweEFFMzE2RDkwLCAweDZBMTQ2QTAwLCAweDlCOTZFOUU0LCAweDYzNTFEODZGLAotMHg1QTQ2Njk5NSwgMHhENDQ2MEI4QSwgMHgyQ0MzNzQ0RSwgMHg5OTY2NjY5NiwgMHgyMDI1N0FCRiwgMHhBM0YyOTU1LCAweEQ1RDA5MTlBLCAweDU0NDQ0ODU5LCAweEZDNUM2MDZGLCAweEE2NjUzNzQ5LCAweDMwNkU2OTYsIDB4MjUyOEJENzAsIDB4QTA3QkNFNSwgMHhGMEE0NjY2MiwgMHhEQzY0OTQ0MCwgMHg5OUM3ODc0QSwKLTB4NjU2Q0JFQiwgMHg1MTUxQTY3QiwgMHg2MERCNEIwNSwgMHhEMTQ0NDEwNywgMHg1MTRCNzQsIDB4MTY1MDI1QSwgMHg1QjVBMTEwMSwgMHg3MTAxMTc5QSwgMHhEMDlBMDcwQiwgMHg1MEEwOTZCRiwgMHg0N0E5NTIxRCwgMHg0QjJENzQ5MiwgMHgzRjBGMUI1MywgMHgxOTQxQUJGRiwgMHg3QjY2NjExMSwgMHhEM0MzNDVCQSwKLTB4MUNBOUQ2LCAweEUxODM1OUI5LCAweDE1OTBFNkY4LCAweEY0Mjg1OTAyLCAweEJGMUI5MkQwLCAweDFCRTc2RCwgMHgyQTU1ODJDMywgMHg4OTc5MTY0QiwgMHgzQzcyMUI0MCwgMHgzM0MwQ0YzMCwgMHgyREQyMUVFMSwgMHhFOUQzMDcwNywgMHgxOTJERjY1LCAweDFCOTJFN0M1LCAweDMzMzMzNjY5LCAweDFFMDU2MEY0LAotMHhGQjUzMDM0QiwgMHg5NjZBNjY5OSwgMHg2Rjk3OTdBNywgMHhFRjQ2OUJEQiwgMHgxOTQzRjVGNiwgMHgxREE3QzcwQSwgMHg3NDc0MUU5RSwgMHhGNTcwOTk2NywgMHg1MjBCNzRGMSwgMHg0NzQxRkJBQiwgMHhEQTY3MTJCOSwgMHhDQkM2QzFEMCwgMHg2N0UyRDY0LCAweDVFMDNCNjI1LCAweEMwODhEOUQ1LCAweEY4OTAwNUZBLAotMHg1QTI1MTZBQSwgMHhFNUM3RDlENiwgMHg2OUZFNTA5NiwgMHg0MzVCRTBEMSwgMHg3MTkzREI4LCAweDlDQ0M5OTY3LCAweDU0NjEzMzAxLCAweDQ2MTIxMUJDLCAweDczMEM2RkFCLCAweDYwNTBBNUIxLCAweDdFQjkxMTQxLCAweDZBMTUyRjAwLCAweDY5NjY1QUU1LCAweEFFNTc4MEY4LCAweDdEMDZGOTAsIDB4MjAzMkQ1MTAsCi0weDRFMDc0NkQxLCAweEE2OUMzM0NDLCAweDFBNDYyNjE2LCAweDM2QzZDNkM2LCAweEZGQTU5RDFGLCAweDlCNkQ3NEYxLCAweDExOTc5MDdFLCAweDY1NkE5OTk1LCAweDkxNzQyRTQ4LCAweEQwMDUzOEY1LCAweDQ0MTU0MiwgMHg0MEQyNDY5QiwgMHhGRjU5OTksIDB4MTVBOTk2NkEsIDB4OTQ4NDFFRjksIDB4QTU2NTFEMUYsCi0weENDOUM2NjMzLCAweDJGN0QxMDdFLCAweDlCODE0MTFGLCAweDlFNTlBNjY5LCAweDVFOTcwMDA3LCAweDdFMkUxRjAzLCAweDI5QjVGMjQ0LCAweDg2QzVENDgsIDB4NTQ4NTgxQjQsIDB4Rjk1NUNGNDQsIDB4RTM1Q0IyQ0QsIDB4QTk1NkI2RDcsIDB4RTBFNjkxMjUsIDB4MTk2OUM1OUQsIDB4NTUwMDk5RUYsIDB4NjhEOTlGMjQsCi0weDVGQTY1MDEwLCAweDJCMTI1NkZELCAweEY4MjQ0MTQ3LCAweDFENTY0NzBDLCAweDIxNjJBNzYsIDB4NjJGMTY1MTAsIDB4QUE1NTY5OTUsIDB4NTQwNjY5LCAweDE0QzI5NzI2LCAweDQ3OTBGQzAsIDB4MkNDMTlCNDQsIDB4NkNENzc1OUQsIDB4RDdGNjQxNDAsIDB4NDI1RjgxRTQsIDB4NTAzNDM0OEQsIDB4NjUwOTU5NjYsCi0weDcyNjFCMEY1LCAweEFGNTY4MUQxLCAweDkzNUE0MDUxLCAweDUyNjI3NjdCLCAweDU5NUVDMkU4LCAweERCNzQzODQ3LCAweDNDNjBBNTEzLCAweEMyMUYzOTkxLCAweENCMzRDNzM4LCAweEQxOUFFOTk1LCAweEI5MTcxNzgxLCAweDExMDdBQjY2LCAweDVGQzBENzkwLCAweDIwNzBGMUY2LCAweDZFNUUxQTA5LCAweEI1NDA3RTVFLAotMHg1MDU0OTRFQSwgMHhFNDcwMzU1NiwgMHhGODkwOTk5RSwgMHhBNjVCRjU5NSwgMHgyOTE5QTdGLCAweDQ5REQzODgwLCAweDk0RUY5NjBBLCAweDE4M0QxOTA2LCAweDE1MDBGOUY5LCAweDlERUU0NTA5LCAweEY1RkE2MzEzLCAweEUwNTI2ODUwLCAweEJGRTYwMDA1LCAweEYxNkU2ODUsIDB4RjkwMDY1QTUsIDB4OTE2QUY4NTksCi0weEZGNjA4NDU0LCAweEU2QkY1MDk0LCAweDgxRDFFMEZBLCAweEExOUZGOTEsIDB4NjBENTlDRDksIDB4Mzk1MjQyNzQsIDB4RDc5OTRGNCwgMHgzNjI5NUM4RCwgMHhFMDUwMzk0NSwgMHgyRDg1QzU0NSwgMHhEMTUwMDY1OCwgMHgyMjE3MjYzNSwgMHgzMzhDNTYyNiwgMHhERTgxMjUwNiwgMHhEQjU3RThEMCwgMHhFOUQ5NTVGNiwKLTB4OUY2Qzk0RTYsIDB4OTYzNkNDMzMsIDB4MkExQTM1NDIsIDB4Rjk1RDgwRjUsIDB4RDQyNjZGNDIsIDB4MUM5RTVGOSwgMHg3NEExQzMwRSwgMHg2QjE2QTA1MCwgMHhGQjAzNTA2QSwgMHg0MjE4QjQ2OSwgMHg5NEQxNDIyRCwgMHg0MjdEMzUzMSwgMHhDMjVCQUQ0MCwgMHg2NjkyQjI5MiwgMHg1QTUwRTlBNSwgMHg3MTdDRDRDMywKLTB4NzE5MzhGNTksIDB4NTE0NzQwMEEsIDB4NDFCQzZFQjUsIDB4RDRBMEQ0RTQsIDB4MUQwRTVGQSwgMHhGNjg2OUYwNiwgMHhBN0UzNTI1MiwgMHhGNEQxNDIxQiwgMHhBNDg5NERFNywgMHgyRDk0NkIxQSwgMHhEMEZGQzY4NCwgMHgxN0MyOTFFNCwgMHg3RjUyNTAwMCwgMHgxNTg0ODEzOSwgMHg2Njk2NjlBNSwgMHhBN0E3NjM1MywKLTB4QTk5Njk2NkEsIDB4MkZFMTU1QzAsIDB4MUUxRTQyRDYsIDB4NENCMTk5NzYsIDB4MTEwM0JFNjksIDB4NTc2OTkwODIsIDB4NzE2MjRBRiwgMHhFMTQ0NUEwOSwgMHg5NjlBNDUwNCwgMHg1NjAyOTU1RSwgMHg1QTE1NDhFNCwgMHg1QjA3NDMxNCwgMHg3NEE2Q0U2NiwgMHg5MDM4MTUyRSwgMHhEOEM0NTU0RiwgMHgzRUJCMDY1NywKLTB4QThBNjU2NjksIDB4QjlCNTYwMTAsIDB4OTZCOTJEODYsIDB4RTlEOUNDQTQsIDB4MzNERTY5QTcsIDB4NUM4Q0Q4RTQsIDB4RjVEMTQwMUEsIDB4NEI1OUE0NkIsIDB4Q0QyNThEMDcsIDB4RjNDM0E0NzUsIDB4MTA1REZDMkUsIDB4Rjc5MjkxNDAsIDB4QTRBNDUwRkUsIDB4NUI0NTk4LCAweDE3MTM3Qjc1LCAweDFCMDVGMDgyLAotMHhENjI0NzREMSwgMHg2NzNBQjUwMCwgMHhBOTQ2MEI1RSwgMHg0NzAyNUFEMSwgMHg2RTY2OTVEOSwgMHgxMjYyQjZGNiwgMHg2QUU2NTE5MCwgMHg2NkE2OTQ5OSwgMHhEMDk5M0E3NiwgMHgyMjMyMTcyNywgMHg1NUMwQzU2RiwgMHg2RjdEMUU0MywgMHgzNTJGNTNFLCAweDZBRDY2NjJGLCAweDYyNzEzNjIzLCAweDk0ODQ4NEY5LAotMHgyNzE2MUUwNCwgMHhFOTk2MDY1QiwgMHhGRUQwNDExRSwgMHg4QkM1OUE0QiwgMHg2ODlFNEIwMSwgMHg0MDQ2N0U3RSwgMHg1NTBFMEY4LCAweDE4MzJENzhELCAweDZDRUM5NTgwLCAweDZBOUU4RjZFLCAweDUzNDBENEIxLCAweDE0NDlDNkQsIDB4MjIxNjM1MzAsIDB4QjRGNkMzQzYsIDB4QUQwMURBOTUsIDB4NjU2RjA1MUUsCi0weDgxNTExNjdCLCAweEEwQzM5NjZCLCAweDQwRjg1QjE1LCAweERENEI4RDJBLCAweDI0QkI2NjcsIDB4NTJFMTkzRiwgMHg1NkE3MDE5QiwgMHgxMjYyNTUwNCwgMHgxMUExNjI5NywgMHg0QjU5MDY2QywgMHg1OUU5OTBBMCwgMHhBNDVDMEIwMCwgMHg5MkMzNEIzRiwgMHhEMDZGNjMyNSwgMHhDNjhEMThCOSwgMHg3NDc4M0MzMCwKLTB4RUE1OEM1Q0QsIDB4MTQyMTUxRjcsIDB4REE2NDlFMDQsIDB4REE5NTA2MDIsIDB4NkU2NDE1MTAsIDB4QTcyNDkxNDQsIDB4RjQ2QTFGRiwgMHhBOTUwRjYxMSwgMHg3NTJFMUZDLCAweDdBNDYwNTUxLCAweEI4RTBENkQxLCAweEU5RDA5MTUxLCAweEM3NDVBMTA0LCAweDIwNzJFNjg3LCAweDlGODcwMTA1LCAweDY1QTBGMUZCLAotMHhEMEQ1MDBGOSwgMHgxQTkwMUZFMSwgMHg2RjRFOTQwMSwgMHgzMzMyMjU1OCwgMHg1MjUzMjczMiwgMHhEQjE2Qjc4MiwgMHhCQUE1NjA0NiwgMHhCQ0ExOTM5NiwgMHg0MTFCMzlCNywgMHhEQzg0NzE4NCwgMHgzMUM4QjM2NCwgMHg2QTY2OTA2RSwgMHgzRjg1RDhGMCwgMHgzNkVCNDM5MywgMHhENTE4OTg1LCAweDM0MzkyRjQ3LAotMHgxRkNGNEU5NiwgMHhGNEEwNUUwNiwgMHhCRDVCMTAyQywgMHhGRjA1NkE2NSwgMHg1NjFCQjYwMSwgMHhBQ0M1MEE1MSwgMHhBMzczMzIzNSwgMHg3RTFCNTNFMiwgMHg1MjUxQTBFNSwgMHhFMDc4MTU2RiwgMHgxRjU2RTc5MCwgMHhBOTk2NUQ1OSwgMHhFMDk0OUM3RCwgMHhEODdENTYwQSwgMHhEMDY0OUNFRCwgMHgxMDY1QTQ3RSwKLTB4MjU3Q0U0QzMsIDB4RTI0MDk1OTcsIDB4NzFENDkyMjAsIDB4MjUzOTI5RiwgMHg0NzY3M0VDQSwgMHg3MTZCNTFGMywgMHg0QzFDNDhDNSwgMHhDN0MxNTIwQiwgMHg3QjU5MzA2MCwgMHg0Rjg4NDkxRSwgMHhBNTY2QTk1NiwgMHg3NzY3QTM0LCAweDY1MTQ5QTAwLCAweEI2RDc1QTVGLCAweDk2QTc1N0E2LCAweEEwNTA2MTdCLAotMHhCMDA3RDE0MSwgMHgxMkEzNzdCMCwgMHhDNEU4RDVGNSwgMHhFMEM3NEI5NSwgMHhDMTNDMDZGOSwgMHg3OTk2MjEzRCwgMHg5QUM2OEY0NSwgMHg2NTQ2MEI5NSwgMHg5OUE3QzI5MiwgMHg4ODlDOUM2QywgMHhBNEVERDQ0MCwgMHhCMDY5M0RGLCAweEZGNTBFNDkwLCAweDUwN0E5NzcsIDB4RTQxNDdFRDAsIDB4ODBGMTk1MDUsCi0weEZDQzUwNjZFLCAweDc0QjY0MzE5LCAweDEwM0ExRUM2LCAweEIyODg1MDdFLCAweDU2QTc3OUEwLCAweDdDOTA1NkFBLCAweDM4MTI5NEZELCAweDVEMTk0RUMxLCAweEYwQzE5QjFGLCAweEQ2MEExREUxLCAweDk0QzBDNERGLCAweDdFNjY4MjRCLCAweDY5NjcwNjY3LCAweDQ2MTUyMEM3LCAweDc0NjYwNzFGLCAweDk2RkQxQTAwLAotMHgxMEM0RUE2NSwgMHg5M0RFMDQ1LCAweDZGMDFFMkU1LCAweEIxOTY5NDYsIDB4NTA0MjQ2QUQsIDB4QjQ1RTBGNCwgMHhBQkYxMTk0LCAweDg0Qzk0RDVBLCAweDExMUQyN0UsIDB4RjY5NTFCQkQsIDB4RTA4MTE2NkIsIDB4NTY2OTk5NjUsIDB4QTFGMTZDNTQsIDB4NDYxMDdBNjQsIDB4ODIxQzM0OTEsIDB4ODhEODZFNUIsCi0weEU1RDJDN0NCLCAweDUyMDM0MzJGLCAweEU2MTYzMzJCLCAweEY5ODU0OTM4LCAweEQyNzM2NzQyLCAweDY3MTA2MUY3LCAweDkyNDhCREI4LCAweDU0NDEwNkUyLCAweDYxMzQyODBELCAweEM2NUUwOTFELCAweDU1OTlFODYwLCAweEVDQzI0NUI0LCAweEZFNDU2NEUwLCAweEQ1MDBGNEY0LCAweDU5RkRDMEVELCAweDQ0NTMwMzc2LAotMHhCMTUyNzY3RSwgMHg2QTA3NDM1MSwgMHhDNTY1REUsIDB4QUQ5OTU4NDQsIDB4NTdGMUQwOTksIDB4QjI1MkQ0ODQsIDB4RDE5ODREOEUsIDB4NTE5NkE2NiwgMHgyQzU5RTE2NywgMHhDMEU5MDU1RiwgMHhGRDE5NkYwNiwgMHhGNUYwQzFDNywgMHhGQUQwNTE1MiwgMHgyMTI2RTBGNSwgMHhFOUY0MjkxMSwgMHhDODMzOTg5NSwKLTB4OEQ0MDVCRCwgMHg1MEU5NDM3NywgMHg0NDNBRjk0NSwgMHg1MDExMjkzQywgMHg3NkEyOTdBRCwgMHgxRUU0NDBDNSwgMHgzNURBRDlBMCwgMHhBNDQxOTU5MCwgMHgxNjVCQTYxOSwgMHhGNjBCOUE2NSwgMHgxRjg5NDQ0QSwgMHg3MUIwMjU1LCAweDQ3NkRGMEE2LCAweDYxRDRBMUEsIDB4NDY5RjlEQjAsIDB4MzIzNTVDOEMsCi0weDg2MDkxRDQ2LCAweEU3OTUwNjBCLCAweDIyOTYzMDVDLCAweDZFNDFGODAsIDB4RjQ5MEU1OTQsIDB4RjRFMjU2OTksIDB4QkY2NUFDNTAsIDB4NEE3RTc1REIsIDB4MTAxNUY0NTgsIDB4QjA0QUNEOUUsIDB4RUU1NDc4RjQsIDB4N0Y2MzBDNTMsIDB4NEU0OUY1RjAsIDB4Q0RBMzMxOUMsIDB4QkUxMTZEMjAsIDB4NDU4OUQ5RTksCi0weDc0MzU0MzRCLCAweEZERDk2NjU2LCAweDVGNjgxRTQsIDB4OTlBRDFDNTAsIDB4NTUyQTU0MDEsIDB4NjhGMDQ1NDksIDB4NzNCNjZEMiwgMHgxRjg2RDEwMSwgMHhEMDQxMTYwQiwgMHhGOTA2RkZBNSwgMHg2ODk2NzZERSwgMHg1RjQ3ODBCRCwgMHhGMDkzOUFBNSwgMHgxRjBCNUY0MCwgMHg1MDFCM0YsIDB4QThDMTkzQjUsCi0weDhDNzNDQzMzLCAweEUyNEY3Q0QzLCAweDkwOTBBNTY1LCAweEE5OTBENTlBLCAweEExQzE0ODc3LCAweDk0NkQ4MTgwLCAweEY4MzQzMTI0LCAweDE0QzFFOTE1LCAweDQ5MTlDQkE1LCAweEZGNTVEMDAxLCAweEY0RTE1MkEyLCAweDQ2Njg3RUYwLCAweEYwNUFCRDQ4LCAweEI3QjM3NDYwLCAweDE0NzRDNTgsIDB4OTRFNDkwRTgsCi0weEI5RTQ0MTgzLCAweDc4RDMyREUxLCAweEM4RTQ0ODlGLCAweDVCREFBNDVCLCAweEI1NjEwMTQ3LCAweDUxNjJBNUY5LCAweDVENjE5MUM4LCAweDQ1OTVDMEE2LCAweEE1N0RDOTk2LCAweDZEOUQwRDFFLCAweEY1OEJDNzY3LCAweDFBMEU1NTA5LCAweDQwOUJEMkQ3LCAweEZGNUMxMzUsIDB4MzNCNzU3OSwgMHhFRjAzNTYwMCwKLTB4Nzc5MTUyQiwgMHg1MEIwOTFCNywgMHgzNjNBMzE2MiwgMHg0OTEwNjlEQiwgMHg5QzRFMEM1RiwgMHg5NDVBMUIxMiwgMHg1NDkwRkYwMCwgMHhCNUEwQjQwMCwgMHgxRjgyRDY0QSwgMHhCMkM3NDI2LCAweDMyOUNEQTczLCAweEE5OTk1QUE1LCAweEY2NTg3NkI0LCAweDFFNEU4OTBFLCAweDg1N0FCNTc2LCAweEE1MkUwNTQsCi0weDFEMTFEODhDLCAweEEzNTg5NUIwLCAweDZGMTk2ODkwLCAweEM3MTQzRTcwLCAweDZCRTQwMUZFLCAweDExMUJBOTYxLCAweDY2MDcwQUY1LCAweDVGMDcxMzBGLCAweEExNTA2MUI2LCAweDhDNzNDRDMyLCAweDZDNjQ4MUQ2LCAweDZBRDVBNkMxLCAweDE0QTU4NzJDLCAweDQ2QjkwQkU0LCAweEU1NTg2OTQ2LCAweDMxNjNDNThDLAotMHgxNDMxQjU1MCwgMHg5MUU5NEYwOSwgMHg2NkY1QzI0QiwgMHhFRTQwNDYxRSwgMHg5NzU5Mzk5MiwgMHgxOUUwNTlGNCwgMHg5NEY5MkUwNSwgMHg4Q0M0NDVFQSwgMHg0MDNENjRBNywgMHhCMEZFNUQ4LCAweDlDOUI1QzAwLCAweDdFREVEOUE0LCAweDdDRDM5M0I1LCAweEYxQTUwREEsIDB4MzcyQjQwNzcsIDB4QkY5MDQ2RTcsCi0weDU2MjYxRTZELCAweDUxMjMyNTcwLCAweDQwMTUzQ0FCLCAweDlCNkY2NzEyLCAweDUxQzAxNjBBLCAweEI5OTAwNTJGLCAweDM3ODhCOTU1LCAweDU1NTA2NEEwLCAweDZGMEI1QjA1LCAweDk3NzY2NjZCLCAweEFBMDY5QjQ1LCAweEFGRjgxNDQwLCAweDkxRTRERTFBLCAweDgwRDVDOUM2LCAweDFFOUU1REE0LCAweDJCNjVCNDUwLAotMHgxMjEzMzYyQiwgMHhENzY2NjU0QSwgMHg0NjEzNDZDLCAweDE5N0IyNDQxLCAweDVGOTU0N0VCLCAweDE1QUYwNTA2LCAweDQ2NEM4RDlELCAweDQwMjE5NTdBLCAweEZFNTRFNDEzLCAweDEzMjk1MDM1LCAweDE0NUUwRDIsIDB4NEQ0ODU0RTksIDB4QkU1MDkxOUIsIDB4QTc2Q0Y5NDAsIDB4OTFFMTQwNkUsIDB4OUE2NTVBOUEsCi0weDNFNjUwMDVBLCAweDFDMEI2NjY2LCAweDI2MTFBQzU3LCAweEJFN0QxNDQyLCAweDMxMUUzRkMsIDB4QTQ4NTgxODUsIDB4NkU1NEQyQTEsIDB4OTE0MEE1REUsIDB4ODQ0RUM4NSwgMHhGNEE4MTU0MCwgMHgxMTU5QkY5LCAweDI4OTZEMDdELCAweEQ1RTY5MEVBLCAweDQwQTQ3RDQ3LCAweDZGNjcyQzE2LCAweEYxNjExMjE3LAotMHhFNDA5NkY2NSwgMHg2MjFEMDVFRiwgMHg5MDQwOTc5RiwgMHhDMUM1Q0E0NiwgMHg1Qjk2MDZCNSwgMHg1MTAxNzY3QSwgMHg0NDhDOTU2OCwgMHhFNDk4M0QxMiwgMHhDQkM4QjVFOSwgMHgxQjE1RTQwMiwgMHhFMUM2MEUxNSwgMHg0NEU2ODQxOSwgMHg5MEQ0OERDLCAweDdBOTA0MkJCLCAweDE1MTI4NUQsIDB4Njc2QjI2MTMsCi0weDEyMTY0NEI0LCAweDkyMEY1MkUzLCAweDU2REUwOUUsIDB4NkU2NjA3QTQsIDB4NUU1NjBCMEUsIDB4QzIwQjc2MTYsIDB4QUY0NjQxNDYsIDB4OEM1QzI4MzUsIDB4NDc0QkMyQzYsIDB4QkM2NDE5Q0EsIDB4NUM0MzUzRjAsIDB4MzEzOTI1NDcsIDB4NTA0Mjk1QUEsIDB4Q0M1OTMzNjMsIDB4MUMwQzZEQkEsIDB4NEQ3MUI3RiwKLTB4Q0M1OTM2MzMsIDB4RTcxQTI1MEIsIDB4RThDQzU5OUQsIDB4ODk0RkE2OTUsIDB4NEVDMzUxM0UsIDB4MzlDMEM2NDUsIDB4N0I1MjYwMzQsIDB4RjkxRTJFMDYsIDB4MUE2NjM2OTksIDB4MjAyNTk5RUYsIDB4QzFEMUUxOTUsIDB4NzVFNjAwRkYsIDB4RDBEMUVDREMsIDB4RDZEQjYwNTAsIDB4RTBFNTAxNkYsIDB4RjA5MTBCMTUsCi0weEQ2OEM2OTE3LCAweDZGMUEzRDAwLCAweEY1RDYxQkE2LCAweDMzNkQxQ0E1LCAweDc4ODg5NDFELCAweDc4RDA5MTJELCAweEUxRDFDMzRDLCAweDU5MkU0QzQxLCAweDE1MzlGODA0LCAweEZCMDE5NjUwLCAweEQ1RTUwNjA5LCAweEU4QzU1M0Y5LCAweDQxMUJFQkQsIDB4RTU4MEQxREEsIDB4MUNBQ0Q2OTMsIDB4QUYxNUJDRTEsCi0weDExMDQ5MDlDLCAweDRCM0I0Njg2LCAweEIzQTMxMjUxLCAweDUwRjU2NjUsIDB4MUQ0RUMxRDMsIDB4MjgzMEQ3MTIsIDB4NDAxRjA0NzUsIDB4QzA4OUQ0REQsIDB4QjI0MjU3MDEsIDB4NDAwNzZGNjUsIDB4QTk1MEY1QTQsIDB4OUY5OTkwQkYsIDB4NzAyMTQ0MzEsIDB4MjI3NTNDMzEsIDB4Q0M3MzY5RDksIDB4RTk5MTkwNjEsCi0weEY0NUExRjEsIDB4QkQwNjkwRDAsIDB4NzlBNkMxODAsIDB4MkZERDEwNUEsIDB4NTg0Mjk2Q0EsIDB4MTE2RjkwNkUsIDB4NTg0ODRDNUMsIDB4REY5QjEwRTYsIDB4NTE4NDQ4NkQsIDB4RTlEODlEOTAsIDB4NjlCMDVFRDIsIDB4RDk4NDFEMkIsIDB4QzJDNkM1RTYsIDB4Rjg4OTQ3Q0QsIDB4OTA2OTY0NjksIDB4QzVDMEM2REYsCi0weDY3N0IwNjQwLCAweDRCNDc5QkM1LCAweDgzRDFCODExLCAweDVCNDdFNDQwLCAweDFBNDE5REVBLCAweDNERDhENEE5LCAweDg3NTJCMEYzLCAweEQxRDE4MTg5LCAweENDQTYzMkNDLCAweDcyNUNDQjczLCAweDYzMjVDQzMzLCAweDE0NDY0QTI1LCAweDU0MTAzMDNGLCAweEY4QzEyRjg1LCAweDM5RDIwNUU1LCAweEZFODUwNTQ5LAotMHhDNjg3MTBCNSwgMHg0NzFGNzg0MiwgMHhEMzRBNEM2QywgMHg0NzQyRDE4OCwgMHhCRkQ1MEE0NCwgMHgxOTg3Nzc3QywgMHg1QjYxQzEyLCAweEIyNTMwNjc3LCAweEQ5OTVBOTE2LCAweDc1QjQ5NkEwLCAweDMxRTYxRTcsIDB4NTM5MzlERUQsIDB4NTE3MDVCMDAsIDB4QkE1QTQwNDYsIDB4RkYxNEE0LCAweDI1OTlEQ0Y4LAotMHg3RDQ3RjAyRSwgMHg5Qjk1OTA2NCwgMHhEQ0Q0RTAxNCwgMHgzOEMyMkREMSwgMHg2NTY0N0M4OCwgMHhENDYwNjA2NiwgMHgzNTUxRTBEMiwgMHhEMDYxNTdGRSwgMHgxMTMxMjYwQiwgMHg4QjgxRTQ1NCwgMHgxRTE4NjVGRiwgMHgxOTY2QTUyNCwgMHg0QjQ2ODREOCwgMHgzNDUwRjFCNiwgMHhFNEZFNDFEMSwgMHgxRDMxRjFFNiwKLTB4QzQ3QzFGNEEsIDB4OTQ2NTZBQiwgMHg0NUQxMDFCLCAweEI2ODFCNzEyLCAweDlCRDA5MjE1LCAweDc3OTI0MTU0LCAweEZDRUNENEEwLCAweEYwRjFDNzJELCAweDc0RDA4MzRGLCAweEU0OTA4MTE3LCAweDY1RTAzNjVDLCAweDk1NUEwOUVGLCAweDZFNzQ0MzQ5LCAweEY0NjkyQjEzLCAweDM0NzUwRjZFLCAweDk0RDE5OEE5LAotMHg4MzlDMkRCMiwgMHhFRDkyOTU4MCwgMHhFQTYwOUU2NSwgMHgxQTE1RjhEMSwgMHhGRTAwRDZBRCwgMHhENURDMDE0MSwgMHhEOTBEMzk5NSwgMHg2RTY2NDBFRCwgMHhBOUI0NDNDRiwgMHhFNTA2ODFEOSwgMHgzRjcwNTY1OSwgMHg1RjVFNDg0NCwgMHg5QTI1NEE1QiwgMHgyNjYxODE5NSwgMHg4Qjk0NURBRCwgMHhERkQ0RTQ5MCwKLTB4Njc0MzUyQzAsIDB4OTk2N0MxQzAsIDB4NTk5MEU5OTUsIDB4REVDNTQ0QkEsIDB4QTdEQTQ0NCwgMHgxNjQ1N0U4LCAweDE0MkRGRTA0LCAweEE0RDVDMDg0LCAweDEzMTcyNTM5LCAweDg0RkMzNTkwLCAweEE5NzM0NzQ4LCAweEZFMDdGNDUxLCAweDQyMTE5QUVELCAweDhGMDg3OTE2LCAweDEzQTY1RDEsIDB4ODI4NTZFNzUsCi0weDM1MTFCMUI5LCAweEE2MUJEMDE4LCAweDg2MTlCODkzLCAweDQwQkQ4OUU1LCAweDlBMTVGNjQwLCAweDQwNTI0NjRGLCAweDlEODdDMUUwLCAweDk3MkM1OEYwLCAweDg0RDhFRDU0LCAweEU2NEQ5QzVELCAweEY0MjE1MDJGLCAweEYyNDg2NCwgMHg1OUI4QTE1NCwgMHg5QTI1OTZERiwgMHgxNDQxRTZGQSwgMHgxQkU0NkY5MCwKLTB4QTg5MTUwNTEsIDB4QTVCNjI2MTEsIDB4RjU4Mjg0MUQsIDB4ODI1MzYyQjcsIDB4NTVGMzY3RSwgMHg0MTUyNjNCRCwgMHgzRTQ2MzkzMCwgMHg2ODc1NEEwNiwgMHgxMTE3RjI4MCwgMHg4QjE2Qjg1NSwgMHhFQzc1RTFDNCwgMHhBMDc3MTExNywgMHg2NjlEQjg1MCwgMHg2RDE3MTIzOCwgMHg0NzE2NzIxMywgMHg5MEIyMTc0NiwKLTB4RDkyNjQ5QzgsIDB4Q0FDNkM2RjEsIDB4RTM5MkM3NjksIDB4NjBFNzkzOUIsIDB4MTQxMzA0NzUsIDB4NTYwMDFBN0QsIDB4RjY1NzAyOEYsIDB4NkY2ODE5RSwgMHgyOTk3NEMzMywgMHg0OUE1N0M1QywgMHhENTkwRTg5MCwgMHg2RkYxMTE2LCAweDEzMkI3NjY1LCAweEEwQzYwQjU2LCAweDk4NDRERjQxLCAweEExQjEwM0UsCi0weDQ0ODQ1RUVGLCAweEE2RDJGNUQ1LCAweDU1RkE0NjAwLCAweEJGNjExMjY0LCAweDZBRDUzNjEwLCAweEVENTk0QTExLCAweENGQzE1MDE1LCAweDk2MjY0MjQ3LCAweEE0RjFEM0RBLCAweDI1N0VDMTY2LCAweEI4RDZDMTE0LCAweEVBOTBDRjRGLCAweDZENUE4MDQsIDB4M0YwNjk1RTgsIDB4OUM5MEJDRTksIDB4QUI0NzAxRDEsCi0weDEzNjM1N0I1LCAweDk5NEQ5RTBFLCAweDEyMTY1MkIyLCAweDZEOUZEMjYxLCAweDVDQ0M5NzMzLCAweDg3M0I5NUU1LCAweDkwNUU5QzgwLCAweEEwNTFCQTZGLCAweDVGNDc4NTg5LCAweDE5N0FEMTlBLCAweDUwMDE1REU5LCAweDVCQUU0MTJGLCAweDQxMTExNjJCLCAweDczOEYzODYsIDB4RTQ4MzVCQUUsIDB4NUI1NUEyRDAsCi0weDVFNEIwMzgsIDB4RjlGOTEwMTQsIDB4OEZDQkQxRTEsIDB4RDk4QjQ3NDMsIDB4Qjk5NTVEQUYsIDB4QzUzNzNEQ0QsIDB4QkQxQzgxMTQsIDB4MjUwNTMyRjEsIDB4MjQ1MDRFMEUsIDB4NjJEN0M1MCwgMHhFOEQ0NDE1NCwgMHhBODk0NDA0NCwgMHg5RDY2OTk5NSwgMHg1MzBDNkZGQSwgMHg2NTE2N0JBNywgMHhFNjQxQkUsCi0weDgxMUFCNUQyLCAweEQxOEE5RDA5LCAweDZGMDY0MDQ1LCAweEJGOTAyOTkxLCAweEM1NEYwN0ZGLCAweEY2OTYyQjExLCAweEE0ODE5RkRCLCAweDYwRjQ2QTU0LCAweEU0NTE4MTVCLCAweDdDMTk3QiwgMHg5RDQ0REEwQywgMHg4Njk2NDBGRiwgMHgxOEM0NEQxOCwgMHg0MDI0N0Y2NiwgMHg1MjIxRjcxMSwgMHg1MTAxOTZGRiwKLTB4MzUzMjYxRUYsIDB4NDQ0OTBFMEUsIDB4Rjk5NEU5NTYsIDB4OTI2QzQ1QkYsIDB4N0Q5Njg1NUYsIDB4ODRENEM5OEEsIDB4RTA2QkY0NTYsIDB4QzIxQjE2NDEsIDB4NEI1Q0I0OTMsIDB4REE5MEQzNjYsIDB4RTg5NjRENDQsIDB4MTk3Qzc1REEsIDB4RDZENDYzMzMsIDB4NDY1RTc4QTEsIDB4MTk0MjQ2MUUsIDB4QzEzNTY2NTYsCi0weDU4RDYzMUNDLCAweEQ3NzMzODRDLCAweDRBOTk0MEU1LCAweEEwRjk3NDE0LCAweDUzNTMyMzI3LCAweDc4MTA3QUI1LCAweDNDMDkxQkE1LCAweEE2NDY5MTQ0LCAweDQ0RTQ1ODQxLCAweEM1MEQ1ODQyLCAweDRBMTk5Njc4LCAweDQ2MzY1REY4LCAweDU0NjNFODcsIDB4OEQyQzExNTEsIDB4RkY1ODk1LCAweDJGRDIzMUM4LAotMHg2QzlDRDJCMywgMHhENzQyNDNCMiwgMHhDNDQwOUNERSwgMHhCOEUwNDExRiwgMHgyNjY3MEYwNSwgMHg1QjY2OTdBOSwgMHg1NTQ2NEEyQiwgMHgyRTBGNTY5QSwgMHg0NjYwRTI1QiwgMHhGRTUwMDcxNSwgMHg5QzY4MzUzMiwgMHhDQjBDNTk0OSwgMHg4MDZDNjU5MiwgMHg2NzlCMDE1NiwgMHhGRTAwNUYxNSwgMHhBNTQwRkU1MCwKLTB4MUYyODE1MTAsIDB4OTA2RDRGMDAsIDB4NTcwNTJDODAsIDB4QTk1QkMwQjUsIDB4NkM5OEM1Q0IsIDB4NDQ1ODFFNEUsIDB4QUQ5RDQ4NDYsIDB4ODM1MkM3REIsIDB4QjIxRTUwRDksIDB4RUI0NjA3QjcsIDB4OTlBQzlDNzcsIDB4MTUwOUQ5RkMsIDB4NTQ2MDEzM0UsIDB4NDI0NEVFNUEsIDB4RUY1QTI1OUEsIDB4MzQzOTQ2MUIsCi0weDZCOTQwQjA1LCAweDU5RTk0NDg0LCAweDUwNjJCNDVFLCAweDg1OUI5MzYzLCAweEZERTQ4MTk0LCAweDMyNTM2MkQyLCAweEU0NjBGQjQ2LCAweEQ3OEI5OEU3LCAweDY0QTNEMzQ2LCAweEU1QjA2Mjc3LCAweDlGNjU1QTQxLCAweDY3NkI1MzAyLCAweEVBOTUwQjdELCAweEZEMTU4QSwgMHg3NzUzNjJCNCwgMHg3NUMyMTkzOCwKLTB4ODYxRUI5RDIsIDB4NTg5NTMyQ0MsIDB4MTAyNTE5MEIsIDB4RDQ2QjA2RkYsIDB4QjUwRTdDNDQsIDB4Q0REN0EzNzIsIDB4QjVCOTYxMDAsIDB4RjJCNDkxQTEsIDB4NUU5OTYwRjQsIDB4RjFDQzU4MkUsIDB4ODlDOTk1NzUsIDB4N0FBMTQ3NUYsIDB4N0I2NkMxMjQsIDB4RDBENjgxRUYsIDB4NDQxNTZFMDgsIDB4OEYxRjEwNTYsCi0weDZFNjdEMjQwLCAweDlBNEM0OTUxLCAweEQ0NTFFNEE3LCAweEVBOTQxQjEzLCAweDdFNDcwMDcwLCAweDg1NDIyRTdGLCAweDVCOTY5MEZFLCAweERFMDZFNjI2LCAweEM4ODU0QTE1LCAweDVBMDVFRDRELCAweDgwRjQ2RTFCLCAweDkwMTFGMzAyLCAweDQ0OTNEMkQ4LCAweEU1MEQ5RDY4LCAweEZCNzY0NDAwLCAweDY0RDE4MTZGLAotMHg5OTY1QTYxNiwgMHhCRjAxMTgxMSwgMHgxNTVCMDI1MiwgMHgzRDlEQTQxMSwgMHg1OEQ5NkQ5MCwgMHg1RkFDMTRGLCAweDM0RTA5RjQ3LCAweDc0NzAzMDNELCAweDM1MzE2RTVCLCAweDg0NzgyRDE5LCAweDYwNzRCMTE0LCAweERGODUxMjRGLCAweDVCNDdCNzIzLCAweDkxMzI3NjczLCAweDMxQTNDNTQ4LCAweDZEMDRGOSwKLTB4NjVEQTYyQ0MsIDB4Nzc5QjYyNzAsIDB4OTAzNzY5OSwgMHhENTlBMDYxQiwgMHhEMTQwRjVEMCwgMHg1NDZGMDRFNSwgMHgxOTdBNjE5MywgMHgxNTBGNDZGQSwgMHhFMDU5MjE1MSwgMHg1NEE5RDBEQiwgMHhBQTU1RDg1MSwgMHg1MDYxNkY2NCwgMHgzNTMwNzk5NCwgMHgxMTk4QzcyRiwgMHg0NzJFNzlEMSwgMHhGRjAxOTgxLAotMHhGNjE5NUFGRiwgMHg1OEU2NjIxOSwgMHg2OUQzRDY3QywgMHgzMzk1QzgzMiwgMHg1REEzMURGRiwgMHhENjZFNzU4MywgMHg4MDI5NzlENywgMHgxQzQxOTgwNSwgMHhBNTk2OTE2QSwgMHg2QTQ2NDQxNCwgMHg2NDcwMjU0NywgMHhEMzFBQjcwNCwgMHg5MUU2QzIxQiwgMHg0MUFGNTUsIDB4QzYwMERGNjQsIDB4MkQxNjI5NjAsCi0weEQwRDlBQzY0LCAweDkyMUM2Mzc4LCAweEQwMDUxQzE4LCAweENDMjY5NjlDLCAweDNDODU2ODk5LCAweDU2QTlEM0EzLCAweEM4Q0NEOTY2LCAweEI0MjU1MkUyLCAweEZGMDU1QjVCLCAweDRBQzdFNjQxLCAweEU3NDdEMERELCAweDQ1QTVGNzVELCAweEZEOTYwMjA1LCAweEE2MDM5MUZELCAweDVFQUQ4NDg0LCAweDEzRDBFNTYzLAotMHgxMTAxMUJCRiwgMHhGNEE0NDE0LCAweENCNUQwOTM5LCAweDFENkRFODA0LCAweDJENkRGODUwLCAweEI3RTExNDMxLCAweDhCMjUzNDEwLCAweDI0RDdBOTE4LCAweEE2NTkxRjZBLCAweEZBMDU0NSwgMHgxMEQzNDIxQSwgMHg0RTRDRTQ1MywgMHg5OUM0OEMzRCwgMHg3MUQxQzBGLCAweEI0Qjk0MDQ1LCAweEUwODE1RDA1LAotMHg5RDg1NDIxNCwgMHhGNUYwNjEzNiwgMHgxQTU4RkQxNSwgMHg0NzQyQTY1MCwgMHg3RTY2NDY0QSwgMHhDQUM1RDFGMiwgMHg5OUE5MTQ0MSwgMHhCMDYxMTVGQiwgMHhDMEY0MzUyMiwgMHg5Q0U5Q0RDOCwgMHg1OUVBNDA0RSwgMHg1QjQyQTcwNywgMHgxNjkxNEJELCAweDg3MkRGMDg3LCAweDQxMTRBRTlFLCAweDNCMTI4NEZFLAotMHg1RTVFNTgwOCwgMHg0NjgwRDY2QywgMHgzNjQyNDZDMiwgMHg2NUMyNDYyRSwgMHg0MjFDNzhBMSwgMHgxRUI4RDVFQSwgMHgyOEYyNEM1NSwgMHg1MDIxNjcwQiwgMHg5MEJENzg3NSwgMHg3MTM4NUNDQSwgMHhFN0YwNzQxMSwgMHgxRjExQTM2NiwgMHg1RkRGQjg1MiwgMHg0QzRERTA1QSwgMHg5RTBEOUFENiwgMHhFMDk1M0M4NCwKLTB4RTVDQzA2NDEsIDB4RTAxQkY0MDYsIDB4NTFFNDA3MkEsIDB4NEQ2NkI4QjUsIDB4MjcyREFEMDQsIDB4RjJDMzk4NkQsIDB4NkQ2ODAxNTgsIDB4NDY0QjA3NTUsIDB4NTUwMDQ3RkIsIDB4NzRCNDFEMSwgMHhBRjU4Njc2QywgMHg3QTY1NTI0MSwgMHg2NEI5NTA1QiwgMHg0RDFENEQ4RCwgMHhGRkE1OTA5QiwgMHgyRjA3NTRDMSwKLTB4NDA1MjI1NkQsIDB4QjlENjg2MDksIDB4NjY2MTVFQiwgMHg4QTNENjREMSwgMHgyMzkyRDFFNSwgMHhGMEExNUFCRCwgMHhGNzM3NUIwMSwgMHg2OTkyOTFBMSwgMHg2MDdEMDE1NCwgMHg2RjE5Q0RDNiwgMHg4NjlEQUM1MSwgMHgxMTE2NDcyNiwgMHhCMEI1MEIxQSwgMHg5NTUwRTMyMCwgMHgyNTdGRjQ1MCwgMHgzMjY0NjY5QSwKLTB4REY1RDQwNUIsIDB4ODE5ODU1RTcsIDB4NkI5N0MwQTQsIDB4ODgzOTQ5NDUsIDB4QkNGMTQ0MTEsIDB4NkVENDk5LCAweDU3MDE5M0UzLCAweEZBMzQ2NDAxLCAweEY0NzkwOTUsIDB4RTZFNjg1MEIsIDB4QjJGMTYxNSwgMHg5NUUyMTYwLCAweDE0NEQ4QTNELCAweDM5MzJEMTg2LCAweDVCNjRGODAxLCAweDFGMDc0NkU3LAotMHgxNDQzRUY5OCwgMHhFODQ0NEU0OSwgMHg0NzQwRUI1MCwgMHhCOTAzNUI1OCwgMHhEM0QyMUIzRSwgMHhCODc2NzY5OSwgMHg2N0Q3ODM2NiwgMHhCRDExODdDQiwgMHg2QzVDMEMxQywgMHg5MDZEM0UxMywgMHg5RTFFNkM0OSwgMHg0MDA1OThFRCwgMHg1MjkxMDZGRCwgMHhCNEMxMEQyRCwgMHg3NDBEQzMzNCwgMHhFOTk0NThBMCwKLTB4OTRDOEQ1NzIsIDB4RDdEMTgyMjgsIDB4MTNFNTY2RSwgMHgxQkMzRDYyOSwgMHg2MzEzNjE3MiwgMHg1MUExQjEwLCAweEYzMDVGNEUwLCAweDY3OUY2ODEzLCAweEQzODM1NkVBLCAweEQ2NjlDODU2LCAweEM1Q0U1QTQsIDB4QzczOENCNzQsIDB4NTY3REI0ODAsIDB4QTY1Rjk0NDAsIDB4RTIwNzE3NkIsIDB4OUQ1RTRBODgsCi0weDFFRkQ2NDQwLCAweDEwOTU3MzhBLCAweEYwMDU2NDZFLCAweDE5RTE4NzAsIDB4RUM0ODE1NDUsIDB4MkU1OTgxMDUsIDB4NTVGNzQzOUYsIDB4REJEQjQxQTEsIDB4RTY0Rjk5NSwgMHg2QTkxNjRBOSwgMHhBNTE5MUUwNCwgMHhGNEQxNDEzQywgMHg2NDZFQTA1NiwgMHhFMzkxMTI2MywgMHgyMDExN0E2NSwgMHhGOTA1OTMwNCwKLTB4NDgzNjY3NTQsIDB4MTIxNjZCNjcsIDB4ODY4QTY3NywgMHg0NkRCODBDMCwgMHgxODc4RDY5QSwgMHg2MEQyNkRDMSwgMHg0MDVFRTgwNCwgMHg4NEQ5OTBCRiwgMHhEQUQ1NDYwNiwgMHhEOTMzNjVDQywgMHg5M0IyOTcxQiwgMHgzMTI2OTE1MSwgMHg1RjBFNThDMiwgMHgxOUI5NjM5MCwgMHhBMUFENDQ0LCAweDkwMjg2RDk0LAotMHhCMUQxMEI3RSwgMHg0MEZBQTQ1MSwgMHg4Mjc2ODE1RSwgMHg4NjY5RjQwMCwgMHhCNUE2MUIxMiwgMHg2NUZDOUI4LCAweDQ0NkFBNTUsIDB4QTExRDgzNzgsIDB4QUQ5RjQ0NjgsIDB4MjEyNjZFMUUsIDB4ODY4NTQ0RkMsIDB4Njc1MjAzMTgsIDB4ODU4REQwRUIsIDB4ODZENDkwNkYsIDB4NTFEM0E5QTYsIDB4OTc2Nzg1N0UsCi0weEQ2Qzk5QzY4LCAweDMzQ0MyNjY3LCAweDY2MDc5NUY0LCAweEQxRjEwMTU1LCAweDg2RDkwRDE2LCAweEU2NkExNjAzLCAweEY1Rjg2NDQwLCAweEU5OEU0NTA0LCAweDE3NDI0QjlBLCAweEIwODM5RjU5LCAweEU3MDQzOEYwLCAweDQzMkE3NTYwLCAweDkyRDg5RkM1LCAweDM3QzQyMzk5LCAweDExNjE3NTcwLCAweDI0OTYwNUJFLAotMHgxMDFCRTI2NSwgMHhFRTkwNTA1MywgMHg0NTQwREE1OSwgMHg5NzI5QTRGRiwgMHhFRTg1MDYwNywgMHg5RkQxNTI0OCwgMHg1MEU1QjMyMywgMHg3NTc5Rjk0NiwgMHg0OTg0NTlBRiwgMHg5MTlDMkMxRSwgMHg2QUQ3ODM3NCwgMHhCMTY0NzQyMSwgMHg5RUUwQjYwMywgMHhBNkQzNUU5LCAweDk2Njk2QzlFLCAweDU4N0E1MDAzLAotMHg0OTQ1NEE5LCAweDZENkQ5MzkzLCAweEM5ODY3N0U5LCAweDQwOTVDMkVGLCAweDlDNjA4NTA1LCAweDE1OTQwQzJDLCAweDVCNjBEMkRCLCAweDFDODE1MUE5LCAweDYwRjQ5MUQyLCAweDJCNjcwNDUzLCAweDRGMTk2NEJBLCAweEI0NDMwQjUxLCAweEE5ODYwNDU0LCAweEIwRTQxRTQ2LCAweDE0MDZCN0UzLCAweDU2MjcwMUU0LAotMHgyMEQxRjZBMSwgMHg1MzUyQTk2NiwgMHg2NEUxRDYyRiwgMHg5MkM2RUQwNywgMHhGODgyNTYxQiwgMHg5OTE5NUEwNCwgMHhDOTM0RTNBQywgMHhEOUI5MTgxMCwgMHg0NzRCMDRGNCwgMHgzRDlBNjYsIDB4Q0E5QzEwQUYsIDB4RTE5NDI5MTYsIDB4QTEyNTM1NSwgMHgzMjI5NUM4QywgMHg2NzVBNjRFMSwgMHg5RDkwNjQ5NCwKLTB4NkM2MEVCMUYsIDB4Nzg3NEMxQkMsIDB4MUNCNTMwMzgsIDB4NTZEMEY5RDEsIDB4QjFFQjk1NCwgMHg3Qzc4MTU0MCwgMHg1MzIzNjE5RSwgMHg2RkUwNTVBOSwgMHhFNzQ0MEQyMiwgMHg3NDMxQTM0NywgMHg2RjFCRTE0NiwgMHgxMDE1QkYwMCwgMHg2MjM4MTkwNSwgMHg3MDI1QjQ0MCwgMHgxNzZBRjA1MCwgMHg1RDI3MEVGMSwKLTB4NDZBRjRDMTgsIDB4NEI4NkQ5RUQsIDB4OEIxNzcwMTAsIDB4RkFEMDk2MDYsIDB4QkZBMTVFNTAsIDB4NDcwMUQ3MkQsIDB4QTI5OEE1NUUsIDB4ODY1Q0E5NTAsIDB4OUI1QjEyMjcsIDB4RTBCOTE3NSwgMHhGNDgxRjFGQywgMHg3RTVEMDQ0MCwgMHgxQTY5N0ZFNSwgMHhERTg0QzVGMCwgMHhGOTk3NTMwMywgMHg0Q0I0NkM1NCwKLTB4M0VEMEQ2NjYsIDB4RTZCMDcwNjUsIDB4RjA2NjEyNjMsIDB4MTE3QzkzQTAsIDB4RDU2REI0RTEsIDB4MkU1RTBFNUQsIDB4ODczREUxMUYsIDB4NTUxMjQxM0UsIDB4NUU5Q0U0MDQsIDB4QjRDMTBCN0YsIDB4Rjk5MEU5NTYsIDB4ODRDOTVFOTUsIDB4QjVFMDRCMUYsIDB4ODY4MTVCQTUsIDB4N0E1Q0IyNkMsIDB4NDJGNDFGOTEsCi0weEY0NTkyRTAzLCAweEY1MUYxMzAwLCAweDk5RDc4MTBGLCAweEIxNjA1MUE3LCAweDVCNTdCMDNFLCAweEVFNTkwQjU1LCAweEMwMTRGREQ2LCAweEY5QzA0NTA1LCAweDFBNjY5NjY5LCAweDk4NEM1Rjg0LCAweDFBNkZEMkUzLCAweDFBMDc1RTUsIDB4RDgwRTQ1MEMsIDB4RDY2OTQyQjYsIDB4RDA1MEUzMUYsIDB4QkE2MDU0NDAsCi0weDUwRTc4NTZBLCAweDQwNkU1M0VGLCAweEYwMTE5MUIsIDB4QkYwNTUyNDMsIDB4OUIyNUU5RTcsIDB4Rjg5MkExNTcsIDB4MkQ1OTg5NTcsIDB4ODU4OTZCNiwgMHhFRjQ0NTg0QiwgMHgxNzA2NjdGQiwgMHhEMTAxN0YzOCwgMHhDRUM1ODY4NywgMHg0NDNDNkM5OSwgMHhCNUI4M0QzLCAweEZEMDVEOTFCLCAweEE2RDcyREQzLAotMHg2Qzk4RDlEMCwgMHhENjY5OTBFMCwgMHhERTg1MEIwRiwgMHhFOTk2NDYwOSwgMHg4NjA1Qjk0QiwgMHg2REMwRDE5NiwgMHhCMTk0QTUsIDB4NkYxMzQyNEQsIDB4OUVEMTMyMTUsIDB4NzA2NDI0OUYsIDB4NTc1MUUwQjAsIDB4MTY2RjI2RDYsIDB4NTU5RUMyRjgsIDB4RTEyQzVDNzEsIDB4NTk4OThEMTUsIDB4QkMwMTVBMDUsCi0weDkwRDE4QjBGLCAweEIwRTg2NDlDLCAweDE3MEI5OEQwLCAweDgxODFGNDkxLCAweEQ5OTA0OThDLCAweDc2MzEyOTI1LCAweDkzQjUzNDAyLCAweENDMUM0QjU0LCAweDJGM0Y1MDA2LCAweDU2RUM0RjEwLCAweDFBRTUwMUU0LCAweDZGNEQ0MERCLCAweEEzNTI1RDY5LCAweDEzMjlFNDkxLCAweDQwMEFGOTk1LCAweDJENUM0ODA2LAotMHhCMDkxNjY3RCwgMHhDQzZDMTYyNywgMHg0MjVDRDlFQywgMHhGNTUyOTMxQSwgMHhBNkQ0NjU4MCwgMHhGNEFFNTBFMCwgMHgxOTc5OTA5QSwgMHhGMTc1MDA1OCwgMHgzMzY1Q0NEOSwgMHhCQTE2NjUwMCwgMHg4Njc3OTczOSwgMHg2N0YyNjExLCAweDU1MTA5QTBCLCAweDUxMDE2QTY1LCAweDExNjBCQkYsIDB4NUE2QzE0MDEsCi0weEM0REM5OTg0LCAweDMzNTM0MjQ0LCAweDQwNTcxMTNBLCAweEYxRjQzMUMxLCAweEY4QTQ0QkU1LCAweDFBOTc2ODUxLCAweEI5QjVDMjhGLCAweEZFMDk5NDU0LCAweEIwNjVCOEI1LCAweEMwMjE3NzA3LCAweEYzODMxQkQxLCAweDk3NTc0MDFCLCAweDFEMjkzNTgwLCAweDdBOTUxMjAwLCAweDIwNjE1QUY1LCAweDYyNzI3NTcsCi0weEUwRkMyOTA3LCAweEQ4NjBCNUMxLCAweDk4NUY4OUMsIDB4QzI1QzJDNUYsIDB4N0Y5NDFDMDEsIDB4QTk1QTQ1MEEsIDB4NDREODlBOTUsIDB4Q0UxQzBDNTgsIDB4MTk0MTg0RjksIDB4NTc5QkIzNzEsIDB4OTAxMTFGNDAsIDB4NUYwMzcwNzUsIDB4QkI1MTY5OTYsIDB4NEVDOTc5MSwgMHhDQ0VDOUM0NCwgMHg1RDg0MDRGOCwKLTB4NDhGRTlEMSwgMHg0NzkyRTNFMiwgMHg2RjM1RTM4MSwgMHg1RjAzNTBGQiwgMHhGRjZDNTYsIDB4NjA1MEE1RjcsIDB4NTg5NjI1QzksIDB4OEY3OTA2MUQsIDB4MTFEMDQyMUYsIDB4OTA2MUYxODQsIDB4NTA0NjYyQkUsIDB4OEZDN0QxOTAsIDB4QjQ0MDQ2MjcsIDB4RUExRjFCMDMsIDB4QUY1OUQwRUEsIDB4NzlFNTBFMDQsCi0weENGODA0NDVELCAweDQxOTFEMzhCLCAweDhGNTEzMjgsIDB4NjY1M0UyODIsIDB4OEM1QzM1NzMsIDB4OTBFMDU5MjksIDB4QzU5MTBEMkIsIDB4QUU0NzlENDYsIDB4MkY3QzE2MTAsIDB4MjRCMTYzN0UsIDB4Q0IwMDFGNTUsIDB4MTE4Mzg0QjUsIDB4QTM0MjE3MTAsIDB4QUEwNzI1RjQsIDB4RTlDMDk1OUEsIDB4RTVFNzQxMTQsCi0weDRBNDRDQjI1LCAweDE3NjNCRDkwLCAweDFCMDk1NDA0LCAweENGMDlEMDk1LCAweDVCODM0NEFDLCAweEM1QzBGOUQxLCAweEE3NjE1NDQxLCAweEU5OTA0NzRCLCAweDYzNTM2NzIzLCAweDFFMzA1QkE2LCAweEU1NkIwNjZCLCAweENBODE3OTE2LCAweDlGNzk4NTc4LCAweEQ3NjkyRTA2LCAweDU2RjAxNDgxLCAweDM3MjE1MTAwLAotMHgxNzExMTQwMSwgMHhGODkwRjk1NSwgMHhBNjhENjhENiwgMHhENjRBMDZGMCwgMHg5RjY1RDlEMiwgMHhCRTkwMDk1RiwgMHg5OTY3MDcyRiwgMHhFMDFDOTQ3QiwgMHgxMjIzNTcwOSwgMHg1ODlERkQsIDB4QkIxNTRBNDEsIDB4MkQ1REMwMUYsIDB4QzU4QjVDMDgsIDB4Q0I2NERDNEMsIDB4OUY5MzkzQUMsIDB4NzMwMzQ2N0UsCi0weDU5OUVDOTg0LCAweDQ2RTExMUZDLCAweDdBNjc5NDA0LCAweEE5MDY0N0ZCLCAweDQwRUU5NDlBLCAweDc3MDc2RTA4LCAweDEwNzM2NDIzLCAweDUzRDkwQUIsIDB4MUY1MTBCQiwgMHg4NUNDMjUzQSwgMHhBQTkwNTY2NiwgMHg0NUVDMEI0LCAweDgzNTEyMUYxLCAweDJFNUE0MjQ3LCAweDFEODY2NEEwLCAweDUxNDQyQ0UwLAotMHhERDg4NDUxRSwgMHhFODVDMDExMywgMHhGQTQwOTYwMSwgMHhBNDIxMTYyNywgMHg0NTlGNTBCQSwgMHg5ODRDNDU4QSwgMHhFNjVBNjBENywgMHg5NTgxNDNCMiwgMHhEMzgzNUJGQSwgMHhGNzI3RjExMCwgMHg0RjA3NDM1NCwgMHgxMTExM0QzRCwgMHgxNTU4MzEyQiwgMHhGRjA4RTZENiwgMHg4OUJDNTkxMCwgMHg5OUY5OTI4NywKLTB4NDBENDE4M0YsIDB4REE2NkE1NTAsIDB4QTQ1Q0UyNzksIDB4N0Y5N0EyNTEsIDB4QjFCMDI1RiwgMHg3MDc3MjI2NSwgMHhGMEUyMUUxNiwgMHhFNzk5NTlCNSwgMHg0OTY2NjlDNiwgMHhFQ0QwMDcxNiwgMHg1NjE5RUNFMSwgMHg2RTVDMTFGLCAweDExMDFGRkY4LCAweDU1QTAxRENCLCAweEE1MDUzOTcwLCAweDNENDQ4ODU1LAotMHg5RjkyRTU0MCwgMHgzNUI4QTREMCwgMHg4NDExOUNBNywgMHg1NDI5NDA2RiwgMHg5MEUwNUI1NiwgMHgzNzUyRTFEOCwgMHhFMUI0MkQ4NywgMHg5NDU0QjBGMSwgMHhERDM4MjUwNSwgMHgxOTA0RUQ2RiwgMHhEOTREMEM1OCwgMHg3QzUyMDMxRiwgMHgxNEIwNjcwNiwgMHg3OTkyODc5OSwgMHg0MDE0OUJDNywgMHhFOURDRDZEMCwKLTB4MTA0RjREMSwgMHhEOTY2MzQ0OCwgMHhCRDg1RDAwMywgMHgzNThDQ0RBMywgMHg2NkY1NDEyQiwgMHg2RTY1MDY2QSwgMHg2RTE5QjE2MSwgMHg1NUQxQUE1MCwgMHg3ODVDOUQzMCwgMHgxNjI1MzBCRSwgMHg3QUU2NDU0OCwgMHhBNTFCOUIwRSwgMHhGOUE1NjQwMCwgMHgzMkNFMzVEQiwgMHgxNzI4NTM3MCwgMHhCMDExN0I3NiwKLTB4N0NFMDQ3NDEsIDB4OUQwQzUxQTQsIDB4QkYwMDRENTUsIDB4QUFENUFDMTEsIDB4NjU5OUNCNDEsIDB4RkJEMDk0NDQsIDB4OTM2MjkxRTUsIDB4MkQ1RUEwNTYsIDB4MTEyOTY1NkEsIDB4N0ZDMDk1MDYsIDB4RDQ0MTQ5QzgsIDB4QkE3NTAzNTIsIDB4RDI0MzE5NDMsIDB4Nzk2N0UxODIsIDB4QjgxM0M0OTcsIDB4MjQyMTk0NjUsCi0weEM0M0M5MTY5LCAweDZGRDgxNDgzLCAweDYxNTJFM0MsIDB4NTk5NDdCNiwgMHgyN0Y5MEQxMiwgMHg1NDA0NkQyQSwgMHhENTIxMzA5QiwgMHhFNjY1MzkyMSwgMHg5MTY0RjRGMSwgMHgxNTIxRkI0QSwgMHg2MUM1NEMzOCwgMHg0MTY0ODRCRiwgMHgyNzc2QjExRiwgMHg1OUE5RDg4NCwgMHhFRDgwNkI1NCwgMHgxQkIwRDU5QiwKLTB4NEU4RDkxQTEsIDB4NzgyRkQxMzEsIDB4QzA1QTAzNzcsIDB4N0ExMjExMjYsIDB4REZDNUQwRTAsIDB4RUY4NTlFMDUsIDB4N0JCNjA1MTUsIDB4NUREMjZEODksIDB4MkUyOTExNTcsIDB4OUYyRjM1MzAsIDB4QzA4MTU2QTksIDB4NkQ5MUNEQzUsIDB4RjE1NDgxMTcsIDB4QjUyNTE3RkUsIDB4MjA1M0U5NDcsIDB4QUI1Nzg1QzUsCi0weDQ3OUE5MUUwLCAweDlGOTBGRTAxLCAweDMxMjQ4NERFLCAweDQ0MUJDMUE1LCAweDY2QjUwMUY1LCAweEM0NjE3QTVCLCAweDkxNkJCMEY0LCAweDIwNjU3QzdBLCAweEUyNTM5MEZGLCAweDFGMzg2MUI0LCAweDU1MDU4NkFGLCAweDZCODU5OUQ0LCAweDlGNDI5NEVDLCAweEY0RDQ4MTQ3LCAweEQwOTY1MjMzLCAweDFFMDVDRkVELAotMHg1OTE3NjkwMywgMHgyRDI5NzZDLCAweENEMzMzMzhDLCAweDE0NDFFNEFELCAweDQxOTZDMDg4LCAweEY2MDc5NDAzLCAweDk2OURDMDMwLCAweDY0OTkwRDI5LCAweDI0NTNGMzcyLCAweDg2NTg5MDlCLCAweDQ1ODA0NkZCLCAweDExQTE4NUM0LCAweDU4RkMxMTQ0LCAweDMxRTY0MUEsIDB4OEU0NzcwOUUsIDB4RjE2MTEyNzcsCi0weDYxRjkwN0EsIDB4QjcxMDBGNUMsIDB4NUExNzBCMTksIDB4MTYwNTU3RSwgMHg1NUIzOUQwLCAweEMwQzU1NkVGLCAweEJCRjUwMjk5LCAweEQxRDIzRTEyLCAweDY5NTg4NTQzLCAweDQ1NDY4OTAsIDB4OTBGQTQxMTUsIDB4MTFDNUVEOCwgMHg2OEI3NDc4OSwgMHhDMDZGMDExNywgMHgxNzI3OTBBRCwgMHg2MDZEQUM1NCwKLTB4OEQ0ODgxNTQsIDB4ODQ0NEVDOTgsIDB4OUE2NTkyRDMsIDB4RTVFMTUwNDAsIDB4REIwMzE3NjIsIDB4MkYwOTk0NTAsIDB4NDA0RjBGNUEsIDB4MUQwOUU5RjQsIDB4NTYwNDVFMUYsIDB4RjlDOTlGMDAsIDB4MTM2QzY1OTksIDB4QjBDMzZFOTEsIDB4MUMyODM1QjAsIDB4NjBCRTZCNSwgMHg0NjJGQjREMSwgMHhDQjE5QjZENywKLTB4NkM0OEM0RDksIDB4RDBEMTlCNjksIDB4QTVFNTQ0RkMsIDB4RTQ4NTFFMzEsIDB4NDFFNDY0QjgsIDB4NTlDNkY5RDQsIDB4RjBBNjUyN0UsIDB4NTMzM0QxRTAsIDB4NDg2MkY2MDYsIDB4NzIzNzA2MzEsIDB4QzJCNDkwQzUsIDB4NDY0M0RFNUMsIDB4NTRGOUM0ODksIDB4RkM1MjZDNDAsIDB4QjBBNTY4OTUsIDB4NDVDMUMxMzQsCi0weDc2OEYxOTgxLCAweDZFMjk1MDA1LCAweDk1MEI2OTY0LCAweDRCNENENUU5LCAweEVCMTMxMjQ1LCAweDQ0N0Y4NDQsIDB4MTMxQjFENzYsIDB4OTk5ODFBNywgMHg1MDBCMUYwQSwgMHg5MTAxMUIxQiwgMHg2NEU2NDcwOSwgMHhBNDVDODE0NSwgMHhCNTMwMDFEMSwgMHhEQjQ2Mjg4NSwgMHhCRTA2RDAxNSwgMHg0ODU4NTQxQiwKLTB4NkM4NkMzQjUsIDB4NzBBMTk2N0IsIDB4OTY5QjA0MTQsIDB4RUY0ODVDMDQsIDB4N0ZFMTUxQzEsIDB4RUJFN0Y0NDQsIDB4NTM0MTk5MEIsIDB4NzFENTgwNjAsIDB4RjVBNjFFMTAsIDB4NzlGMkM1MywgMHhFNUU0MUYwMCwgMHhCRkY0NTA1LCAweEUwMUJCNEU5LCAweEJGRTM5MDVELCAweERCNzY2NEQwLCAweDk1NkEwNjVCLAotMHgxMjg5NEUxLCAweEJGMTRCNDAxLCAweDMwRjdBOTcsIDB4QTg1Qzk3RTAsIDB4RjQwNjQzRTksIDB4Rjg1MDY3MDYsIDB4OUI5QjA2QUIsIDB4NUFBMDU5OTUsIDB4NDU0NDhFM0QsIDB4RTFEMTkwN0YsIDB4MjRGNEMyMkMsIDB4ODJDMjk1OUEsIDB4QkYwNjUyNDMsIDB4ODc4NTgxMkQsIDB4OUE5NEE5MTYsIDB4MzE1QjJDNjAsCi0weDUyMzI5MUQ5LCAweEYyOTkxNjA5LCAweDI4MzA1NzlDLCAweDk5OTk3M0NDLCAweDRCMTRDMDk4LCAweEMxQzUwNTMsIDB4RDFDMUM2OEEsIDB4NjRCNjdGMywgMHhEMDlCODAxRCwgMHg2QTdDMTA0NCwgMHg0ODU4MDk1NCwgMHg4NTlGMDk1QSwgMHg0NjUzMzYyMCwgMHg1OTJDODUyRCwgMHhBNTQxOTE0MSwgMHg0RDE2QTFEMCwKLTB4QjBCMTUzQiwgMHhFMTk0NEU0QSwgMHgyMTM3MTYzMywgMHhDRUM5QzRFNCwgMHhBNUQ3MEUwOCwgMHg0RTRDNERELCAweDU5MUNBQzA0LCAweDVCMDIxREJDLCAweDk5NjdDQzMzLCAweDgxQzBFNUZELCAweEY2NTFDMTA0LCAweDk2Njc2MEM5LCAweDk1RTEzMDNDLCAweEVDNUM2NDQwLCAweDUwQkY5RjQsIDB4MzU2MUMzMUUsCi0weDQ1QTA5NkFELCAweEZGOTI1MDBCLCAweEY2NTk4OTA0LCAweDE5RjlDNTBCLCAweDYwQzY0RDE4LCAweEQ2NDA1ODRGLCAweDIxOTRFMUYzLCAweEYwMzExNjNELCAweDEwMUI1NkUwLCAweERFNTkyMURBLCAweEJGMDFGRDEsIDB4NzA2RkQ5NCwgMHgzNENCMzBDRSwgMHhCODU3MDYxQywgMHg1MjI1QjYwOSwgMHhDNDNDMzEzNSwKLTB4QzAzQjkzNTAsIDB4RjAwMTY3NkYsIDB4RjBDMTg3NjcsIDB4NjYxMTM5MUIsIDB4NEY4OUE0NiwgMHgxRjQyNDQxQSwgMHg2NDlGMEY0NiwgMHhCNUUwMDE1RSwgMHg3OTY2ODMwRSwgMHg5NzQwRjRGNywgMHhDOENDNDQ1MSwgMHg1OUJENDA0QiwgMHhDQzk0MzVFMSwgMHgzQjE1QjJBMCwgMHgxMjNDMTYwNywgMHg1OTQ2OEQ5MCwKLTB4NDBFMEQ3NDksIDB4MTRDMUY0NkUsIDB4NDQ4QkQ2QTksIDB4NjU5QUY1NTYsIDB4NTBFNzQzNUIsIDB4QUVEMjkzM0MsIDB4NTYwNTEzMDgsIDB4Q0UxNDZFNTAsIDB4MUM5MDRGMTAsIDB4RUM0ODVFMEQsIDB4MTY5QTkzNkMsIDB4NTE2MzM2MDUsIDB4REI1N0E4MzAsIDB4NjI5NTdBQiwgMHhGNEYxNDQ0OCwgMHg0NUNBRDVELAotMHg2OTVDQzAwNiwgMHgxMDQ2MDZCOSwgMHg4MUQxRDg2RCwgMHg4NjQ5RjA1MCwgMHgyMEQxREI1NiwgMHhFNUU1M0NDMCwgMHhDQjQ3MDI1NiwgMHhDNjI5RTQ5NCwgMHg0OTM4NUY4RiwgMHg2NTA1NkUzMSwgMHg5Qzg2RjA5NSwgMHhDOENDOTg2NSwgMHg4NjlEODExOCwgMHhEMTAyMUYxMSwgMHg4N0RBRDFFMiwgMHhBRjA0RDUwMCwKLTB4NDUxODQ2NCwgMHhCODU3QjA4NSwgMHg0NTA1RTgzNCwgMHhCMUUyNUYwNCwgMHhEOEREOTA4NCwgMHgzNTk3OEMzMywgMHgxMUE2NDI1NywgMHg5OTFBMUU0MSwgMHg2NkIwNjc1MiwgMHhCQUY0MTQ0MywgMHhCRDRBNDU0NCwgMHhENjc1M0I2NiwgMHhDQUM2QzYzOSwgMHgxNTQ0ODBGRCwgMHg5OUQxOUJDLCAweDU0NkVFNDQyLAotMHhEMEMwMTkzRSwgMHg3NDkxRTIxRiwgMHgyNEIwQjNDNywgMHhGOTgxRDUwMSwgMHg3NDQzOEI1OCwgMHg1NEM0NzM5MSwgMHg5RUREMTE4MCwgMHhFNjk3ODc0RiwgMHgyRTQxRjhFNSwgMHg0NjhGREQ5LCAweDRGMUU0MzlDLCAweDU1NDJFQjgxLCAweEE1NTRGQUUwLCAweDFFNDNFMkIwLCAweDYwNkQ1ODk4LCAweDY1ODdDNEU4LAotMHg2Qjg2QzUxMSwgMHg2MDUwQTZEMywgMHgxQzUyMzQ4NSwgMHhGMjUzMDM5NiwgMHg0QTJENTg4NCwgMHg2RkQwOTE5MywgMHgyOTk3OEY4NCwgMHhGRTQ5MDk5OSwgMHg5MTg5Njc1RSwgMHg5OTI3NzQwMSwgMHhERDZGMjQ5NCwgMHg4Q0QzOTM0NCwgMHhCNTc4M0Q5LCAweEM4NTlFRSwgMHhBQzcwMTUwMywgMHg4RkMxRDdFMSwKLTB4QTA4NTQzMTcsIDB4RDA5RTg0NDQsIDB4NDUxMEYyQkQsIDB4RUQ0ODRDRDQsIDB4REU1RDBDMUMsIDB4QzA4NTQzNjcsIDB4RDE2NDIxMzQsIDB4NTAzODc2RSwgMHg3QzA0NkE1RSwgMHhFNTY0NDAzNSwgMHgzRDA0MzE3MywgMHg1REU4OTkxLCAweEE2MDNENkQwLCAweDcwNjQ0QjFCLCAweDQxQzNGNTUsIDB4Nzk5RUM1MCwKLTB4NUMxRDAwNUEsIDB4QjU0MDI3QkIsIDB4NTAxNzAzRkIsIDB4Q0U1RTJEODQsIDB4QzI0ODc3NkIsIDB4MzRDMzFEQjEsIDB4RDA4MTQ2RjYsIDB4NjE5NEQ0ODgsIDB4OTAyRDk1REYsIDB4NTYyMzk2OTksIDB4Nzk1NjY5OTYsIDB4NDYzNjY3OTcsIDB4MjA3NUI0NDksIDB4RTYxOTkwNEIsIDB4RjFGQzQ5MUQsIDB4NDAyNjkyNUYsCi0weDg1Q0U5OTQsIDB4QzYyRDY1MUIsIDB4RTBGNTBCNCwgMHg2MDk3NkY1NSwgMHg1Qjc3MDZBNiwgMHg0OTQ3MUY0MSwgMHhGNkQ5MTM1MiwgMHg1NTFBMDYyRiwgMHg0MTQ1Q0ZDQSwgMHg1NUIxNDIzNCwgMHhBQkYxMjUzMSwgMHhCOTE1RjBGNCwgMHg4QUM3RTI3NSwgMHg0Njc5QzEyRiwgMHhFMjEzNTNFQywgMHg2OTM2MDJBNSwKLTB4NEJDMjU2QUIsIDB4NDYzRDY0QTYsIDB4NUU3QzZCOCwgMHgxNDM5ODNGMCwgMHgzNjQ2ODcxQSwgMHg2MDFEMUZFLCAweDRENDYwMUZDLCAweEI0ODlEMERGLCAweEY3ODE0MDQ2LCAweEU1QTUwQkE3LCAweEIzNEExMTYsIDB4NzA3QzQxNTEsIDB4ODA0NDY2QkIsIDB4Q0Y0NTBDNUMsIDB4MTMyOUI5RjQsIDB4RkU0MDA2NTUsCi0weEY0QTE0MzFCLCAweDUxRDMyMDJELCAweDc0QjBBNDQ0LCAweEE2RjE2MTIsIDB4NkM1ODRDOEMsIDB4QzAxNEY2NjUsIDB4RDM5ODI5NTcsIDB4MzZDMTM2RDEsIDB4NUM0NUNDRDAsIDB4OUY0NTk4ODIsIDB4OTFBNzUzQTIsIDB4QTk3NTJDNEMsIDB4NDIxQjQyOTcsIDB4Nzc2QTIzMTMsIDB4MzUzOTc5MDYsIDB4NDgwNjU3NjIsCi0weDExMjlCNDQwLCAweEFGNDEwQjVELCAweDdGOTU4MkQyLCAweDRCNTFFNjUwLCAweDg5MUQwRDc3LCAweEU1OTkwOUU1LCAweDcwNUQyMzRCLCAweEMzREE5MDU1LCAweEYxQjExNTAxLCAweDQ0QkM5NEQ5LCAweDFGQTU1QzQ4LCAweDJBNDIyNjU3LCAweEM0MTA5MUExLCAweDE4OTcwRTc0LCAweDc2OTkwOTksIDB4MTA2MTZBRDcsCi0weDFBRTE5RjEwLCAweDQ3NUE2QzMxLCAweEEyNzI1N0U5LCAweEM0ODQ1ODJDLCAweEQ2OTk2NjVBLCAweDE3Qzk0QzE4LCAweEUxNTY5QiwgMHgxMTg1NUFCRiwgMHhBNTgwRDYwNywgMHg2NEMxOEI3RSwgMHg3MDMwQTYwNSwgMHgyQjM2NjBEMCwgMHgxNjVCRTEwMywgMHg4MDlFMTg2NywgMHg0NzQwN0ZENywgMHgzNEU0ODU4QiwKLTB4OTBFRDc0MEIsIDB4MUI0M0MyRjUsIDB4RjQ1MTUyN0MsIDB4NTcyM0UxQzUsIDB4RTFEMTA2NUIsIDB4QTUxQTlERjQsIDB4N0YwOTlBODUsIDB4NDE1NzAzMEIsIDB4MUQ5RjYwQjgsIDB4QzExNDkxRkQsIDB4RkU4NTBBNTUsIDB4Qjk5MDQzMUYsIDB4QTBDNzhEMTYsIDB4NkY1QTRENDAsIDB4RkU0NDExRSwgMHgzNDQyNkI1NiwKLTB4NTAxNEZFMEYsIDB4QkQ1REM1MUEsIDB4QzYzNjM3QzMsIDB4RTFCNDU5QjIsIDB4RkE4NzFCMDUsIDB4NDU0NEQwQUQsIDB4RTVFNTA5M0QsIDB4MzMwNkM1REQsIDB4NDdDMzM0ODQsIDB4NkYxRTE0NiwgMHhFNDk3NEYxLCAweERENDgwNTBGLCAweEFCMTUxRTEyLCAweDUxNjlGQzkyLCAweDUwNTVCMjdBLCAweEQxNDJBRDVDLAotMHg0QjE2QjBGNCwgMHgzMTJCQzk1NSwgMHg3NUIxMEZDLCAweDRBOUUwNDU4LCAweEE2NUQzNENFLCAweDkwRDM2NkNGLCAweDEwMDk5RDI5LCAweDhCMzU4NDE5LCAweDg3RDJCNURBLCAweDMxMTYyRUY1LCAweEY2MTk4OUM1LCAweDFGNDM0MUY4LCAweEJDNEM2RDlDLCAweDExQTc1OSwgMHg5NTUzQTIxLCAweENGQzQxNTMwLAotMHgxRjA1QjYxMCwgMHg1QjJGNjRDMCwgMHgxMTdGMTEyNCwgMHhGM0QyNEQ5LCAweDQ0NDQ3ODc0LCAweDc0MzUxQTA2LCAweDY0QzQ4OTc5LCAweDYzQzE4NUIsIDB4OTFGMDk0QTQsIDB4NEUxRDFDNDgsIDB4OTY5MTAzQUUsIDB4OUNGQzYwNjcsIDB4MkZDOTQwNDUsIDB4RUQzODQ0QzQsIDB4Njc2QzkzNUIsIDB4NkUyMDkxQjUsCi0weDJEOTc0NEVDLCAweDZBMTExMjI3LCAweDc4REI5MEU1LCAweDgwNDU1ODdFLCAweEM0RTQ1OTFFLCAweDQ3OUJFMUUwLCAweDVCNjY3NDk5LCAweDUwRTA0OTNFLCAweEZCNTQ4MTlDLCAweDQzMTQ5MUY4LCAweEQzRUY1MEUwLCAweDczNjM5MjYsIDB4NTBGRjY0NDAsIDB4NDREQzZDOUQsIDB4RjZEOTk2NUEsIDB4NTQ4NDk5LAotMHgxNTBBMTQwMywgMHhDNzMyNENDNywgMHhBRkYwNDc0QiwgMHhCNDc5OTY2RSwgMHhBRDlFNTQ1MSwgMHhGOTkxM0M0MSwgMHgxRjA5QjQ2LCAweDNFMzU0NjFFLCAweEEwQzY2QzEwLCAweEE0RDFEMTAzLCAweEEwNTQ3MEI0LCAweDZGMUEzNTMxLCAweDQwNDdCMkY1LCAweDExNDcyQ0UwLCAweDNBRTQxNjMxLCAweEZEMzZBOTA1LAotMHhGNDQzNkY5MSwgMHg0QTQxOTc2NiwgMHg1MDY5OUU2NywgMHg1NDA4RDkzRCwgMHgxMTI3MTFBRiwgMHhGNTAwNjQyRiwgMHgxNjBCRDY2QSwgMHgxMUIwQkZFLCAweEMyQzU1Q0ExLCAweDMxQ0Y4NTksIDB4QzZDOTU0MDEsIDB4RDlDMEU1QzEsIDB4RTQ2MDU2QUUsIDB4RjVFMzA3MTAsIDB4QTVGRjAxNTAsIDB4NDQ1NDIwM0YsCi0weEI2NjYwOTU5LCAweDI1MjI3NzYsIDB4MkQ1ODY5NzAsIDB4NzM3MDc1NywgMHg2MDk1MzMxNywgMHg4MUU3MDcyRCwgMHg2ODE0OUU2LCAweDY1MzgzNCwgMHgzNjNEOUQ4MSwgMHhCNDI5MTEzRiwgMHg1NjZDMDI1OCwgMHg1MUY5MkYwMCwgMHhFMTlDNTgxMiwgMHgxMUZCMTUwLCAweDU5QTY1MjAwLCAweDI3NzVFMEY0LAotMHgxMDY3NTJBMywgMHg3NTc0MzI2LCAweDVDQzM0NzM5LCAweERBRDU0ODA1LCAweDVFOTM2QkM3LCAweENGQ0FDNUM5LCAweDJGQzQyNTU1LCAweEQwNjk5NEMwLCAweDVDQUM3NDAwLCAweDVEODREMDc0LCAweDZENjY4NjA0LCAweEU1MEIxOUJELCAweEU3OTY5RjU1LCAweEZGOTI1MDA1LCAweDY1QjI2NkIsIDB4NDc0MzAzNUUsCi0weDk3MkM0NEM3LCAweDVBQjQ3MjYwLCAweDc3MTIzNTgwLCAweEQ5MkRCNDA0LCAweDQ1MUJCOEQxLCAweEI5NEI0NDQ3LCAweDlCOTU1MjEwLCAweEEyNTM4MTUsIDB4NzlBQzUxODQsIDB4RTNEMTBDNUMsIDB4NDUyNDEwRkIsIDB4REZEM0ExNDgsIDB4RTAzMzZFNDYsIDB4NEUyODc1OTksIDB4MTJCNzUwQTksIDB4REFDMERFNDcsCi0weEMxODQ1OUE5LCAweEM3NjRDRDMwLCAweDIzMzQ2NzVFLCAweEY2NDkwREI4LCAweDQ5MTcyNjc5LCAweDY1OUI2OTk0LCAweDdBOTEyNjkxLCAweEIyQjc2MDc0LCAweEI5RTU4NzA0LCAweENDMzNEOUE5LCAweDIwN0Y2QTcsIDB4QzQwNUY4MDEsIDB4NTYwMjk3Q0YsIDB4NDgxNDBFNUYsIDB4QzQ0RTY3NkEsIDB4QjE5MURFRCwKLTB4MTEwMzVGNjAsIDB4NUIxRjYwQjQsIDB4QTRFQjE0NDMsIDB4NUE2QzA2RTYsIDB4MTkxNUFFOSwgMHgzM0NEMjY5NiwgMHg4NzlGNDQ0NCwgMHhENDQyMTcwQiwgMHhDOUM5RDlENiwgMHhBMUQ0QzEyNCwgMHhDNDAzNjZCNywgMHgyMjQ5N0U5LCAweENEMThEN0Y5LCAweDk5RkQxMTFBLCAweDlGNkI1M0ExLCAweEUwNTFBQkZDLAotMHhCQzEwMDcxRCwgMHhBNTY2QTc1OSwgMHg2REJDNUU1LCAweDRBOURBODUxLCAweDIyNjZCMTUsIDB4MTIzRDZFOUIsIDB4NjZFMDU0NDksIDB4RDEwRDM4NzAsIDB4MTcwNkU0NjIsIDB4QUYwQjlCNTEsIDB4RTAxMDlENkMsIDB4RjE0NDg2MUIsIDB4ODEzRUQwMUIsIDB4QjY0OTZDMTAsIDB4MUVEMDA3NjgsIDB4NjA3NDdDMTAsCi0weDQ2NDk0Mzc2LCAweDVFNEMxMEIwLCAweDU3M0Q1OTA2LCAweDVBMDJFNUZFLCAweEIzRTAwNUYyLCAweEMwNUM0RjQ1LCAweERCRDU4OTgyLCAweDZEMTMxNzFGLCAweDk3NDFGQTAwLCAweDYxREI4NTIsIDB4OEQ0NkQyOTksIDB4NDc0MjFFNEQsIDB4NzRBOTRFNiwgMHg0REEzMUNEMywgMHg2ODE2MDJGRiwgMHhDNjc5NjJENywKLTB4MTU2MEJCQSwgMHhGODg0OUQ4NSwgMHg3REQ2RDVCOCwgMHg1QjZCNDY0MCwgMHg0NDFBMzQ5RiwgMHg2MUIzNjAxRiwgMHhENTUwRTJEMywgMHhDRjE4MTExQiwgMHg5NzY3MzMzMywgMHhDNTk5MDlFNCwgMHg1N0RBRTg0MCwgMHhCQjkxMEU1LCAweDE0NDQ4NEY5LCAweEE4NUMyNTExLCAweDQwOTJENUVBLCAweDg5OTEwMzkxLAotMHg3RDM4NTUwMCwgMHgzRDFEMjE3NiwgMHg4MDJGRDQxQiwgMHhBNUQ5NDg5MCwgMHg2NTZFOTA5OSwgMHhFNjY5MDZFNiwgMHg0MzMxQTJENSwgMHg0NDc4RTI1QiwgMHhFNzhDNDFELCAweDM1NjVEOTc5LCAweDQxNDcxMzNCLCAweDg5QzZDNjRBLCAweDQ1QzlDRENGLCAweDUzMjMxNUZBLCAweDNFNUEwRDA0LCAweEIxMTFEQkZDLAotMHg2MzE2MkZGNywgMHg5RTBCOUNEMCwgMHhBNzU4RTQ2QiwgMHhBMDk3NDIxRiwgMHhBRTU0NDI2MiwgMHhBNTlBNURERCwgMHgzNzMyMjYxRCwgMHg3MTczNjc5MCwgMHg4ODk1QTE3MywgMHg2ODc0NzBCMSwgMHg1N0U1NjRGRSwgMHg2QTc2NTQwNCwgMHhGNUUyMTQ4MiwgMHg2NjcxNTBFMSwgMHhDMEE3NjREOSwgMHg4OTk1MEMxNCwKLTB4Mzc1NjkxMkIsIDB4MzkxMzQ5OSwgMHg2RkI1NTNDMywgMHgyOTkyMDk5NSwgMHg3NTBFQzczOCwgMHhDMzVDNjk5MiwgMHhBQTU1RTQwNCwgMHhDQjRCMDc1MywgMHgyMDM5NjE1NiwgMHhEQjA0RjRDMSwgMHg3ODc2ODI1RiwgMHhENTYyMzE5QSwgMHg1OTJEMTIxQiwgMHhGOTM2MDk1NiwgMHg0NzgxMUI0NywgMHhEOUJENTg4NCwKLTB4MTcwQTM1RSwgMHg4NDRFRTU5QSwgMHg4Njg0RUREQSwgMHg0MDVGMTAwMCwgMHg4MTM2NDFBNywgMHgxNzY2ODFBMiwgMHg3REJFNjQ0MCwgMHg4N0M2QTU0LCAweEM0ODVEOTA1LCAweDFBQjA4MTFELCAweERCQTU5MjkxLCAweEZBNTI4MTdDLCAweDM5ODFFNUYwLCAweDUxMDlGRUU1LCAweEMxMjg0NTU3LCAweDU3M0IyNzAzLAotMHgzMDY0MDY1OSwgMHhGMUQzRTk5NywgMHg5MDYyNTNCNywgMHg5MDc2QzNGRCwgMHhDQTM0RDM1QywgMHhGNDgxNDkxQywgMHg1OTc2QTRDMCwgMHgzRkYxMTQ0LCAweDI2MTcwNjQ5LCAweDE5NkI5MDY1LCAweDkwNjkzRDA5LCAweEYwMjExQTE3LCAweEFGMDE2REQ0LCAweDRFNDQ5QzQ4LCAweDZGOUE4NEY0LCAweEI0NDQ5ODE4LAotMHg2MDZEQjE0NCwgMHg5MTZCOTdBNiwgMHhFQkQwRkQxOSwgMHhBQTA4RDU0MSwgMHhENzFCRTUwNSwgMHgxRTY1MDdBRiwgMHgzRTRCMTM2MSwgMHhGMzkxNjE5LCAweDQyNjRCQzUwLCAweDYwNTYzMzIxLCAweDRBMzcwNjE3LCAweDQzNjQ1MkU3LCAweEJFMTA3NjA0LCAweEREQTlDMThFLCAweEJGNUIwMzcxLCAweDkwNkYxMTA3LAotMHg1NUM1QzgzQywgMHgzMTM2NDc4MiwgMHg2OEREOUYxLCAweEY5OTYwN0U2LCAweDI5OTYzNjdFLCAweDVBRjQ0NTgsIDB4OTY1ODJEMzAsIDB4QzRFNEQ5OEEsIDB4RTY4NzE5QkUsIDB4MjBDNTZDNjQsIDB4NUE1NTAyNDYsIDB4Qjc1OUIwNzksIDB4NjQ0MzlCRkIsIDB4QjEyNDBEMkUsIDB4MjcxMzUwQjIsIDB4NDMxNEFGNTYsCi0weEE5OTk4RDcyLCAweDVFOEQxNDgxLCAweEI2NUQ3MjUzLCAweDY2OTM5MkI4LCAweEYwOTE5QjZDLCAweDlGOTc5MERELCAweDYwOTc5ODM4LCAweDNENjI1MTY4LCAweDEyMTk2RDU4LCAweDU5RTk0NDhBLCAweDMwNTQ3QzkyLCAweDhFMzE3NTkwLCAweDdCOTU0ODQzLCAweDMyM0Q0OTA3LCAweDVBNEQ1MzA4LCAweEQxMDQ5MERCLAotMHg5MkNFNDUxMSwgMHhCOTM1MzEyNSwgMHhBOTFGNDA1MCwgMHhEQzQ4NUQwOCwgMHgyRjExNzQyLCAweEI5QjQwOTBGLCAweEQwOTg5MUZGLCAweDk1MDM5MzYsIDB4ODBFMzUwNUYsIDB4RUQ5OTQwNUYsIDB4RUE5MDU4REUsIDB4NTUwMTlGQzAsIDB4OUExRjQxMkMsIDB4NDcxNjYwREEsIDB4RjREMEM1MDUsIDB4NDkyNjY2NkQsCi0weDQxOTFDM0VGLCAweDFBMDUyNkY1LCAweDU1Rjg4OUM3LCAweEQzM0NDNzM4LCAweDdBNjZDNjAxLCAweEY3MDFDNjYyLCAweDZFOTUzOTA2LCAweDZFNjU1OUFELCAweDE2MjZDNTdBLCAweEUwMDc1MjY2LCAweDY3MDY5QTVCLCAweEE1RjcwNDAxLCAweDQ3Nzg2MDkwLCAweDgxMTFDNTNCLCAweEI0NjQwQjFBLCAweDI2OUQ1REFFLAotMHg1MEM0QTQ3NCwgMHgyQTk0OTg3RCwgMHg0NEMwNTIyNiwgMHg2MTE0NDIzRiwgMHhCODQ3NEYxRCwgMHg4RTBFMDVEOCwgMHg4N0I0MEZEMiwgMHgxRjQzOTJGRCwgMHgxNzBFOTk1LCAweDE1NjNERTAsIDB4NkY5QUM1Q0EsIDB4NzUyQTBEMUQsIDB4RkYwQTQ0RDAsIDB4N0ZEMEQzNjYsIDB4NTFBNjJFMDUsIDB4RDBENUU4REUsCi0weDU2MTEzRjMwLCAweEU0MDU2RDg3LCAweEFCM0I1MTAwLCAweDQ2NTM5QzYsIDB4N0Y2NzYyOTAsIDB4Qjg1MTEzMEQsIDB4RjVFMDkxODMsIDB4NjRBQzVEMkQsIDB4NTVGOTQwNEIsIDB4RTI1NkY5NzcsIDB4NzA2MTc3NjAsIDB4RUU0OEU0NTAsIDB4REQ1RTM1QzgsIDB4OTRENDAwRjgsIDB4NDQ2QTA2NjcsIDB4RUE5MzUxODQsCi0weDQ2NEIwN0Y4LCAweDhDNzRCNkQ0LCAweDhEOUQ1OUE1LCAweENFQzZBREQ1LCAweDJEMDk1NkEzLCAweEE1QkE1MTAzLCAweDMxMzUzMTIzLCAweDU1RkY0MTQwLCAweEEyNDQwRjE1LCAweDg5MjY2NzkyLCAweDQ0RTFFMTU0LCAweEU1QjQxMzM4LCAweDJGQ0U5OTAxLCAweDk1RTY4MTFCLCAweDQ3NUM4NzEsIDB4QUU5RTRBNDQsCi0weDVFMEQxNDEsIDB4RTcwMkQ2NkIsIDB4NDc0NzA3RTIsIDB4NjQ4NkNCQzUsIDB4NzQ3NjAxNkUsIDB4QjFEMjlCNTYsIDB4N0EzNEM2MDUsIDB4NTE0Mjc5MDYsIDB4RTc5NjdGOTcsIDB4NjVEMjlDOTAsIDB4NTUwODFBRCwgMHhENkU2NDA0NSwgMHg2NzEzNDM2OCwgMHg5MTAxRTZERCwgMHg2ODk1Nzg0MSwgMHgzRDNENTkwOSwKLTB4RTA1MjVCQUYsIDB4MTM0QTREM0MsIDB4QzFCMTE5MDksIDB4MTY0OTNCNzYsIDB4NkI5NkQwQTAsIDB4QkYwRTc5RDYsIDB4MkM3MDk2RjksIDB4OTBGQzA0RDYsIDB4MTc0MkU0NzIsIDB4NTMxQ0ExQUMsIDB4REFEMDg2NDYsIDB4OTA2NjY2OSwgMHhBNzU4OEQ4NiwgMHg5MTNDNTRDMiwgMHg3NDJBNDUxNCwgMHgxNzExMUFCQywKLTB4REREN0VERTUsIDB4NjY5OUM0OTgsIDB4NzUzMTMxMzUsIDB4RTQ5OTVGNjQsIDB4MjU4MjY2N0UsIDB4OUM1QzRDNDgsIDB4MUQwRDEwRDksIDB4NUI0QzE2NCwgMHg0NkU2MTZDQiwgMHhEMTg0NDRCRiwgMHhFMUQ0Njk1QywgMHg0MDA5NUU5OSwgMHhFQ0UwMjk1NSwgMHhGRjQwQTQxMSwgMHg1NEQyNDIxQiwgMHhFMUM3REIwNSwKLTB4ODBFNTA5NUQsIDB4Njc0NUU5MDcsIDB4QTYxOTcwMDcsIDB4NzYwNjc0RjksIDB4MTUyMjE3MEEsIDB4NjUxODFGRiwgMHhFMEZEQTQ1LCAweDUyMUM3ODY3LCAweDZCOTFEMzgyLCAweDY1N0E4M0MxLCAweDczQzk4QzM1LCAweEIzQ0MzMUQ2LCAweDE2NEIyNTdCLCAweDZGOTYwNUY5LCAweDUyRjQ5RUI1LCAweDg3NTkyOTA3LAotMHgxQjEwRDZGOCwgMHg5NDlGRDU0LCAweDkxMDMxNUJBLCAweDQwRjA5QjQ3LCAweEI3NjFDMTQ0LCAweDZEMDM5RDUsIDB4NTlCMTEzRiwgMHhFNUM2RDksIDB4MTc2OTkwRkIsIDB4OTBGOEE0NjUsIDB4NkRCOEQxNDQsIDB4NDU1MkUzOTIsIDB4Qzk0Mzk2QjksIDB4MzYzMTVBOTcsIDB4N0U4NzQyMTUsIDB4NDAxMTZGNkYsCi0weERGMTkzNDAxLCAweDcwNjg5MzE3LCAweDdFMDIxNzQwLCAweEQ1QzA0NEJELCAweEYxNjM2RTk0LCAweDVCMEQzNEExLCAweDEwMjdGNjg5LCAweDQ0QTQ1NTkwLCAweEQ0NDMwMzVGLCAweEQ3QTQ0MThDLCAweEQ5NDlGNDgwLCAweDg0QzFFMTU0LCAweDYwOTA5NjZFLCAweDQwQjU2QzFFLCAweDk2NjlDNTQwLCAweEE2MzA1NTA1LAotMHgxNjY3RTI0NCwgMHhDMjQ1ODg1RCwgMHhENTA0QTVFLCAweEE0RjBDNTQ5LCAweDM1ODQ3MkE4LCAweEM0MTRCRjIwLCAweDQzMzY5NzI5LCAweEIxMTEyNzExLCAweDc4NjQ0MzUyLCAweDgxMUNCODU2LCAweDZGOTc5MkYwLCAweDFFMUU0MTk1LCAweDYyQzU4QzE0LCAweDI2MTlEM0EyLCAweDk5ODA1NkJELCAweDY1M0YzNDEwLAotMHg5MTkxODRFNCwgMHg2NDkwNkQ2QywgMHhFM0Q3OTk2LCAweDQ3NjYwNTYzLCAweDUwQTkxRjAzLCAweDQ5RjhDNUNCLCAweEZFMTUyMzVFLCAweDk3ODM0NTEsIDB4NzE2MjU3QjcsIDB4MUFCNTM1MSwgMHgxNzEwREM4NCwgMHgzRkEwMUQ1QSwgMHg5ODQ0QUQ2NCwgMHhFNEQ5MDFCQywgMHhFRTU0NjM1MiwgMHhGOTU0Nzk4NywKLTB4RjY4MzRCNDcsIDB4QjY1MUY2RCwgMHhFMDlDOTA0NSwgMHhFNDkxNDI0RSwgMHg5NEY5MDUwQiwgMHg3REE2MDkxRCwgMHhCNUMxNEQ3NCwgMHgxMjNBNjk5RCwgMHgxRjQxM0NDMywgMHg5RjQzNDE1OCwgMHg1NUQ4QzhDNCwgMHg1MTEwNkZGLCAweEQzNkNCMUMsIDB4MTU0MUZDRTEsIDB4QzMzNDRFRDMsIDB4M0UyOUQ5MDUsCi0weDE1MEE2NTc5LCAweDUwMjQ3NUEsIDB4NDU0QjBGMDQsIDB4NjU5MDI3MjIsIDB4OUVBMDU1LCAweDI2NTY4Q0M1LCAweDdFQjE0NDMsIDB4NDIxODZGOTYsIDB4MTMyMzU3QTksIDB4NzQwOTFGMTMsIDB4RUU1NTQ4MEYsIDB4N0EwQjRBNDUsIDB4RjAxQTg2MzcsIDB4OTM3RDY4RDUsIDB4RTI2MTExMTUsIDB4OEE4NTM2NjMsCi0weDYwRDI5NUFCLCAweDE5NDY0NjFBLCAweEJCNTE5MEExLCAweDZENTE0MjE4LCAweDdDNjQ4MkNGLCAweDg3NTlBQ0M4LCAweDdFODZDODA1LCAweDQyRDM3NTVGLCAweEY0QzEwNTI5LCAweDQ3MUYxNDAwLCAweDUzOTQyMzhDLCAweDExMkQ1NEE4LCAweDU1RTQ1MEY4LCAweERDMjE5MUJBLCAweEE1RjkzMDExLCAweDFBMjE1OUY1LAotMHg0MDUxQTI5NywgMHg2NjA2Njk5OSwgMHhBNjQ0QzA1OCwgMHg1NEVDOTE0OCwgMHhGQUZCMDE0NiwgMHgxMTUwRkNFQywgMHg0MTQxRDE3MSwgMHhGMDlGMDQ0NCwgMHg0ODhFNUUwRSwgMHgzRDE5MEYxMCwgMHg0MDZFNDA1RiwgMHhGRTk5MDRBRCwgMHgxMDFGNUM2RiwgMHg0NTRCMDkzQiwgMHg0MDk0NkMxRiwgMHhGMEI5NjZELAotMHhDMTY0NjREQiwgMHg5MUUyRDZGOSwgMHg5Nzc4OTA3NCwgMHg1MzdDNUM0MCwgMHg0NEE1MzNDMywgMHg3NDEwMkIzMywgMHg0MEQ0MjVDMSwgMHhENzQ4QzkzNiwgMHg3ODY2MTlDOSwgMHg0MDkxNzk4NSwgMHg2NjU5NEMxQywgMHgyRjA1RDJEMiwgMHg4QzcxMUI0LCAweEY5NjAyNzU3LCAweDEwMTM4NTRBLCAweDdENjI5NkQwLAotMHgzRDk5QjhGMCwgMHg0OTVEMzI0MywgMHg5MTY4NjRCRSwgMHg0RTQzQjk0NywgMHhFNzU2QTExMCwgMHhBOEQwOUQ3RCwgMHhCRjYyNTA5NSwgMHhDMUQ0OEY4NywgMHg4QkQ0NzA5OSwgMHhEQjYzMTMxNSwgMHhFNTQxMzlBMCwgMHhFNERDOUM2MywgMHg4NDZDMjU0NCwgMHg0RjBFMDREMSwgMHhFMEIxNUIyNiwgMHgzMjQ5NDk5RCwKLQotfQpkaWZmIC0tZ2l0IGEvdHJhbnNjb2Rlci9iYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGUuaCBiL3RyYW5zY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZWRmOTQuLjAwMDAwMDAKLS0tIGEvdHJhbnNjb2Rlci9iYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0vLyBiYXNpc3VfZ2xvYmFsX3NlbGVjdG9yX3BhbGV0dGUuaAotLy8gQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgQmlub21pYWwgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gCi0vLyBUT0RPOiBOT05FIG9mIHRoaXMgaXMgdXNlZCBpbiAuYmFzaXMvLmt0eDIgZmlsZXMuIEl0IHdpbGwgYmUgZGVsZXRlZCBzb29uLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlICJiYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotbmFtZXNwYWNlIGJhc2lzdAotewotCWNsYXNzIGV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIKLQl7Ci0JcHVibGljOgotCQllbnVtIHsgY1RvdGFsQml0cyA9IDE1LCBjVG90YWxWYWx1ZXMgPSAxIDw8IGNUb3RhbEJpdHMgfTsKLQotCQlldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyKHVpbnQzMl90IGluZGV4ID0gMCkKLQkJewotI2lmZGVmIF9ERUJVRwotCQkJc3RhdGljIGJvb2wgc190ZXN0ZWQ7Ci0JCQlpZiAoIXNfdGVzdGVkKQotCQkJewotCQkJCXNfdGVzdGVkID0gdHJ1ZTsKLQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY1RvdGFsVmFsdWVzOyBpKyspCi0JCQkJewotCQkJCQlldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyIG0oaSk7Ci0JCQkJCWV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgbiA9IG07Ci0KLQkJCQkJYXNzZXJ0KG4uZ2V0X2luZGV4KCkgPT0gaSk7Ci0JCQkJfQotCQkJfQotI2VuZGlmCi0KLQkJCXNldF9pbmRleChpbmRleCk7Ci0JCX0KLQotCQl2b2lkIHNldF9pbmRleCh1aW50MzJfdCBpbmRleCkKLQkJewotCQkJYXNzZXJ0KGluZGV4IDwgY1RvdGFsVmFsdWVzKTsKLQkJCW1fcm90ID0gaW5kZXggJiAzOwotCQkJbV9mbGlwID0gKGluZGV4ID4+IDIpICYgMTsKLQkJCW1faW52ID0gKGluZGV4ID4+IDMpICYgMTsKLQkJCW1fY29udHJhc3QgPSAoaW5kZXggPj4gNCkgJiAzOwotCQkJbV9zaGlmdCA9IChpbmRleCA+PiA2KSAmIDE7Ci0JCQltX21lZGlhbiA9IChpbmRleCA+PiA3KSAmIDE7Ci0JCQltX2RpdiA9IChpbmRleCA+PiA4KSAmIDE7Ci0JCQltX3JhbmQgPSAoaW5kZXggPj4gOSkgJiAxOwotCQkJbV9kaWxhdGUgPSAoaW5kZXggPj4gMTApICYgMTsKLQkJCW1fc2hpZnRfeCA9IChpbmRleCA+PiAxMSkgJiAxOwotCQkJbV9zaGlmdF95ID0gKGluZGV4ID4+IDEyKSAmIDE7Ci0JCQltX2Vyb2RlID0gKGluZGV4ID4+IDEzKSAmIDE7Ci0JCQltX2hpZ2hfcGFzcyA9IChpbmRleCA+PiAxNCkgJiAxOwotCQl9Ci0KLQkJdWludDMyX3QgZ2V0X2luZGV4KCkgY29uc3QKLQkJewotCQkJcmV0dXJuIG1fcm90IHwgKG1fZmxpcCA8PCAyKSB8IChtX2ludiA8PCAzKSB8IChtX2NvbnRyYXN0IDw8IDQpIHwgKG1fc2hpZnQgPDwgNikgfCAobV9tZWRpYW4gPDwgNykgfCAobV9kaXYgPDwgOCkgfCAobV9yYW5kIDw8IDkpIHwgKG1fZGlsYXRlIDw8IDEwKSB8IChtX3NoaWZ0X3ggPDwgMTEpIHwgKG1fc2hpZnRfeSA8PCAxMikgfCAobV9lcm9kZSA8PCAxMykgfCAobV9oaWdoX3Bhc3MgPDwgMTQpOwotCQl9Ci0KLQkJdm9pZCBjbGVhcigpCi0JCXsKLQkJCWJhc2lzdTo6Y2xlYXJfb2JqKCp0aGlzKTsKLQkJfQotCi0JCXVpbnQ4X3QgbV9jb250cmFzdDsKLQkJYm9vbCBtX3JhbmQ7Ci0JCWJvb2wgbV9tZWRpYW47Ci0JCWJvb2wgbV9kaXY7Ci0JCWJvb2wgbV9zaGlmdDsKLQkJYm9vbCBtX2ludjsKLQkJYm9vbCBtX2ZsaXA7Ci0JCWJvb2wgbV9kaWxhdGU7Ci0JCWJvb2wgbV9zaGlmdF94OwotCQlib29sIG1fc2hpZnRfeTsKLQkJYm9vbCBtX2Vyb2RlOwotCQlib29sIG1faGlnaF9wYXNzOwotCQl1aW50OF90IG1fcm90OwotCX07Ci0KLQllbnVtIG1vZGlmaWVyX3R5cGVzCi0JewotCQljTW9kaWZpZXJDb250cmFzdCwKLQkJY01vZGlmaWVyUmFuZCwKLQkJY01vZGlmaWVyTWVkaWFuLAotCQljTW9kaWZpZXJEaXYsCi0JCWNNb2RpZmllclNoaWZ0LAotCQljTW9kaWZpZXJJbnYsCi0JCWNNb2RpZmllckZsaXBwZWRBbmRSb3RhdGVkLAotCQljTW9kaWZpZXJEaWxhdGUsCi0JCWNNb2RpZmllclNoaWZ0WCwKLQkJY01vZGlmaWVyU2hpZnRZLAotCQljTW9kaWZpZXJFcm9kZSwKLQkJY01vZGlmaWVySGlnaFBhc3MsCi0JCWNUb3RhbE1vZGlmaWVycwotCX07Ci0KLSNkZWZpbmUgRVRDMV9HTE9CQUxfU0VMRUNUT1JfQ09ERUJPT0tfTUFYX01PRF9CSVRTIChldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyOjpjVG90YWxCaXRzKQotCi0Jc3RydWN0IGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeQotCXsKLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5KCkKLQkJewotCQkJY2xlYXIoKTsKLQkJfQotCi0JCXZvaWQgY2xlYXIoKQotCQl7Ci0JCQliYXNpc3U6OmNsZWFyX29iaigqdGhpcyk7Ci0JCX0KLQotCQl1aW50OF90IG9wZXJhdG9yW10gKHVpbnQzMl90IGkpIGNvbnN0IHsgYXNzZXJ0KGkgPCAxNik7IHJldHVybiBtX3NlbGVjdG9yc1tpXTsgfQotCQl1aW50OF90Jm9wZXJhdG9yW10gKHVpbnQzMl90IGkpIHsgYXNzZXJ0KGkgPCAxNik7IHJldHVybiBtX3NlbGVjdG9yc1tpXTsgfQotCi0JCXZvaWQgc2V0X3VpbnQzMih1aW50MzJfdCB2KQotCQl7Ci0JCQlmb3IgKHVpbnQzMl90IGJ5dGVfaW5kZXggPSAwOyBieXRlX2luZGV4IDwgNDsgYnl0ZV9pbmRleCsrKQotCQkJewotCQkJCXVpbnQzMl90IGIgPSAodiA+PiAoYnl0ZV9pbmRleCAqIDgpKSAmIDB4RkY7Ci0KLQkJCQltX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDBdID0gYiAmIDM7Ci0JCQkJbV9zZWxlY3RvcnNbYnl0ZV9pbmRleCAqIDQgKyAxXSA9IChiID4+IDIpICYgMzsKLQkJCQltX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDJdID0gKGIgPj4gNCkgJiAzOwotCQkJCW1fc2VsZWN0b3JzW2J5dGVfaW5kZXggKiA0ICsgM10gPSAoYiA+PiA2KSAmIDM7Ci0JCQl9Ci0JCX0KLQotCQl1aW50MzJfdCBnZXRfdWludDMyKCkgY29uc3QKLQkJewotCQkJcmV0dXJuIGdldF9ieXRlKDApIHwgKGdldF9ieXRlKDEpIDw8IDgpIHwgKGdldF9ieXRlKDIpIDw8IDE2KSB8IChnZXRfYnl0ZSgzKSA8PCAyNCk7Ci0JCX0KLQotCQl1aW50MzJfdCBnZXRfYnl0ZSh1aW50MzJfdCBieXRlX2luZGV4KSBjb25zdAotCQl7Ci0JCQlhc3NlcnQoYnl0ZV9pbmRleCA8IDQpOwotCi0JCQlyZXR1cm4gbV9zZWxlY3RvcnNbYnl0ZV9pbmRleCAqIDQgKyAwXSB8Ci0JCQkJKG1fc2VsZWN0b3JzW2J5dGVfaW5kZXggKiA0ICsgMV0gPDwgMikgfAotCQkJCShtX3NlbGVjdG9yc1tieXRlX2luZGV4ICogNCArIDJdIDw8IDQpIHwKLQkJCQkobV9zZWxlY3RvcnNbYnl0ZV9pbmRleCAqIDQgKyAzXSA8PCA2KTsKLQkJfQotCi0JCXVpbnQ4X3Qgb3BlcmF0b3IoKSh1aW50MzJfdCB4LCB1aW50MzJfdCB5KSBjb25zdCB7IGFzc2VydCgoeCA8IDQpICYmICh5IDwgNCkpOyByZXR1cm4gbV9zZWxlY3RvcnNbeCArIHkgKiA0XTsgfQotCQl1aW50OF90Jm9wZXJhdG9yKCkodWludDMyX3QgeCwgdWludDMyX3QgeSkgeyBhc3NlcnQoKHggPCA0KSAmJiAoeSA8IDQpKTsgcmV0dXJuIG1fc2VsZWN0b3JzW3ggKyB5ICogNF07IH0KLQotCQl1aW50MzJfdCBjYWxjX2Rpc3RhbmNlKGNvbnN0IGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSAmb3RoZXIpIGNvbnN0Ci0JCXsKLQkJCXVpbnQzMl90IGRpc3QgPSAwOwotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7IGkrKykKLQkJCXsKLQkJCQlpbnQgZGVsdGEgPSBzdGF0aWNfY2FzdDxpbnQ+KG1fc2VsZWN0b3JzW2ldKSAtIHN0YXRpY19jYXN0PGludD4ob3RoZXIubV9zZWxlY3RvcnNbaV0pOwotCQkJCWRpc3QgKz0gZGVsdGEgKiBkZWx0YTsKLQkJCX0KLQkJCXJldHVybiBkaXN0OwotCQl9Ci0KLSNpZiAwCi0JCXVpbnQzMl90IGNhbGNfaGFtbWluZ19kaXN0KGNvbnN0IGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSAmb3RoZXIpIGNvbnN0Ci0JCXsKLQkJCXVpbnQzMl90IGRpc3QgPSAwOwotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7IGkrKykKLQkJCQlkaXN0ICs9IGdfaGFtbWluZ19kaXN0W2dldF9ieXRlKGkpIF4gb3RoZXIuZ2V0X2J5dGUoaSldOwotCQkJcmV0dXJuIGRpc3Q7Ci0JCX0KLSNlbmRpZgotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfaW52ZXJ0ZWQoKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCQlyZXN1bHQubV9zZWxlY3RvcnNbaV0gPSAzIC0gbV9zZWxlY3RvcnNbaV07Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X2RpdmlkZWQoKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQljb25zdCB1aW50OF90IGRpdl9zZWxlY3Rvcls0XSA9IHsgMiwgMCwgMywgMSB9OwotCi0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCQlyZXN1bHQubV9zZWxlY3RvcnNbaV0gPSBkaXZfc2VsZWN0b3JbbV9zZWxlY3RvcnNbaV1dOwotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9zaGlmdGVkKGludCBkZWx0YSkgY29uc3QKLQkJewotCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHJlc3VsdDsKLQotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspCi0JCQkJcmVzdWx0Lm1fc2VsZWN0b3JzW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYmFzaXN1OjpjbGFtcDxpbnQ+KG1fc2VsZWN0b3JzW2ldICsgZGVsdGEsIDAsIDMpKTsKLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfcmFuZG9taXplZCgpIGNvbnN0Ci0JCXsKLQkJCXVpbnQzMl90IHNlZWQgPSBnZXRfdWludDMyKCk7Ci0KLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByZXN1bHQ7Ci0KLQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQl7Ci0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQl7Ci0JCQkJCWludCBzID0gKCp0aGlzKSh4LCB5KTsKLQotCQkJCQkvLyBiZXR3ZWVuIDAgYW5kIDEwCi0JCQkJCXVpbnQzMl90IGkgPSBiYXNpc2RfdXJhbmQoc2VlZCwgNikgKyBiYXNpc2RfdXJhbmQoc2VlZCwgNik7Ci0JCQkJCWlmIChpID09IDApCi0JCQkJCQlzIC09IDI7Ci0JCQkJCWVsc2UgaWYgKGkgPT0gMTApCi0JCQkJCQlzICs9IDI7Ci0JCQkJCWVsc2UgaWYgKGkgPCAzKQotCQkJCQkJcyAtPSAxOwotCQkJCQllbHNlIGlmIChpID4gNykKLQkJCQkJCXMgKz0gMTsKLQotCQkJCQlyZXN1bHQoeCwgeSkgPSBzdGF0aWNfY2FzdDx1aW50OF90PihiYXNpc3U6OmNsYW1wPGludD4ocywgMCwgMykpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfY29udHJhc3QoaW50IHRhYmxlX2luZGV4KSBjb25zdAotCQl7Ci0JCQlhc3NlcnQodGFibGVfaW5kZXggPCA0KTsKLQotCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHJlc3VsdDsKLQotCQkJc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc19jb250cmFzdF90YWJsZXNbNF1bNF0gPQotCQkJewotCQkJCXsgMCwgMSwgMiwgMyB9LCAvLyBub3QgdXNlZAotCQkJCXsgMCwgMCwgMywgMyB9LAotCQkJCXsgMSwgMSwgMiwgMiB9LAotCQkJCXsgMSwgMSwgMywgMyB9Ci0JCQl9OwotCi0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCXsKLQkJCQlyZXN1bHRbaV0gPSBzX2NvbnRyYXN0X3RhYmxlc1t0YWJsZV9pbmRleF1bKCp0aGlzKVtpXV07Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X2RpbGF0ZWQoKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJewotCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJewotCQkJCQl1aW50MzJfdCBtYXhfc2VsZWN0b3IgPSAwOwotCi0JCQkJCWZvciAoaW50IHlkID0gLTE7IHlkIDw9IDE7IHlkKyspCi0JCQkJCXsKLQkJCQkJCWludCBmeSA9IHkgKyB5ZDsKLQkJCQkJCWlmICgoZnkgPCAwKSB8fCAoZnkgPiAzKSkKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJZm9yIChpbnQgeGQgPSAtMTsgeGQgPD0gMTsgeGQrKykKLQkJCQkJCXsKLQkJCQkJCQlpbnQgZnggPSB4ICsgeGQ7Ci0JCQkJCQkJaWYgKChmeCA8IDApIHx8IChmeCA+IDMpKQotCQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJCW1heF9zZWxlY3RvciA9IGJhc2lzdTo6bWF4aW11bTx1aW50MzJfdD4obWF4X3NlbGVjdG9yLCAoKnRoaXMpKGZ4LCBmeSkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmVzdWx0KHgsIHkpID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obWF4X3NlbGVjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X2Vyb2RlZCgpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSByZXN1bHQ7Ci0KLQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQl7Ci0JCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQl7Ci0JCQkJCXVpbnQzMl90IG1pbl9zZWxlY3RvciA9IDk5OwotCi0JCQkJCWZvciAoaW50IHlkID0gLTE7IHlkIDw9IDE7IHlkKyspCi0JCQkJCXsKLQkJCQkJCWludCBmeSA9IHkgKyB5ZDsKLQkJCQkJCWlmICgoZnkgPCAwKSB8fCAoZnkgPiAzKSkKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJZm9yIChpbnQgeGQgPSAtMTsgeGQgPD0gMTsgeGQrKykKLQkJCQkJCXsKLQkJCQkJCQlpbnQgZnggPSB4ICsgeGQ7Ci0JCQkJCQkJaWYgKChmeCA8IDApIHx8IChmeCA+IDMpKQotCQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJCW1pbl9zZWxlY3RvciA9IGJhc2lzdTo6bWluaW11bTx1aW50MzJfdD4obWluX3NlbGVjdG9yLCAoKnRoaXMpKGZ4LCBmeSkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmVzdWx0KHgsIHkpID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obWluX3NlbGVjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X3NoaWZ0X3goKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJewotCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJewotCQkJCQlpbnQgc3ggPSB4IC0gMTsKLQkJCQkJaWYgKHN4IDwgMCkKLQkJCQkJCXN4ID0gMDsKLQotCQkJCQlyZXN1bHQoeCwgeSkgPSAoKnRoaXMpKHN4LCB5KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X3NoaWZ0X3koKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJewotCQkJCWludCBzeSA9IHkgLSAxOwotCQkJCWlmIChzeSA8IDApCi0JCQkJCXN5ID0gMzsKLQotCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJCXJlc3VsdCh4LCB5KSA9ICgqdGhpcykoeCwgc3kpOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9tZWRpYW4oKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcmVzdWx0OwotCi0JCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJewotCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJewotCQkJCQkvLyBBQkMKLQkJCQkJLy8gRCBGCi0JCQkJCS8vIEdISQotCi0JCQkJCXVpbnQ4X3Qgc2VsZWN0b3JzWzhdOwotCQkJCQl1aW50MzJfdCBuID0gMDsKLQotCQkJCQlmb3IgKGludCB5ZCA9IC0xOyB5ZCA8PSAxOyB5ZCsrKQotCQkJCQl7Ci0JCQkJCQlpbnQgZnkgPSB5ICsgeWQ7Ci0JCQkJCQlpZiAoKGZ5IDwgMCkgfHwgKGZ5ID4gMykpCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJCWZvciAoaW50IHhkID0gLTE7IHhkIDw9IDE7IHhkKyspCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCh4ZCB8IHlkKSA9PSAwKQotCQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJCWludCBmeCA9IHggKyB4ZDsKLQkJCQkJCQlpZiAoKGZ4IDwgMCkgfHwgKGZ4ID4gMykpCi0JCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCQkJc2VsZWN0b3JzW24rK10gPSAoKnRoaXMpKGZ4LCBmeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlzdGQ6OnNvcnQoc2VsZWN0b3JzLCBzZWxlY3RvcnMgKyBuKTsKLQotCQkJCQlyZXN1bHQoeCwgeSkgPSBzZWxlY3RvcnNbbiAvIDJdOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBnZXRfaGlnaF9wYXNzKCkgY29uc3QKLQkJewotCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHJlc3VsdDsKLQotCQkJc3RhdGljIGNvbnN0IGludCBrZXJuZWxbM11bM10gPQotCQkJewotCQkJCXsgMCwgIC0xLCAgMCB9LAotCQkJCXsgLTEsICA4LCAtMSB9LAotCQkJCXsgMCwgIC0xLCAgMCB9Ci0JCQl9OwotCi0JCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJewotCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJewotCQkJCQkvLyBBQkMKLQkJCQkJLy8gRCBGCi0JCQkJCS8vIEdISQotCi0JCQkJCWludCBzdW0gPSAwOwotCi0JCQkJCWZvciAoaW50IHlkID0gLTE7IHlkIDw9IDE7IHlkKyspCi0JCQkJCXsKLQkJCQkJCWludCBmeSA9IHkgKyB5ZDsKLQkJCQkJCWZ5ID0gYmFzaXN1OjpjbGFtcDxpbnQ+KGZ5LCAwLCAzKTsKLQotCQkJCQkJZm9yIChpbnQgeGQgPSAtMTsgeGQgPD0gMTsgeGQrKykKLQkJCQkJCXsKLQkJCQkJCQlpbnQgZnggPSB4ICsgeGQ7Ci0JCQkJCQkJZnggPSBiYXNpc3U6OmNsYW1wPGludD4oZngsIDAsIDMpOwotCi0JCQkJCQkJaW50IGsgPSAoKnRoaXMpKGZ4LCBmeSk7Ci0JCQkJCQkJc3VtICs9IGsgKiBrZXJuZWxbeWQgKyAxXVt4ZCArIDFdOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJc3VtID0gc3VtIC8gNDsKLQotCQkJCQlyZXN1bHQoeCwgeSkgPSBzdGF0aWNfY2FzdDx1aW50OF90PihiYXNpc3U6OmNsYW1wPGludD4oc3VtLCAwLCAzKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9mbGlwcGVkX2FuZF9yb3RhdGVkKGJvb2wgZmxpcCwgdWludDMyX3Qgcm90YXRpb25faW5kZXgpIGNvbnN0Ci0JCXsKLQkJCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSB0ZW1wOwotCi0JCQlpZiAoZmxpcCkKLQkJCXsKLQkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJdGVtcCh4LCB5KSA9ICgqdGhpcykoeCwgMyAtIHkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXRlbXAgPSAqdGhpczsKLQkJCX0KLQotCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHJlc3VsdDsKLQotCQkJc3dpdGNoIChyb3RhdGlvbl9pbmRleCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCQlyZXN1bHQgPSB0ZW1wOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJCQlyZXN1bHQoeCwgeSkgPSB0ZW1wKHksIDMgLSB4KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJcmVzdWx0KHgsIHkpID0gdGVtcCgzIC0geCwgMyAtIHkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJCQlyZXN1bHQoeCwgeSkgPSB0ZW1wKDMgLSB5LCB4KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYXNzZXJ0KDApOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9tb2RpZmllZChjb25zdCBldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyICZtb2RpZmllcikgY29uc3QKLQkJewotCQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IHIoKnRoaXMpOwotCi0JCQlpZiAobW9kaWZpZXIubV9zaGlmdF94KQotCQkJCXIgPSByLmdldF9zaGlmdF94KCk7Ci0KLQkJCWlmIChtb2RpZmllci5tX3NoaWZ0X3kpCi0JCQkJciA9IHIuZ2V0X3NoaWZ0X3koKTsKLQotCQkJciA9IHIuZ2V0X2ZsaXBwZWRfYW5kX3JvdGF0ZWQobW9kaWZpZXIubV9mbGlwICE9IDAsIG1vZGlmaWVyLm1fcm90KTsKLQotCQkJaWYgKG1vZGlmaWVyLm1fZGlsYXRlKQotCQkJCXIgPSByLmdldF9kaWxhdGVkKCk7Ci0KLQkJCWlmIChtb2RpZmllci5tX2Vyb2RlKQotCQkJCXIgPSByLmdldF9lcm9kZWQoKTsKLQotCQkJaWYgKG1vZGlmaWVyLm1faGlnaF9wYXNzKQotCQkJCXIgPSByLmdldF9oaWdoX3Bhc3MoKTsKLQotCQkJaWYgKG1vZGlmaWVyLm1fcmFuZCkKLQkJCQlyID0gci5nZXRfcmFuZG9taXplZCgpOwotCi0JCQlpZiAobW9kaWZpZXIubV9kaXYpCi0JCQkJciA9IHIuZ2V0X2RpdmlkZWQoKTsKLQotCQkJaWYgKG1vZGlmaWVyLm1fc2hpZnQpCi0JCQkJciA9IHIuZ2V0X3NoaWZ0ZWQoMSk7Ci0KLQkJCWlmIChtb2RpZmllci5tX2NvbnRyYXN0KQotCQkJCXIgPSByLmdldF9jb250cmFzdChtb2RpZmllci5tX2NvbnRyYXN0KTsKLQotCQkJaWYgKG1vZGlmaWVyLm1faW52KQotCQkJCXIgPSByLmdldF9pbnZlcnRlZCgpOwotCi0JCQlpZiAobW9kaWZpZXIubV9tZWRpYW4pCi0JCQkJciA9IHIuZ2V0X21lZGlhbigpOwotCi0JCQlyZXR1cm4gcjsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeSBhcHBseV9tb2RpZmllcihtb2RpZmllcl90eXBlcyBtb2RfdHlwZSwgY29uc3QgZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllciAmbW9kaWZpZXIpIGNvbnN0Ci0JCXsKLQkJCXN3aXRjaCAobW9kX3R5cGUpCi0JCQl7Ci0JCQljYXNlIGNNb2RpZmllckNvbnRyYXN0OgotCQkJCXJldHVybiBnZXRfY29udHJhc3QobW9kaWZpZXIubV9jb250cmFzdCk7Ci0JCQljYXNlIGNNb2RpZmllclJhbmQ6Ci0JCQkJcmV0dXJuIGdldF9yYW5kb21pemVkKCk7Ci0JCQljYXNlIGNNb2RpZmllck1lZGlhbjoKLQkJCQlyZXR1cm4gZ2V0X21lZGlhbigpOwotCQkJY2FzZSBjTW9kaWZpZXJEaXY6Ci0JCQkJcmV0dXJuIGdldF9kaXZpZGVkKCk7Ci0JCQljYXNlIGNNb2RpZmllclNoaWZ0OgotCQkJCXJldHVybiBnZXRfc2hpZnRlZCgxKTsKLQkJCWNhc2UgY01vZGlmaWVySW52OgotCQkJCXJldHVybiBnZXRfaW52ZXJ0ZWQoKTsKLQkJCWNhc2UgY01vZGlmaWVyRmxpcHBlZEFuZFJvdGF0ZWQ6Ci0JCQkJcmV0dXJuIGdldF9mbGlwcGVkX2FuZF9yb3RhdGVkKG1vZGlmaWVyLm1fZmxpcCAhPSAwLCBtb2RpZmllci5tX3JvdCk7Ci0JCQljYXNlIGNNb2RpZmllckRpbGF0ZToKLQkJCQlyZXR1cm4gZ2V0X2RpbGF0ZWQoKTsKLQkJCWNhc2UgY01vZGlmaWVyU2hpZnRYOgotCQkJCXJldHVybiBnZXRfc2hpZnRfeCgpOwotCQkJY2FzZSBjTW9kaWZpZXJTaGlmdFk6Ci0JCQkJcmV0dXJuIGdldF9zaGlmdF95KCk7Ci0JCQljYXNlIGNNb2RpZmllckVyb2RlOgotCQkJCXJldHVybiBnZXRfZXJvZGVkKCk7Ci0JCQljYXNlIGNNb2RpZmllckhpZ2hQYXNzOgotCQkJCXJldHVybiBnZXRfaGlnaF9wYXNzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCWFzc2VydCgwKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcmV0dXJuICp0aGlzOwotCQl9Ci0KLQkJZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGdldF9tb2RpZmllZChjb25zdCBldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyICZtb2RpZmllciwgdWludDMyX3QgbnVtX29yZGVyLCBjb25zdCBtb2RpZmllcl90eXBlcyAqcE9yZGVyKSBjb25zdAotCQl7Ci0JCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgcigqdGhpcyk7Ci0KLQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fb3JkZXI7IGkrKykKLQkJCXsKLQkJCQlyID0gci5hcHBseV9tb2RpZmllcihwT3JkZXJbaV0sIG1vZGlmaWVyKTsKLQkJCX0KLQotCQkJcmV0dXJuIHI7Ci0JCX0KLQotCQlib29sIG9wZXJhdG9yPCAoY29uc3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5ICZvdGhlcikgY29uc3QKLQkJewotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspCi0JCQl7Ci0JCQkJaWYgKG1fc2VsZWN0b3JzW2ldIDwgb3RoZXIubV9zZWxlY3RvcnNbaV0pCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKG1fc2VsZWN0b3JzW2ldICE9IG90aGVyLm1fc2VsZWN0b3JzW2ldKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWJvb2wgb3BlcmF0b3I9PSAoY29uc3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5ICZvdGhlcikgY29uc3QKLQkJewotCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspCi0JCQl7Ci0JCQkJaWYgKG1fc2VsZWN0b3JzW2ldICE9IG90aGVyLm1fc2VsZWN0b3JzW2ldKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQlwcml2YXRlOgotCQl1aW50OF90IG1fc2VsZWN0b3JzWzE2XTsKLQl9OwotCi0JdHlwZWRlZiBiYXNpc3U6OnZlY3RvcjxldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnk+IGV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeV92ZWM7Ci0KLQlleHRlcm4gY29uc3QgdWludDMyX3QgZ19nbG9iYWxfc2VsZWN0b3JfY2JbXTsKLQlleHRlcm4gY29uc3QgdWludDMyX3QgZ19nbG9iYWxfc2VsZWN0b3JfY2Jfc2l6ZTsKLQotI2RlZmluZSBFVEMxX0dMT0JBTF9TRUxFQ1RPUl9DT0RFQk9PS19NQVhfUEFMX0JJVFMgKDEyKQotCi0Jc3RydWN0IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rX2VudHJ5X2lkCi0JewotCQl1aW50MzJfdCBtX3BhbGV0dGVfaW5kZXg7Ci0JCWV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgbV9tb2RpZmllcjsKLQotCQlldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9va19lbnRyeV9pZCh1aW50MzJfdCBwYWxldHRlX2luZGV4LCBjb25zdCBldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyICZtb2RpZmllcikgOiBtX3BhbGV0dGVfaW5kZXgocGFsZXR0ZV9pbmRleCksIG1fbW9kaWZpZXIobW9kaWZpZXIpIHsgfQotCi0JCWV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rX2VudHJ5X2lkKCkgeyB9Ci0KLQkJdm9pZCBzZXQodWludDMyX3QgcGFsZXR0ZV9pbmRleCwgY29uc3QgZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllciAmbW9kaWZpZXIpIHsgbV9wYWxldHRlX2luZGV4ID0gcGFsZXR0ZV9pbmRleDsgbV9tb2RpZmllciA9IG1vZGlmaWVyOyB9Ci0JfTsKLQotCXR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2tfZW50cnlfaWQ+IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rX2VudHJ5X2lkX3ZlYzsKLQotCWNsYXNzIGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rCi0JewotCXB1YmxpYzoKLQkJZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2soKSB7IH0KLQkJZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sodWludDMyX3QgTiwgY29uc3QgdWludDMyX3QgKnBFbnRyaWVzKSB7IGluaXQoTiwgcEVudHJpZXMpOyB9Ci0KLQkJdm9pZCBpbml0KHVpbnQzMl90IE4sIGNvbnN0IHVpbnQzMl90KiBwRW50cmllcyk7Ci0KLQkJdm9pZCBwcmludF9jb2RlKEZJTEUgKnBGaWxlKTsKLQotCQl2b2lkIGNsZWFyKCkKLQkJewotCQkJbV9wYWxldHRlLmNsZWFyKCk7Ci0JCX0KLQotCQl1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gKHVpbnQzMl90KW1fcGFsZXR0ZS5zaXplKCk7IH0KLQotCQljb25zdCBldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnlfdmVjICZnZXRfcGFsZXR0ZSgpIGNvbnN0Ci0JCXsKLQkJCXJldHVybiBtX3BhbGV0dGU7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X2VudHJ5KHVpbnQzMl90IHBhbGV0dGVfaW5kZXgpIGNvbnN0Ci0JCXsKLQkJCXJldHVybiBtX3BhbGV0dGVbcGFsZXR0ZV9pbmRleF07Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X2VudHJ5KHVpbnQzMl90IHBhbGV0dGVfaW5kZXgsIGNvbnN0IGV0YzFfZ2xvYmFsX3BhbGV0dGVfZW50cnlfbW9kaWZpZXIgJm1vZGlmaWVyKSBjb25zdAotCQl7Ci0JCQlyZXR1cm4gbV9wYWxldHRlW3BhbGV0dGVfaW5kZXhdLmdldF9tb2RpZmllZChtb2RpZmllcik7Ci0JCX0KLQotCQlldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZ2V0X2VudHJ5KGNvbnN0IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rX2VudHJ5X2lkICZpZCkgY29uc3QKLQkJewotCQkJcmV0dXJuIG1fcGFsZXR0ZVtpZC5tX3BhbGV0dGVfaW5kZXhdLmdldF9tb2RpZmllZChpZC5tX21vZGlmaWVyKTsKLQkJfQotCi0JCWV0YzFfc2VsZWN0b3JfcGFsZXR0ZV9lbnRyeV92ZWMgbV9wYWxldHRlOwotCX07Ci0KLX0gLy8gbmFtZXNwYWNlIGJhc2lzdApkaWZmIC0tZ2l0IGEvdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlci5jcHAgYi90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmNwcAppbmRleCA5ZjlmOGE4Li4zYWViYTBlIDEwMDY0NAotLS0gYS90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmNwcAorKysgYi90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmNwcApAQCAtMzcsNiArMzcsMTQgQEAKIAkjZW5kaWYKICNlbmRpZgogCisvLyBVc2luZyB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcyBjYXVzZXMgZXJyb3JzIHdoZW4gdXNpbmcgVUJTYW4uIEphbSBpdCBvZmYuCisjaWYgZGVmaW5lZChfX2hhc19mZWF0dXJlKQorI2lmIF9faGFzX2ZlYXR1cmUodW5kZWZpbmVkX2JlaGF2aW9yX3Nhbml0aXplcikKKyN1bmRlZiBCQVNJU0RfVVNFX1VOQUxJR05FRF9XT1JEX1JFQURTCisjZGVmaW5lIEJBU0lTRF9VU0VfVU5BTElHTkVEX1dPUkRfUkVBRFMgMAorI2VuZGlmCisjZW5kaWYKKwogI2RlZmluZSBCQVNJU0RfU1VQUE9SVEVEX0JBU0lTX1ZFUlNJT04gKDB4MTMpCiAKICNpZm5kZWYgQkFTSVNEX1NVUFBPUlRfS1RYMgpAQCAtMjI0LDMyICsyMzIsNyBAQAogCiAJCXJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4ofmNyYyk7CiAJfQotCi0JY29uc3QgdWludDMyX3QgZ19nbG9iYWxfc2VsZWN0b3JfY2JbXSA9Ci0jaW5jbHVkZSAiYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9jYi5oIgotCQk7Ci0KLQljb25zdCB1aW50MzJfdCBnX2dsb2JhbF9zZWxlY3Rvcl9jYl9zaXplID0gc2l6ZW9mKGdfZ2xvYmFsX3NlbGVjdG9yX2NiKSAvIHNpemVvZihnX2dsb2JhbF9zZWxlY3Rvcl9jYlswXSk7Ci0KLQl2b2lkIGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rOjppbml0KHVpbnQzMl90IE4sIGNvbnN0IHVpbnQzMl90KiBwRW50cmllcykKLQl7Ci0JCW1fcGFsZXR0ZS5yZXNpemUoTik7Ci0JCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBOOyBpKyspCi0JCQltX3BhbGV0dGVbaV0uc2V0X3VpbnQzMihwRW50cmllc1tpXSk7Ci0JfQotCi0Jdm9pZCBldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vazo6cHJpbnRfY29kZShGSUxFKiBwRmlsZSkKLQl7Ci0JCWZwcmludGYocEZpbGUsICJ7XG4iKTsKLQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fcGFsZXR0ZS5zaXplKCk7IGkrKykKLQkJewotCQkJZnByaW50ZihwRmlsZSwgIjB4JVgsIiwgbV9wYWxldHRlW2ldLmdldF91aW50MzIoKSk7Ci0JCQlpZiAoKGkgJiAxNSkgPT0gMTUpCi0JCQkJZnByaW50ZihwRmlsZSwgIlxuIik7Ci0JCX0KLQkJZnByaW50ZihwRmlsZSwgIlxufVxuIik7Ci0JfQotCisJCQogCWVudW0gZXRjX2NvbnN0YW50cwogCXsKIAkJY0VUQzFCeXRlc1BlckJsb2NrID0gOFUsCkBAIC03NTMyLDkgKzc1MTUsOCBAQAogCX0KICNlbmRpZiAvLyBCQVNJU0RfU1VQUE9SVF9QVlJUQzIKIAotCWJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcihjb25zdCBldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayogcEdsb2JhbF9zZWxfY29kZWJvb2spIDoKKwliYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6YmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIoKSA6CiAJCW1fcEdsb2JhbF9jb2RlYm9vayhudWxscHRyKSwKLQkJbV9wR2xvYmFsX3NlbF9jb2RlYm9vayhwR2xvYmFsX3NlbF9jb2RlYm9vayksCiAJCW1fc2VsZWN0b3JfaGlzdG9yeV9idWZfc2l6ZSgwKQogCXsKIAl9CkBAIC03NjQxLDUwICs3NjIzLDggQEAKIAogCQlpZiAodXNlZF9nbG9iYWxfc2VsZWN0b3JfY2IpCiAJCXsKLQkJCS8vIGdsb2JhbCBzZWxlY3RvciBwYWxldHRlCi0JCQl1aW50MzJfdCBwYWxfYml0cyA9IHN5bV9jb2RlYy5nZXRfYml0cyg0KTsKLQkJCXVpbnQzMl90IG1vZF9iaXRzID0gc3ltX2NvZGVjLmdldF9iaXRzKDQpOwotCi0JCQliYXNpc3Q6Omh1ZmZtYW5fZGVjb2RpbmdfdGFibGUgbW9kX21vZGVsOwotCQkJaWYgKG1vZF9iaXRzKQotCQkJewotCQkJCWlmICghc3ltX2NvZGVjLnJlYWRfaHVmZm1hbl90YWJsZShtb2RfbW9kZWwpKQotCQkJCXsKLQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6ZGVjb2RlX3BhbGV0dGVzOiBmYWlsIDZcbiIpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghbW9kX21vZGVsLmlzX3ZhbGlkKCkpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgNmFcbiIpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX3NlbGVjdG9yczsgaSsrKQotCQkJewotCQkJCXVpbnQzMl90IHBhbF9pbmRleCA9IDA7Ci0JCQkJaWYgKHBhbF9iaXRzKQotCQkJCQlwYWxfaW5kZXggPSBzeW1fY29kZWMuZ2V0X2JpdHMocGFsX2JpdHMpOwotCi0JCQkJdWludDMyX3QgbW9kX2luZGV4ID0gMDsKLQkJCQlpZiAobW9kX2JpdHMpCi0JCQkJCW1vZF9pbmRleCA9IHN5bV9jb2RlYy5kZWNvZGVfaHVmZm1hbihtb2RfbW9kZWwpOwotCi0JCQkJaWYgKHBhbF9pbmRleCA+PSBtX3BHbG9iYWxfc2VsX2NvZGVib29rLT5zaXplKCkpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgN3pcbiIpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJY29uc3QgZXRjMV9zZWxlY3Rvcl9wYWxldHRlX2VudHJ5IGUobV9wR2xvYmFsX3NlbF9jb2RlYm9vay0+Z2V0X2VudHJ5KHBhbF9pbmRleCwgZXRjMV9nbG9iYWxfcGFsZXR0ZV9lbnRyeV9tb2RpZmllcihtb2RfaW5kZXgpKSk7Ci0KLQkJCQkvLyBUT0RPOiBPcHRpbWl6ZSB0aGlzCi0JCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCQkJZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQkJCW1fbG9jYWxfc2VsZWN0b3JzW2ldLnNldF9zZWxlY3Rvcih4LCB5LCBlW3ggKyB5ICogNF0pOwotCi0JCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uaW5pdF9mbGFncygpOwotCQkJfQorCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6ZGVjb2RlX3BhbGV0dGVzOiBnbG9iYWwgc2VsZWN0b3IgY29kZWJvb2tzIGFyZSB1bnN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJZWxzZQogCQl7CkBAIC03NjkyLDE0NiArNzYzMiw3MCBAQAogCiAJCQlpZiAodXNlZF9oeWJyaWRfc2VsZWN0b3JfY2IpCiAJCQl7Ci0JCQkJY29uc3QgdWludDMyX3QgcGFsX2JpdHMgPSBzeW1fY29kZWMuZ2V0X2JpdHMoNCk7Ci0JCQkJY29uc3QgdWludDMyX3QgbW9kX2JpdHMgPSBzeW1fY29kZWMuZ2V0X2JpdHMoNCk7CisJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6ZGVjb2RlX3BhbGV0dGVzOiBoeWJyaWQgZ2xvYmFsIHNlbGVjdG9yIGNvZGVib29rcyBhcmUgdW5zdXBwb3J0ZWRcbiIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQkKKwkJCWNvbnN0IGJvb2wgdXNlZF9yYXdfZW5jb2RpbmcgPSAoc3ltX2NvZGVjLmdldF9iaXRzKDEpID09IDEpOwogCi0JCQkJYmFzaXN0OjpodWZmbWFuX2RlY29kaW5nX3RhYmxlIHVzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzX21vZGVsOwotCQkJCWlmICghc3ltX2NvZGVjLnJlYWRfaHVmZm1hbl90YWJsZSh1c2VzX2dsb2JhbF9jYl9iaXRmbGFnc19tb2RlbCkpCisJCQlpZiAodXNlZF9yYXdfZW5jb2RpbmcpCisJCQl7CisJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9zZWxlY3RvcnM7IGkrKykKIAkJCQl7Ci0JCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCA3XG4iKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoIXVzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzX21vZGVsLmlzX3ZhbGlkKCkpCi0JCQkJewotCQkJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyOjpkZWNvZGVfcGFsZXR0ZXM6IGZhaWwgN2FcbiIpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJYmFzaXN0OjpodWZmbWFuX2RlY29kaW5nX3RhYmxlIGdsb2JhbF9tb2RfaW5kaWNlc19tb2RlbDsKLQkJCQlpZiAobW9kX2JpdHMpCi0JCQkJewotCQkJCQlpZiAoIXN5bV9jb2RlYy5yZWFkX2h1ZmZtYW5fdGFibGUoZ2xvYmFsX21vZF9pbmRpY2VzX21vZGVsKSkKKwkJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKIAkJCQkJewotCQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6ZGVjb2RlX3BhbGV0dGVzOiBmYWlsIDhcbiIpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmICghZ2xvYmFsX21vZF9pbmRpY2VzX21vZGVsLmlzX3ZhbGlkKCkpCi0JCQkJCXsKLQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCA4YVxuIik7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9CisJCQkJCQl1aW50MzJfdCBjdXJfYnl0ZSA9IHN5bV9jb2RlYy5nZXRfYml0cyg4KTsKIAotCQkJCXVpbnQzMl90IGN1cl91c2VzX2dsb2JhbF9jYl9iaXRmbGFncyA9IDA7Ci0JCQkJdWludDMyX3QgdXNlc19nbG9iYWxfY2JfYml0ZmxhZ3NfcmVtYWluaW5nID0gMDsKLQotCQkJCWZvciAodWludDMyX3QgcSA9IDA7IHEgPCBudW1fc2VsZWN0b3JzOyBxKyspCi0JCQkJewotCQkJCQlpZiAoIXVzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzX3JlbWFpbmluZykKLQkJCQkJewotCQkJCQkJY3VyX3VzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzID0gc3ltX2NvZGVjLmRlY29kZV9odWZmbWFuKHVzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzX21vZGVsKTsKLQotCQkJCQkJdXNlc19nbG9iYWxfY2JfYml0ZmxhZ3NfcmVtYWluaW5nID0gODsKLQkJCQkJfQotCQkJCQl1c2VzX2dsb2JhbF9jYl9iaXRmbGFnc19yZW1haW5pbmctLTsKLQotCQkJCQljb25zdCBib29sIHVzZWRfZ2xvYmFsX2NiX2ZsYWcgPSAoY3VyX3VzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzICYgMSkgIT0gMDsKLQkJCQkJY3VyX3VzZXNfZ2xvYmFsX2NiX2JpdGZsYWdzID4+PSAxOwotCi0JCQkJCWlmICh1c2VkX2dsb2JhbF9jYl9mbGFnKQotCQkJCQl7Ci0JCQkJCQljb25zdCB1aW50MzJfdCBwYWxfaW5kZXggPSBwYWxfYml0cyA/IHN5bV9jb2RlYy5nZXRfYml0cyhwYWxfYml0cykgOiAwOwotCQkJCQkJY29uc3QgdWludDMyX3QgbW9kX2luZGV4ID0gbW9kX2JpdHMgPyBzeW1fY29kZWMuZGVjb2RlX2h1ZmZtYW4oZ2xvYmFsX21vZF9pbmRpY2VzX21vZGVsKSA6IDA7Ci0KLQkJCQkJCWlmIChwYWxfaW5kZXggPj0gbV9wR2xvYmFsX3NlbF9jb2RlYm9vay0+c2l6ZSgpKQotCQkJCQkJewotCQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCA4YlxuIik7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCi0JCQkJCQljb25zdCBldGMxX3NlbGVjdG9yX3BhbGV0dGVfZW50cnkgZShtX3BHbG9iYWxfc2VsX2NvZGVib29rLT5nZXRfZW50cnkocGFsX2luZGV4LCBldGMxX2dsb2JhbF9wYWxldHRlX2VudHJ5X21vZGlmaWVyKG1vZF9pbmRleCkpKTsKLQotCQkJCQkJZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IDQ7IHkrKykKLQkJCQkJCQlmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgNDsgeCsrKQotCQkJCQkJCQltX2xvY2FsX3NlbGVjdG9yc1txXS5zZXRfc2VsZWN0b3IoeCwgeSwgZVt4ICsgeSAqIDRdKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyBqKyspCi0JCQkJCQl7Ci0JCQkJCQkJdWludDMyX3QgY3VyX2J5dGUgPSBzeW1fY29kZWMuZ2V0X2JpdHMoOCk7Ci0KLQkJCQkJCQlmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCQkJCQltX2xvY2FsX3NlbGVjdG9yc1txXS5zZXRfc2VsZWN0b3IoaywgaiwgKGN1cl9ieXRlID4+IChrICogMikpICYgMyk7Ci0JCQkJCQl9CisJCQkJCQlmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgNDsgaysrKQorCQkJCQkJCW1fbG9jYWxfc2VsZWN0b3JzW2ldLnNldF9zZWxlY3RvcihrLCBqLCAoY3VyX2J5dGUgPj4gKGsgKiAyKSkgJiAzKTsKIAkJCQkJfQogCi0JCQkJCW1fbG9jYWxfc2VsZWN0b3JzW3FdLmluaXRfZmxhZ3MoKTsKKwkJCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uaW5pdF9mbGFncygpOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UKIAkJCXsKLQkJCQljb25zdCBib29sIHVzZWRfcmF3X2VuY29kaW5nID0gKHN5bV9jb2RlYy5nZXRfYml0cygxKSA9PSAxKTsKLQotCQkJCWlmICh1c2VkX3Jhd19lbmNvZGluZykKKwkJCQlpZiAoIXN5bV9jb2RlYy5yZWFkX2h1ZmZtYW5fdGFibGUoZGVsdGFfc2VsZWN0b3JfcGFsX21vZGVsKSkKIAkJCQl7Ci0JCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fc2VsZWN0b3JzOyBpKyspCisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCAxMFxuIik7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCQlpZiAoKG51bV9zZWxlY3RvcnMgPiAxKSAmJiAoIWRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbC5pc192YWxpZCgpKSkKKwkJCQl7CisJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCAxMGFcbiIpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQkJdWludDhfdCBwcmV2X2J5dGVzWzRdID0geyAwLCAwLCAwLCAwIH07CisKKwkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX3NlbGVjdG9yczsgaSsrKQorCQkJCXsKKwkJCQkJaWYgKCFpKQogCQkJCQl7CiAJCQkJCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgaisrKQogCQkJCQkJewogCQkJCQkJCXVpbnQzMl90IGN1cl9ieXRlID0gc3ltX2NvZGVjLmdldF9iaXRzKDgpOwotCi0JCQkJCQkJZm9yICh1aW50MzJfdCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQkJCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uc2V0X3NlbGVjdG9yKGssIGosIChjdXJfYnl0ZSA+PiAoayAqIDIpKSAmIDMpOwotCQkJCQkJfQotCi0JCQkJCQltX2xvY2FsX3NlbGVjdG9yc1tpXS5pbml0X2ZsYWdzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKCFzeW1fY29kZWMucmVhZF9odWZmbWFuX3RhYmxlKGRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbCkpCi0JCQkJCXsKLQkJCQkJCUJBU0lTVV9ERVZFTF9FUlJPUigiYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXI6OmRlY29kZV9wYWxldHRlczogZmFpbCAxMFxuIik7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlpZiAoKG51bV9zZWxlY3RvcnMgPiAxKSAmJiAoIWRlbHRhX3NlbGVjdG9yX3BhbF9tb2RlbC5pc192YWxpZCgpKSkKLQkJCQkJewotCQkJCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6ZGVjb2RlX3BhbGV0dGVzOiBmYWlsIDEwYVxuIik7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQl1aW50OF90IHByZXZfYnl0ZXNbNF0gPSB7IDAsIDAsIDAsIDAgfTsKLQotCQkJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX3NlbGVjdG9yczsgaSsrKQotCQkJCQl7Ci0JCQkJCQlpZiAoIWkpCi0JCQkJCQl7Ci0JCQkJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKLQkJCQkJCQl7Ci0JCQkJCQkJCXVpbnQzMl90IGN1cl9ieXRlID0gc3ltX2NvZGVjLmdldF9iaXRzKDgpOwotCQkJCQkJCQlwcmV2X2J5dGVzW2pdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY3VyX2J5dGUpOwotCi0JCQkJCQkJCWZvciAodWludDMyX3QgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJCQkJCQltX2xvY2FsX3NlbGVjdG9yc1tpXS5zZXRfc2VsZWN0b3IoaywgaiwgKGN1cl9ieXRlID4+IChrICogMikpICYgMyk7Ci0JCQkJCQkJfQotCQkJCQkJCW1fbG9jYWxfc2VsZWN0b3JzW2ldLmluaXRfZmxhZ3MoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQotCQkJCQkJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykKLQkJCQkJCXsKLQkJCQkJCQlpbnQgZGVsdGFfYnl0ZSA9IHN5bV9jb2RlYy5kZWNvZGVfaHVmZm1hbihkZWx0YV9zZWxlY3Rvcl9wYWxfbW9kZWwpOwotCi0JCQkJCQkJdWludDMyX3QgY3VyX2J5dGUgPSBkZWx0YV9ieXRlIF4gcHJldl9ieXRlc1tqXTsKIAkJCQkJCQlwcmV2X2J5dGVzW2pdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY3VyX2J5dGUpOwogCiAJCQkJCQkJZm9yICh1aW50MzJfdCBrID0gMDsgayA8IDQ7IGsrKykKIAkJCQkJCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uc2V0X3NlbGVjdG9yKGssIGosIChjdXJfYnl0ZSA+PiAoayAqIDIpKSAmIDMpOwogCQkJCQkJfQogCQkJCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uaW5pdF9mbGFncygpOworCQkJCQkJY29udGludWU7CiAJCQkJCX0KKworCQkJCQlmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgaisrKQorCQkJCQl7CisJCQkJCQlpbnQgZGVsdGFfYnl0ZSA9IHN5bV9jb2RlYy5kZWNvZGVfaHVmZm1hbihkZWx0YV9zZWxlY3Rvcl9wYWxfbW9kZWwpOworCisJCQkJCQl1aW50MzJfdCBjdXJfYnl0ZSA9IGRlbHRhX2J5dGUgXiBwcmV2X2J5dGVzW2pdOworCQkJCQkJcHJldl9ieXRlc1tqXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN1cl9ieXRlKTsKKworCQkJCQkJZm9yICh1aW50MzJfdCBrID0gMDsgayA8IDQ7IGsrKykKKwkJCQkJCQltX2xvY2FsX3NlbGVjdG9yc1tpXS5zZXRfc2VsZWN0b3IoaywgaiwgKGN1cl9ieXRlID4+IChrICogMikpICYgMyk7CisJCQkJCX0KKwkJCQkJbV9sb2NhbF9zZWxlY3RvcnNbaV0uaW5pdF9mbGFncygpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNzg5OSw2ICs3NzYzLDEyIEBACiAJCX0KIAogCQltX3NlbGVjdG9yX2hpc3RvcnlfYnVmX3NpemUgPSBzeW1fY29kZWMuZ2V0X2JpdHMoMTMpOworCQkvLyBDaGVjayBmb3IgYm9ndXMgdmFsdWVzLgorCQlpZiAoIW1fc2VsZWN0b3JfaGlzdG9yeV9idWZfc2l6ZSkKKwkJeworCQkJQkFTSVNVX0RFVkVMX0VSUk9SKCJiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2Rlcjo6ZGVjb2RlX3RhYmxlczogZmFpbCA1XG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQogCiAJCXN5bV9jb2RlYy5zdG9wKCk7CiAKQEAgLTc5NzksOCArNzg0OSwxMSBAQAogCiAJCWRlY29kZXJfZXRjX2Jsb2NrIGJsb2NrOwogCQltZW1zZXQoJmJsb2NrLCAwLCBzaXplb2YoYmxvY2spKTsKKwkJCQkKKwkJLy9ibG9jay5zZXRfZmxpcF9iaXQodHJ1ZSk7CisJCS8vIFNldHRpbmcgdGhlIGZsaXAgYml0IHRvIGZhbHNlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgS2hyb25vcyBLREZTLgorCQlibG9jay5zZXRfZmxpcF9iaXQoZmFsc2UpOwogCi0JCWJsb2NrLnNldF9mbGlwX2JpdCh0cnVlKTsKIAkJYmxvY2suc2V0X2RpZmZfYml0KHRydWUpOwogCiAJCXZvaWQqIHBQVlJUQ193b3JrX21lbSA9IG51bGxwdHI7CkBAIC04NzQxLDcgKzg2MTQsNyBAQAogCQkJaWYgKCFvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMpCiAJCQkJb3V0cHV0X3Jvd19waXRjaF9pbl9ibG9ja3Nfb3JfcGl4ZWxzID0gb3JpZ193aWR0aDsKIAotCQkJaWYgKCFvdXRwdXRfcm93c19pbl9waXhlbHMpCisJCQlpZiAoIW91dHB1dF9yb3dzX2luX3BpeGVscykgCiAJCQkJb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzID0gb3JpZ19oZWlnaHQ7CiAKIAkJCS8vIE5vdyBtYWtlIHN1cmUgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoLCBvciB3ZSdsbCBvdmVyd3JpdGUgbWVtb3J5LgpAQCAtOTQ0MCw2ICs5MzEzLDEyIEBACiAJCQkJewogCQkJCQlzd2l0Y2ggKGZtdCkKIAkJCQkJeworCQkJCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y1VBU1RDXzR4NDoKKwkJCQkJeworCQkJCQkJbWVtY3B5KHBEc3RfYmxvY2ssIHBTb3VyY2VfYmxvY2ssIHNpemVvZih1YXN0Y19ibG9jaykpOworCQkJCQkJc3RhdHVzID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CiAJCQkJCWNhc2UgYmxvY2tfZm9ybWF0OjpjRVRDMToKIAkJCQkJewogCQkJCQkJaWYgKGZyb21fYWxwaGEpCkBAIC05OTA2LDggKzk3ODUsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAkKLQliYXNpc3VfdHJhbnNjb2Rlcjo6YmFzaXN1X3RyYW5zY29kZXIoY29uc3QgZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sqIHBHbG9iYWxfc2VsX2NvZGVib29rKSA6Ci0JCW1fbG93bGV2ZWxfZXRjMXNfZGVjb2RlcihwR2xvYmFsX3NlbF9jb2RlYm9vayksCisJYmFzaXN1X3RyYW5zY29kZXI6OmJhc2lzdV90cmFuc2NvZGVyKCkgOgogCQltX3JlYWR5X3RvX3RyYW5zY29kZShmYWxzZSkKIAl7CiAJfQpAQCAtMTA3NzgsNiArMTA2NTYsOCBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKKwkJLy9jb25zdCBib29sIHRyYW5zY29kZV9hbHBoYV9kYXRhX3RvX29wYXF1ZV9mb3JtYXRzID0gKGRlY29kZV9mbGFncyAmIGNEZWNvZGVGbGFnc1RyYW5zY29kZUFscGhhRGF0YVRvT3BhcXVlRm9ybWF0cykgIT0gMDsKKwogCQlpZiAoZGVjb2RlX2ZsYWdzICYgY0RlY29kZUZsYWdzUFZSVENEZWNvZGVUb05leHRQb3cyKQogCQl7CiAJCQlCQVNJU1VfREVWRUxfRVJST1IoImJhc2lzdV90cmFuc2NvZGVyOjp0cmFuc2NvZGVfaW1hZ2VfbGV2ZWw6IGNEZWNvZGVGbGFnc1BWUlRDRGVjb2RlVG9OZXh0UG93MiBjdXJyZW50bHkgdW5zdXBwb3J0ZWRcbiIpOwpAQCAtMTEwMDEsNiArMTA4ODEsNyBAQAogCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y1JHQjU2NTogcmV0dXJuICJSR0I1NjUiOwogCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0JHUjU2NTogcmV0dXJuICJCR1I1NjUiOwogCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y1JHQkE0NDQ0OiByZXR1cm4gIlJHQkE0NDQ0IjsKKwkJY2FzZSBibG9ja19mb3JtYXQ6OmNVQVNUQ180eDQ6IHJldHVybiAiVUFTVENfNHg0IjsKIAkJY2FzZSBibG9ja19mb3JtYXQ6OmNGWFQxX1JHQjogcmV0dXJuICJGWFQxX1JHQiI7CiAJCWNhc2UgYmxvY2tfZm9ybWF0OjpjUFZSVEMyXzRfUkdCOiByZXR1cm4gIlBWUlRDMl80X1JHQiI7CiAJCWNhc2UgYmxvY2tfZm9ybWF0OjpjUFZSVEMyXzRfUkdCQTogcmV0dXJuICJQVlJUQzJfNF9SR0JBIjsKQEAgLTEyNTY3LDEyICsxMjQ0OCw4IEBACiAJCQkJYml0cyA9IHJlYWRfYml0czY0KGJsay5tX2J5dGVzLCBiaXRfb2ZzLCBiYXNpc3U6Om1pbmltdW08aW50Pig2NCwgMTI4IC0gKGludCliaXRfb2ZzKSk7CiAJCQllbHNlCiAJCQl7Ci0jaWZkZWYgX19FTVNDUklQVEVOX18KIAkJCQliaXRzID0gYmxrLm1fZHdvcmRzWzJdOwogCQkJCWJpdHMgfD0gKCgodWludDY0X3QpYmxrLm1fZHdvcmRzWzNdKSA8PCAzMlUpOwotI2Vsc2UKLQkJCQliaXRzID0gYmxrLm1fcXdvcmRzWzFdOwotI2VuZGlmCiAJCQkJCiAJCQkJaWYgKGJpdF9vZnMgPj0gNjRVKQogCQkJCQliaXRzID4+PSAoYml0X29mcyAtIDY0VSk7CkBAIC0xNjcyMiw4ICsxNjU5OSw4IEBACiAjaWYgQkFTSVNEX1NVUFBPUlRfS1RYMgogCWNvbnN0IHVpbnQ4X3QgZ19rdHgyX2ZpbGVfaWRlbnRpZmllclsxMl0gPSB7IDB4QUIsIDB4NEIsIDB4NTQsIDB4NTgsIDB4MjAsIDB4MzIsIDB4MzAsIDB4QkIsIDB4MEQsIDB4MEEsIDB4MUEsIDB4MEEgfTsKIAotCWt0eDJfdHJhbnNjb2Rlcjo6a3R4Ml90cmFuc2NvZGVyKGJhc2lzdDo6ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sqIHBHbG9iYWxfc2VsX2NvZGVib29rKSA6Ci0JCW1fZXRjMXNfdHJhbnNjb2RlcihwR2xvYmFsX3NlbF9jb2RlYm9vaykKKwlrdHgyX3RyYW5zY29kZXI6Omt0eDJfdHJhbnNjb2RlcigpIDoKKwkJbV9ldGMxc190cmFuc2NvZGVyKCkKIAl7CiAJCWNsZWFyKCk7CiAJfQpAQCAtMTczMzQsNiArMTcyMTEsNyBAQAogCQkKIAlib29sIGt0eDJfdHJhbnNjb2Rlcjo6ZGVjb21wcmVzc19sZXZlbF9kYXRhKHVpbnQzMl90IGxldmVsX2luZGV4LCBiYXNpc3U6OnVpbnQ4X3ZlYyYgdW5jb21wX2RhdGEpCiAJeworCQljb25zdCB1aW50OF90KiBwQ29tcF9kYXRhID0gbV9sZXZlbHNbbGV2ZWxfaW5kZXhdLm1fYnl0ZV9vZmZzZXQgKyBtX3BEYXRhOwogCQljb25zdCB1aW50NjRfdCBjb21wX3NpemUgPSBtX2xldmVsc1tsZXZlbF9pbmRleF0ubV9ieXRlX2xlbmd0aDsKIAkJCiAJCWNvbnN0IHVpbnQ2NF90IHVuY29tcF9zaXplID0gbV9sZXZlbHNbbGV2ZWxfaW5kZXhdLm1fdW5jb21wcmVzc2VkX2J5dGVfbGVuZ3RoOwpAQCAtMTczNDksNyArMTcyMjcsNyBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKLQkJaWYgKCF1bmNvbXBfZGF0YS50cnlfcmVzaXplKHVuY29tcF9zaXplKSkKKwkJaWYgKCF1bmNvbXBfZGF0YS50cnlfcmVzaXplKChzaXplX3QpdW5jb21wX3NpemUpKQogCQl7CiAJCQlCQVNJU1VfREVWRUxfRVJST1IoImt0eDJfdHJhbnNjb2Rlcjo6ZGVjb21wcmVzc19sZXZlbF9kYXRhOiBPdXQgb2YgbWVtb3J5XG4iKTsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTE3MzU4LDcgKzE3MjM2LDYgQEAKIAkJaWYgKG1faGVhZGVyLm1fc3VwZXJjb21wcmVzc2lvbl9zY2hlbWUgPT0gS1RYMl9TU19aU1RBTkRBUkQpCiAJCXsKICNpZiBCQVNJU0RfU1VQUE9SVF9LVFgyX1pTVEQKLQkJCWNvbnN0IHVpbnQ4X3QqIHBDb21wX2RhdGEgPSBtX2xldmVsc1tsZXZlbF9pbmRleF0ubV9ieXRlX29mZnNldCArIG1fcERhdGE7CiAJCQlzaXplX3QgYWN0dWFsVW5jb21wU2l6ZSA9IFpTVERfZGVjb21wcmVzcyh1bmNvbXBfZGF0YS5kYXRhKCksIChzaXplX3QpdW5jb21wX3NpemUsIHBDb21wX2RhdGEsIChzaXplX3QpY29tcF9zaXplKTsKIAkJCWlmIChaU1REX2lzRXJyb3IoYWN0dWFsVW5jb21wU2l6ZSkpCiAJCQl7CmRpZmYgLS1naXQgYS90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmggYi90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmgKaW5kZXggYmYzYWVkMy4uMzMyN2U4ZCAxMDA2NDQKLS0tIGEvdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlci5oCisrKyBiL3RyYW5zY29kZXIvYmFzaXN1X3RyYW5zY29kZXIuaApAQCAtMzQsNyArMzQsNiBAQAogCiAjaW5jbHVkZSAiYmFzaXN1X3RyYW5zY29kZXJfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJiYXNpc3VfdHJhbnNjb2Rlcl91YXN0Yy5oIgotI2luY2x1ZGUgImJhc2lzdV9nbG9iYWxfc2VsZWN0b3JfcGFsZXR0ZS5oIgogI2luY2x1ZGUgImJhc2lzdV9maWxlX2hlYWRlcnMuaCIKIAogbmFtZXNwYWNlIGJhc2lzdApAQCAtMTkwLDcgKzE4OSw3IEBACiAJCWZyaWVuZCBjbGFzcyBiYXNpc3VfdHJhbnNjb2RlcjsKIAogCXB1YmxpYzoKLQkJYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIoY29uc3QgYmFzaXN0OjpldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayogcEdsb2JhbF9zZWxfY29kZWJvb2spOworCQliYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlcigpOwogCiAJCXZvaWQgc2V0X2dsb2JhbF9jb2RlYm9va3MoY29uc3QgYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIqIHBHbG9iYWxfY29kZWJvb2spIHsgbV9wR2xvYmFsX2NvZGVib29rID0gcEdsb2JhbF9jb2RlYm9vazsgfQogCQljb25zdCBiYXNpc3VfbG93bGV2ZWxfZXRjMXNfdHJhbnNjb2RlciogZ2V0X2dsb2JhbF9jb2RlYm9va3MoKSBjb25zdCB7IHJldHVybiBtX3BHbG9iYWxfY29kZWJvb2s7IH0KQEAgLTI0OCwxNyArMjQ3LDEzIEBACiAKIAkJdHlwZWRlZiBiYXNpc3U6OnZlY3RvcjxzZWxlY3Rvcj4gc2VsZWN0b3JfdmVjOwogCQljb25zdCBzZWxlY3Rvcl92ZWMmIGdldF9zZWxlY3RvcnMoKSBjb25zdCB7IHJldHVybiBtX2xvY2FsX3NlbGVjdG9yczsgfQotCi0JCWNvbnN0IGV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKiBnZXRfZ2xvYmFsX3NlbF9jb2RlYm9vaygpIGNvbnN0IHsgcmV0dXJuIG1fcEdsb2JhbF9zZWxfY29kZWJvb2s7IH0KLQorCQkJCQogCXByaXZhdGU6CiAJCWNvbnN0IGJhc2lzdV9sb3dsZXZlbF9ldGMxc190cmFuc2NvZGVyKiBtX3BHbG9iYWxfY29kZWJvb2s7CiAKIAkJZW5kcG9pbnRfdmVjIG1fbG9jYWxfZW5kcG9pbnRzOwogCQlzZWxlY3Rvcl92ZWMgbV9sb2NhbF9zZWxlY3RvcnM7Ci0KLQkJY29uc3QgZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sqIG1fcEdsb2JhbF9zZWxfY29kZWJvb2s7Ci0KKwkJCQkKIAkJaHVmZm1hbl9kZWNvZGluZ190YWJsZSBtX2VuZHBvaW50X3ByZWRfbW9kZWwsIG1fZGVsdGFfZW5kcG9pbnRfbW9kZWwsIG1fc2VsZWN0b3JfbW9kZWwsIG1fc2VsZWN0b3JfaGlzdG9yeV9idWZfcmxlX21vZGVsOwogCiAJCXVpbnQzMl90IG1fc2VsZWN0b3JfaGlzdG9yeV9idWZfc2l6ZTsKQEAgLTQ0Miw3ICs0MzcsNyBAQAogCQliYXNpc3VfdHJhbnNjb2RlciYgb3BlcmF0b3I9IChjb25zdCBiYXNpc3VfdHJhbnNjb2RlciYpOwogCiAJcHVibGljOgotCQliYXNpc3VfdHJhbnNjb2Rlcihjb25zdCBldGMxX2dsb2JhbF9zZWxlY3Rvcl9jb2RlYm9vayogcEdsb2JhbF9zZWxfY29kZWJvb2spOworCQliYXNpc3VfdHJhbnNjb2RlcigpOwogCiAJCS8vIFZhbGlkYXRlcyB0aGUgLmJhc2lzIGZpbGUuIFRoaXMgY29tcHV0ZXMgYSBjcmMxNiBvdmVyIHRoZSBlbnRpcmUgZmlsZSwgc28gaXQncyBzbG93LgogCQlib29sIHZhbGlkYXRlX2ZpbGVfY2hlY2tzdW1zKGNvbnN0IHZvaWQqIHBEYXRhLCB1aW50MzJfdCBkYXRhX3NpemUsIGJvb2wgZnVsbF92YWxpZGF0aW9uKSBjb25zdDsKQEAgLTc3MCw3ICs3NjUsNyBAQAogCWNsYXNzIGt0eDJfdHJhbnNjb2RlcgogCXsKIAlwdWJsaWM6Ci0JCWt0eDJfdHJhbnNjb2RlcihiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKiBwR2xvYmFsX3NlbF9jb2RlYm9vayk7CisJCWt0eDJfdHJhbnNjb2RlcigpOwogCiAJCS8vIEZyZWVzIGFsbCBhbGxvY2F0aW9ucywgcmVzZXRzIG9iamVjdC4KIAkJdm9pZCBjbGVhcigpOwpkaWZmIC0tZ2l0IGEvdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oIGIvdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlcl9pbnRlcm5hbC5oCmluZGV4IDI0MjJkNzguLjc3NmE5OTggMTAwNjQ0Ci0tLSBhL3RyYW5zY29kZXIvYmFzaXN1X3RyYW5zY29kZXJfaW50ZXJuYWwuaAorKysgYi90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyX2ludGVybmFsLmgKQEAgLTIwLDggKzIwLDggQEAKICNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDEyNykgLy8gIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKICNlbmRpZgogCi0jZGVmaW5lIEJBU0lTRF9MSUJfVkVSU0lPTiAxMTUKLSNkZWZpbmUgQkFTSVNEX1ZFUlNJT05fU1RSSU5HICIwMS4xNSIKKyNkZWZpbmUgQkFTSVNEX0xJQl9WRVJTSU9OIDExNgorI2RlZmluZSBCQVNJU0RfVkVSU0lPTl9TVFJJTkcgIjAxLjE2IgogCiAjaWZkZWYgX0RFQlVHCiAjZGVmaW5lIEJBU0lTRF9CVUlMRF9ERUJVRwpAQCAtNDYsMTggKzQ2LDE4IEBACiAJewogCQljRVRDMSwJCQkJCQkJCS8vIEVUQzFTIFJHQiAKIAkJY0VUQzJfUkdCQSwJCQkJCQkJLy8gZnVsbCBFVEMyIEVBQyBSR0JBOCBibG9jawotCQljQkMxLAkJCQkJCQkJCS8vIERYVDEgUkdCIAotCQljQkMzLAkJCQkJCQkJCS8vIEJDNCBibG9jayBmb2xsb3dlZCBieSBhIGZvdXIgY29sb3IgQkMxIGJsb2NrCi0JCWNCQzQsCQkJCQkJCQkJLy8gRFhUNUEgKGFscGhhIGJsb2NrIG9ubHkpCi0JCWNCQzUsCQkJCQkJCQkJLy8gdHdvIEJDNCBibG9ja3MKKwkJY0JDMSwJCQkJCQkJCS8vIERYVDEgUkdCIAorCQljQkMzLAkJCQkJCQkJLy8gQkM0IGJsb2NrIGZvbGxvd2VkIGJ5IGEgZm91ciBjb2xvciBCQzEgYmxvY2sKKwkJY0JDNCwJCQkJCQkJCS8vIERYVDVBIChhbHBoYSBibG9jayBvbmx5KQorCQljQkM1LAkJCQkJCQkJLy8gdHdvIEJDNCBibG9ja3MKIAkJY1BWUlRDMV80X1JHQiwJCQkJCQkvLyBvcGFxdWUtb25seSBQVlJUQzEgNGJwcAotCQljUFZSVEMxXzRfUkdCQSwJCQkJCS8vIFBWUlRDMSA0YnBwIFJHQkEKLQkJY0JDNywJCQkJCQkJCQkvLyBGdWxsIEJDNyBibG9jaywgYW55IG1vZGUKKwkJY1BWUlRDMV80X1JHQkEsCQkJCQkJLy8gUFZSVEMxIDRicHAgUkdCQQorCQljQkM3LAkJCQkJCQkJLy8gRnVsbCBCQzcgYmxvY2ssIGFueSBtb2RlCiAJCWNCQzdfTTVfQ09MT1IsCQkJCQkJLy8gUkdCIEJDNyBtb2RlIDUgY29sb3IgKHdyaXRlcyBhbiBvcGFxdWUgbW9kZSA1IGJsb2NrKQogCQljQkM3X001X0FMUEhBLAkJCQkJCS8vIGFscGhhIHBvcnRpb24gb2YgQkM3IG1vZGUgNSAoY0JDN19NNV9DT0xPUiBvdXRwdXQgZGF0YSBtdXN0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGZpcnN0IHRvIHNldCB0aGUgbW9kZS9yb3QgZmllbGRzIGV0Yy4pCiAJCWNFVEMyX0VBQ19BOCwJCQkJCQkvLyBhbHBoYSBibG9jayBvZiBFVEMyIEVBQyAoZmlyc3QgOCBieXRlcyBvZiB0aGUgMTYtYml0IEVUQzIgRUFDIFJHQkEgZm9ybWF0KQogCQljQVNUQ180eDQsCQkJCQkJCS8vIEFTVEMgNHg0IChlaXRoZXIgY29sb3Itb25seSBvciBjb2xvcithbHBoYSkuIE5vdGUgdGhhdCB0aGUgdHJhbnNjb2RlciBhbHdheXMgY3VycmVudGx5IGFzc3VtZXMgc1JHQiBpcyBub3QgZW5hYmxlZCB3aGVuIG91dHB1dHRpbmcgQVNUQyAKLQkJCQkJCQkJCQkJCS8vIGRhdGEuIElmIHlvdSB1c2UgYSBzUkdCIEFTVEMgZm9ybWF0IHlvdSdsbCBnZXQgfjEgTFNCIG9mIGFkZGl0aW9uYWwgZXJyb3IsIGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVudCB3YXkgQVNUQyBkZWNvZGVycyBzY2FsZSA4LWJpdCBlbmRwb2ludHMgdG8gMTYtYml0cyBkdXJpbmcgdW5wYWNraW5nLgorCQkJCQkJCQkJCQkvLyBkYXRhLiBJZiB5b3UgdXNlIGEgc1JHQiBBU1RDIGZvcm1hdCB5b3UnbGwgZ2V0IH4xIExTQiBvZiBhZGRpdGlvbmFsIGVycm9yLCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgd2F5IEFTVEMgZGVjb2RlcnMgc2NhbGUgOC1iaXQgZW5kcG9pbnRzIHRvIDE2LWJpdHMgZHVyaW5nIHVucGFja2luZy4KIAkJCiAJCWNBVENfUkdCLAogCQljQVRDX1JHQkFfSU5URVJQT0xBVEVEX0FMUEhBLApAQCAtNzIsOCArNzIsOCBAQAogCQljSW5kaWNlcywJCQkJCQkJLy8gVXNlZCBpbnRlcm5hbGx5OiBXcml0ZSAxNi1iaXQgZW5kcG9pbnQgYW5kIHNlbGVjdG9yIGluZGljZXMgZGlyZWN0bHkgdG8gb3V0cHV0IChvdXRwdXQgYmxvY2sgbXVzdCBiZSBhdCBsZWFzdCAzMi1iaXRzKQogCiAJCWNSR0IzMiwJCQkJCQkJCS8vIFdyaXRlcyBSR0IgY29tcG9uZW50cyB0byAzMmJwcCBvdXRwdXQgcGl4ZWxzCi0JCWNSR0JBMzIsCQkJCQkJCQkvLyBXcml0ZXMgUkdCMjU1IGNvbXBvbmVudHMgdG8gMzJicHAgb3V0cHV0IHBpeGVscwotCQljQTMyLAkJCQkJCQkJCS8vIFdyaXRlcyBhbHBoYSBjb21wb25lbnQgdG8gMzJicHAgb3V0cHV0IHBpeGVscworCQljUkdCQTMyLAkJCQkJCQkvLyBXcml0ZXMgUkdCMjU1IGNvbXBvbmVudHMgdG8gMzJicHAgb3V0cHV0IHBpeGVscworCQljQTMyLAkJCQkJCQkJLy8gV3JpdGVzIGFscGhhIGNvbXBvbmVudCB0byAzMmJwcCBvdXRwdXQgcGl4ZWxzCiAJCQkJCiAJCWNSR0I1NjUsCiAJCWNCR1I1NjUsCkBAIC04Miw2ICs4Miw4IEBACiAJCWNSR0JBNDQ0NF9BTFBIQSwKIAkJY1JHQkE0NDQ0X0NPTE9SX09QQVFVRSwKIAkJY1JHQkE0NDQ0LAorCisJCWNVQVNUQ180eDQsCiAJCQkJCQkKIAkJY1RvdGFsQmxvY2tGb3JtYXRzCiAJfTsKZGlmZiAtLWdpdCBhL3RyYW5zY29kZXIvYmFzaXN1X3RyYW5zY29kZXJfdWFzdGMuaCBiL3RyYW5zY29kZXIvYmFzaXN1X3RyYW5zY29kZXJfdWFzdGMuaAppbmRleCBkNTAxYTJhLi5mOTEzMTRmIDEwMDY0NAotLS0gYS90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyX3Vhc3RjLmgKKysrIGIvdHJhbnNjb2Rlci9iYXNpc3VfdHJhbnNjb2Rlcl91YXN0Yy5oCkBAIC0yMDUsMTAgKzIwNSw2IEBACiAJCXsKIAkJCXVpbnQ4X3QgbV9ieXRlc1sxNl07CiAJCQl1aW50MzJfdCBtX2R3b3Jkc1s0XTsKLQotI2lmbmRlZiBfX0VNU0NSSVBURU5fXwotCQkJdWludDY0X3QgbV9xd29yZHNbMl07Ci0jZW5kaWYKIAkJfTsKIAl9OwogCmRpZmYgLS1naXQgYS93ZWJnbC9lbmNvZGVyL0NNYWtlTGlzdHMudHh0IGIvd2ViZ2wvZW5jb2Rlci9DTWFrZUxpc3RzLnR4dAppbmRleCBlMzY1ZTFiLi41ODhkOTFiIDEwMDY0NAotLS0gYS93ZWJnbC9lbmNvZGVyL0NNYWtlTGlzdHMudHh0CisrKyBiL3dlYmdsL2VuY29kZXIvQ01ha2VMaXN0cy50eHQKQEAgLTIwLDE4ICsyMCwxNiBAQAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X2VuYy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X2V0Yy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X2Zyb250ZW5kLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIAotCS4uLy4uL2VuY29kZXIvYmFzaXN1X2dsb2JhbF9zZWxlY3Rvcl9wYWxldHRlX2hlbHBlcnMuY3BwIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X2dwdV90ZXh0dXJlLmNwcCAgICAgICAgICAgICAgICAgICAgIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X3B2cnRjMV80LmNwcCAgICAgICAgICAgICAgICAgICAgICAgIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X3Jlc2FtcGxlci5jcHAgICAgICAgICAgICAgICAgICAgICAgIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X3Jlc2FtcGxlX2ZpbHRlcnMuY3BwICAgICAgICAgICAgICAgIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X3NzaW0uY3BwICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCS4uLy4uL2VuY29kZXIvYmFzaXN1X2FzdGNfZGVjb21wLmNwcCAgICAgICAgICAgICAgICAgICAgIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X3Vhc3RjX2VuYy5jcHAgICAgICAgICAgICAgICAgICAgICAgIAogCS4uLy4uL2VuY29kZXIvYmFzaXN1X2JjN2VuYy5jcHAKIAkuLi8uLi9lbmNvZGVyL2Jhc2lzdV9rZXJuZWxzX3NzZS5jcHAKLQkuLi8uLi9lbmNvZGVyL2xvZGVwbmcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkuLi8uLi9lbmNvZGVyL2FwZ19ibXAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkuLi8uLi9lbmNvZGVyL2Jhc2lzdV9vcGVuY2wuY3BwCisJLi4vLi4vZW5jb2Rlci9wdnBuZ3JlYWRlci5jcHAKIAkuLi8uLi9lbmNvZGVyL2pwZ2QuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgKQogCmRpZmYgLS1naXQgYS93ZWJnbC9lbmNvZGVyL2J1aWxkL2Jhc2lzX2VuY29kZXIuanMgYi93ZWJnbC9lbmNvZGVyL2J1aWxkL2Jhc2lzX2VuY29kZXIuanMKaW5kZXggMjgyMDMzMS4uYzUyZGJhMiAxMDA2NDQKLS0tIGEvd2ViZ2wvZW5jb2Rlci9idWlsZC9iYXNpc19lbmNvZGVyLmpzCisrKyBiL3dlYmdsL2VuY29kZXIvYnVpbGQvYmFzaXNfZW5jb2Rlci5qcwpAQCAtNiw3ICs2LDcgQEAKIGZ1bmN0aW9uKEJBU0lTKSB7CiAgIEJBU0lTID0gQkFTSVMgfHwge307CiAKLXZhciBNb2R1bGU9dHlwZW9mIEJBU0lTIT09InVuZGVmaW5lZCI/QkFTSVM6e307dmFyIHJlYWR5UHJvbWlzZVJlc29sdmUscmVhZHlQcm9taXNlUmVqZWN0O01vZHVsZVsicmVhZHkiXT1uZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cmVhZHlQcm9taXNlUmVzb2x2ZT1yZXNvbHZlO3JlYWR5UHJvbWlzZVJlamVjdD1yZWplY3R9KTt2YXIgbW9kdWxlT3ZlcnJpZGVzPXt9O3ZhciBrZXk7Zm9yKGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIGFyZ3VtZW50c189W107dmFyIHRoaXNQcm9ncmFtPSIuL3RoaXMucHJvZ3JhbSI7dmFyIHF1aXRfPWZ1bmN0aW9uKHN0YXR1cyx0b1Rocm93KXt0aHJvdyB0b1Rocm93fTt2YXIgRU5WSVJPTk1FTlRfSVNfV0VCPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX05PREU9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX1NIRUxMPWZhbHNlO0VOVklST05NRU5UX0lTX1dFQj10eXBlb2Ygd2luZG93PT09Im9iamVjdCI7RU5WSVJPTk1FTlRfSVNfV09SS0VSPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT09ImZ1bmN0aW9uIjtFTlZJUk9OTUVOVF9JU19OT0RFPXR5cGVvZiBwcm9jZXNzPT09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT0ic3RyaW5nIjtFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjt2YXIgc2NyaXB0RGlyZWN0b3J5PSIiO2Z1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCl7aWYoTW9kdWxlWyJsb2NhdGVGaWxlIl0pe3JldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLHNjcmlwdERpcmVjdG9yeSl9cmV0dXJuIHNjcmlwdERpcmVjdG9yeStwYXRofXZhciByZWFkXyxyZWFkQXN5bmMscmVhZEJpbmFyeSxzZXRXaW5kb3dUaXRsZTt2YXIgbm9kZUZTO3ZhciBub2RlUGF0aDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1yZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpKyIvIn1lbHNle3NjcmlwdERpcmVjdG9yeT1fX2Rpcm5hbWUrIi8ifXJlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKCJmcyIpO2lmKCFub2RlUGF0aClub2RlUGF0aD1yZXF1aXJlKCJwYXRoIik7ZmlsZW5hbWU9bm9kZVBhdGhbIm5vcm1hbGl6ZSJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTWyJyZWFkRmlsZVN5bmMiXShmaWxlbmFtZSxiaW5hcnk/bnVsbDoidXRmOCIpfTtyZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZmlsZW5hbWUpe3ZhciByZXQ9cmVhZF8oZmlsZW5hbWUsdHJ1ZSk7aWYoIXJldC5idWZmZXIpe3JldD1uZXcgVWludDhBcnJheShyZXQpfWFzc2VydChyZXQuYnVmZmVyKTtyZXR1cm4gcmV0fTtpZihwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoPjEpe3RoaXNQcm9ncmFtPXByb2Nlc3NbImFyZ3YiXVsxXS5yZXBsYWNlKC9cXC9nLCIvIil9YXJndW1lbnRzXz1wcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7cHJvY2Vzc1sib24iXSgidW5jYXVnaHRFeGNlcHRpb24iLGZ1bmN0aW9uKGV4KXtpZighKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpe3Rocm93IGV4fX0pO3Byb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsYWJvcnQpO3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cHJvY2Vzc1siZXhpdCJdKHN0YXR1cyl9O01vZHVsZVsiaW5zcGVjdCJdPWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19TSEVMTCl7aWYodHlwZW9mIHJlYWQhPSJ1bmRlZmluZWQiKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGYpe3JldHVybiByZWFkKGYpfX1yZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7dmFyIGRhdGE7aWYodHlwZW9mIHJlYWRidWZmZXI9PT0iZnVuY3Rpb24iKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVhZGJ1ZmZlcihmKSl9ZGF0YT1yZWFkKGYsImJpbmFyeSIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PSJvYmplY3QiKTtyZXR1cm4gZGF0YX07aWYodHlwZW9mIHNjcmlwdEFyZ3MhPSJ1bmRlZmluZWQiKXthcmd1bWVudHNfPXNjcmlwdEFyZ3N9ZWxzZSBpZih0eXBlb2YgYXJndW1lbnRzIT0idW5kZWZpbmVkIil7YXJndW1lbnRzXz1hcmd1bWVudHN9aWYodHlwZW9mIHF1aXQ9PT0iZnVuY3Rpb24iKXtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3F1aXQoc3RhdHVzKX19aWYodHlwZW9mIHByaW50IT09InVuZGVmaW5lZCIpe2lmKHR5cGVvZiBjb25zb2xlPT09InVuZGVmaW5lZCIpY29uc29sZT17fTtjb25zb2xlLmxvZz1wcmludDtjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnIhPT0idW5kZWZpbmVkIj9wcmludEVycjpwcmludH19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9c2VsZi5sb2NhdGlvbi5ocmVmfWVsc2UgaWYodHlwZW9mIGRvY3VtZW50IT09InVuZGVmaW5lZCImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQpe3NjcmlwdERpcmVjdG9yeT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY31pZihfc2NyaXB0RGlyKXtzY3JpcHREaXJlY3Rvcnk9X3NjcmlwdERpcn1pZihzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9IiJ9e3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQodXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO3JldHVybiB4aHIucmVzcG9uc2VUZXh0fTtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeSh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24gcmVhZEFzeW5jKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oIkdFVCIsdXJsLHRydWUpO3hoci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIjt4aHIub25sb2FkPWZ1bmN0aW9uIHhocl9vbmxvYWQoKXtpZih4aHIuc3RhdHVzPT0yMDB8fHhoci5zdGF0dXM9PTAmJnhoci5yZXNwb25zZSl7b25sb2FkKHhoci5yZXNwb25zZSk7cmV0dXJufW9uZXJyb3IoKX07eGhyLm9uZXJyb3I9b25lcnJvcjt4aHIuc2VuZChudWxsKX19c2V0V2luZG93VGl0bGU9ZnVuY3Rpb24odGl0bGUpe2RvY3VtZW50LnRpdGxlPXRpdGxlfX1lbHNle312YXIgb3V0PU1vZHVsZVsicHJpbnQiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVsicHJpbnRFcnIiXXx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7Zm9yKGtleSBpbiBtb2R1bGVPdmVycmlkZXMpe2lmKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtNb2R1bGVba2V5XT1tb2R1bGVPdmVycmlkZXNba2V5XX19bW9kdWxlT3ZlcnJpZGVzPW51bGw7aWYoTW9kdWxlWyJhcmd1bWVudHMiXSlhcmd1bWVudHNfPU1vZHVsZVsiYXJndW1lbnRzIl07aWYoTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdKXRoaXNQcm9ncmFtPU1vZHVsZVsidGhpc1Byb2dyYW0iXTtpZihNb2R1bGVbInF1aXQiXSlxdWl0Xz1Nb2R1bGVbInF1aXQiXTt2YXIgU1RBQ0tfQUxJR049MTY7ZnVuY3Rpb24gYWxpZ25NZW1vcnkoc2l6ZSxmYWN0b3Ipe2lmKCFmYWN0b3IpZmFjdG9yPVNUQUNLX0FMSUdOO3JldHVybiBNYXRoLmNlaWwoc2l6ZS9mYWN0b3IpKmZhY3Rvcn12YXIgdGVtcFJldDA9MDt2YXIgc2V0VGVtcFJldDA9ZnVuY3Rpb24odmFsdWUpe3RlbXBSZXQwPXZhbHVlfTt2YXIgZ2V0VGVtcFJldDA9ZnVuY3Rpb24oKXtyZXR1cm4gdGVtcFJldDB9O3ZhciB3YXNtQmluYXJ5O2lmKE1vZHVsZVsid2FzbUJpbmFyeSJdKXdhc21CaW5hcnk9TW9kdWxlWyJ3YXNtQmluYXJ5Il07dmFyIG5vRXhpdFJ1bnRpbWU7aWYoTW9kdWxlWyJub0V4aXRSdW50aW1lIl0pbm9FeGl0UnVudGltZT1Nb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXTtpZih0eXBlb2YgV2ViQXNzZW1ibHkhPT0ib2JqZWN0Iil7YWJvcnQoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKX12YXIgd2FzbU1lbW9yeTt2YXIgQUJPUlQ9ZmFsc2U7dmFyIEVYSVRTVEFUVVM7ZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbix0ZXh0KXtpZighY29uZGl0aW9uKXthYm9ydCgiQXNzZXJ0aW9uIGZhaWxlZDogIit0ZXh0KX19dmFyIFVURjhEZWNvZGVyPXR5cGVvZiBUZXh0RGVjb2RlciE9PSJ1bmRlZmluZWQiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnVuZGVmaW5lZDtmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLGlkeCxtYXhCeXRlc1RvUmVhZCl7dmFyIGVuZElkeD1pZHgrbWF4Qnl0ZXNUb1JlYWQ7dmFyIGVuZFB0cj1pZHg7d2hpbGUoaGVhcFtlbmRQdHJdJiYhKGVuZFB0cj49ZW5kSWR4KSkrK2VuZFB0cjtpZihlbmRQdHItaWR4PjE2JiZoZWFwLnN1YmFycmF5JiZVVEY4RGVjb2Rlcil7cmV0dXJuIFVURjhEZWNvZGVyLmRlY29kZShoZWFwLnN1YmFycmF5KGlkeCxlbmRQdHIpKX1lbHNle3ZhciBzdHI9IiI7d2hpbGUoaWR4PGVuZFB0cil7dmFyIHUwPWhlYXBbaWR4KytdO2lmKCEodTAmMTI4KSl7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTtjb250aW51ZX12YXIgdTE9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjIyNCk9PTE5Mil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCh1MCYzMSk8PDZ8dTEpO2NvbnRpbnVlfXZhciB1Mj1oZWFwW2lkeCsrXSY2MztpZigodTAmMjQwKT09MjI0KXt1MD0odTAmMTUpPDwxMnx1MTw8Nnx1Mn1lbHNle3UwPSh1MCY3KTw8MTh8dTE8PDEyfHUyPDw2fGhlYXBbaWR4KytdJjYzfWlmKHUwPDY1NTM2KXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApfWVsc2V7dmFyIGNoPXUwLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9fX1yZXR1cm4gc3RyfWZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsbWF4Qnl0ZXNUb1JlYWQpe3JldHVybiBwdHI/VVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LHB0cixtYXhCeXRlc1RvUmVhZCk6IiJ9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLGhlYXAsb3V0SWR4LG1heEJ5dGVzVG9Xcml0ZSl7aWYoIShtYXhCeXRlc1RvV3JpdGU+MCkpcmV0dXJuIDA7dmFyIHN0YXJ0SWR4PW91dElkeDt2YXIgZW5kSWR4PW91dElkeCttYXhCeXRlc1RvV3JpdGUtMTtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpe3ZhciB1MT1zdHIuY2hhckNvZGVBdCgrK2kpO3U9NjU1MzYrKCh1JjEwMjMpPDwxMCl8dTEmMTAyM31pZih1PD0xMjcpe2lmKG91dElkeD49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPXV9ZWxzZSBpZih1PD0yMDQ3KXtpZihvdXRJZHgrMT49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTE5Mnx1Pj42O2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2UgaWYodTw9NjU1MzUpe2lmKG91dElkeCsyPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjI0fHU+PjEyO2hlYXBbb3V0SWR4KytdPTEyOHx1Pj42JjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2V7aWYob3V0SWR4KzM+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0yNDB8dT4+MTg7aGVhcFtvdXRJZHgrK109MTI4fHU+PjEyJjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1Pj42JjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfX1oZWFwW291dElkeF09MDtyZXR1cm4gb3V0SWR4LXN0YXJ0SWR4fWZ1bmN0aW9uIHN0cmluZ1RvVVRGOChzdHIsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl7cmV0dXJuIHN0cmluZ1RvVVRGOEFycmF5KHN0cixIRUFQVTgsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl9ZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEY4KHN0cil7dmFyIGxlbj0wO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciB1PXN0ci5jaGFyQ29kZUF0KGkpO2lmKHU+PTU1Mjk2JiZ1PD01NzM0Myl1PTY1NTM2KygodSYxMDIzKTw8MTApfHN0ci5jaGFyQ29kZUF0KCsraSkmMTAyMztpZih1PD0xMjcpKytsZW47ZWxzZSBpZih1PD0yMDQ3KWxlbis9MjtlbHNlIGlmKHU8PTY1NTM1KWxlbis9MztlbHNlIGxlbis9NH1yZXR1cm4gbGVufXZhciBVVEYxNkRlY29kZXI9dHlwZW9mIFRleHREZWNvZGVyIT09InVuZGVmaW5lZCI/bmV3IFRleHREZWNvZGVyKCJ1dGYtMTZsZSIpOnVuZGVmaW5lZDtmdW5jdGlvbiBVVEYxNlRvU3RyaW5nKHB0cixtYXhCeXRlc1RvUmVhZCl7dmFyIGVuZFB0cj1wdHI7dmFyIGlkeD1lbmRQdHI+PjE7dmFyIG1heElkeD1pZHgrbWF4Qnl0ZXNUb1JlYWQvMjt3aGlsZSghKGlkeD49bWF4SWR4KSYmSEVBUFUxNltpZHhdKSsraWR4O2VuZFB0cj1pZHg8PDE7aWYoZW5kUHRyLXB0cj4zMiYmVVRGMTZEZWNvZGVyKXtyZXR1cm4gVVRGMTZEZWNvZGVyLmRlY29kZShIRUFQVTguc3ViYXJyYXkocHRyLGVuZFB0cikpfWVsc2V7dmFyIHN0cj0iIjtmb3IodmFyIGk9MDshKGk+PW1heEJ5dGVzVG9SZWFkLzIpOysraSl7dmFyIGNvZGVVbml0PUhFQVAxNltwdHIraSoyPj4xXTtpZihjb2RlVW5pdD09MClicmVhaztzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVVuaXQpfXJldHVybiBzdHJ9fWZ1bmN0aW9uIHN0cmluZ1RvVVRGMTYoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe2lmKG1heEJ5dGVzVG9Xcml0ZT09PXVuZGVmaW5lZCl7bWF4Qnl0ZXNUb1dyaXRlPTIxNDc0ODM2NDd9aWYobWF4Qnl0ZXNUb1dyaXRlPDIpcmV0dXJuIDA7bWF4Qnl0ZXNUb1dyaXRlLT0yO3ZhciBzdGFydFB0cj1vdXRQdHI7dmFyIG51bUNoYXJzVG9Xcml0ZT1tYXhCeXRlc1RvV3JpdGU8c3RyLmxlbmd0aCoyP21heEJ5dGVzVG9Xcml0ZS8yOnN0ci5sZW5ndGg7Zm9yKHZhciBpPTA7aTxudW1DaGFyc1RvV3JpdGU7KytpKXt2YXIgY29kZVVuaXQ9c3RyLmNoYXJDb2RlQXQoaSk7SEVBUDE2W291dFB0cj4+MV09Y29kZVVuaXQ7b3V0UHRyKz0yfUhFQVAxNltvdXRQdHI+PjFdPTA7cmV0dXJuIG91dFB0ci1zdGFydFB0cn1mdW5jdGlvbiBsZW5ndGhCeXRlc1VURjE2KHN0cil7cmV0dXJuIHN0ci5sZW5ndGgqMn1mdW5jdGlvbiBVVEYzMlRvU3RyaW5nKHB0cixtYXhCeXRlc1RvUmVhZCl7dmFyIGk9MDt2YXIgc3RyPSIiO3doaWxlKCEoaT49bWF4Qnl0ZXNUb1JlYWQvNCkpe3ZhciB1dGYzMj1IRUFQMzJbcHRyK2kqND4+Ml07aWYodXRmMzI9PTApYnJlYWs7KytpO2lmKHV0ZjMyPj02NTUzNil7dmFyIGNoPXV0ZjMyLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9ZWxzZXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodXRmMzIpfX1yZXR1cm4gc3RyfWZ1bmN0aW9uIHN0cmluZ1RvVVRGMzIoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe2lmKG1heEJ5dGVzVG9Xcml0ZT09PXVuZGVmaW5lZCl7bWF4Qnl0ZXNUb1dyaXRlPTIxNDc0ODM2NDd9aWYobWF4Qnl0ZXNUb1dyaXRlPDQpcmV0dXJuIDA7dmFyIHN0YXJ0UHRyPW91dFB0cjt2YXIgZW5kUHRyPXN0YXJ0UHRyK21heEJ5dGVzVG9Xcml0ZS00O2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpKTtpZihjb2RlVW5pdD49NTUyOTYmJmNvZGVVbml0PD01NzM0Myl7dmFyIHRyYWlsU3Vycm9nYXRlPXN0ci5jaGFyQ29kZUF0KCsraSk7Y29kZVVuaXQ9NjU1MzYrKChjb2RlVW5pdCYxMDIzKTw8MTApfHRyYWlsU3Vycm9nYXRlJjEwMjN9SEVBUDMyW291dFB0cj4+Ml09Y29kZVVuaXQ7b3V0UHRyKz00O2lmKG91dFB0cis0PmVuZFB0cilicmVha31IRUFQMzJbb3V0UHRyPj4yXT0wO3JldHVybiBvdXRQdHItc3RhcnRQdHJ9ZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEYzMihzdHIpe3ZhciBsZW49MDtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgY29kZVVuaXQ9c3RyLmNoYXJDb2RlQXQoaSk7aWYoY29kZVVuaXQ+PTU1Mjk2JiZjb2RlVW5pdDw9NTczNDMpKytpO2xlbis9NH1yZXR1cm4gbGVufWZ1bmN0aW9uIGFsaWduVXAoeCxtdWx0aXBsZSl7aWYoeCVtdWx0aXBsZT4wKXt4Kz1tdWx0aXBsZS14JW11bHRpcGxlfXJldHVybiB4fXZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlWyJIRUFQOCJdPUhFQVA4PW5ldyBJbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVAxNiJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUDMyIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQVTgiXT1IRUFQVTg9bmV3IFVpbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVBVMTYiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUFUzMiJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjMyIl09SEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjY0Il09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIElOSVRJQUxfTUVNT1JZPU1vZHVsZVsiSU5JVElBTF9NRU1PUlkiXXx8Mjk5OTU4MjcyO3ZhciB3YXNtVGFibGU7dmFyIF9fQVRQUkVSVU5fXz1bXTt2YXIgX19BVElOSVRfXz1bXTt2YXIgX19BVE1BSU5fXz1bXTt2YXIgX19BVFBPU1RSVU5fXz1bXTt2YXIgcnVudGltZUluaXRpYWxpemVkPWZhbHNlO2Z1bmN0aW9uIHByZVJ1bigpe2lmKE1vZHVsZVsicHJlUnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlUnVuIl09W01vZHVsZVsicHJlUnVuIl1dO3doaWxlKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKXthZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7aWYoIU1vZHVsZVsibm9GU0luaXQiXSYmIUZTLmluaXQuaW5pdGlhbGl6ZWQpRlMuaW5pdCgpO1RUWS5pbml0KCk7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe0ZTLmlnbm9yZVBlcm1pc3Npb25zPWZhbHNlO2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihNb2R1bGVbInBvc3RSdW4iXSl7aWYodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicG9zdFJ1biJdPVtNb2R1bGVbInBvc3RSdW4iXV07d2hpbGUoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlWyJwb3N0UnVuIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pfWZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKXtfX0FUUFJFUlVOX18udW5zaGlmdChjYil9ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfXZhciBydW5EZXBlbmRlbmNpZXM9MDt2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb24gZ2V0VW5pcXVlUnVuRGVwZW5kZW5jeShpZCl7cmV0dXJuIGlkfWZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcysrO2lmKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKXtNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpfX1mdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMtLTtpZihNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSl7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKX1pZihydW5EZXBlbmRlbmNpZXM9PTApe2lmKHJ1bkRlcGVuZGVuY3lXYXRjaGVyIT09bnVsbCl7Y2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7cnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbH1pZihkZXBlbmRlbmNpZXNGdWxmaWxsZWQpe3ZhciBjYWxsYmFjaz1kZXBlbmRlbmNpZXNGdWxmaWxsZWQ7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7Y2FsbGJhY2soKX19fU1vZHVsZVsicHJlbG9hZGVkSW1hZ2VzIl09e307TW9kdWxlWyJwcmVsb2FkZWRBdWRpb3MiXT17fTtmdW5jdGlvbiBhYm9ydCh3aGF0KXtpZihNb2R1bGVbIm9uQWJvcnQiXSl7TW9kdWxlWyJvbkFib3J0Il0od2hhdCl9d2hhdCs9IiI7ZXJyKHdoYXQpO0FCT1JUPXRydWU7RVhJVFNUQVRVUz0xO3doYXQ9ImFib3J0KCIrd2hhdCsiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iO3ZhciBlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7cmVhZHlQcm9taXNlUmVqZWN0KGUpO3Rocm93IGV9ZnVuY3Rpb24gaGFzUHJlZml4KHN0cixwcmVmaXgpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGg/c3RyLnN0YXJ0c1dpdGgocHJlZml4KTpzdHIuaW5kZXhPZihwcmVmaXgpPT09MH12YXIgZGF0YVVSSVByZWZpeD0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGRhdGFVUklQcmVmaXgpfXZhciBmaWxlVVJJUHJlZml4PSJmaWxlOi8vIjtmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZmlsZVVSSVByZWZpeCl9dmFyIHdhc21CaW5hcnlGaWxlPSJiYXNpc19lbmNvZGVyLndhc20iO2lmKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKXt3YXNtQmluYXJ5RmlsZT1sb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKX1mdW5jdGlvbiBnZXRCaW5hcnkoKXt0cnl7aWYod2FzbUJpbmFyeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpfWlmKHJlYWRCaW5hcnkpe3JldHVybiByZWFkQmluYXJ5KHdhc21CaW5hcnlGaWxlKX1lbHNle3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn19Y2F0Y2goZXJyKXthYm9ydChlcnIpfX1mdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCl7aWYoIXdhc21CaW5hcnkmJihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUikmJnR5cGVvZiBmZXRjaD09PSJmdW5jdGlvbiImJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXtpZighcmVzcG9uc2VbIm9rIl0pe3Rocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrd2FzbUJpbmFyeUZpbGUrIicifXJldHVybiByZXNwb25zZVsiYXJyYXlCdWZmZXIiXSgpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KCl9KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihnZXRCaW5hcnkpfWZ1bmN0aW9uIGNyZWF0ZVdhc20oKXt2YXIgaW5mbz17ImEiOmFzbUxpYnJhcnlBcmd9O2Z1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSxtb2R1bGUpe3ZhciBleHBvcnRzPWluc3RhbmNlLmV4cG9ydHM7TW9kdWxlWyJhc20iXT1leHBvcnRzO3dhc21NZW1vcnk9TW9kdWxlWyJhc20iXVsiWiJdO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTt3YXNtVGFibGU9TW9kdWxlWyJhc20iXVsiXyJdO3JlbW92ZVJ1bkRlcGVuZGVuY3koIndhc20taW5zdGFudGlhdGUiKX1hZGRSdW5EZXBlbmRlbmN5KCJ3YXNtLWluc3RhbnRpYXRlIik7ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpe3JlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pfWZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpe3JldHVybiBnZXRCaW5hcnlQcm9taXNlKCkudGhlbihmdW5jdGlvbihiaW5hcnkpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksaW5mbyl9KS50aGVuKHJlY2VpdmVyLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiK3JlYXNvbik7YWJvcnQocmVhc29uKX0pfWZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoKXtpZighd2FzbUJpbmFyeSYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT09ImZ1bmN0aW9uIiYmIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkmJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpJiZ0eXBlb2YgZmV0Y2g9PT0iZnVuY3Rpb24iKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXt2YXIgcmVzdWx0PVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLGluZm8pO3JldHVybiByZXN1bHQudGhlbihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIityZWFzb24pO2VycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX0pfSl9ZWxzZXtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX19aWYoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSl7dHJ5e3ZhciBleHBvcnRzPU1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbyxyZWNlaXZlSW5zdGFuY2UpO3JldHVybiBleHBvcnRzfWNhdGNoKGUpe2VycigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKTtyZXR1cm4gZmFsc2V9fWluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpO3JldHVybnt9fXZhciB0ZW1wRG91YmxlO3ZhciB0ZW1wSTY0O2Z1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT0iZnVuY3Rpb24iKXtjYWxsYmFjayhNb2R1bGUpO2NvbnRpbnVlfXZhciBmdW5jPWNhbGxiYWNrLmZ1bmM7aWYodHlwZW9mIGZ1bmM9PT0ibnVtYmVyIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXt3YXNtVGFibGUuZ2V0KGZ1bmMpKCl9ZWxzZXt3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19dmFyIEV4Y2VwdGlvbkluZm9BdHRycz17REVTVFJVQ1RPUl9PRkZTRVQ6MCxSRUZDT1VOVF9PRkZTRVQ6NCxUWVBFX09GRlNFVDo4LENBVUdIVF9PRkZTRVQ6MTIsUkVUSFJPV05fT0ZGU0VUOjEzLFNJWkU6MTZ9O2Z1bmN0aW9uIF9fX2N4YV9hbGxvY2F0ZV9leGNlcHRpb24oc2l6ZSl7cmV0dXJuIF9tYWxsb2Moc2l6ZStFeGNlcHRpb25JbmZvQXR0cnMuU0laRSkrRXhjZXB0aW9uSW5mb0F0dHJzLlNJWkV9ZnVuY3Rpb24gRXhjZXB0aW9uSW5mbyhleGNQdHIpe3RoaXMuZXhjUHRyPWV4Y1B0cjt0aGlzLnB0cj1leGNQdHItRXhjZXB0aW9uSW5mb0F0dHJzLlNJWkU7dGhpcy5zZXRfdHlwZT1mdW5jdGlvbih0eXBlKXtIRUFQMzJbdGhpcy5wdHIrRXhjZXB0aW9uSW5mb0F0dHJzLlRZUEVfT0ZGU0VUPj4yXT10eXBlfTt0aGlzLmdldF90eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIEhFQVAzMlt0aGlzLnB0citFeGNlcHRpb25JbmZvQXR0cnMuVFlQRV9PRkZTRVQ+PjJdfTt0aGlzLnNldF9kZXN0cnVjdG9yPWZ1bmN0aW9uKGRlc3RydWN0b3Ipe0hFQVAzMlt0aGlzLnB0citFeGNlcHRpb25JbmZvQXR0cnMuREVTVFJVQ1RPUl9PRkZTRVQ+PjJdPWRlc3RydWN0b3J9O3RoaXMuZ2V0X2Rlc3RydWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gSEVBUDMyW3RoaXMucHRyK0V4Y2VwdGlvbkluZm9BdHRycy5ERVNUUlVDVE9SX09GRlNFVD4+Ml19O3RoaXMuc2V0X3JlZmNvdW50PWZ1bmN0aW9uKHJlZmNvdW50KXtIRUFQMzJbdGhpcy5wdHIrRXhjZXB0aW9uSW5mb0F0dHJzLlJFRkNPVU5UX09GRlNFVD4+Ml09cmVmY291bnR9O3RoaXMuc2V0X2NhdWdodD1mdW5jdGlvbihjYXVnaHQpe2NhdWdodD1jYXVnaHQ/MTowO0hFQVA4W3RoaXMucHRyK0V4Y2VwdGlvbkluZm9BdHRycy5DQVVHSFRfT0ZGU0VUPj4wXT1jYXVnaHR9O3RoaXMuZ2V0X2NhdWdodD1mdW5jdGlvbigpe3JldHVybiBIRUFQOFt0aGlzLnB0citFeGNlcHRpb25JbmZvQXR0cnMuQ0FVR0hUX09GRlNFVD4+MF0hPTB9O3RoaXMuc2V0X3JldGhyb3duPWZ1bmN0aW9uKHJldGhyb3duKXtyZXRocm93bj1yZXRocm93bj8xOjA7SEVBUDhbdGhpcy5wdHIrRXhjZXB0aW9uSW5mb0F0dHJzLlJFVEhST1dOX09GRlNFVD4+MF09cmV0aHJvd259O3RoaXMuZ2V0X3JldGhyb3duPWZ1bmN0aW9uKCl7cmV0dXJuIEhFQVA4W3RoaXMucHRyK0V4Y2VwdGlvbkluZm9BdHRycy5SRVRIUk9XTl9PRkZTRVQ+PjBdIT0wfTt0aGlzLmluaXQ9ZnVuY3Rpb24odHlwZSxkZXN0cnVjdG9yKXt0aGlzLnNldF90eXBlKHR5cGUpO3RoaXMuc2V0X2Rlc3RydWN0b3IoZGVzdHJ1Y3Rvcik7dGhpcy5zZXRfcmVmY291bnQoMCk7dGhpcy5zZXRfY2F1Z2h0KGZhbHNlKTt0aGlzLnNldF9yZXRocm93bihmYWxzZSl9O3RoaXMuYWRkX3JlZj1mdW5jdGlvbigpe3ZhciB2YWx1ZT1IRUFQMzJbdGhpcy5wdHIrRXhjZXB0aW9uSW5mb0F0dHJzLlJFRkNPVU5UX09GRlNFVD4+Ml07SEVBUDMyW3RoaXMucHRyK0V4Y2VwdGlvbkluZm9BdHRycy5SRUZDT1VOVF9PRkZTRVQ+PjJdPXZhbHVlKzF9O3RoaXMucmVsZWFzZV9yZWY9ZnVuY3Rpb24oKXt2YXIgcHJldj1IRUFQMzJbdGhpcy5wdHIrRXhjZXB0aW9uSW5mb0F0dHJzLlJFRkNPVU5UX09GRlNFVD4+Ml07SEVBUDMyW3RoaXMucHRyK0V4Y2VwdGlvbkluZm9BdHRycy5SRUZDT1VOVF9PRkZTRVQ+PjJdPXByZXYtMTtyZXR1cm4gcHJldj09PTF9fXZhciBleGNlcHRpb25MYXN0PTA7dmFyIHVuY2F1Z2h0RXhjZXB0aW9uQ291bnQ9MDtmdW5jdGlvbiBfX19jeGFfdGhyb3cocHRyLHR5cGUsZGVzdHJ1Y3Rvcil7dmFyIGluZm89bmV3IEV4Y2VwdGlvbkluZm8ocHRyKTtpbmZvLmluaXQodHlwZSxkZXN0cnVjdG9yKTtleGNlcHRpb25MYXN0PXB0cjt1bmNhdWdodEV4Y2VwdGlvbkNvdW50Kys7dGhyb3cgcHRyfWZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKXtIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKT4+Ml09dmFsdWU7cmV0dXJuIHZhbHVlfXZhciBQQVRIPXtzcGxpdFBhdGg6ZnVuY3Rpb24oZmlsZW5hbWUpe3ZhciBzcGxpdFBhdGhSZT0vXihcLz98KShbXHNcU10qPykoKD86XC57MSwyfXxbXlwvXSs/fCkoXC5bXi5cL10qfCkpKD86W1wvXSopJC87cmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTpmdW5jdGlvbihwYXJ0cyxhbGxvd0Fib3ZlUm9vdCl7dmFyIHVwPTA7Zm9yKHZhciBpPXBhcnRzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgbGFzdD1wYXJ0c1tpXTtpZihsYXN0PT09Ii4iKXtwYXJ0cy5zcGxpY2UoaSwxKX1lbHNlIGlmKGxhc3Q9PT0iLi4iKXtwYXJ0cy5zcGxpY2UoaSwxKTt1cCsrfWVsc2UgaWYodXApe3BhcnRzLnNwbGljZShpLDEpO3VwLS19fWlmKGFsbG93QWJvdmVSb290KXtmb3IoO3VwO3VwLS0pe3BhcnRzLnVuc2hpZnQoIi4uIil9fXJldHVybiBwYXJ0c30sbm9ybWFsaXplOmZ1bmN0aW9uKHBhdGgpe3ZhciBpc0Fic29sdXRlPXBhdGguY2hhckF0KDApPT09Ii8iLHRyYWlsaW5nU2xhc2g9cGF0aC5zdWJzdHIoLTEpPT09Ii8iO3BhdGg9UEFUSC5ub3JtYWxpemVBcnJheShwYXRoLnNwbGl0KCIvIikuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiEhcH0pLCFpc0Fic29sdXRlKS5qb2luKCIvIik7aWYoIXBhdGgmJiFpc0Fic29sdXRlKXtwYXRoPSIuIn1pZihwYXRoJiZ0cmFpbGluZ1NsYXNoKXtwYXRoKz0iLyJ9cmV0dXJuKGlzQWJzb2x1dGU/Ii8iOiIiKStwYXRofSxkaXJuYW1lOmZ1bmN0aW9uKHBhdGgpe3ZhciByZXN1bHQ9UEFUSC5zcGxpdFBhdGgocGF0aCkscm9vdD1yZXN1bHRbMF0sZGlyPXJlc3VsdFsxXTtpZighcm9vdCYmIWRpcil7cmV0dXJuIi4ifWlmKGRpcil7ZGlyPWRpci5zdWJzdHIoMCxkaXIubGVuZ3RoLTEpfXJldHVybiByb290K2Rpcn0sYmFzZW5hbWU6ZnVuY3Rpb24ocGF0aCl7aWYocGF0aD09PSIvIilyZXR1cm4iLyI7cGF0aD1QQVRILm5vcm1hbGl6ZShwYXRoKTtwYXRoPXBhdGgucmVwbGFjZSgvXC8kLywiIik7dmFyIGxhc3RTbGFzaD1wYXRoLmxhc3RJbmRleE9mKCIvIik7aWYobGFzdFNsYXNoPT09LTEpcmV0dXJuIHBhdGg7cmV0dXJuIHBhdGguc3Vic3RyKGxhc3RTbGFzaCsxKX0sZXh0bmFtZTpmdW5jdGlvbihwYXRoKXtyZXR1cm4gUEFUSC5zcGxpdFBhdGgocGF0aClbM119LGpvaW46ZnVuY3Rpb24oKXt2YXIgcGF0aHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBQQVRILm5vcm1hbGl6ZShwYXRocy5qb2luKCIvIikpfSxqb2luMjpmdW5jdGlvbihsLHIpe3JldHVybiBQQVRILm5vcm1hbGl6ZShsKyIvIityKX19O2Z1bmN0aW9uIGdldFJhbmRvbURldmljZSgpe2lmKHR5cGVvZiBjcnlwdG89PT0ib2JqZWN0IiYmdHlwZW9mIGNyeXB0b1siZ2V0UmFuZG9tVmFsdWVzIl09PT0iZnVuY3Rpb24iKXt2YXIgcmFuZG9tQnVmZmVyPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiBmdW5jdGlvbigpe2NyeXB0by5nZXRSYW5kb21WYWx1ZXMocmFuZG9tQnVmZmVyKTtyZXR1cm4gcmFuZG9tQnVmZmVyWzBdfX1lbHNlIGlmKEVOVklST05NRU5UX0lTX05PREUpe3RyeXt2YXIgY3J5cHRvX21vZHVsZT1yZXF1aXJlKCJjcnlwdG8iKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY3J5cHRvX21vZHVsZVsicmFuZG9tQnl0ZXMiXSgxKVswXX19Y2F0Y2goZSl7fX1yZXR1cm4gZnVuY3Rpb24oKXthYm9ydCgicmFuZG9tRGV2aWNlIil9fXZhciBQQVRIX0ZTPXtyZXNvbHZlOmZ1bmN0aW9uKCl7dmFyIHJlc29sdmVkUGF0aD0iIixyZXNvbHZlZEFic29sdXRlPWZhbHNlO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49LTEmJiFyZXNvbHZlZEFic29sdXRlO2ktLSl7dmFyIHBhdGg9aT49MD9hcmd1bWVudHNbaV06RlMuY3dkKCk7aWYodHlwZW9mIHBhdGghPT0ic3RyaW5nIil7dGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKX1lbHNlIGlmKCFwYXRoKXtyZXR1cm4iIn1yZXNvbHZlZFBhdGg9cGF0aCsiLyIrcmVzb2x2ZWRQYXRoO3Jlc29sdmVkQWJzb2x1dGU9cGF0aC5jaGFyQXQoMCk9PT0iLyJ9cmVzb2x2ZWRQYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocmVzb2x2ZWRQYXRoLnNwbGl0KCIvIikuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiEhcH0pLCFyZXNvbHZlZEFic29sdXRlKS5qb2luKCIvIik7cmV0dXJuKHJlc29sdmVkQWJzb2x1dGU/Ii8iOiIiKStyZXNvbHZlZFBhdGh8fCIuIn0scmVsYXRpdmU6ZnVuY3Rpb24oZnJvbSx0byl7ZnJvbT1QQVRIX0ZTLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO3RvPVBBVEhfRlMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO2Z1bmN0aW9uIHRyaW0oYXJyKXt2YXIgc3RhcnQ9MDtmb3IoO3N0YXJ0PGFyci5sZW5ndGg7c3RhcnQrKyl7aWYoYXJyW3N0YXJ0XSE9PSIiKWJyZWFrfXZhciBlbmQ9YXJyLmxlbmd0aC0xO2Zvcig7ZW5kPj0wO2VuZC0tKXtpZihhcnJbZW5kXSE9PSIiKWJyZWFrfWlmKHN0YXJ0PmVuZClyZXR1cm5bXTtyZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LGVuZC1zdGFydCsxKX12YXIgZnJvbVBhcnRzPXRyaW0oZnJvbS5zcGxpdCgiLyIpKTt2YXIgdG9QYXJ0cz10cmltKHRvLnNwbGl0KCIvIikpO3ZhciBsZW5ndGg9TWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCx0b1BhcnRzLmxlbmd0aCk7dmFyIHNhbWVQYXJ0c0xlbmd0aD1sZW5ndGg7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXtpZihmcm9tUGFydHNbaV0hPT10b1BhcnRzW2ldKXtzYW1lUGFydHNMZW5ndGg9aTticmVha319dmFyIG91dHB1dFBhcnRzPVtdO2Zvcih2YXIgaT1zYW1lUGFydHNMZW5ndGg7aTxmcm9tUGFydHMubGVuZ3RoO2krKyl7b3V0cHV0UGFydHMucHVzaCgiLi4iKX1vdXRwdXRQYXJ0cz1vdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtyZXR1cm4gb3V0cHV0UGFydHMuam9pbigiLyIpfX07dmFyIFRUWT17dHR5czpbXSxpbml0OmZ1bmN0aW9uKCl7fSxzaHV0ZG93bjpmdW5jdGlvbigpe30scmVnaXN0ZXI6ZnVuY3Rpb24oZGV2LG9wcyl7VFRZLnR0eXNbZGV2XT17aW5wdXQ6W10sb3V0cHV0OltdLG9wczpvcHN9O0ZTLnJlZ2lzdGVyRGV2aWNlKGRldixUVFkuc3RyZWFtX29wcyl9LHN0cmVhbV9vcHM6e29wZW46ZnVuY3Rpb24oc3RyZWFtKXt2YXIgdHR5PVRUWS50dHlzW3N0cmVhbS5ub2RlLnJkZXZdO2lmKCF0dHkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDQzKX1zdHJlYW0udHR5PXR0eTtzdHJlYW0uc2Vla2FibGU9ZmFsc2V9LGNsb3NlOmZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnR0eS5vcHMuZmx1c2goc3RyZWFtLnR0eSl9LGZsdXNoOmZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnR0eS5vcHMuZmx1c2goc3RyZWFtLnR0eSl9LHJlYWQ6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7aWYoIXN0cmVhbS50dHl8fCFzdHJlYW0udHR5Lm9wcy5nZXRfY2hhcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjApfXZhciBieXRlc1JlYWQ9MDtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3ZhciByZXN1bHQ7dHJ5e3Jlc3VsdD1zdHJlYW0udHR5Lm9wcy5nZXRfY2hhcihzdHJlYW0udHR5KX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2KX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSx3cml0ZTpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtpZighc3RyZWFtLnR0eXx8IXN0cmVhbS50dHkub3BzLnB1dF9jaGFyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2MCl9dHJ5e2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7c3RyZWFtLnR0eS5vcHMucHV0X2NoYXIoc3RyZWFtLnR0eSxidWZmZXJbb2Zmc2V0K2ldKX19Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpfWlmKGxlbmd0aCl7c3RyZWFtLm5vZGUudGltZXN0YW1wPURhdGUubm93KCl9cmV0dXJuIGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyOmZ1bmN0aW9uKHR0eSl7aWYoIXR0eS5pbnB1dC5sZW5ndGgpe3ZhciByZXN1bHQ9bnVsbDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXt2YXIgQlVGU0laRT0yNTY7dmFyIGJ1Zj1CdWZmZXIuYWxsb2M/QnVmZmVyLmFsbG9jKEJVRlNJWkUpOm5ldyBCdWZmZXIoQlVGU0laRSk7dmFyIGJ5dGVzUmVhZD0wO3RyeXtieXRlc1JlYWQ9bm9kZUZTLnJlYWRTeW5jKHByb2Nlc3Muc3RkaW4uZmQsYnVmLDAsQlVGU0laRSxudWxsKX1jYXRjaChlKXtpZihlLnRvU3RyaW5nKCkuaW5kZXhPZigiRU9GIikhPS0xKWJ5dGVzUmVhZD0wO2Vsc2UgdGhyb3cgZX1pZihieXRlc1JlYWQ+MCl7cmVzdWx0PWJ1Zi5zbGljZSgwLGJ5dGVzUmVhZCkudG9TdHJpbmcoInV0Zi04Iil9ZWxzZXtyZXN1bHQ9bnVsbH19ZWxzZSBpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5wcm9tcHQ9PSJmdW5jdGlvbiIpe3Jlc3VsdD13aW5kb3cucHJvbXB0KCJJbnB1dDogIik7aWYocmVzdWx0IT09bnVsbCl7cmVzdWx0Kz0iXG4ifX1lbHNlIGlmKHR5cGVvZiByZWFkbGluZT09ImZ1bmN0aW9uIil7cmVzdWx0PXJlYWRsaW5lKCk7aWYocmVzdWx0IT09bnVsbCl7cmVzdWx0Kz0iXG4ifX1pZighcmVzdWx0KXtyZXR1cm4gbnVsbH10dHkuaW5wdXQ9aW50QXJyYXlGcm9tU3RyaW5nKHJlc3VsdCx0cnVlKX1yZXR1cm4gdHR5LmlucHV0LnNoaWZ0KCl9LHB1dF9jaGFyOmZ1bmN0aW9uKHR0eSx2YWwpe2lmKHZhbD09PW51bGx8fHZhbD09PTEwKXtvdXQoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwwKSk7dHR5Lm91dHB1dD1bXX1lbHNle2lmKHZhbCE9MCl0dHkub3V0cHV0LnB1c2godmFsKX19LGZsdXNoOmZ1bmN0aW9uKHR0eSl7aWYodHR5Lm91dHB1dCYmdHR5Lm91dHB1dC5sZW5ndGg+MCl7b3V0KFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119fX0sZGVmYXVsdF90dHkxX29wczp7cHV0X2NoYXI6ZnVuY3Rpb24odHR5LHZhbCl7aWYodmFsPT09bnVsbHx8dmFsPT09MTApe2VycihVVEY4QXJyYXlUb1N0cmluZyh0dHkub3V0cHV0LDApKTt0dHkub3V0cHV0PVtdfWVsc2V7aWYodmFsIT0wKXR0eS5vdXRwdXQucHVzaCh2YWwpfX0sZmx1c2g6ZnVuY3Rpb24odHR5KXtpZih0dHkub3V0cHV0JiZ0dHkub3V0cHV0Lmxlbmd0aD4wKXtlcnIoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwwKSk7dHR5Lm91dHB1dD1bXX19fX07ZnVuY3Rpb24gbW1hcEFsbG9jKHNpemUpe3ZhciBhbGlnbmVkU2l6ZT1hbGlnbk1lbW9yeShzaXplLDE2Mzg0KTt2YXIgcHRyPV9tYWxsb2MoYWxpZ25lZFNpemUpO3doaWxlKHNpemU8YWxpZ25lZFNpemUpSEVBUDhbcHRyK3NpemUrK109MDtyZXR1cm4gcHRyfXZhciBNRU1GUz17b3BzX3RhYmxlOm51bGwsbW91bnQ6ZnVuY3Rpb24obW91bnQpe3JldHVybiBNRU1GUy5jcmVhdGVOb2RlKG51bGwsIi8iLDE2Mzg0fDUxMSwwKX0sY3JlYXRlTm9kZTpmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7aWYoRlMuaXNCbGtkZXYobW9kZSl8fEZTLmlzRklGTyhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpfWlmKCFNRU1GUy5vcHNfdGFibGUpe01FTUZTLm9wc190YWJsZT17ZGlyOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLGxvb2t1cDpNRU1GUy5ub2RlX29wcy5sb29rdXAsbWtub2Q6TUVNRlMubm9kZV9vcHMubWtub2QscmVuYW1lOk1FTUZTLm5vZGVfb3BzLnJlbmFtZSx1bmxpbms6TUVNRlMubm9kZV9vcHMudW5saW5rLHJtZGlyOk1FTUZTLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6TUVNRlMubm9kZV9vcHMucmVhZGRpcixzeW1saW5rOk1FTUZTLm5vZGVfb3BzLnN5bWxpbmt9LHN0cmVhbTp7bGxzZWVrOk1FTUZTLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOntsbHNlZWs6TUVNRlMuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpNRU1GUy5zdHJlYW1fb3BzLnJlYWQsd3JpdGU6TUVNRlMuc3RyZWFtX29wcy53cml0ZSxhbGxvY2F0ZTpNRU1GUy5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6TUVNRlMuc3RyZWFtX29wcy5tbWFwLG1zeW5jOk1FTUZTLnN0cmVhbV9vcHMubXN5bmN9fSxsaW5rOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLHJlYWRsaW5rOk1FTUZTLm5vZGVfb3BzLnJlYWRsaW5rfSxzdHJlYW06e319LGNocmRldjp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOkZTLmNocmRldl9zdHJlYW1fb3BzfX19dmFyIG5vZGU9RlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlLGRldik7aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuZGlyLm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5kaXIuc3RyZWFtO25vZGUuY29udGVudHM9e319ZWxzZSBpZihGUy5pc0ZpbGUobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuZmlsZS5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUuZmlsZS5zdHJlYW07bm9kZS51c2VkQnl0ZXM9MDtub2RlLmNvbnRlbnRzPW51bGx9ZWxzZSBpZihGUy5pc0xpbmsobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUubGluay5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUubGluay5zdHJlYW19ZWxzZSBpZihGUy5pc0NocmRldihub2RlLm1vZGUpKXtub2RlLm5vZGVfb3BzPU1FTUZTLm9wc190YWJsZS5jaHJkZXYubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmNocmRldi5zdHJlYW19bm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKTtpZihwYXJlbnQpe3BhcmVudC5jb250ZW50c1tuYW1lXT1ub2RlfXJldHVybiBub2RlfSxnZXRGaWxlRGF0YUFzUmVndWxhckFycmF5OmZ1bmN0aW9uKG5vZGUpe2lmKG5vZGUuY29udGVudHMmJm5vZGUuY29udGVudHMuc3ViYXJyYXkpe3ZhciBhcnI9W107Zm9yKHZhciBpPTA7aTxub2RlLnVzZWRCeXRlczsrK2kpYXJyLnB1c2gobm9kZS5jb250ZW50c1tpXSk7cmV0dXJuIGFycn1yZXR1cm4gbm9kZS5jb250ZW50c30sZ2V0RmlsZURhdGFBc1R5cGVkQXJyYXk6ZnVuY3Rpb24obm9kZSl7aWYoIW5vZGUuY29udGVudHMpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2lmKG5vZGUuY29udGVudHMuc3ViYXJyYXkpcmV0dXJuIG5vZGUuY29udGVudHMuc3ViYXJyYXkoMCxub2RlLnVzZWRCeXRlcyk7cmV0dXJuIG5ldyBVaW50OEFycmF5KG5vZGUuY29udGVudHMpfSxleHBhbmRGaWxlU3RvcmFnZTpmdW5jdGlvbihub2RlLG5ld0NhcGFjaXR5KXt2YXIgcHJldkNhcGFjaXR5PW5vZGUuY29udGVudHM/bm9kZS5jb250ZW50cy5sZW5ndGg6MDtpZihwcmV2Q2FwYWNpdHk+PW5ld0NhcGFjaXR5KXJldHVybjt2YXIgQ0FQQUNJVFlfRE9VQkxJTkdfTUFYPTEwMjQqMTAyNDtuZXdDYXBhY2l0eT1NYXRoLm1heChuZXdDYXBhY2l0eSxwcmV2Q2FwYWNpdHkqKHByZXZDYXBhY2l0eTxDQVBBQ0lUWV9ET1VCTElOR19NQVg/MjoxLjEyNSk+Pj4wKTtpZihwcmV2Q2FwYWNpdHkhPTApbmV3Q2FwYWNpdHk9TWF0aC5tYXgobmV3Q2FwYWNpdHksMjU2KTt2YXIgb2xkQ29udGVudHM9bm9kZS5jb250ZW50cztub2RlLmNvbnRlbnRzPW5ldyBVaW50OEFycmF5KG5ld0NhcGFjaXR5KTtpZihub2RlLnVzZWRCeXRlcz4wKW5vZGUuY29udGVudHMuc2V0KG9sZENvbnRlbnRzLnN1YmFycmF5KDAsbm9kZS51c2VkQnl0ZXMpLDApO3JldHVybn0scmVzaXplRmlsZVN0b3JhZ2U6ZnVuY3Rpb24obm9kZSxuZXdTaXplKXtpZihub2RlLnVzZWRCeXRlcz09bmV3U2l6ZSlyZXR1cm47aWYobmV3U2l6ZT09MCl7bm9kZS5jb250ZW50cz1udWxsO25vZGUudXNlZEJ5dGVzPTA7cmV0dXJufWlmKCFub2RlLmNvbnRlbnRzfHxub2RlLmNvbnRlbnRzLnN1YmFycmF5KXt2YXIgb2xkQ29udGVudHM9bm9kZS5jb250ZW50cztub2RlLmNvbnRlbnRzPW5ldyBVaW50OEFycmF5KG5ld1NpemUpO2lmKG9sZENvbnRlbnRzKXtub2RlLmNvbnRlbnRzLnNldChvbGRDb250ZW50cy5zdWJhcnJheSgwLE1hdGgubWluKG5ld1NpemUsbm9kZS51c2VkQnl0ZXMpKSl9bm9kZS51c2VkQnl0ZXM9bmV3U2l6ZTtyZXR1cm59aWYoIW5vZGUuY29udGVudHMpbm9kZS5jb250ZW50cz1bXTtpZihub2RlLmNvbnRlbnRzLmxlbmd0aD5uZXdTaXplKW5vZGUuY29udGVudHMubGVuZ3RoPW5ld1NpemU7ZWxzZSB3aGlsZShub2RlLmNvbnRlbnRzLmxlbmd0aDxuZXdTaXplKW5vZGUuY29udGVudHMucHVzaCgwKTtub2RlLnVzZWRCeXRlcz1uZXdTaXplfSxub2RlX29wczp7Z2V0YXR0cjpmdW5jdGlvbihub2RlKXt2YXIgYXR0cj17fTthdHRyLmRldj1GUy5pc0NocmRldihub2RlLm1vZGUpP25vZGUuaWQ6MTthdHRyLmlubz1ub2RlLmlkO2F0dHIubW9kZT1ub2RlLm1vZGU7YXR0ci5ubGluaz0xO2F0dHIudWlkPTA7YXR0ci5naWQ9MDthdHRyLnJkZXY9bm9kZS5yZGV2O2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT00MDk2fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT1ub2RlLnVzZWRCeXRlc31lbHNlIGlmKEZTLmlzTGluayhub2RlLm1vZGUpKXthdHRyLnNpemU9bm9kZS5saW5rLmxlbmd0aH1lbHNle2F0dHIuc2l6ZT0wfWF0dHIuYXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIubXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuY3RpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuYmxrc2l6ZT00MDk2O2F0dHIuYmxvY2tzPU1hdGguY2VpbChhdHRyLnNpemUvYXR0ci5ibGtzaXplKTtyZXR1cm4gYXR0cn0sc2V0YXR0cjpmdW5jdGlvbihub2RlLGF0dHIpe2lmKGF0dHIubW9kZSE9PXVuZGVmaW5lZCl7bm9kZS5tb2RlPWF0dHIubW9kZX1pZihhdHRyLnRpbWVzdGFtcCE9PXVuZGVmaW5lZCl7bm9kZS50aW1lc3RhbXA9YXR0ci50aW1lc3RhbXB9aWYoYXR0ci5zaXplIT09dW5kZWZpbmVkKXtNRU1GUy5yZXNpemVGaWxlU3RvcmFnZShub2RlLGF0dHIuc2l6ZSl9fSxsb29rdXA6ZnVuY3Rpb24ocGFyZW50LG5hbWUpe3Rocm93IEZTLmdlbmVyaWNFcnJvcnNbNDRdfSxta25vZDpmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7cmV0dXJuIE1FTUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSxkZXYpfSxyZW5hbWU6ZnVuY3Rpb24ob2xkX25vZGUsbmV3X2RpcixuZXdfbmFtZSl7aWYoRlMuaXNEaXIob2xkX25vZGUubW9kZSkpe3ZhciBuZXdfbm9kZTt0cnl7bmV3X25vZGU9RlMubG9va3VwTm9kZShuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt9aWYobmV3X25vZGUpe2Zvcih2YXIgaSBpbiBuZXdfbm9kZS5jb250ZW50cyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTUpfX19ZGVsZXRlIG9sZF9ub2RlLnBhcmVudC5jb250ZW50c1tvbGRfbm9kZS5uYW1lXTtvbGRfbm9kZS5uYW1lPW5ld19uYW1lO25ld19kaXIuY29udGVudHNbbmV3X25hbWVdPW9sZF9ub2RlO29sZF9ub2RlLnBhcmVudD1uZXdfZGlyfSx1bmxpbms6ZnVuY3Rpb24ocGFyZW50LG5hbWUpe2RlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19LHJtZGlyOmZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTtmb3IodmFyIGkgaW4gbm9kZS5jb250ZW50cyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTUpfWRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19LHJlYWRkaXI6ZnVuY3Rpb24obm9kZSl7dmFyIGVudHJpZXM9WyIuIiwiLi4iXTtmb3IodmFyIGtleSBpbiBub2RlLmNvbnRlbnRzKXtpZighbm9kZS5jb250ZW50cy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtjb250aW51ZX1lbnRyaWVzLnB1c2goa2V5KX1yZXR1cm4gZW50cmllc30sc3ltbGluazpmdW5jdGlvbihwYXJlbnQsbmV3bmFtZSxvbGRwYXRoKXt2YXIgbm9kZT1NRU1GUy5jcmVhdGVOb2RlKHBhcmVudCxuZXduYW1lLDUxMXw0MDk2MCwwKTtub2RlLmxpbms9b2xkcGF0aDtyZXR1cm4gbm9kZX0scmVhZGxpbms6ZnVuY3Rpb24obm9kZSl7aWYoIUZTLmlzTGluayhub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9cmV0dXJuIG5vZGUubGlua319LHN0cmVhbV9vcHM6e3JlYWQ6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt2YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYocG9zaXRpb24+PXN0cmVhbS5ub2RlLnVzZWRCeXRlcylyZXR1cm4gMDt2YXIgc2l6ZT1NYXRoLm1pbihzdHJlYW0ubm9kZS51c2VkQnl0ZXMtcG9zaXRpb24sbGVuZ3RoKTtpZihzaXplPjgmJmNvbnRlbnRzLnN1YmFycmF5KXtidWZmZXIuc2V0KGNvbnRlbnRzLnN1YmFycmF5KHBvc2l0aW9uLHBvc2l0aW9uK3NpemUpLG9mZnNldCl9ZWxzZXtmb3IodmFyIGk9MDtpPHNpemU7aSsrKWJ1ZmZlcltvZmZzZXQraV09Y29udGVudHNbcG9zaXRpb24raV19cmV0dXJuIHNpemV9LHdyaXRlOmZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixjYW5Pd24pe2lmKGJ1ZmZlci5idWZmZXI9PT1IRUFQOC5idWZmZXIpe2Nhbk93bj1mYWxzZX1pZighbGVuZ3RoKXJldHVybiAwO3ZhciBub2RlPXN0cmVhbS5ub2RlO25vZGUudGltZXN0YW1wPURhdGUubm93KCk7aWYoYnVmZmVyLnN1YmFycmF5JiYoIW5vZGUuY29udGVudHN8fG5vZGUuY29udGVudHMuc3ViYXJyYXkpKXtpZihjYW5Pd24pe25vZGUuY29udGVudHM9YnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKTtub2RlLnVzZWRCeXRlcz1sZW5ndGg7cmV0dXJuIGxlbmd0aH1lbHNlIGlmKG5vZGUudXNlZEJ5dGVzPT09MCYmcG9zaXRpb249PT0wKXtub2RlLmNvbnRlbnRzPWJ1ZmZlci5zbGljZShvZmZzZXQsb2Zmc2V0K2xlbmd0aCk7bm9kZS51c2VkQnl0ZXM9bGVuZ3RoO3JldHVybiBsZW5ndGh9ZWxzZSBpZihwb3NpdGlvbitsZW5ndGg8PW5vZGUudXNlZEJ5dGVzKXtub2RlLmNvbnRlbnRzLnNldChidWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpLHBvc2l0aW9uKTtyZXR1cm4gbGVuZ3RofX1NRU1GUy5leHBhbmRGaWxlU3RvcmFnZShub2RlLHBvc2l0aW9uK2xlbmd0aCk7aWYobm9kZS5jb250ZW50cy5zdWJhcnJheSYmYnVmZmVyLnN1YmFycmF5KXtub2RlLmNvbnRlbnRzLnNldChidWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpLHBvc2l0aW9uKX1lbHNle2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7bm9kZS5jb250ZW50c1twb3NpdGlvbitpXT1idWZmZXJbb2Zmc2V0K2ldfX1ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChub2RlLnVzZWRCeXRlcyxwb3NpdGlvbitsZW5ndGgpO3JldHVybiBsZW5ndGh9LGxsc2VlazpmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7dmFyIHBvc2l0aW9uPW9mZnNldDtpZih3aGVuY2U9PT0xKXtwb3NpdGlvbis9c3RyZWFtLnBvc2l0aW9ufWVsc2UgaWYod2hlbmNlPT09Mil7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXtwb3NpdGlvbis9c3RyZWFtLm5vZGUudXNlZEJ5dGVzfX1pZihwb3NpdGlvbjwwKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9cmV0dXJuIHBvc2l0aW9ufSxhbGxvY2F0ZTpmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LGxlbmd0aCl7TUVNRlMuZXhwYW5kRmlsZVN0b3JhZ2Uoc3RyZWFtLm5vZGUsb2Zmc2V0K2xlbmd0aCk7c3RyZWFtLm5vZGUudXNlZEJ5dGVzPU1hdGgubWF4KHN0cmVhbS5ub2RlLnVzZWRCeXRlcyxvZmZzZXQrbGVuZ3RoKX0sbW1hcDpmdW5jdGlvbihzdHJlYW0sYWRkcmVzcyxsZW5ndGgscG9zaXRpb24scHJvdCxmbGFncyl7YXNzZXJ0KGFkZHJlc3M9PT0wKTtpZighRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myl9dmFyIHB0cjt2YXIgYWxsb2NhdGVkO3ZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50cztpZighKGZsYWdzJjIpJiZjb250ZW50cy5idWZmZXI9PT1idWZmZXIpe2FsbG9jYXRlZD1mYWxzZTtwdHI9Y29udGVudHMuYnl0ZU9mZnNldH1lbHNle2lmKHBvc2l0aW9uPjB8fHBvc2l0aW9uK2xlbmd0aDxjb250ZW50cy5sZW5ndGgpe2lmKGNvbnRlbnRzLnN1YmFycmF5KXtjb250ZW50cz1jb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpfWVsc2V7Y29udGVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGVudHMscG9zaXRpb24scG9zaXRpb24rbGVuZ3RoKX19YWxsb2NhdGVkPXRydWU7cHRyPW1tYXBBbGxvYyhsZW5ndGgpO2lmKCFwdHIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ4KX1IRUFQOC5zZXQoY29udGVudHMscHRyKX1yZXR1cm57cHRyOnB0cixhbGxvY2F0ZWQ6YWxsb2NhdGVkfX0sbXN5bmM6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLG1tYXBGbGFncyl7aWYoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDMpfWlmKG1tYXBGbGFncyYyKXtyZXR1cm4gMH12YXIgYnl0ZXNXcml0dGVuPU1FTUZTLnN0cmVhbV9vcHMud3JpdGUoc3RyZWFtLGJ1ZmZlciwwLGxlbmd0aCxvZmZzZXQsZmFsc2UpO3JldHVybiAwfX19O3ZhciBGUz17cm9vdDpudWxsLG1vdW50czpbXSxkZXZpY2VzOnt9LHN0cmVhbXM6W10sbmV4dElub2RlOjEsbmFtZVRhYmxlOm51bGwsY3VycmVudFBhdGg6Ii8iLGluaXRpYWxpemVkOmZhbHNlLGlnbm9yZVBlcm1pc3Npb25zOnRydWUsdHJhY2tpbmdEZWxlZ2F0ZTp7fSx0cmFja2luZzp7b3BlbkZsYWdzOntSRUFEOjEsV1JJVEU6Mn19LEVycm5vRXJyb3I6bnVsbCxnZW5lcmljRXJyb3JzOnt9LGZpbGVzeXN0ZW1zOm51bGwsc3luY0ZTUmVxdWVzdHM6MCxsb29rdXBQYXRoOmZ1bmN0aW9uKHBhdGgsb3B0cyl7cGF0aD1QQVRIX0ZTLnJlc29sdmUoRlMuY3dkKCkscGF0aCk7b3B0cz1vcHRzfHx7fTtpZighcGF0aClyZXR1cm57cGF0aDoiIixub2RlOm51bGx9O3ZhciBkZWZhdWx0cz17Zm9sbG93X21vdW50OnRydWUscmVjdXJzZV9jb3VudDowfTtmb3IodmFyIGtleSBpbiBkZWZhdWx0cyl7aWYob3B0c1trZXldPT09dW5kZWZpbmVkKXtvcHRzW2tleV09ZGVmYXVsdHNba2V5XX19aWYob3B0cy5yZWN1cnNlX2NvdW50Pjgpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDMyKX12YXIgcGFydHM9UEFUSC5ub3JtYWxpemVBcnJheShwYXRoLnNwbGl0KCIvIikuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiEhcH0pLGZhbHNlKTt2YXIgY3VycmVudD1GUy5yb290O3ZhciBjdXJyZW50X3BhdGg9Ii8iO2Zvcih2YXIgaT0wO2k8cGFydHMubGVuZ3RoO2krKyl7dmFyIGlzbGFzdD1pPT09cGFydHMubGVuZ3RoLTE7aWYoaXNsYXN0JiZvcHRzLnBhcmVudCl7YnJlYWt9Y3VycmVudD1GUy5sb29rdXBOb2RlKGN1cnJlbnQscGFydHNbaV0pO2N1cnJlbnRfcGF0aD1QQVRILmpvaW4yKGN1cnJlbnRfcGF0aCxwYXJ0c1tpXSk7aWYoRlMuaXNNb3VudHBvaW50KGN1cnJlbnQpKXtpZighaXNsYXN0fHxpc2xhc3QmJm9wdHMuZm9sbG93X21vdW50KXtjdXJyZW50PWN1cnJlbnQubW91bnRlZC5yb290fX1pZighaXNsYXN0fHxvcHRzLmZvbGxvdyl7dmFyIGNvdW50PTA7d2hpbGUoRlMuaXNMaW5rKGN1cnJlbnQubW9kZSkpe3ZhciBsaW5rPUZTLnJlYWRsaW5rKGN1cnJlbnRfcGF0aCk7Y3VycmVudF9wYXRoPVBBVEhfRlMucmVzb2x2ZShQQVRILmRpcm5hbWUoY3VycmVudF9wYXRoKSxsaW5rKTt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgoY3VycmVudF9wYXRoLHtyZWN1cnNlX2NvdW50Om9wdHMucmVjdXJzZV9jb3VudH0pO2N1cnJlbnQ9bG9va3VwLm5vZGU7aWYoY291bnQrKz40MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzIpfX19fXJldHVybntwYXRoOmN1cnJlbnRfcGF0aCxub2RlOmN1cnJlbnR9fSxnZXRQYXRoOmZ1bmN0aW9uKG5vZGUpe3ZhciBwYXRoO3doaWxlKHRydWUpe2lmKEZTLmlzUm9vdChub2RlKSl7dmFyIG1vdW50PW5vZGUubW91bnQubW91bnRwb2ludDtpZighcGF0aClyZXR1cm4gbW91bnQ7cmV0dXJuIG1vdW50W21vdW50Lmxlbmd0aC0xXSE9PSIvIj9tb3VudCsiLyIrcGF0aDptb3VudCtwYXRofXBhdGg9cGF0aD9ub2RlLm5hbWUrIi8iK3BhdGg6bm9kZS5uYW1lO25vZGU9bm9kZS5wYXJlbnR9fSxoYXNoTmFtZTpmdW5jdGlvbihwYXJlbnRpZCxuYW1lKXt2YXIgaGFzaD0wO2Zvcih2YXIgaT0wO2k8bmFtZS5sZW5ndGg7aSsrKXtoYXNoPShoYXNoPDw1KS1oYXNoK25hbWUuY2hhckNvZGVBdChpKXwwfXJldHVybihwYXJlbnRpZCtoYXNoPj4+MCklRlMubmFtZVRhYmxlLmxlbmd0aH0saGFzaEFkZE5vZGU6ZnVuY3Rpb24obm9kZSl7dmFyIGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtub2RlLm5hbWVfbmV4dD1GUy5uYW1lVGFibGVbaGFzaF07RlMubmFtZVRhYmxlW2hhc2hdPW5vZGV9LGhhc2hSZW1vdmVOb2RlOmZ1bmN0aW9uKG5vZGUpe3ZhciBoYXNoPUZTLmhhc2hOYW1lKG5vZGUucGFyZW50LmlkLG5vZGUubmFtZSk7aWYoRlMubmFtZVRhYmxlW2hhc2hdPT09bm9kZSl7RlMubmFtZVRhYmxlW2hhc2hdPW5vZGUubmFtZV9uZXh0fWVsc2V7dmFyIGN1cnJlbnQ9RlMubmFtZVRhYmxlW2hhc2hdO3doaWxlKGN1cnJlbnQpe2lmKGN1cnJlbnQubmFtZV9uZXh0PT09bm9kZSl7Y3VycmVudC5uYW1lX25leHQ9bm9kZS5uYW1lX25leHQ7YnJlYWt9Y3VycmVudD1jdXJyZW50Lm5hbWVfbmV4dH19fSxsb29rdXBOb2RlOmZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgZXJyQ29kZT1GUy5tYXlMb29rdXAocGFyZW50KTtpZihlcnJDb2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlLHBhcmVudCl9dmFyIGhhc2g9RlMuaGFzaE5hbWUocGFyZW50LmlkLG5hbWUpO2Zvcih2YXIgbm9kZT1GUy5uYW1lVGFibGVbaGFzaF07bm9kZTtub2RlPW5vZGUubmFtZV9uZXh0KXt2YXIgbm9kZU5hbWU9bm9kZS5uYW1lO2lmKG5vZGUucGFyZW50LmlkPT09cGFyZW50LmlkJiZub2RlTmFtZT09PW5hbWUpe3JldHVybiBub2RlfX1yZXR1cm4gRlMubG9va3VwKHBhcmVudCxuYW1lKX0sY3JlYXRlTm9kZTpmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLHJkZXYpe3ZhciBub2RlPW5ldyBGUy5GU05vZGUocGFyZW50LG5hbWUsbW9kZSxyZGV2KTtGUy5oYXNoQWRkTm9kZShub2RlKTtyZXR1cm4gbm9kZX0sZGVzdHJveU5vZGU6ZnVuY3Rpb24obm9kZSl7RlMuaGFzaFJlbW92ZU5vZGUobm9kZSl9LGlzUm9vdDpmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZT09PW5vZGUucGFyZW50fSxpc01vdW50cG9pbnQ6ZnVuY3Rpb24obm9kZSl7cmV0dXJuISFub2RlLm1vdW50ZWR9LGlzRmlsZTpmdW5jdGlvbihtb2RlKXtyZXR1cm4obW9kZSY2MTQ0MCk9PT0zMjc2OH0saXNEaXI6ZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MTYzODR9LGlzTGluazpmdW5jdGlvbihtb2RlKXtyZXR1cm4obW9kZSY2MTQ0MCk9PT00MDk2MH0saXNDaHJkZXY6ZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09ODE5Mn0saXNCbGtkZXY6ZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MjQ1NzZ9LGlzRklGTzpmdW5jdGlvbihtb2RlKXtyZXR1cm4obW9kZSY2MTQ0MCk9PT00MDk2fSxpc1NvY2tldDpmdW5jdGlvbihtb2RlKXtyZXR1cm4obW9kZSY0OTE1Mik9PT00OTE1Mn0sZmxhZ01vZGVzOnsiciI6MCwicisiOjIsInciOjU3NywidysiOjU3OCwiYSI6MTA4OSwiYSsiOjEwOTB9LG1vZGVTdHJpbmdUb0ZsYWdzOmZ1bmN0aW9uKHN0cil7dmFyIGZsYWdzPUZTLmZsYWdNb2Rlc1tzdHJdO2lmKHR5cGVvZiBmbGFncz09PSJ1bmRlZmluZWQiKXt0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZmlsZSBvcGVuIG1vZGU6ICIrc3RyKX1yZXR1cm4gZmxhZ3N9LGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nOmZ1bmN0aW9uKGZsYWcpe3ZhciBwZXJtcz1bInIiLCJ3IiwicnciXVtmbGFnJjNdO2lmKGZsYWcmNTEyKXtwZXJtcys9IncifXJldHVybiBwZXJtc30sbm9kZVBlcm1pc3Npb25zOmZ1bmN0aW9uKG5vZGUscGVybXMpe2lmKEZTLmlnbm9yZVBlcm1pc3Npb25zKXtyZXR1cm4gMH1pZihwZXJtcy5pbmRleE9mKCJyIikhPT0tMSYmIShub2RlLm1vZGUmMjkyKSl7cmV0dXJuIDJ9ZWxzZSBpZihwZXJtcy5pbmRleE9mKCJ3IikhPT0tMSYmIShub2RlLm1vZGUmMTQ2KSl7cmV0dXJuIDJ9ZWxzZSBpZihwZXJtcy5pbmRleE9mKCJ4IikhPT0tMSYmIShub2RlLm1vZGUmNzMpKXtyZXR1cm4gMn1yZXR1cm4gMH0sbWF5TG9va3VwOmZ1bmN0aW9uKGRpcil7dmFyIGVyckNvZGU9RlMubm9kZVBlcm1pc3Npb25zKGRpciwieCIpO2lmKGVyckNvZGUpcmV0dXJuIGVyckNvZGU7aWYoIWRpci5ub2RlX29wcy5sb29rdXApcmV0dXJuIDI7cmV0dXJuIDB9LG1heUNyZWF0ZTpmdW5jdGlvbihkaXIsbmFtZSl7dHJ5e3ZhciBub2RlPUZTLmxvb2t1cE5vZGUoZGlyLG5hbWUpO3JldHVybiAyMH1jYXRjaChlKXt9cmV0dXJuIEZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsInd4Iil9LG1heURlbGV0ZTpmdW5jdGlvbihkaXIsbmFtZSxpc2Rpcil7dmFyIG5vZGU7dHJ5e25vZGU9RlMubG9va3VwTm9kZShkaXIsbmFtZSl9Y2F0Y2goZSl7cmV0dXJuIGUuZXJybm99dmFyIGVyckNvZGU9RlMubm9kZVBlcm1pc3Npb25zKGRpciwid3giKTtpZihlcnJDb2RlKXtyZXR1cm4gZXJyQ29kZX1pZihpc2Rpcil7aWYoIUZTLmlzRGlyKG5vZGUubW9kZSkpe3JldHVybiA1NH1pZihGUy5pc1Jvb3Qobm9kZSl8fEZTLmdldFBhdGgobm9kZSk9PT1GUy5jd2QoKSl7cmV0dXJuIDEwfX1lbHNle2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe3JldHVybiAzMX19cmV0dXJuIDB9LG1heU9wZW46ZnVuY3Rpb24obm9kZSxmbGFncyl7aWYoIW5vZGUpe3JldHVybiA0NH1pZihGUy5pc0xpbmsobm9kZS5tb2RlKSl7cmV0dXJuIDMyfWVsc2UgaWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7aWYoRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoZmxhZ3MpIT09InIifHxmbGFncyY1MTIpe3JldHVybiAzMX19cmV0dXJuIEZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLEZTLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzKSl9LE1BWF9PUEVOX0ZEUzo0MDk2LG5leHRmZDpmdW5jdGlvbihmZF9zdGFydCxmZF9lbmQpe2ZkX3N0YXJ0PWZkX3N0YXJ0fHwwO2ZkX2VuZD1mZF9lbmR8fEZTLk1BWF9PUEVOX0ZEUztmb3IodmFyIGZkPWZkX3N0YXJ0O2ZkPD1mZF9lbmQ7ZmQrKyl7aWYoIUZTLnN0cmVhbXNbZmRdKXtyZXR1cm4gZmR9fXRocm93IG5ldyBGUy5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtOmZ1bmN0aW9uKGZkKXtyZXR1cm4gRlMuc3RyZWFtc1tmZF19LGNyZWF0ZVN0cmVhbTpmdW5jdGlvbihzdHJlYW0sZmRfc3RhcnQsZmRfZW5kKXtpZighRlMuRlNTdHJlYW0pe0ZTLkZTU3RyZWFtPWZ1bmN0aW9uKCl7fTtGUy5GU1N0cmVhbS5wcm90b3R5cGU9e29iamVjdDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZX0sc2V0OmZ1bmN0aW9uKHZhbCl7dGhpcy5ub2RlPXZhbH19LGlzUmVhZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfX0saXNXcml0ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfX0saXNBcHBlbmQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9fX19dmFyIG5ld1N0cmVhbT1uZXcgRlMuRlNTdHJlYW07Zm9yKHZhciBwIGluIHN0cmVhbSl7bmV3U3RyZWFtW3BdPXN0cmVhbVtwXX1zdHJlYW09bmV3U3RyZWFtO3ZhciBmZD1GUy5uZXh0ZmQoZmRfc3RhcnQsZmRfZW5kKTtzdHJlYW0uZmQ9ZmQ7RlMuc3RyZWFtc1tmZF09c3RyZWFtO3JldHVybiBzdHJlYW19LGNsb3NlU3RyZWFtOmZ1bmN0aW9uKGZkKXtGUy5zdHJlYW1zW2ZkXT1udWxsfSxjaHJkZXZfc3RyZWFtX29wczp7b3BlbjpmdW5jdGlvbihzdHJlYW0pe3ZhciBkZXZpY2U9RlMuZ2V0RGV2aWNlKHN0cmVhbS5ub2RlLnJkZXYpO3N0cmVhbS5zdHJlYW1fb3BzPWRldmljZS5zdHJlYW1fb3BzO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX19LGxsc2VlazpmdW5jdGlvbigpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKX19LG1ham9yOmZ1bmN0aW9uKGRldil7cmV0dXJuIGRldj4+OH0sbWlub3I6ZnVuY3Rpb24oZGV2KXtyZXR1cm4gZGV2JjI1NX0sbWFrZWRldjpmdW5jdGlvbihtYSxtaSl7cmV0dXJuIG1hPDw4fG1pfSxyZWdpc3RlckRldmljZTpmdW5jdGlvbihkZXYsb3BzKXtGUy5kZXZpY2VzW2Rldl09e3N0cmVhbV9vcHM6b3BzfX0sZ2V0RGV2aWNlOmZ1bmN0aW9uKGRldil7cmV0dXJuIEZTLmRldmljZXNbZGV2XX0sZ2V0TW91bnRzOmZ1bmN0aW9uKG1vdW50KXt2YXIgbW91bnRzPVtdO3ZhciBjaGVjaz1bbW91bnRdO3doaWxlKGNoZWNrLmxlbmd0aCl7dmFyIG09Y2hlY2sucG9wKCk7bW91bnRzLnB1c2gobSk7Y2hlY2sucHVzaC5hcHBseShjaGVjayxtLm1vdW50cyl9cmV0dXJuIG1vdW50c30sc3luY2ZzOmZ1bmN0aW9uKHBvcHVsYXRlLGNhbGxiYWNrKXtpZih0eXBlb2YgcG9wdWxhdGU9PT0iZnVuY3Rpb24iKXtjYWxsYmFjaz1wb3B1bGF0ZTtwb3B1bGF0ZT1mYWxzZX1GUy5zeW5jRlNSZXF1ZXN0cysrO2lmKEZTLnN5bmNGU1JlcXVlc3RzPjEpe2Vycigid2FybmluZzogIitGUy5zeW5jRlNSZXF1ZXN0cysiIEZTLnN5bmNmcyBvcGVyYXRpb25zIGluIGZsaWdodCBhdCBvbmNlLCBwcm9iYWJseSBqdXN0IGRvaW5nIGV4dHJhIHdvcmsiKX12YXIgbW91bnRzPUZTLmdldE1vdW50cyhGUy5yb290Lm1vdW50KTt2YXIgY29tcGxldGVkPTA7ZnVuY3Rpb24gZG9DYWxsYmFjayhlcnJDb2RlKXtGUy5zeW5jRlNSZXF1ZXN0cy0tO3JldHVybiBjYWxsYmFjayhlcnJDb2RlKX1mdW5jdGlvbiBkb25lKGVyckNvZGUpe2lmKGVyckNvZGUpe2lmKCFkb25lLmVycm9yZWQpe2RvbmUuZXJyb3JlZD10cnVlO3JldHVybiBkb0NhbGxiYWNrKGVyckNvZGUpfXJldHVybn1pZigrK2NvbXBsZXRlZD49bW91bnRzLmxlbmd0aCl7ZG9DYWxsYmFjayhudWxsKX19bW91bnRzLmZvckVhY2goZnVuY3Rpb24obW91bnQpe2lmKCFtb3VudC50eXBlLnN5bmNmcyl7cmV0dXJuIGRvbmUobnVsbCl9bW91bnQudHlwZS5zeW5jZnMobW91bnQscG9wdWxhdGUsZG9uZSl9KX0sbW91bnQ6ZnVuY3Rpb24odHlwZSxvcHRzLG1vdW50cG9pbnQpe3ZhciByb290PW1vdW50cG9pbnQ9PT0iLyI7dmFyIHBzZXVkbz0hbW91bnRwb2ludDt2YXIgbm9kZTtpZihyb290JiZGUy5yb290KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCl9ZWxzZSBpZighcm9vdCYmIXBzZXVkbyl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKG1vdW50cG9pbnQse2ZvbGxvd19tb3VudDpmYWxzZX0pO21vdW50cG9pbnQ9bG9va3VwLnBhdGg7bm9kZT1sb29rdXAubm9kZTtpZihGUy5pc01vdW50cG9pbnQobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDEwKX1pZighRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTQpfX12YXIgbW91bnQ9e3R5cGU6dHlwZSxvcHRzOm9wdHMsbW91bnRwb2ludDptb3VudHBvaW50LG1vdW50czpbXX07dmFyIG1vdW50Um9vdD10eXBlLm1vdW50KG1vdW50KTttb3VudFJvb3QubW91bnQ9bW91bnQ7bW91bnQucm9vdD1tb3VudFJvb3Q7aWYocm9vdCl7RlMucm9vdD1tb3VudFJvb3R9ZWxzZSBpZihub2RlKXtub2RlLm1vdW50ZWQ9bW91bnQ7aWYobm9kZS5tb3VudCl7bm9kZS5tb3VudC5tb3VudHMucHVzaChtb3VudCl9fXJldHVybiBtb3VudFJvb3R9LHVubW91bnQ6ZnVuY3Rpb24obW91bnRwb2ludCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKG1vdW50cG9pbnQse2ZvbGxvd19tb3VudDpmYWxzZX0pO2lmKCFGUy5pc01vdW50cG9pbnQobG9va3VwLm5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9dmFyIG5vZGU9bG9va3VwLm5vZGU7dmFyIG1vdW50PW5vZGUubW91bnRlZDt2YXIgbW91bnRzPUZTLmdldE1vdW50cyhtb3VudCk7T2JqZWN0LmtleXMoRlMubmFtZVRhYmxlKS5mb3JFYWNoKGZ1bmN0aW9uKGhhc2gpe3ZhciBjdXJyZW50PUZTLm5hbWVUYWJsZVtoYXNoXTt3aGlsZShjdXJyZW50KXt2YXIgbmV4dD1jdXJyZW50Lm5hbWVfbmV4dDtpZihtb3VudHMuaW5kZXhPZihjdXJyZW50Lm1vdW50KSE9PS0xKXtGUy5kZXN0cm95Tm9kZShjdXJyZW50KX1jdXJyZW50PW5leHR9fSk7bm9kZS5tb3VudGVkPW51bGw7dmFyIGlkeD1ub2RlLm1vdW50Lm1vdW50cy5pbmRleE9mKG1vdW50KTtub2RlLm1vdW50Lm1vdW50cy5zcGxpY2UoaWR4LDEpfSxsb29rdXA6ZnVuY3Rpb24ocGFyZW50LG5hbWUpe3JldHVybiBwYXJlbnQubm9kZV9vcHMubG9va3VwKHBhcmVudCxuYW1lKX0sbWtub2Q6ZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyIHBhcmVudD1sb29rdXAubm9kZTt2YXIgbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO2lmKCFuYW1lfHxuYW1lPT09Ii4ifHxuYW1lPT09Ii4uIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfXZhciBlcnJDb2RlPUZTLm1heUNyZWF0ZShwYXJlbnQsbmFtZSk7aWYoZXJyQ29kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSl9aWYoIXBhcmVudC5ub2RlX29wcy5ta25vZCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpfXJldHVybiBwYXJlbnQubm9kZV9vcHMubWtub2QocGFyZW50LG5hbWUsbW9kZSxkZXYpfSxjcmVhdGU6ZnVuY3Rpb24ocGF0aCxtb2RlKXttb2RlPW1vZGUhPT11bmRlZmluZWQ/bW9kZTo0Mzg7bW9kZSY9NDA5NTttb2RlfD0zMjc2ODtyZXR1cm4gRlMubWtub2QocGF0aCxtb2RlLDApfSxta2RpcjpmdW5jdGlvbihwYXRoLG1vZGUpe21vZGU9bW9kZSE9PXVuZGVmaW5lZD9tb2RlOjUxMTttb2RlJj01MTF8NTEyO21vZGV8PTE2Mzg0O3JldHVybiBGUy5ta25vZChwYXRoLG1vZGUsMCl9LG1rZGlyVHJlZTpmdW5jdGlvbihwYXRoLG1vZGUpe3ZhciBkaXJzPXBhdGguc3BsaXQoIi8iKTt2YXIgZD0iIjtmb3IodmFyIGk9MDtpPGRpcnMubGVuZ3RoOysraSl7aWYoIWRpcnNbaV0pY29udGludWU7ZCs9Ii8iK2RpcnNbaV07dHJ5e0ZTLm1rZGlyKGQsbW9kZSl9Y2F0Y2goZSl7aWYoZS5lcnJubyE9MjApdGhyb3cgZX19fSxta2RldjpmdW5jdGlvbihwYXRoLG1vZGUsZGV2KXtpZih0eXBlb2YgZGV2PT09InVuZGVmaW5lZCIpe2Rldj1tb2RlO21vZGU9NDM4fW1vZGV8PTgxOTI7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSxkZXYpfSxzeW1saW5rOmZ1bmN0aW9uKG9sZHBhdGgsbmV3cGF0aCl7aWYoIVBBVEhfRlMucmVzb2x2ZShvbGRwYXRoKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpfXZhciBsb29rdXA9RlMubG9va3VwUGF0aChuZXdwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7aWYoIXBhcmVudCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpfXZhciBuZXduYW1lPVBBVEguYmFzZW5hbWUobmV3cGF0aCk7dmFyIGVyckNvZGU9RlMubWF5Q3JlYXRlKHBhcmVudCxuZXduYW1lKTtpZihlcnJDb2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKX1pZighcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKX1yZXR1cm4gcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmsocGFyZW50LG5ld25hbWUsb2xkcGF0aCl9LHJlbmFtZTpmdW5jdGlvbihvbGRfcGF0aCxuZXdfcGF0aCl7dmFyIG9sZF9kaXJuYW1lPVBBVEguZGlybmFtZShvbGRfcGF0aCk7dmFyIG5ld19kaXJuYW1lPVBBVEguZGlybmFtZShuZXdfcGF0aCk7dmFyIG9sZF9uYW1lPVBBVEguYmFzZW5hbWUob2xkX3BhdGgpO3ZhciBuZXdfbmFtZT1QQVRILmJhc2VuYW1lKG5ld19wYXRoKTt2YXIgbG9va3VwLG9sZF9kaXIsbmV3X2Rpcjtsb29rdXA9RlMubG9va3VwUGF0aChvbGRfcGF0aCx7cGFyZW50OnRydWV9KTtvbGRfZGlyPWxvb2t1cC5ub2RlO2xvb2t1cD1GUy5sb29rdXBQYXRoKG5ld19wYXRoLHtwYXJlbnQ6dHJ1ZX0pO25ld19kaXI9bG9va3VwLm5vZGU7aWYoIW9sZF9kaXJ8fCFuZXdfZGlyKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTtpZihvbGRfZGlyLm1vdW50IT09bmV3X2Rpci5tb3VudCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzUpfXZhciBvbGRfbm9kZT1GUy5sb29rdXBOb2RlKG9sZF9kaXIsb2xkX25hbWUpO3ZhciByZWxhdGl2ZT1QQVRIX0ZTLnJlbGF0aXZlKG9sZF9wYXRoLG5ld19kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT0iLiIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX1yZWxhdGl2ZT1QQVRIX0ZTLnJlbGF0aXZlKG5ld19wYXRoLG9sZF9kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT0iLiIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDU1KX12YXIgbmV3X25vZGU7dHJ5e25ld19ub2RlPUZTLmxvb2t1cE5vZGUobmV3X2RpcixuZXdfbmFtZSl9Y2F0Y2goZSl7fWlmKG9sZF9ub2RlPT09bmV3X25vZGUpe3JldHVybn12YXIgaXNkaXI9RlMuaXNEaXIob2xkX25vZGUubW9kZSk7dmFyIGVyckNvZGU9RlMubWF5RGVsZXRlKG9sZF9kaXIsb2xkX25hbWUsaXNkaXIpO2lmKGVyckNvZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpfWVyckNvZGU9bmV3X25vZGU/RlMubWF5RGVsZXRlKG5ld19kaXIsbmV3X25hbWUsaXNkaXIpOkZTLm1heUNyZWF0ZShuZXdfZGlyLG5ld19uYW1lKTtpZihlcnJDb2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKX1pZighb2xkX2Rpci5ub2RlX29wcy5yZW5hbWUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKX1pZihGUy5pc01vdW50cG9pbnQob2xkX25vZGUpfHxuZXdfbm9kZSYmRlMuaXNNb3VudHBvaW50KG5ld19ub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTApfWlmKG5ld19kaXIhPT1vbGRfZGlyKXtlcnJDb2RlPUZTLm5vZGVQZXJtaXNzaW9ucyhvbGRfZGlyLCJ3Iik7aWYoZXJyQ29kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSl9fXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsTW92ZVBhdGgiXSl7RlMudHJhY2tpbmdEZWxlZ2F0ZVsid2lsbE1vdmVQYXRoIl0ob2xkX3BhdGgsbmV3X3BhdGgpfX1jYXRjaChlKXtlcnIoIkZTLnRyYWNraW5nRGVsZWdhdGVbJ3dpbGxNb3ZlUGF0aCddKCciK29sZF9wYXRoKyInLCAnIituZXdfcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9RlMuaGFzaFJlbW92ZU5vZGUob2xkX25vZGUpO3RyeXtvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZShvbGRfbm9kZSxuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt0aHJvdyBlfWZpbmFsbHl7RlMuaGFzaEFkZE5vZGUob2xkX25vZGUpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbk1vdmVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Nb3ZlUGF0aCJdKG9sZF9wYXRoLG5ld19wYXRoKX1jYXRjaChlKXtlcnIoIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uTW92ZVBhdGgnXSgnIitvbGRfcGF0aCsiJywgJyIrbmV3X3BhdGgrIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UpfX0scm1kaXI6ZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyIHBhcmVudD1sb29rdXAubm9kZTt2YXIgbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO3ZhciBlcnJDb2RlPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSx0cnVlKTtpZihlcnJDb2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKX1pZighcGFyZW50Lm5vZGVfb3BzLnJtZGlyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myl9aWYoRlMuaXNNb3VudHBvaW50KG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCl9dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0ocGF0aCl9fWNhdGNoKGUpe2VycigiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMucm1kaXIocGFyZW50LG5hbWUpO0ZTLmRlc3Ryb3lOb2RlKG5vZGUpO3RyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXSlGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXShwYXRoKX1jYXRjaChlKXtlcnIoIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uRGVsZXRlUGF0aCddKCciK3BhdGgrIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UpfX0scmVhZGRpcjpmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtpZighbm9kZS5ub2RlX29wcy5yZWFkZGlyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCl9cmV0dXJuIG5vZGUubm9kZV9vcHMucmVhZGRpcihub2RlKX0sdW5saW5rOmZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyQ29kZT1GUy5tYXlEZWxldGUocGFyZW50LG5hbWUsZmFsc2UpO2lmKGVyckNvZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpfWlmKCFwYXJlbnQubm9kZV9vcHMudW5saW5rKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myl9aWYoRlMuaXNNb3VudHBvaW50KG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCl9dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0ocGF0aCl9fWNhdGNoKGUpe2VycigiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMudW5saW5rKHBhcmVudCxuYW1lKTtGUy5kZXN0cm95Tm9kZShub2RlKTt0cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0ocGF0aCl9Y2F0Y2goZSl7ZXJyKCJGUy50cmFja2luZ0RlbGVnYXRlWydvbkRlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX19LHJlYWRsaW5rOmZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTt2YXIgbGluaz1sb29rdXAubm9kZTtpZighbGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpfWlmKCFsaW5rLm5vZGVfb3BzLnJlYWRsaW5rKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9cmV0dXJuIFBBVEhfRlMucmVzb2x2ZShGUy5nZXRQYXRoKGxpbmsucGFyZW50KSxsaW5rLm5vZGVfb3BzLnJlYWRsaW5rKGxpbmspKX0sc3RhdDpmdW5jdGlvbihwYXRoLGRvbnRGb2xsb3cpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRGb2xsb3d9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtpZighbm9kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpfWlmKCFub2RlLm5vZGVfb3BzLmdldGF0dHIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKX1yZXR1cm4gbm9kZS5ub2RlX29wcy5nZXRhdHRyKG5vZGUpfSxsc3RhdDpmdW5jdGlvbihwYXRoKXtyZXR1cm4gRlMuc3RhdChwYXRoLHRydWUpfSxjaG1vZDpmdW5jdGlvbihwYXRoLG1vZGUsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzohZG9udEZvbGxvd30pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHttb2RlOm1vZGUmNDA5NXxub2RlLm1vZGUmfjQwOTUsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sbGNobW9kOmZ1bmN0aW9uKHBhdGgsbW9kZSl7RlMuY2htb2QocGF0aCxtb2RlLHRydWUpfSxmY2htb2Q6ZnVuY3Rpb24oZmQsbW9kZSl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfUZTLmNobW9kKHN0cmVhbS5ub2RlLG1vZGUpfSxjaG93bjpmdW5jdGlvbihwYXRoLHVpZCxnaWQsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzohZG9udEZvbGxvd30pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd246ZnVuY3Rpb24ocGF0aCx1aWQsZ2lkKXtGUy5jaG93bihwYXRoLHVpZCxnaWQsdHJ1ZSl9LGZjaG93bjpmdW5jdGlvbihmZCx1aWQsZ2lkKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCl9RlMuY2hvd24oc3RyZWFtLm5vZGUsdWlkLGdpZCl9LHRydW5jYXRlOmZ1bmN0aW9uKHBhdGgsbGVuKXtpZihsZW48MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfXZhciBub2RlO2lmKHR5cGVvZiBwYXRoPT09InN0cmluZyIpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6dHJ1ZX0pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpfWlmKEZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDMxKX1pZighRlMuaXNGaWxlKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX12YXIgZXJyQ29kZT1GUy5ub2RlUGVybWlzc2lvbnMobm9kZSwidyIpO2lmKGVyckNvZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHtzaXplOmxlbix0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxmdHJ1bmNhdGU6ZnVuY3Rpb24oZmQsbGVuKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX1GUy50cnVuY2F0ZShzdHJlYW0ubm9kZSxsZW4pfSx1dGltZTpmdW5jdGlvbihwYXRoLGF0aW1lLG10aW1lKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7dGltZXN0YW1wOk1hdGgubWF4KGF0aW1lLG10aW1lKX0pfSxvcGVuOmZ1bmN0aW9uKHBhdGgsZmxhZ3MsbW9kZSxmZF9zdGFydCxmZF9lbmQpe2lmKHBhdGg9PT0iIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpfWZsYWdzPXR5cGVvZiBmbGFncz09PSJzdHJpbmciP0ZTLm1vZGVTdHJpbmdUb0ZsYWdzKGZsYWdzKTpmbGFnczttb2RlPXR5cGVvZiBtb2RlPT09InVuZGVmaW5lZCI/NDM4Om1vZGU7aWYoZmxhZ3MmNjQpe21vZGU9bW9kZSY0MDk1fDMyNzY4fWVsc2V7bW9kZT0wfXZhciBub2RlO2lmKHR5cGVvZiBwYXRoPT09Im9iamVjdCIpe25vZGU9cGF0aH1lbHNle3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IShmbGFncyYxMzEwNzIpfSk7bm9kZT1sb29rdXAubm9kZX1jYXRjaChlKXt9fXZhciBjcmVhdGVkPWZhbHNlO2lmKGZsYWdzJjY0KXtpZihub2RlKXtpZihmbGFncyYxMjgpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDIwKX19ZWxzZXtub2RlPUZTLm1rbm9kKHBhdGgsbW9kZSwwKTtjcmVhdGVkPXRydWV9fWlmKCFub2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCl9aWYoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSl7ZmxhZ3MmPX41MTJ9aWYoZmxhZ3MmNjU1MzYmJiFGUy5pc0Rpcihub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCl9aWYoIWNyZWF0ZWQpe3ZhciBlcnJDb2RlPUZTLm1heU9wZW4obm9kZSxmbGFncyk7aWYoZXJyQ29kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSl9fWlmKGZsYWdzJjUxMil7RlMudHJ1bmNhdGUobm9kZSwwKX1mbGFncyY9figxMjh8NTEyfDEzMTA3Mik7dmFyIHN0cmVhbT1GUy5jcmVhdGVTdHJlYW0oe25vZGU6bm9kZSxwYXRoOkZTLmdldFBhdGgobm9kZSksZmxhZ3M6ZmxhZ3Msc2Vla2FibGU6dHJ1ZSxwb3NpdGlvbjowLHN0cmVhbV9vcHM6bm9kZS5zdHJlYW1fb3BzLHVuZ290dGVuOltdLGVycm9yOmZhbHNlfSxmZF9zdGFydCxmZF9lbmQpO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX1pZihNb2R1bGVbImxvZ1JlYWRGaWxlcyJdJiYhKGZsYWdzJjEpKXtpZighRlMucmVhZEZpbGVzKUZTLnJlYWRGaWxlcz17fTtpZighKHBhdGggaW4gRlMucmVhZEZpbGVzKSl7RlMucmVhZEZpbGVzW3BhdGhdPTE7ZXJyKCJGUy50cmFja2luZ0RlbGVnYXRlIGVycm9yIG9uIHJlYWQgZmlsZTogIitwYXRoKX19dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbIm9uT3BlbkZpbGUiXSl7dmFyIHRyYWNraW5nRmxhZ3M9MDtpZigoZmxhZ3MmMjA5NzE1NSkhPT0xKXt0cmFja2luZ0ZsYWdzfD1GUy50cmFja2luZy5vcGVuRmxhZ3MuUkVBRH1pZigoZmxhZ3MmMjA5NzE1NSkhPT0wKXt0cmFja2luZ0ZsYWdzfD1GUy50cmFja2luZy5vcGVuRmxhZ3MuV1JJVEV9RlMudHJhY2tpbmdEZWxlZ2F0ZVsib25PcGVuRmlsZSJdKHBhdGgsdHJhY2tpbmdGbGFncyl9fWNhdGNoKGUpe2VycigiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25PcGVuRmlsZSddKCciK3BhdGgrIicsIGZsYWdzKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1yZXR1cm4gc3RyZWFtfSxjbG9zZTpmdW5jdGlvbihzdHJlYW0pe2lmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKHN0cmVhbS5nZXRkZW50cylzdHJlYW0uZ2V0ZGVudHM9bnVsbDt0cnl7aWYoc3RyZWFtLnN0cmVhbV9vcHMuY2xvc2Upe3N0cmVhbS5zdHJlYW1fb3BzLmNsb3NlKHN0cmVhbSl9fWNhdGNoKGUpe3Rocm93IGV9ZmluYWxseXtGUy5jbG9zZVN0cmVhbShzdHJlYW0uZmQpfXN0cmVhbS5mZD1udWxsfSxpc0Nsb3NlZDpmdW5jdGlvbihzdHJlYW0pe3JldHVybiBzdHJlYW0uZmQ9PT1udWxsfSxsbHNlZWs6ZnVuY3Rpb24oc3RyZWFtLG9mZnNldCx3aGVuY2Upe2lmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKCFzdHJlYW0uc2Vla2FibGV8fCFzdHJlYW0uc3RyZWFtX29wcy5sbHNlZWspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKX1pZih3aGVuY2UhPTAmJndoZW5jZSE9MSYmd2hlbmNlIT0yKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9c3RyZWFtLnBvc2l0aW9uPXN0cmVhbS5zdHJlYW1fb3BzLmxsc2VlayhzdHJlYW0sb2Zmc2V0LHdoZW5jZSk7c3RyZWFtLnVuZ290dGVuPVtdO3JldHVybiBzdHJlYW0ucG9zaXRpb259LHJlYWQ6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfWlmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0xKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzEpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy5yZWFkKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9dmFyIHNlZWtpbmc9dHlwZW9mIHBvc2l0aW9uIT09InVuZGVmaW5lZCI7aWYoIXNlZWtpbmcpe3Bvc2l0aW9uPXN0cmVhbS5wb3NpdGlvbn1lbHNlIGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKX12YXIgYnl0ZXNSZWFkPXN0cmVhbS5zdHJlYW1fb3BzLnJlYWQoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKTtpZighc2Vla2luZylzdHJlYW0ucG9zaXRpb24rPWJ5dGVzUmVhZDtyZXR1cm4gYnl0ZXNSZWFkfSx3cml0ZTpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24sY2FuT3duKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfWlmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzEpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy53cml0ZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfWlmKHN0cmVhbS5zZWVrYWJsZSYmc3RyZWFtLmZsYWdzJjEwMjQpe0ZTLmxsc2VlayhzdHJlYW0sMCwyKX12YXIgc2Vla2luZz10eXBlb2YgcG9zaXRpb24hPT0idW5kZWZpbmVkIjtpZighc2Vla2luZyl7cG9zaXRpb249c3RyZWFtLnBvc2l0aW9ufWVsc2UgaWYoIXN0cmVhbS5zZWVrYWJsZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzApfXZhciBieXRlc1dyaXR0ZW49c3RyZWFtLnN0cmVhbV9vcHMud3JpdGUoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bik7aWYoIXNlZWtpbmcpc3RyZWFtLnBvc2l0aW9uKz1ieXRlc1dyaXR0ZW47dHJ5e2lmKHN0cmVhbS5wYXRoJiZGUy50cmFja2luZ0RlbGVnYXRlWyJvbldyaXRlVG9GaWxlIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Xcml0ZVRvRmlsZSJdKHN0cmVhbS5wYXRoKX1jYXRjaChlKXtlcnIoIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uV3JpdGVUb0ZpbGUnXSgnIitzdHJlYW0ucGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9cmV0dXJuIGJ5dGVzV3JpdHRlbn0sYWxsb2NhdGU6ZnVuY3Rpb24oc3RyZWFtLG9mZnNldCxsZW5ndGgpe2lmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKG9mZnNldDwwfHxsZW5ndGg8PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX1pZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCl9aWYoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSYmIUZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myl9aWYoIXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMzgpfXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKX0sbW1hcDpmdW5jdGlvbihzdHJlYW0sYWRkcmVzcyxsZW5ndGgscG9zaXRpb24scHJvdCxmbGFncyl7aWYoKHByb3QmMikhPT0wJiYoZmxhZ3MmMik9PT0wJiYoc3RyZWFtLmZsYWdzJjIwOTcxNTUpIT09Mil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMil9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDIpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy5tbWFwKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myl9cmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1tYXAoc3RyZWFtLGFkZHJlc3MsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3MpfSxtc3luYzpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgsbW1hcEZsYWdzKXtpZighc3RyZWFtfHwhc3RyZWFtLnN0cmVhbV9vcHMubXN5bmMpe3JldHVybiAwfXJldHVybiBzdHJlYW0uc3RyZWFtX29wcy5tc3luYyhzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgsbW1hcEZsYWdzKX0sbXVubWFwOmZ1bmN0aW9uKHN0cmVhbSl7cmV0dXJuIDB9LGlvY3RsOmZ1bmN0aW9uKHN0cmVhbSxjbWQsYXJnKXtpZighc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDU5KX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwoc3RyZWFtLGNtZCxhcmcpfSxyZWFkRmlsZTpmdW5jdGlvbihwYXRoLG9wdHMpe29wdHM9b3B0c3x8e307b3B0cy5mbGFncz1vcHRzLmZsYWdzfHwwO29wdHMuZW5jb2Rpbmc9b3B0cy5lbmNvZGluZ3x8ImJpbmFyeSI7aWYob3B0cy5lbmNvZGluZyE9PSJ1dGY4IiYmb3B0cy5lbmNvZGluZyE9PSJiaW5hcnkiKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW5jb2RpbmcgdHlwZSAiJytvcHRzLmVuY29kaW5nKyciJyl9dmFyIHJldDt2YXIgc3RyZWFtPUZTLm9wZW4ocGF0aCxvcHRzLmZsYWdzKTt2YXIgc3RhdD1GUy5zdGF0KHBhdGgpO3ZhciBsZW5ndGg9c3RhdC5zaXplO3ZhciBidWY9bmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtGUy5yZWFkKHN0cmVhbSxidWYsMCxsZW5ndGgsMCk7aWYob3B0cy5lbmNvZGluZz09PSJ1dGY4Iil7cmV0PVVURjhBcnJheVRvU3RyaW5nKGJ1ZiwwKX1lbHNlIGlmKG9wdHMuZW5jb2Rpbmc9PT0iYmluYXJ5Iil7cmV0PWJ1Zn1GUy5jbG9zZShzdHJlYW0pO3JldHVybiByZXR9LHdyaXRlRmlsZTpmdW5jdGlvbihwYXRoLGRhdGEsb3B0cyl7b3B0cz1vcHRzfHx7fTtvcHRzLmZsYWdzPW9wdHMuZmxhZ3N8fDU3Nzt2YXIgc3RyZWFtPUZTLm9wZW4ocGF0aCxvcHRzLmZsYWdzLG9wdHMubW9kZSk7aWYodHlwZW9mIGRhdGE9PT0ic3RyaW5nIil7dmFyIGJ1Zj1uZXcgVWludDhBcnJheShsZW5ndGhCeXRlc1VURjgoZGF0YSkrMSk7dmFyIGFjdHVhbE51bUJ5dGVzPXN0cmluZ1RvVVRGOEFycmF5KGRhdGEsYnVmLDAsYnVmLmxlbmd0aCk7RlMud3JpdGUoc3RyZWFtLGJ1ZiwwLGFjdHVhbE51bUJ5dGVzLHVuZGVmaW5lZCxvcHRzLmNhbk93bil9ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpe0ZTLndyaXRlKHN0cmVhbSxkYXRhLDAsZGF0YS5ieXRlTGVuZ3RoLHVuZGVmaW5lZCxvcHRzLmNhbk93bil9ZWxzZXt0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpfUZTLmNsb3NlKHN0cmVhbSl9LGN3ZDpmdW5jdGlvbigpe3JldHVybiBGUy5jdXJyZW50UGF0aH0sY2hkaXI6ZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7aWYobG9va3VwLm5vZGU9PT1udWxsKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCl9aWYoIUZTLmlzRGlyKGxvb2t1cC5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCl9dmFyIGVyckNvZGU9RlMubm9kZVBlcm1pc3Npb25zKGxvb2t1cC5ub2RlLCJ4Iik7aWYoZXJyQ29kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSl9RlMuY3VycmVudFBhdGg9bG9va3VwLnBhdGh9LGNyZWF0ZURlZmF1bHREaXJlY3RvcmllczpmdW5jdGlvbigpe0ZTLm1rZGlyKCIvdG1wIik7RlMubWtkaXIoIi9ob21lIik7RlMubWtkaXIoIi9ob21lL3dlYl91c2VyIil9LGNyZWF0ZURlZmF1bHREZXZpY2VzOmZ1bmN0aW9uKCl7RlMubWtkaXIoIi9kZXYiKTtGUy5yZWdpc3RlckRldmljZShGUy5tYWtlZGV2KDEsMykse3JlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sd3JpdGU6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7cmV0dXJuIGxlbmd0aH19KTtGUy5ta2RldigiL2Rldi9udWxsIixGUy5tYWtlZGV2KDEsMykpO1RUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDUsMCksVFRZLmRlZmF1bHRfdHR5X29wcyk7VFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNiwwKSxUVFkuZGVmYXVsdF90dHkxX29wcyk7RlMubWtkZXYoIi9kZXYvdHR5IixGUy5tYWtlZGV2KDUsMCkpO0ZTLm1rZGV2KCIvZGV2L3R0eTEiLEZTLm1ha2VkZXYoNiwwKSk7dmFyIHJhbmRvbV9kZXZpY2U9Z2V0UmFuZG9tRGV2aWNlKCk7RlMuY3JlYXRlRGV2aWNlKCIvZGV2IiwicmFuZG9tIixyYW5kb21fZGV2aWNlKTtGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCJ1cmFuZG9tIixyYW5kb21fZGV2aWNlKTtGUy5ta2RpcigiL2Rldi9zaG0iKTtGUy5ta2RpcigiL2Rldi9zaG0vdG1wIil9LGNyZWF0ZVNwZWNpYWxEaXJlY3RvcmllczpmdW5jdGlvbigpe0ZTLm1rZGlyKCIvcHJvYyIpO0ZTLm1rZGlyKCIvcHJvYy9zZWxmIik7RlMubWtkaXIoIi9wcm9jL3NlbGYvZmQiKTtGUy5tb3VudCh7bW91bnQ6ZnVuY3Rpb24oKXt2YXIgbm9kZT1GUy5jcmVhdGVOb2RlKCIvcHJvYy9zZWxmIiwiZmQiLDE2Mzg0fDUxMSw3Myk7bm9kZS5ub2RlX29wcz17bG9va3VwOmZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgZmQ9K25hbWU7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7dmFyIHJldD17cGFyZW50Om51bGwsbW91bnQ6e21vdW50cG9pbnQ6ImZha2UifSxub2RlX29wczp7cmVhZGxpbms6ZnVuY3Rpb24oKXtyZXR1cm4gc3RyZWFtLnBhdGh9fX07cmV0LnBhcmVudD1yZXQ7cmV0dXJuIHJldH19O3JldHVybiBub2RlfX0se30sIi9wcm9jL3NlbGYvZmQiKX0sY3JlYXRlU3RhbmRhcmRTdHJlYW1zOmZ1bmN0aW9uKCl7aWYoTW9kdWxlWyJzdGRpbiJdKXtGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsTW9kdWxlWyJzdGRpbiJdKX1lbHNle0ZTLnN5bWxpbmsoIi9kZXYvdHR5IiwiL2Rldi9zdGRpbiIpfWlmKE1vZHVsZVsic3Rkb3V0Il0pe0ZTLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxNb2R1bGVbInN0ZG91dCJdKX1lbHNle0ZTLnN5bWxpbmsoIi9kZXYvdHR5IiwiL2Rldi9zdGRvdXQiKX1pZihNb2R1bGVbInN0ZGVyciJdKXtGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsTW9kdWxlWyJzdGRlcnIiXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eTEiLCIvZGV2L3N0ZGVyciIpfXZhciBzdGRpbj1GUy5vcGVuKCIvZGV2L3N0ZGluIiwwKTt2YXIgc3Rkb3V0PUZTLm9wZW4oIi9kZXYvc3Rkb3V0IiwxKTt2YXIgc3RkZXJyPUZTLm9wZW4oIi9kZXYvc3RkZXJyIiwxKX0sZW5zdXJlRXJybm9FcnJvcjpmdW5jdGlvbigpe2lmKEZTLkVycm5vRXJyb3IpcmV0dXJuO0ZTLkVycm5vRXJyb3I9ZnVuY3Rpb24gRXJybm9FcnJvcihlcnJubyxub2RlKXt0aGlzLm5vZGU9bm9kZTt0aGlzLnNldEVycm5vPWZ1bmN0aW9uKGVycm5vKXt0aGlzLmVycm5vPWVycm5vfTt0aGlzLnNldEVycm5vKGVycm5vKTt0aGlzLm1lc3NhZ2U9IkZTIGVycm9yIn07RlMuRXJybm9FcnJvci5wcm90b3R5cGU9bmV3IEVycm9yO0ZTLkVycm5vRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZTLkVycm5vRXJyb3I7WzQ0XS5mb3JFYWNoKGZ1bmN0aW9uKGNvZGUpe0ZTLmdlbmVyaWNFcnJvcnNbY29kZV09bmV3IEZTLkVycm5vRXJyb3IoY29kZSk7RlMuZ2VuZXJpY0Vycm9yc1tjb2RlXS5zdGFjaz0iPGdlbmVyaWMgZXJyb3IsIG5vIHN0YWNrPiJ9KX0sc3RhdGljSW5pdDpmdW5jdGlvbigpe0ZTLmVuc3VyZUVycm5vRXJyb3IoKTtGUy5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpO0ZTLm1vdW50KE1FTUZTLHt9LCIvIik7RlMuY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCk7RlMuY3JlYXRlRGVmYXVsdERldmljZXMoKTtGUy5jcmVhdGVTcGVjaWFsRGlyZWN0b3JpZXMoKTtGUy5maWxlc3lzdGVtcz17Ik1FTUZTIjpNRU1GU319LGluaXQ6ZnVuY3Rpb24oaW5wdXQsb3V0cHV0LGVycm9yKXtGUy5pbml0LmluaXRpYWxpemVkPXRydWU7RlMuZW5zdXJlRXJybm9FcnJvcigpO01vZHVsZVsic3RkaW4iXT1pbnB1dHx8TW9kdWxlWyJzdGRpbiJdO01vZHVsZVsic3Rkb3V0Il09b3V0cHV0fHxNb2R1bGVbInN0ZG91dCJdO01vZHVsZVsic3RkZXJyIl09ZXJyb3J8fE1vZHVsZVsic3RkZXJyIl07RlMuY3JlYXRlU3RhbmRhcmRTdHJlYW1zKCl9LHF1aXQ6ZnVuY3Rpb24oKXtGUy5pbml0LmluaXRpYWxpemVkPWZhbHNlO3ZhciBmZmx1c2g9TW9kdWxlWyJfZmZsdXNoIl07aWYoZmZsdXNoKWZmbHVzaCgwKTtmb3IodmFyIGk9MDtpPEZTLnN0cmVhbXMubGVuZ3RoO2krKyl7dmFyIHN0cmVhbT1GUy5zdHJlYW1zW2ldO2lmKCFzdHJlYW0pe2NvbnRpbnVlfUZTLmNsb3NlKHN0cmVhbSl9fSxnZXRNb2RlOmZ1bmN0aW9uKGNhblJlYWQsY2FuV3JpdGUpe3ZhciBtb2RlPTA7aWYoY2FuUmVhZCltb2RlfD0yOTJ8NzM7aWYoY2FuV3JpdGUpbW9kZXw9MTQ2O3JldHVybiBtb2RlfSxmaW5kT2JqZWN0OmZ1bmN0aW9uKHBhdGgsZG9udFJlc29sdmVMYXN0TGluayl7dmFyIHJldD1GUy5hbmFseXplUGF0aChwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspO2lmKHJldC5leGlzdHMpe3JldHVybiByZXQub2JqZWN0fWVsc2V7cmV0dXJuIG51bGx9fSxhbmFseXplUGF0aDpmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3RyeXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cGF0aD1sb29rdXAucGF0aH1jYXRjaChlKXt9dmFyIHJldD17aXNSb290OmZhbHNlLGV4aXN0czpmYWxzZSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOmZhbHNlLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3JldC5wYXJlbnRFeGlzdHM9dHJ1ZTtyZXQucGFyZW50UGF0aD1sb29rdXAucGF0aDtyZXQucGFyZW50T2JqZWN0PWxvb2t1cC5ub2RlO3JldC5uYW1lPVBBVEguYmFzZW5hbWUocGF0aCk7bG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cmV0LmV4aXN0cz10cnVlO3JldC5wYXRoPWxvb2t1cC5wYXRoO3JldC5vYmplY3Q9bG9va3VwLm5vZGU7cmV0Lm5hbWU9bG9va3VwLm5vZGUubmFtZTtyZXQuaXNSb290PWxvb2t1cC5wYXRoPT09Ii8ifWNhdGNoKGUpe3JldC5lcnJvcj1lLmVycm5vfXJldHVybiByZXR9LGNyZWF0ZVBhdGg6ZnVuY3Rpb24ocGFyZW50LHBhdGgsY2FuUmVhZCxjYW5Xcml0ZSl7cGFyZW50PXR5cGVvZiBwYXJlbnQ9PT0ic3RyaW5nIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpO3ZhciBwYXJ0cz1wYXRoLnNwbGl0KCIvIikucmV2ZXJzZSgpO3doaWxlKHBhcnRzLmxlbmd0aCl7dmFyIHBhcnQ9cGFydHMucG9wKCk7aWYoIXBhcnQpY29udGludWU7dmFyIGN1cnJlbnQ9UEFUSC5qb2luMihwYXJlbnQscGFydCk7dHJ5e0ZTLm1rZGlyKGN1cnJlbnQpfWNhdGNoKGUpe31wYXJlbnQ9Y3VycmVudH1yZXR1cm4gY3VycmVudH0sY3JlYXRlRmlsZTpmdW5jdGlvbihwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpe3ZhciBwYXRoPVBBVEguam9pbjIodHlwZW9mIHBhcmVudD09PSJzdHJpbmciP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMuY3JlYXRlKHBhdGgsbW9kZSl9LGNyZWF0ZURhdGFGaWxlOmZ1bmN0aW9uKHBhcmVudCxuYW1lLGRhdGEsY2FuUmVhZCxjYW5Xcml0ZSxjYW5Pd24pe3ZhciBwYXRoPW5hbWU/UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTpwYXJlbnQ7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTt2YXIgbm9kZT1GUy5jcmVhdGUocGF0aCxtb2RlKTtpZihkYXRhKXtpZih0eXBlb2YgZGF0YT09PSJzdHJpbmciKXt2YXIgYXJyPW5ldyBBcnJheShkYXRhLmxlbmd0aCk7Zm9yKHZhciBpPTAsbGVuPWRhdGEubGVuZ3RoO2k8bGVuOysraSlhcnJbaV09ZGF0YS5jaGFyQ29kZUF0KGkpO2RhdGE9YXJyfUZTLmNobW9kKG5vZGUsbW9kZXwxNDYpO3ZhciBzdHJlYW09RlMub3Blbihub2RlLDU3Nyk7RlMud3JpdGUoc3RyZWFtLGRhdGEsMCxkYXRhLmxlbmd0aCwwLGNhbk93bik7RlMuY2xvc2Uoc3RyZWFtKTtGUy5jaG1vZChub2RlLG1vZGUpfXJldHVybiBub2RlfSxjcmVhdGVEZXZpY2U6ZnVuY3Rpb24ocGFyZW50LG5hbWUsaW5wdXQsb3V0cHV0KXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT0ic3RyaW5nIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpO3ZhciBtb2RlPUZTLmdldE1vZGUoISFpbnB1dCwhIW91dHB1dCk7aWYoIUZTLmNyZWF0ZURldmljZS5tYWpvcilGUy5jcmVhdGVEZXZpY2UubWFqb3I9NjQ7dmFyIGRldj1GUy5tYWtlZGV2KEZTLmNyZWF0ZURldmljZS5tYWpvcisrLDApO0ZTLnJlZ2lzdGVyRGV2aWNlKGRldix7b3BlbjpmdW5jdGlvbihzdHJlYW0pe3N0cmVhbS5zZWVrYWJsZT1mYWxzZX0sY2xvc2U6ZnVuY3Rpb24oc3RyZWFtKXtpZihvdXRwdXQmJm91dHB1dC5idWZmZXImJm91dHB1dC5idWZmZXIubGVuZ3RoKXtvdXRwdXQoMTApfX0scmVhZDpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXt2YXIgYnl0ZXNSZWFkPTA7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt2YXIgcmVzdWx0O3RyeXtyZXN1bHQ9aW5wdXQoKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2KX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSx3cml0ZTpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3RyeXtvdXRwdXQoYnVmZmVyW29mZnNldCtpXSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpfX1pZihsZW5ndGgpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBpfX0pO3JldHVybiBGUy5ta2RldihwYXRoLG1vZGUsZGV2KX0sZm9yY2VMb2FkRmlsZTpmdW5jdGlvbihvYmope2lmKG9iai5pc0RldmljZXx8b2JqLmlzRm9sZGVyfHxvYmoubGlua3x8b2JqLmNvbnRlbnRzKXJldHVybiB0cnVlO2lmKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9PSJ1bmRlZmluZWQiKXt0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpfWVsc2UgaWYocmVhZF8pe3RyeXtvYmouY29udGVudHM9aW50QXJyYXlGcm9tU3RyaW5nKHJlYWRfKG9iai51cmwpLHRydWUpO29iai51c2VkQnl0ZXM9b2JqLmNvbnRlbnRzLmxlbmd0aH1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSl9fWVsc2V7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbG9hZCB3aXRob3V0IHJlYWQoKSBvciBYTUxIdHRwUmVxdWVzdC4iKX19LGNyZWF0ZUxhenlGaWxlOmZ1bmN0aW9uKHBhcmVudCxuYW1lLHVybCxjYW5SZWFkLGNhbldyaXRlKXtmdW5jdGlvbiBMYXp5VWludDhBcnJheSgpe3RoaXMubGVuZ3RoS25vd249ZmFsc2U7dGhpcy5jaHVua3M9W119TGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLmdldD1mdW5jdGlvbiBMYXp5VWludDhBcnJheV9nZXQoaWR4KXtpZihpZHg+dGhpcy5sZW5ndGgtMXx8aWR4PDApe3JldHVybiB1bmRlZmluZWR9dmFyIGNodW5rT2Zmc2V0PWlkeCV0aGlzLmNodW5rU2l6ZTt2YXIgY2h1bmtOdW09aWR4L3RoaXMuY2h1bmtTaXplfDA7cmV0dXJuIHRoaXMuZ2V0dGVyKGNodW5rTnVtKVtjaHVua09mZnNldF19O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5zZXREYXRhR2V0dGVyPWZ1bmN0aW9uIExhenlVaW50OEFycmF5X3NldERhdGFHZXR0ZXIoZ2V0dGVyKXt0aGlzLmdldHRlcj1nZXR0ZXJ9O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5jYWNoZUxlbmd0aD1mdW5jdGlvbiBMYXp5VWludDhBcnJheV9jYWNoZUxlbmd0aCgpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJIRUFEIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIrdXJsKyIuIFN0YXR1czogIit4aHIuc3RhdHVzKTt2YXIgZGF0YWxlbmd0aD1OdW1iZXIoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LWxlbmd0aCIpKTt2YXIgaGVhZGVyO3ZhciBoYXNCeXRlU2VydmluZz0oaGVhZGVyPXhoci5nZXRSZXNwb25zZUhlYWRlcigiQWNjZXB0LVJhbmdlcyIpKSYmaGVhZGVyPT09ImJ5dGVzIjt2YXIgdXNlc0d6aXA9KGhlYWRlcj14aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtRW5jb2RpbmciKSkmJmhlYWRlcj09PSJnemlwIjt2YXIgY2h1bmtTaXplPTEwMjQqMTAyNDtpZighaGFzQnl0ZVNlcnZpbmcpY2h1bmtTaXplPWRhdGFsZW5ndGg7dmFyIGRvWEhSPWZ1bmN0aW9uKGZyb20sdG8pe2lmKGZyb20+dG8pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHJhbmdlICgiK2Zyb20rIiwgIit0bysiKSBvciBubyBieXRlcyByZXF1ZXN0ZWQhIik7aWYodG8+ZGF0YWxlbmd0aC0xKXRocm93IG5ldyBFcnJvcigib25seSAiK2RhdGFsZW5ndGgrIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oIkdFVCIsdXJsLGZhbHNlKTtpZihkYXRhbGVuZ3RoIT09Y2h1bmtTaXplKXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrZnJvbSsiLSIrdG8pO2lmKHR5cGVvZiBVaW50OEFycmF5IT0idW5kZWZpbmVkIil4aHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciI7aWYoeGhyLm92ZXJyaWRlTWltZVR5cGUpe3hoci5vdmVycmlkZU1pbWVUeXBlKCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXgtdXNlci1kZWZpbmVkIil9eGhyLnNlbmQobnVsbCk7aWYoISh4aHIuc3RhdHVzPj0yMDAmJnhoci5zdGF0dXM8MzAwfHx4aHIuc3RhdHVzPT09MzA0KSl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGxvYWQgIit1cmwrIi4gU3RhdHVzOiAiK3hoci5zdGF0dXMpO2lmKHhoci5yZXNwb25zZSE9PXVuZGVmaW5lZCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZXx8W10pfWVsc2V7cmV0dXJuIGludEFycmF5RnJvbVN0cmluZyh4aHIucmVzcG9uc2VUZXh0fHwiIix0cnVlKX19O3ZhciBsYXp5QXJyYXk9dGhpcztsYXp5QXJyYXkuc2V0RGF0YUdldHRlcihmdW5jdGlvbihjaHVua051bSl7dmFyIHN0YXJ0PWNodW5rTnVtKmNodW5rU2l6ZTt2YXIgZW5kPShjaHVua051bSsxKSpjaHVua1NpemUtMTtlbmQ9TWF0aC5taW4oZW5kLGRhdGFsZW5ndGgtMSk7aWYodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09InVuZGVmaW5lZCIpe2xhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPWRvWEhSKHN0YXJ0LGVuZCl9aWYodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09InVuZGVmaW5lZCIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dfSk7aWYodXNlc0d6aXB8fCFkYXRhbGVuZ3RoKXtjaHVua1NpemU9ZGF0YWxlbmd0aD0xO2RhdGFsZW5ndGg9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoO2NodW5rU2l6ZT1kYXRhbGVuZ3RoO291dCgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIil9dGhpcy5fbGVuZ3RoPWRhdGFsZW5ndGg7dGhpcy5fY2h1bmtTaXplPWNodW5rU2l6ZTt0aGlzLmxlbmd0aEtub3duPXRydWV9O2lmKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9PSJ1bmRlZmluZWQiKXtpZighRU5WSVJPTk1FTlRfSVNfV09SS0VSKXRocm93IkNhbm5vdCBkbyBzeW5jaHJvbm91cyBiaW5hcnkgWEhScyBvdXRzaWRlIHdlYndvcmtlcnMgaW4gbW9kZXJuIGJyb3dzZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2MiO3ZhciBsYXp5QXJyYXk9bmV3IExhenlVaW50OEFycmF5O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlBcnJheSx7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtpZighdGhpcy5sZW5ndGhLbm93bil7dGhpcy5jYWNoZUxlbmd0aCgpfXJldHVybiB0aGlzLl9sZW5ndGh9fSxjaHVua1NpemU6e2dldDpmdW5jdGlvbigpe2lmKCF0aGlzLmxlbmd0aEtub3duKXt0aGlzLmNhY2hlTGVuZ3RoKCl9cmV0dXJuIHRoaXMuX2NodW5rU2l6ZX19fSk7dmFyIHByb3BlcnRpZXM9e2lzRGV2aWNlOmZhbHNlLGNvbnRlbnRzOmxhenlBcnJheX19ZWxzZXt2YXIgcHJvcGVydGllcz17aXNEZXZpY2U6ZmFsc2UsdXJsOnVybH19dmFyIG5vZGU9RlMuY3JlYXRlRmlsZShwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpO2lmKHByb3BlcnRpZXMuY29udGVudHMpe25vZGUuY29udGVudHM9cHJvcGVydGllcy5jb250ZW50c31lbHNlIGlmKHByb3BlcnRpZXMudXJsKXtub2RlLmNvbnRlbnRzPW51bGw7bm9kZS51cmw9cHJvcGVydGllcy51cmx9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobm9kZSx7dXNlZEJ5dGVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50cy5sZW5ndGh9fX0pO3ZhciBzdHJlYW1fb3BzPXt9O3ZhciBrZXlzPU9iamVjdC5rZXlzKG5vZGUuc3RyZWFtX29wcyk7a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7dmFyIGZuPW5vZGUuc3RyZWFtX29wc1trZXldO3N0cmVhbV9vcHNba2V5XT1mdW5jdGlvbiBmb3JjZUxvYWRMYXp5RmlsZSgpe0ZTLmZvcmNlTG9hZEZpbGUobm9kZSk7cmV0dXJuIGZuLmFwcGx5KG51bGwsYXJndW1lbnRzKX19KTtzdHJlYW1fb3BzLnJlYWQ9ZnVuY3Rpb24gc3RyZWFtX29wc19yZWFkKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7RlMuZm9yY2VMb2FkRmlsZShub2RlKTt2YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYocG9zaXRpb24+PWNvbnRlbnRzLmxlbmd0aClyZXR1cm4gMDt2YXIgc2l6ZT1NYXRoLm1pbihjb250ZW50cy5sZW5ndGgtcG9zaXRpb24sbGVuZ3RoKTtpZihjb250ZW50cy5zbGljZSl7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX19ZWxzZXtmb3IodmFyIGk9MDtpPHNpemU7aSsrKXtidWZmZXJbb2Zmc2V0K2ldPWNvbnRlbnRzLmdldChwb3NpdGlvbitpKX19cmV0dXJuIHNpemV9O25vZGUuc3RyZWFtX29wcz1zdHJlYW1fb3BzO3JldHVybiBub2RlfSxjcmVhdGVQcmVsb2FkZWRGaWxlOmZ1bmN0aW9uKHBhcmVudCxuYW1lLHVybCxjYW5SZWFkLGNhbldyaXRlLG9ubG9hZCxvbmVycm9yLGRvbnRDcmVhdGVGaWxlLGNhbk93bixwcmVGaW5pc2gpe0Jyb3dzZXIuaW5pdCgpO3ZhciBmdWxsbmFtZT1uYW1lP1BBVEhfRlMucmVzb2x2ZShQQVRILmpvaW4yKHBhcmVudCxuYW1lKSk6cGFyZW50O3ZhciBkZXA9Z2V0VW5pcXVlUnVuRGVwZW5kZW5jeSgiY3AgIitmdWxsbmFtZSk7ZnVuY3Rpb24gcHJvY2Vzc0RhdGEoYnl0ZUFycmF5KXtmdW5jdGlvbiBmaW5pc2goYnl0ZUFycmF5KXtpZihwcmVGaW5pc2gpcHJlRmluaXNoKCk7aWYoIWRvbnRDcmVhdGVGaWxlKXtGUy5jcmVhdGVEYXRhRmlsZShwYXJlbnQsbmFtZSxieXRlQXJyYXksY2FuUmVhZCxjYW5Xcml0ZSxjYW5Pd24pfWlmKG9ubG9hZClvbmxvYWQoKTtyZW1vdmVSdW5EZXBlbmRlbmN5KGRlcCl9dmFyIGhhbmRsZWQ9ZmFsc2U7TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKXtpZihoYW5kbGVkKXJldHVybjtpZihwbHVnaW5bImNhbkhhbmRsZSJdKGZ1bGxuYW1lKSl7cGx1Z2luWyJoYW5kbGUiXShieXRlQXJyYXksZnVsbG5hbWUsZmluaXNoLGZ1bmN0aW9uKCl7aWYob25lcnJvcilvbmVycm9yKCk7cmVtb3ZlUnVuRGVwZW5kZW5jeShkZXApfSk7aGFuZGxlZD10cnVlfX0pO2lmKCFoYW5kbGVkKWZpbmlzaChieXRlQXJyYXkpfWFkZFJ1bkRlcGVuZGVuY3koZGVwKTtpZih0eXBlb2YgdXJsPT0ic3RyaW5nIil7QnJvd3Nlci5hc3luY0xvYWQodXJsLGZ1bmN0aW9uKGJ5dGVBcnJheSl7cHJvY2Vzc0RhdGEoYnl0ZUFycmF5KX0sb25lcnJvcil9ZWxzZXtwcm9jZXNzRGF0YSh1cmwpfX0saW5kZXhlZERCOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQn0sREJfTkFNRTpmdW5jdGlvbigpe3JldHVybiJFTV9GU18iK3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX0sREJfVkVSU0lPTjoyMCxEQl9TVE9SRV9OQU1FOiJGSUxFX0RBVEEiLHNhdmVGaWxlc1RvREI6ZnVuY3Rpb24ocGF0aHMsb25sb2FkLG9uZXJyb3Ipe29ubG9hZD1vbmxvYWR8fGZ1bmN0aW9uKCl7fTtvbmVycm9yPW9uZXJyb3J8fGZ1bmN0aW9uKCl7fTt2YXIgaW5kZXhlZERCPUZTLmluZGV4ZWREQigpO3RyeXt2YXIgb3BlblJlcXVlc3Q9aW5kZXhlZERCLm9wZW4oRlMuREJfTkFNRSgpLEZTLkRCX1ZFUlNJT04pfWNhdGNoKGUpe3JldHVybiBvbmVycm9yKGUpfW9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZD1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnVwZ3JhZGVuZWVkZWQoKXtvdXQoImNyZWF0aW5nIGRiIik7dmFyIGRiPW9wZW5SZXF1ZXN0LnJlc3VsdDtkYi5jcmVhdGVPYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKX07b3BlblJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIG9wZW5SZXF1ZXN0X29uc3VjY2Vzcygpe3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7dmFyIHRyYW5zYWN0aW9uPWRiLnRyYW5zYWN0aW9uKFtGUy5EQl9TVE9SRV9OQU1FXSwicmVhZHdyaXRlIik7dmFyIGZpbGVzPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKEZTLkRCX1NUT1JFX05BTUUpO3ZhciBvaz0wLGZhaWw9MCx0b3RhbD1wYXRocy5sZW5ndGg7ZnVuY3Rpb24gZmluaXNoKCl7aWYoZmFpbD09MClvbmxvYWQoKTtlbHNlIG9uZXJyb3IoKX1wYXRocy5mb3JFYWNoKGZ1bmN0aW9uKHBhdGgpe3ZhciBwdXRSZXF1ZXN0PWZpbGVzLnB1dChGUy5hbmFseXplUGF0aChwYXRoKS5vYmplY3QuY29udGVudHMscGF0aCk7cHV0UmVxdWVzdC5vbnN1Y2Nlc3M9ZnVuY3Rpb24gcHV0UmVxdWVzdF9vbnN1Y2Nlc3MoKXtvaysrO2lmKG9rK2ZhaWw9PXRvdGFsKWZpbmlzaCgpfTtwdXRSZXF1ZXN0Lm9uZXJyb3I9ZnVuY3Rpb24gcHV0UmVxdWVzdF9vbmVycm9yKCl7ZmFpbCsrO2lmKG9rK2ZhaWw9PXRvdGFsKWZpbmlzaCgpfX0pO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSxsb2FkRmlsZXNGcm9tREI6ZnVuY3Rpb24ocGF0aHMsb25sb2FkLG9uZXJyb3Ipe29ubG9hZD1vbmxvYWR8fGZ1bmN0aW9uKCl7fTtvbmVycm9yPW9uZXJyb3J8fGZ1bmN0aW9uKCl7fTt2YXIgaW5kZXhlZERCPUZTLmluZGV4ZWREQigpO3RyeXt2YXIgb3BlblJlcXVlc3Q9aW5kZXhlZERCLm9wZW4oRlMuREJfTkFNRSgpLEZTLkRCX1ZFUlNJT04pfWNhdGNoKGUpe3JldHVybiBvbmVycm9yKGUpfW9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZD1vbmVycm9yO29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3RyeXt2YXIgdHJhbnNhY3Rpb249ZGIudHJhbnNhY3Rpb24oW0ZTLkRCX1NUT1JFX05BTUVdLCJyZWFkb25seSIpfWNhdGNoKGUpe29uZXJyb3IoZSk7cmV0dXJufXZhciBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXIgb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uIGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZSBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaChmdW5jdGlvbihwYXRoKXt2YXIgZ2V0UmVxdWVzdD1maWxlcy5nZXQocGF0aCk7Z2V0UmVxdWVzdC5vbnN1Y2Nlc3M9ZnVuY3Rpb24gZ2V0UmVxdWVzdF9vbnN1Y2Nlc3MoKXtpZihGUy5hbmFseXplUGF0aChwYXRoKS5leGlzdHMpe0ZTLnVubGluayhwYXRoKX1GUy5jcmVhdGVEYXRhRmlsZShQQVRILmRpcm5hbWUocGF0aCksUEFUSC5iYXNlbmFtZShwYXRoKSxnZXRSZXF1ZXN0LnJlc3VsdCx0cnVlLHRydWUsdHJ1ZSk7b2srKztpZihvaytmYWlsPT10b3RhbClmaW5pc2goKX07Z2V0UmVxdWVzdC5vbmVycm9yPWZ1bmN0aW9uIGdldFJlcXVlc3Rfb25lcnJvcigpe2ZhaWwrKztpZihvaytmYWlsPT10b3RhbClmaW5pc2goKX19KTt0cmFuc2FjdGlvbi5vbmVycm9yPW9uZXJyb3J9O29wZW5SZXF1ZXN0Lm9uZXJyb3I9b25lcnJvcn19O3ZhciBTWVNDQUxMUz17bWFwcGluZ3M6e30sREVGQVVMVF9QT0xMTUFTSzo1LHVtYXNrOjUxMSxjYWxjdWxhdGVBdDpmdW5jdGlvbihkaXJmZCxwYXRoKXtpZihwYXRoWzBdIT09Ii8iKXt2YXIgZGlyO2lmKGRpcmZkPT09LTEwMCl7ZGlyPUZTLmN3ZCgpfWVsc2V7dmFyIGRpcnN0cmVhbT1GUy5nZXRTdHJlYW0oZGlyZmQpO2lmKCFkaXJzdHJlYW0pdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7ZGlyPWRpcnN0cmVhbS5wYXRofXBhdGg9UEFUSC5qb2luMihkaXIscGF0aCl9cmV0dXJuIHBhdGh9LGRvU3RhdDpmdW5jdGlvbihmdW5jLHBhdGgsYnVmKXt0cnl7dmFyIHN0YXQ9ZnVuYyhwYXRoKX1jYXRjaChlKXtpZihlJiZlLm5vZGUmJlBBVEgubm9ybWFsaXplKHBhdGgpIT09UEFUSC5ub3JtYWxpemUoRlMuZ2V0UGF0aChlLm5vZGUpKSl7cmV0dXJuLTU0fXRocm93IGV9SEVBUDMyW2J1Zj4+Ml09c3RhdC5kZXY7SEVBUDMyW2J1Zis0Pj4yXT0wO0hFQVAzMltidWYrOD4+Ml09c3RhdC5pbm87SEVBUDMyW2J1ZisxMj4+Ml09c3RhdC5tb2RlO0hFQVAzMltidWYrMTY+PjJdPXN0YXQubmxpbms7SEVBUDMyW2J1ZisyMD4+Ml09c3RhdC51aWQ7SEVBUDMyW2J1ZisyND4+Ml09c3RhdC5naWQ7SEVBUDMyW2J1ZisyOD4+Ml09c3RhdC5yZGV2O0hFQVAzMltidWYrMzI+PjJdPTA7dGVtcEk2ND1bc3RhdC5zaXplPj4+MCwodGVtcERvdWJsZT1zdGF0LnNpemUsK01hdGguYWJzKHRlbXBEb3VibGUpPj0xP3RlbXBEb3VibGU+MD8oTWF0aC5taW4oK01hdGguZmxvb3IodGVtcERvdWJsZS80Mjk0OTY3Mjk2KSw0Mjk0OTY3Mjk1KXwwKT4+PjA6fn4rTWF0aC5jZWlsKCh0ZW1wRG91YmxlLSsofn50ZW1wRG91YmxlPj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sSEVBUDMyW2J1Zis0MD4+Ml09dGVtcEk2NFswXSxIRUFQMzJbYnVmKzQ0Pj4yXT10ZW1wSTY0WzFdO0hFQVAzMltidWYrNDg+PjJdPTQwOTY7SEVBUDMyW2J1Zis1Mj4+Ml09c3RhdC5ibG9ja3M7SEVBUDMyW2J1Zis1Nj4+Ml09c3RhdC5hdGltZS5nZXRUaW1lKCkvMWUzfDA7SEVBUDMyW2J1Zis2MD4+Ml09MDtIRUFQMzJbYnVmKzY0Pj4yXT1zdGF0Lm10aW1lLmdldFRpbWUoKS8xZTN8MDtIRUFQMzJbYnVmKzY4Pj4yXT0wO0hFQVAzMltidWYrNzI+PjJdPXN0YXQuY3RpbWUuZ2V0VGltZSgpLzFlM3wwO0hFQVAzMltidWYrNzY+PjJdPTA7dGVtcEk2ND1bc3RhdC5pbm8+Pj4wLCh0ZW1wRG91YmxlPXN0YXQuaW5vLCtNYXRoLmFicyh0ZW1wRG91YmxlKT49MT90ZW1wRG91YmxlPjA/KE1hdGgubWluKCtNYXRoLmZsb29yKHRlbXBEb3VibGUvNDI5NDk2NzI5NiksNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGguY2VpbCgodGVtcERvdWJsZS0rKH5+dGVtcERvdWJsZT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLEhFQVAzMltidWYrODA+PjJdPXRlbXBJNjRbMF0sSEVBUDMyW2J1Zis4ND4+Ml09dGVtcEk2NFsxXTtyZXR1cm4gMH0sZG9Nc3luYzpmdW5jdGlvbihhZGRyLHN0cmVhbSxsZW4sZmxhZ3Msb2Zmc2V0KXt2YXIgYnVmZmVyPUhFQVBVOC5zbGljZShhZGRyLGFkZHIrbGVuKTtGUy5tc3luYyhzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW4sZmxhZ3MpfSxkb01rZGlyOmZ1bmN0aW9uKHBhdGgsbW9kZSl7cGF0aD1QQVRILm5vcm1hbGl6ZShwYXRoKTtpZihwYXRoW3BhdGgubGVuZ3RoLTFdPT09Ii8iKXBhdGg9cGF0aC5zdWJzdHIoMCxwYXRoLmxlbmd0aC0xKTtGUy5ta2RpcihwYXRoLG1vZGUsMCk7cmV0dXJuIDB9LGRvTWtub2Q6ZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7c3dpdGNoKG1vZGUmNjE0NDApe2Nhc2UgMzI3Njg6Y2FzZSA4MTkyOmNhc2UgMjQ1NzY6Y2FzZSA0MDk2OmNhc2UgNDkxNTI6YnJlYWs7ZGVmYXVsdDpyZXR1cm4tMjh9RlMubWtub2QocGF0aCxtb2RlLGRldik7cmV0dXJuIDB9LGRvUmVhZGxpbms6ZnVuY3Rpb24ocGF0aCxidWYsYnVmc2l6ZSl7aWYoYnVmc2l6ZTw9MClyZXR1cm4tMjg7dmFyIHJldD1GUy5yZWFkbGluayhwYXRoKTt2YXIgbGVuPU1hdGgubWluKGJ1ZnNpemUsbGVuZ3RoQnl0ZXNVVEY4KHJldCkpO3ZhciBlbmRDaGFyPUhFQVA4W2J1ZitsZW5dO3N0cmluZ1RvVVRGOChyZXQsYnVmLGJ1ZnNpemUrMSk7SEVBUDhbYnVmK2xlbl09ZW5kQ2hhcjtyZXR1cm4gbGVufSxkb0FjY2VzczpmdW5jdGlvbihwYXRoLGFtb2RlKXtpZihhbW9kZSZ+Nyl7cmV0dXJuLTI4fXZhciBub2RlO3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6dHJ1ZX0pO25vZGU9bG9va3VwLm5vZGU7aWYoIW5vZGUpe3JldHVybi00NH12YXIgcGVybXM9IiI7aWYoYW1vZGUmNClwZXJtcys9InIiO2lmKGFtb2RlJjIpcGVybXMrPSJ3IjtpZihhbW9kZSYxKXBlcm1zKz0ieCI7aWYocGVybXMmJkZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLHBlcm1zKSl7cmV0dXJuLTJ9cmV0dXJuIDB9LGRvRHVwOmZ1bmN0aW9uKHBhdGgsZmxhZ3Msc3VnZ2VzdEZEKXt2YXIgc3VnZ2VzdD1GUy5nZXRTdHJlYW0oc3VnZ2VzdEZEKTtpZihzdWdnZXN0KUZTLmNsb3NlKHN1Z2dlc3QpO3JldHVybiBGUy5vcGVuKHBhdGgsZmxhZ3MsMCxzdWdnZXN0RkQsc3VnZ2VzdEZEKS5mZH0sZG9SZWFkdjpmdW5jdGlvbihzdHJlYW0saW92LGlvdmNudCxvZmZzZXQpe3ZhciByZXQ9MDtmb3IodmFyIGk9MDtpPGlvdmNudDtpKyspe3ZhciBwdHI9SEVBUDMyW2lvditpKjg+PjJdO3ZhciBsZW49SEVBUDMyW2lvdisoaSo4KzQpPj4yXTt2YXIgY3Vycj1GUy5yZWFkKHN0cmVhbSxIRUFQOCxwdHIsbGVuLG9mZnNldCk7aWYoY3VycjwwKXJldHVybi0xO3JldCs9Y3VycjtpZihjdXJyPGxlbilicmVha31yZXR1cm4gcmV0fSxkb1dyaXRldjpmdW5jdGlvbihzdHJlYW0saW92LGlvdmNudCxvZmZzZXQpe3ZhciByZXQ9MDtmb3IodmFyIGk9MDtpPGlvdmNudDtpKyspe3ZhciBwdHI9SEVBUDMyW2lvditpKjg+PjJdO3ZhciBsZW49SEVBUDMyW2lvdisoaSo4KzQpPj4yXTt2YXIgY3Vycj1GUy53cml0ZShzdHJlYW0sSEVBUDgscHRyLGxlbixvZmZzZXQpO2lmKGN1cnI8MClyZXR1cm4tMTtyZXQrPWN1cnJ9cmV0dXJuIHJldH0sdmFyYXJnczp1bmRlZmluZWQsZ2V0OmZ1bmN0aW9uKCl7U1lTQ0FMTFMudmFyYXJncys9NDt2YXIgcmV0PUhFQVAzMltTWVNDQUxMUy52YXJhcmdzLTQ+PjJdO3JldHVybiByZXR9LGdldFN0cjpmdW5jdGlvbihwdHIpe3ZhciByZXQ9VVRGOFRvU3RyaW5nKHB0cik7cmV0dXJuIHJldH0sZ2V0U3RyZWFtRnJvbUZEOmZ1bmN0aW9uKGZkKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KTtyZXR1cm4gc3RyZWFtfSxnZXQ2NDpmdW5jdGlvbihsb3csaGlnaCl7cmV0dXJuIGxvd319O2Z1bmN0aW9uIF9fX3N5c19mY250bDY0KGZkLGNtZCx2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzPXZhcmFyZ3M7dHJ5e3ZhciBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTtzd2l0Y2goY21kKXtjYXNlIDA6e3ZhciBhcmc9U1lTQ0FMTFMuZ2V0KCk7aWYoYXJnPDApe3JldHVybi0yOH12YXIgbmV3U3RyZWFtO25ld1N0cmVhbT1GUy5vcGVuKHN0cmVhbS5wYXRoLHN0cmVhbS5mbGFncywwLGFyZyk7cmV0dXJuIG5ld1N0cmVhbS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gc3RyZWFtLmZsYWdzO2Nhc2UgNDp7dmFyIGFyZz1TWVNDQUxMUy5nZXQoKTtzdHJlYW0uZmxhZ3N8PWFyZztyZXR1cm4gMH1jYXNlIDEyOnt2YXIgYXJnPVNZU0NBTExTLmdldCgpO3ZhciBvZmZzZXQ9MDtIRUFQMTZbYXJnK29mZnNldD4+MV09MjtyZXR1cm4gMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDA7Y2FzZSAxNjpjYXNlIDg6cmV0dXJuLTI4O2Nhc2UgOTpzZXRFcnJObygyOCk7cmV0dXJuLTE7ZGVmYXVsdDp7cmV0dXJuLTI4fX19Y2F0Y2goZSl7aWYodHlwZW9mIEZTPT09InVuZGVmaW5lZCJ8fCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybi1lLmVycm5vfX1mdW5jdGlvbiBfX19zeXNfaW9jdGwoZmQsb3AsdmFyYXJncyl7U1lTQ0FMTFMudmFyYXJncz12YXJhcmdzO3RyeXt2YXIgc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7c3dpdGNoKG9wKXtjYXNlIDIxNTA5OmNhc2UgMjE1MDU6e2lmKCFzdHJlYW0udHR5KXJldHVybi01OTtyZXR1cm4gMH1jYXNlIDIxNTEwOmNhc2UgMjE1MTE6Y2FzZSAyMTUxMjpjYXNlIDIxNTA2OmNhc2UgMjE1MDc6Y2FzZSAyMTUwODp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLTU5O3JldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFzdHJlYW0udHR5KXJldHVybi01OTt2YXIgYXJncD1TWVNDQUxMUy5nZXQoKTtIRUFQMzJbYXJncD4+Ml09MDtyZXR1cm4gMH1jYXNlIDIxNTIwOntpZighc3RyZWFtLnR0eSlyZXR1cm4tNTk7cmV0dXJuLTI4fWNhc2UgMjE1MzE6e3ZhciBhcmdwPVNZU0NBTExTLmdldCgpO3JldHVybiBGUy5pb2N0bChzdHJlYW0sb3AsYXJncCl9Y2FzZSAyMTUyMzp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLTU5O3JldHVybiAwfWNhc2UgMjE1MjQ6e2lmKCFzdHJlYW0udHR5KXJldHVybi01OTtyZXR1cm4gMH1kZWZhdWx0OmFib3J0KCJiYWQgaW9jdGwgc3lzY2FsbCAiK29wKX19Y2F0Y2goZSl7aWYodHlwZW9mIEZTPT09InVuZGVmaW5lZCJ8fCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybi1lLmVycm5vfX1mdW5jdGlvbiBfX19zeXNfb3BlbihwYXRoLGZsYWdzLHZhcmFyZ3Mpe1NZU0NBTExTLnZhcmFyZ3M9dmFyYXJnczt0cnl7dmFyIHBhdGhuYW1lPVNZU0NBTExTLmdldFN0cihwYXRoKTt2YXIgbW9kZT1TWVNDQUxMUy5nZXQoKTt2YXIgc3RyZWFtPUZTLm9wZW4ocGF0aG5hbWUsZmxhZ3MsbW9kZSk7cmV0dXJuIHN0cmVhbS5mZH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT0idW5kZWZpbmVkInx8IShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpYWJvcnQoZSk7cmV0dXJuLWUuZXJybm99fXZhciBzdHJ1Y3RSZWdpc3RyYXRpb25zPXt9O2Z1bmN0aW9uIHJ1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKXt3aGlsZShkZXN0cnVjdG9ycy5sZW5ndGgpe3ZhciBwdHI9ZGVzdHJ1Y3RvcnMucG9wKCk7dmFyIGRlbD1kZXN0cnVjdG9ycy5wb3AoKTtkZWwocHRyKX19ZnVuY3Rpb24gc2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBVMzJbcG9pbnRlcj4+Ml0pfXZhciBhd2FpdGluZ0RlcGVuZGVuY2llcz17fTt2YXIgcmVnaXN0ZXJlZFR5cGVzPXt9O3ZhciB0eXBlRGVwZW5kZW5jaWVzPXt9O3ZhciBjaGFyXzA9NDg7dmFyIGNoYXJfOT01NztmdW5jdGlvbiBtYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSl7aWYodW5kZWZpbmVkPT09bmFtZSl7cmV0dXJuIl91bmtub3duIn1uYW1lPW5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCIkIik7dmFyIGY9bmFtZS5jaGFyQ29kZUF0KDApO2lmKGY+PWNoYXJfMCYmZjw9Y2hhcl85KXtyZXR1cm4iXyIrbmFtZX1lbHNle3JldHVybiBuYW1lfX1mdW5jdGlvbiBjcmVhdGVOYW1lZEZ1bmN0aW9uKG5hbWUsYm9keSl7bmFtZT1tYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSk7cmV0dXJuIG5ldyBGdW5jdGlvbigiYm9keSIsInJldHVybiBmdW5jdGlvbiAiK25hbWUrIigpIHtcbiIrJyAgICAidXNlIHN0cmljdCI7JysiICAgIHJldHVybiBib2R5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4iKyJ9O1xuIikoYm9keSl9ZnVuY3Rpb24gZXh0ZW5kRXJyb3IoYmFzZUVycm9yVHlwZSxlcnJvck5hbWUpe3ZhciBlcnJvckNsYXNzPWNyZWF0ZU5hbWVkRnVuY3Rpb24oZXJyb3JOYW1lLGZ1bmN0aW9uKG1lc3NhZ2Upe3RoaXMubmFtZT1lcnJvck5hbWU7dGhpcy5tZXNzYWdlPW1lc3NhZ2U7dmFyIHN0YWNrPW5ldyBFcnJvcihtZXNzYWdlKS5zdGFjaztpZihzdGFjayE9PXVuZGVmaW5lZCl7dGhpcy5zdGFjaz10aGlzLnRvU3RyaW5nKCkrIlxuIitzdGFjay5yZXBsYWNlKC9eRXJyb3IoOlteXG5dKik/XG4vLCIiKX19KTtlcnJvckNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGJhc2VFcnJvclR5cGUucHJvdG90eXBlKTtlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lcnJvckNsYXNzO2Vycm9yQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYodGhpcy5tZXNzYWdlPT09dW5kZWZpbmVkKXtyZXR1cm4gdGhpcy5uYW1lfWVsc2V7cmV0dXJuIHRoaXMubmFtZSsiOiAiK3RoaXMubWVzc2FnZX19O3JldHVybiBlcnJvckNsYXNzfXZhciBJbnRlcm5hbEVycm9yPXVuZGVmaW5lZDtmdW5jdGlvbiB0aHJvd0ludGVybmFsRXJyb3IobWVzc2FnZSl7dGhyb3cgbmV3IEludGVybmFsRXJyb3IobWVzc2FnZSl9ZnVuY3Rpb24gd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQobXlUeXBlcyxkZXBlbmRlbnRUeXBlcyxnZXRUeXBlQ29udmVydGVycyl7bXlUeXBlcy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpe3R5cGVEZXBlbmRlbmNpZXNbdHlwZV09ZGVwZW5kZW50VHlwZXN9KTtmdW5jdGlvbiBvbkNvbXBsZXRlKHR5cGVDb252ZXJ0ZXJzKXt2YXIgbXlUeXBlQ29udmVydGVycz1nZXRUeXBlQ29udmVydGVycyh0eXBlQ29udmVydGVycyk7aWYobXlUeXBlQ29udmVydGVycy5sZW5ndGghPT1teVR5cGVzLmxlbmd0aCl7dGhyb3dJbnRlcm5hbEVycm9yKCJNaXNtYXRjaGVkIHR5cGUgY29udmVydGVyIGNvdW50Iil9Zm9yKHZhciBpPTA7aTxteVR5cGVzLmxlbmd0aDsrK2kpe3JlZ2lzdGVyVHlwZShteVR5cGVzW2ldLG15VHlwZUNvbnZlcnRlcnNbaV0pfX12YXIgdHlwZUNvbnZlcnRlcnM9bmV3IEFycmF5KGRlcGVuZGVudFR5cGVzLmxlbmd0aCk7dmFyIHVucmVnaXN0ZXJlZFR5cGVzPVtdO3ZhciByZWdpc3RlcmVkPTA7ZGVwZW5kZW50VHlwZXMuZm9yRWFjaChmdW5jdGlvbihkdCxpKXtpZihyZWdpc3RlcmVkVHlwZXMuaGFzT3duUHJvcGVydHkoZHQpKXt0eXBlQ29udmVydGVyc1tpXT1yZWdpc3RlcmVkVHlwZXNbZHRdfWVsc2V7dW5yZWdpc3RlcmVkVHlwZXMucHVzaChkdCk7aWYoIWF3YWl0aW5nRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGR0KSl7YXdhaXRpbmdEZXBlbmRlbmNpZXNbZHRdPVtdfWF3YWl0aW5nRGVwZW5kZW5jaWVzW2R0XS5wdXNoKGZ1bmN0aW9uKCl7dHlwZUNvbnZlcnRlcnNbaV09cmVnaXN0ZXJlZFR5cGVzW2R0XTsrK3JlZ2lzdGVyZWQ7aWYocmVnaXN0ZXJlZD09PXVucmVnaXN0ZXJlZFR5cGVzLmxlbmd0aCl7b25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl9fSl9fSk7aWYoMD09PXVucmVnaXN0ZXJlZFR5cGVzLmxlbmd0aCl7b25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl9fWZ1bmN0aW9uIF9fZW1iaW5kX2ZpbmFsaXplX3ZhbHVlX29iamVjdChzdHJ1Y3RUeXBlKXt2YXIgcmVnPXN0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV07ZGVsZXRlIHN0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV07dmFyIHJhd0NvbnN0cnVjdG9yPXJlZy5yYXdDb25zdHJ1Y3Rvcjt2YXIgcmF3RGVzdHJ1Y3Rvcj1yZWcucmF3RGVzdHJ1Y3Rvcjt2YXIgZmllbGRSZWNvcmRzPXJlZy5maWVsZHM7dmFyIGZpZWxkVHlwZXM9ZmllbGRSZWNvcmRzLm1hcChmdW5jdGlvbihmaWVsZCl7cmV0dXJuIGZpZWxkLmdldHRlclJldHVyblR5cGV9KS5jb25jYXQoZmllbGRSZWNvcmRzLm1hcChmdW5jdGlvbihmaWVsZCl7cmV0dXJuIGZpZWxkLnNldHRlckFyZ3VtZW50VHlwZX0pKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbc3RydWN0VHlwZV0sZmllbGRUeXBlcyxmdW5jdGlvbihmaWVsZFR5cGVzKXt2YXIgZmllbGRzPXt9O2ZpZWxkUmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkLGkpe3ZhciBmaWVsZE5hbWU9ZmllbGQuZmllbGROYW1lO3ZhciBnZXR0ZXJSZXR1cm5UeXBlPWZpZWxkVHlwZXNbaV07dmFyIGdldHRlcj1maWVsZC5nZXR0ZXI7dmFyIGdldHRlckNvbnRleHQ9ZmllbGQuZ2V0dGVyQ29udGV4dDt2YXIgc2V0dGVyQXJndW1lbnRUeXBlPWZpZWxkVHlwZXNbaStmaWVsZFJlY29yZHMubGVuZ3RoXTt2YXIgc2V0dGVyPWZpZWxkLnNldHRlcjt2YXIgc2V0dGVyQ29udGV4dD1maWVsZC5zZXR0ZXJDb250ZXh0O2ZpZWxkc1tmaWVsZE5hbWVdPXtyZWFkOmZ1bmN0aW9uKHB0cil7cmV0dXJuIGdldHRlclJldHVyblR5cGVbImZyb21XaXJlVHlwZSJdKGdldHRlcihnZXR0ZXJDb250ZXh0LHB0cikpfSx3cml0ZTpmdW5jdGlvbihwdHIsbyl7dmFyIGRlc3RydWN0b3JzPVtdO3NldHRlcihzZXR0ZXJDb250ZXh0LHB0cixzZXR0ZXJBcmd1bWVudFR5cGVbInRvV2lyZVR5cGUiXShkZXN0cnVjdG9ycyxvKSk7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpfX19KTtyZXR1cm5be25hbWU6cmVnLm5hbWUsImZyb21XaXJlVHlwZSI6ZnVuY3Rpb24ocHRyKXt2YXIgcnY9e307Zm9yKHZhciBpIGluIGZpZWxkcyl7cnZbaV09ZmllbGRzW2ldLnJlYWQocHRyKX1yYXdEZXN0cnVjdG9yKHB0cik7cmV0dXJuIHJ2fSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7Zm9yKHZhciBmaWVsZE5hbWUgaW4gZmllbGRzKXtpZighKGZpZWxkTmFtZSBpbiBvKSl7dGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBmaWVsZDogICInK2ZpZWxkTmFtZSsnIicpfX12YXIgcHRyPXJhd0NvbnN0cnVjdG9yKCk7Zm9yKGZpZWxkTmFtZSBpbiBmaWVsZHMpe2ZpZWxkc1tmaWVsZE5hbWVdLndyaXRlKHB0cixvW2ZpZWxkTmFtZV0pfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChyYXdEZXN0cnVjdG9yLHB0cil9cmV0dXJuIHB0cn0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOnJhd0Rlc3RydWN0b3J9XX0pfWZ1bmN0aW9uIGdldFNoaWZ0RnJvbVNpemUoc2l6ZSl7c3dpdGNoKHNpemUpe2Nhc2UgMTpyZXR1cm4gMDtjYXNlIDI6cmV0dXJuIDE7Y2FzZSA0OnJldHVybiAyO2Nhc2UgODpyZXR1cm4gMztkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gdHlwZSBzaXplOiAiK3NpemUpfX1mdW5jdGlvbiBlbWJpbmRfaW5pdF9jaGFyQ29kZXMoKXt2YXIgY29kZXM9bmV3IEFycmF5KDI1Nik7Zm9yKHZhciBpPTA7aTwyNTY7KytpKXtjb2Rlc1tpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfWVtYmluZF9jaGFyQ29kZXM9Y29kZXN9dmFyIGVtYmluZF9jaGFyQ29kZXM9dW5kZWZpbmVkO2Z1bmN0aW9uIHJlYWRMYXRpbjFTdHJpbmcocHRyKXt2YXIgcmV0PSIiO3ZhciBjPXB0cjt3aGlsZShIRUFQVThbY10pe3JldCs9ZW1iaW5kX2NoYXJDb2Rlc1tIRUFQVThbYysrXV19cmV0dXJuIHJldH12YXIgQmluZGluZ0Vycm9yPXVuZGVmaW5lZDtmdW5jdGlvbiB0aHJvd0JpbmRpbmdFcnJvcihtZXNzYWdlKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKG1lc3NhZ2UpfWZ1bmN0aW9uIHJlZ2lzdGVyVHlwZShyYXdUeXBlLHJlZ2lzdGVyZWRJbnN0YW5jZSxvcHRpb25zKXtvcHRpb25zPW9wdGlvbnN8fHt9O2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHJlZ2lzdGVyZWRJbnN0YW5jZSkpe3Rocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKX12YXIgbmFtZT1yZWdpc3RlcmVkSW5zdGFuY2UubmFtZTtpZighcmF3VHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoJ3R5cGUgIicrbmFtZSsnIiBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHR5cGVpZCBwb2ludGVyJyl9aWYocmVnaXN0ZXJlZFR5cGVzLmhhc093blByb3BlcnR5KHJhd1R5cGUpKXtpZihvcHRpb25zLmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpe3JldHVybn1lbHNle3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcmVnaXN0ZXIgdHlwZSAnIituYW1lKyInIHR3aWNlIil9fXJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXT1yZWdpc3RlcmVkSW5zdGFuY2U7ZGVsZXRlIHR5cGVEZXBlbmRlbmNpZXNbcmF3VHlwZV07aWYoYXdhaXRpbmdEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocmF3VHlwZSkpe3ZhciBjYWxsYmFja3M9YXdhaXRpbmdEZXBlbmRlbmNpZXNbcmF3VHlwZV07ZGVsZXRlIGF3YWl0aW5nRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNiKXtjYigpfSl9fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Jvb2wocmF3VHlwZSxuYW1lLHNpemUsdHJ1ZVZhbHVlLGZhbHNlVmFsdWUpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHd0KXtyZXR1cm4hIXd0fSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7cmV0dXJuIG8/dHJ1ZVZhbHVlOmZhbHNlVmFsdWV9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmZ1bmN0aW9uKHBvaW50ZXIpe3ZhciBoZWFwO2lmKHNpemU9PT0xKXtoZWFwPUhFQVA4fWVsc2UgaWYoc2l6ZT09PTIpe2hlYXA9SEVBUDE2fWVsc2UgaWYoc2l6ZT09PTQpe2hlYXA9SEVBUDMyfWVsc2V7dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBib29sZWFuIHR5cGUgc2l6ZTogIituYW1lKX1yZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oaGVhcFtwb2ludGVyPj5zaGlmdF0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfWZ1bmN0aW9uIENsYXNzSGFuZGxlX2lzQWxpYXNPZihvdGhlcil7aWYoISh0aGlzIGluc3RhbmNlb2YgQ2xhc3NIYW5kbGUpKXtyZXR1cm4gZmFsc2V9aWYoIShvdGhlciBpbnN0YW5jZW9mIENsYXNzSGFuZGxlKSl7cmV0dXJuIGZhbHNlfXZhciBsZWZ0Q2xhc3M9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczt2YXIgbGVmdD10aGlzLiQkLnB0cjt2YXIgcmlnaHRDbGFzcz1vdGhlci4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczt2YXIgcmlnaHQ9b3RoZXIuJCQucHRyO3doaWxlKGxlZnRDbGFzcy5iYXNlQ2xhc3Mpe2xlZnQ9bGVmdENsYXNzLnVwY2FzdChsZWZ0KTtsZWZ0Q2xhc3M9bGVmdENsYXNzLmJhc2VDbGFzc313aGlsZShyaWdodENsYXNzLmJhc2VDbGFzcyl7cmlnaHQ9cmlnaHRDbGFzcy51cGNhc3QocmlnaHQpO3JpZ2h0Q2xhc3M9cmlnaHRDbGFzcy5iYXNlQ2xhc3N9cmV0dXJuIGxlZnRDbGFzcz09PXJpZ2h0Q2xhc3MmJmxlZnQ9PT1yaWdodH1mdW5jdGlvbiBzaGFsbG93Q29weUludGVybmFsUG9pbnRlcihvKXtyZXR1cm57Y291bnQ6by5jb3VudCxkZWxldGVTY2hlZHVsZWQ6by5kZWxldGVTY2hlZHVsZWQscHJlc2VydmVQb2ludGVyT25EZWxldGU6by5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSxwdHI6by5wdHIscHRyVHlwZTpvLnB0clR5cGUsc21hcnRQdHI6by5zbWFydFB0cixzbWFydFB0clR5cGU6by5zbWFydFB0clR5cGV9fWZ1bmN0aW9uIHRocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZChvYmope2Z1bmN0aW9uIGdldEluc3RhbmNlVHlwZU5hbWUoaGFuZGxlKXtyZXR1cm4gaGFuZGxlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLm5hbWV9dGhyb3dCaW5kaW5nRXJyb3IoZ2V0SW5zdGFuY2VUeXBlTmFtZShvYmopKyIgaW5zdGFuY2UgYWxyZWFkeSBkZWxldGVkIil9dmFyIGZpbmFsaXphdGlvbkdyb3VwPWZhbHNlO2Z1bmN0aW9uIGRldGFjaEZpbmFsaXplcihoYW5kbGUpe31mdW5jdGlvbiBydW5EZXN0cnVjdG9yKCQkKXtpZigkJC5zbWFydFB0cil7JCQuc21hcnRQdHJUeXBlLnJhd0Rlc3RydWN0b3IoJCQuc21hcnRQdHIpfWVsc2V7JCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MucmF3RGVzdHJ1Y3RvcigkJC5wdHIpfX1mdW5jdGlvbiByZWxlYXNlQ2xhc3NIYW5kbGUoJCQpeyQkLmNvdW50LnZhbHVlLT0xO3ZhciB0b0RlbGV0ZT0wPT09JCQuY291bnQudmFsdWU7aWYodG9EZWxldGUpe3J1bkRlc3RydWN0b3IoJCQpfX1mdW5jdGlvbiBhdHRhY2hGaW5hbGl6ZXIoaGFuZGxlKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBGaW5hbGl6YXRpb25Hcm91cCl7YXR0YWNoRmluYWxpemVyPWZ1bmN0aW9uKGhhbmRsZSl7cmV0dXJuIGhhbmRsZX07cmV0dXJuIGhhbmRsZX1maW5hbGl6YXRpb25Hcm91cD1uZXcgRmluYWxpemF0aW9uR3JvdXAoZnVuY3Rpb24oaXRlcil7Zm9yKHZhciByZXN1bHQ9aXRlci5uZXh0KCk7IXJlc3VsdC5kb25lO3Jlc3VsdD1pdGVyLm5leHQoKSl7dmFyICQkPXJlc3VsdC52YWx1ZTtpZighJCQucHRyKXtjb25zb2xlLndhcm4oIm9iamVjdCBhbHJlYWR5IGRlbGV0ZWQ6ICIrJCQucHRyKX1lbHNle3JlbGVhc2VDbGFzc0hhbmRsZSgkJCl9fX0pO2F0dGFjaEZpbmFsaXplcj1mdW5jdGlvbihoYW5kbGUpe2ZpbmFsaXphdGlvbkdyb3VwLnJlZ2lzdGVyKGhhbmRsZSxoYW5kbGUuJCQsaGFuZGxlLiQkKTtyZXR1cm4gaGFuZGxlfTtkZXRhY2hGaW5hbGl6ZXI9ZnVuY3Rpb24oaGFuZGxlKXtmaW5hbGl6YXRpb25Hcm91cC51bnJlZ2lzdGVyKGhhbmRsZS4kJCl9O3JldHVybiBhdHRhY2hGaW5hbGl6ZXIoaGFuZGxlKX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9jbG9uZSgpe2lmKCF0aGlzLiQkLnB0cil7dGhyb3dJbnN0YW5jZUFscmVhZHlEZWxldGVkKHRoaXMpfWlmKHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3RoaXMuJCQuY291bnQudmFsdWUrPTE7cmV0dXJuIHRoaXN9ZWxzZXt2YXIgY2xvbmU9YXR0YWNoRmluYWxpemVyKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLHskJDp7dmFsdWU6c2hhbGxvd0NvcHlJbnRlcm5hbFBvaW50ZXIodGhpcy4kJCl9fSkpO2Nsb25lLiQkLmNvdW50LnZhbHVlKz0xO2Nsb25lLiQkLmRlbGV0ZVNjaGVkdWxlZD1mYWxzZTtyZXR1cm4gY2xvbmV9fWZ1bmN0aW9uIENsYXNzSGFuZGxlX2RlbGV0ZSgpe2lmKCF0aGlzLiQkLnB0cil7dGhyb3dJbnN0YW5jZUFscmVhZHlEZWxldGVkKHRoaXMpfWlmKHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSl7dGhyb3dCaW5kaW5nRXJyb3IoIk9iamVjdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgZGVsZXRpb24iKX1kZXRhY2hGaW5hbGl6ZXIodGhpcyk7cmVsZWFzZUNsYXNzSGFuZGxlKHRoaXMuJCQpO2lmKCF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aGlzLiQkLnNtYXJ0UHRyPXVuZGVmaW5lZDt0aGlzLiQkLnB0cj11bmRlZmluZWR9fWZ1bmN0aW9uIENsYXNzSGFuZGxlX2lzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn12YXIgZGVsYXlGdW5jdGlvbj11bmRlZmluZWQ7dmFyIGRlbGV0aW9uUXVldWU9W107ZnVuY3Rpb24gZmx1c2hQZW5kaW5nRGVsZXRlcygpe3doaWxlKGRlbGV0aW9uUXVldWUubGVuZ3RoKXt2YXIgb2JqPWRlbGV0aW9uUXVldWUucG9wKCk7b2JqLiQkLmRlbGV0ZVNjaGVkdWxlZD1mYWxzZTtvYmpbImRlbGV0ZSJdKCl9fWZ1bmN0aW9uIENsYXNzSGFuZGxlX2RlbGV0ZUxhdGVyKCl7aWYoIXRoaXMuJCQucHRyKXt0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQodGhpcyl9aWYodGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aHJvd0JpbmRpbmdFcnJvcigiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpfWRlbGV0aW9uUXVldWUucHVzaCh0aGlzKTtpZihkZWxldGlvblF1ZXVlLmxlbmd0aD09PTEmJmRlbGF5RnVuY3Rpb24pe2RlbGF5RnVuY3Rpb24oZmx1c2hQZW5kaW5nRGVsZXRlcyl9dGhpcy4kJC5kZWxldGVTY2hlZHVsZWQ9dHJ1ZTtyZXR1cm4gdGhpc31mdW5jdGlvbiBpbml0X0NsYXNzSGFuZGxlKCl7Q2xhc3NIYW5kbGUucHJvdG90eXBlWyJpc0FsaWFzT2YiXT1DbGFzc0hhbmRsZV9pc0FsaWFzT2Y7Q2xhc3NIYW5kbGUucHJvdG90eXBlWyJjbG9uZSJdPUNsYXNzSGFuZGxlX2Nsb25lO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiZGVsZXRlIl09Q2xhc3NIYW5kbGVfZGVsZXRlO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNEZWxldGVkIl09Q2xhc3NIYW5kbGVfaXNEZWxldGVkO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiZGVsZXRlTGF0ZXIiXT1DbGFzc0hhbmRsZV9kZWxldGVMYXRlcn1mdW5jdGlvbiBDbGFzc0hhbmRsZSgpe312YXIgcmVnaXN0ZXJlZFBvaW50ZXJzPXt9O2Z1bmN0aW9uIGVuc3VyZU92ZXJsb2FkVGFibGUocHJvdG8sbWV0aG9kTmFtZSxodW1hbk5hbWUpe2lmKHVuZGVmaW5lZD09PXByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGUpe3ZhciBwcmV2RnVuYz1wcm90b1ttZXRob2ROYW1lXTtwcm90b1ttZXRob2ROYW1lXT1mdW5jdGlvbigpe2lmKCFwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGFyZ3VtZW50cy5sZW5ndGgpKXt0aHJvd0JpbmRpbmdFcnJvcigiRnVuY3Rpb24gJyIraHVtYW5OYW1lKyInIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIithcmd1bWVudHMubGVuZ3RoKyIpIC0gZXhwZWN0cyBvbmUgb2YgKCIrcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSsiKSEiKX1yZXR1cm4gcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmd1bWVudHMubGVuZ3RoXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGU9W107cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVtwcmV2RnVuYy5hcmdDb3VudF09cHJldkZ1bmN9fWZ1bmN0aW9uIGV4cG9zZVB1YmxpY1N5bWJvbChuYW1lLHZhbHVlLG51bUFyZ3VtZW50cyl7aWYoTW9kdWxlLmhhc093blByb3BlcnR5KG5hbWUpKXtpZih1bmRlZmluZWQ9PT1udW1Bcmd1bWVudHN8fHVuZGVmaW5lZCE9PU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlJiZ1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZVtudW1Bcmd1bWVudHNdKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICciK25hbWUrIicgdHdpY2UiKX1lbnN1cmVPdmVybG9hZFRhYmxlKE1vZHVsZSxuYW1lLG5hbWUpO2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShudW1Bcmd1bWVudHMpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIG11bHRpcGxlIG92ZXJsb2FkcyBvZiBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIitudW1Bcmd1bWVudHMrIikhIil9TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXT12YWx1ZX1lbHNle01vZHVsZVtuYW1lXT12YWx1ZTtpZih1bmRlZmluZWQhPT1udW1Bcmd1bWVudHMpe01vZHVsZVtuYW1lXS5udW1Bcmd1bWVudHM9bnVtQXJndW1lbnRzfX19ZnVuY3Rpb24gUmVnaXN0ZXJlZENsYXNzKG5hbWUsY29uc3RydWN0b3IsaW5zdGFuY2VQcm90b3R5cGUscmF3RGVzdHJ1Y3RvcixiYXNlQ2xhc3MsZ2V0QWN0dWFsVHlwZSx1cGNhc3QsZG93bmNhc3Qpe3RoaXMubmFtZT1uYW1lO3RoaXMuY29uc3RydWN0b3I9Y29uc3RydWN0b3I7dGhpcy5pbnN0YW5jZVByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt0aGlzLnJhd0Rlc3RydWN0b3I9cmF3RGVzdHJ1Y3Rvcjt0aGlzLmJhc2VDbGFzcz1iYXNlQ2xhc3M7dGhpcy5nZXRBY3R1YWxUeXBlPWdldEFjdHVhbFR5cGU7dGhpcy51cGNhc3Q9dXBjYXN0O3RoaXMuZG93bmNhc3Q9ZG93bmNhc3Q7dGhpcy5wdXJlVmlydHVhbEZ1bmN0aW9ucz1bXX1mdW5jdGlvbiB1cGNhc3RQb2ludGVyKHB0cixwdHJDbGFzcyxkZXNpcmVkQ2xhc3Mpe3doaWxlKHB0ckNsYXNzIT09ZGVzaXJlZENsYXNzKXtpZighcHRyQ2xhc3MudXBjYXN0KXt0aHJvd0JpbmRpbmdFcnJvcigiRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAiK2Rlc2lyZWRDbGFzcy5uYW1lKyIsIGdvdCBhbiBpbnN0YW5jZSBvZiAiK3B0ckNsYXNzLm5hbWUpfXB0cj1wdHJDbGFzcy51cGNhc3QocHRyKTtwdHJDbGFzcz1wdHJDbGFzcy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiBjb25zdE5vU21hcnRQdHJSYXdQb2ludGVyVG9XaXJlVHlwZShkZXN0cnVjdG9ycyxoYW5kbGUpe2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1yZXR1cm4gMH1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9dmFyIGhhbmRsZUNsYXNzPWhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczt2YXIgcHRyPXVwY2FzdFBvaW50ZXIoaGFuZGxlLiQkLnB0cixoYW5kbGVDbGFzcyx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIHB0cn1mdW5jdGlvbiBnZW5lcmljUG9pbnRlclRvV2lyZVR5cGUoZGVzdHJ1Y3RvcnMsaGFuZGxlKXt2YXIgcHRyO2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1pZih0aGlzLmlzU21hcnRQb2ludGVyKXtwdHI9dGhpcy5yYXdDb25zdHJ1Y3RvcigpO2lmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IscHRyKX1yZXR1cm4gcHRyfWVsc2V7cmV0dXJuIDB9fWlmKCFoYW5kbGUuJCQpe3Rocm93QmluZGluZ0Vycm9yKCdDYW5ub3QgcGFzcyAiJytfZW1iaW5kX3JlcHIoaGFuZGxlKSsnIiBhcyBhICcrdGhpcy5uYW1lKX1pZighaGFuZGxlLiQkLnB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIrdGhpcy5uYW1lKX1pZighdGhpcy5pc0NvbnN0JiZoYW5kbGUuJCQucHRyVHlwZS5pc0NvbnN0KXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAiKyhoYW5kbGUuJCQuc21hcnRQdHJUeXBlP2hhbmRsZS4kJC5zbWFydFB0clR5cGUubmFtZTpoYW5kbGUuJCQucHRyVHlwZS5uYW1lKSsiIHRvIHBhcmFtZXRlciB0eXBlICIrdGhpcy5uYW1lKX12YXIgaGFuZGxlQ2xhc3M9aGFuZGxlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3B0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO2lmKHRoaXMuaXNTbWFydFBvaW50ZXIpe2lmKHVuZGVmaW5lZD09PWhhbmRsZS4kJC5zbWFydFB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3NpbmcgcmF3IHBvaW50ZXIgdG8gc21hcnQgcG9pbnRlciBpcyBpbGxlZ2FsIil9c3dpdGNoKHRoaXMuc2hhcmluZ1BvbGljeSl7Y2FzZSAwOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZT9oYW5kbGUuJCQuc21hcnRQdHJUeXBlLm5hbWU6aGFuZGxlLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9YnJlYWs7Y2FzZSAxOnB0cj1oYW5kbGUuJCQuc21hcnRQdHI7YnJlYWs7Y2FzZSAyOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dmFyIGNsb25lZEhhbmRsZT1oYW5kbGVbImNsb25lIl0oKTtwdHI9dGhpcy5yYXdTaGFyZShwdHIsX19lbXZhbF9yZWdpc3RlcihmdW5jdGlvbigpe2Nsb25lZEhhbmRsZVsiZGVsZXRlIl0oKX0pKTtpZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHB0cil9fWJyZWFrO2RlZmF1bHQ6dGhyb3dCaW5kaW5nRXJyb3IoIlVuc3VwcG9ydGluZyBzaGFyaW5nIHBvbGljeSIpfX1yZXR1cm4gcHRyfWZ1bmN0aW9uIG5vbkNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlKGRlc3RydWN0b3JzLGhhbmRsZSl7aWYoaGFuZGxlPT09bnVsbCl7aWYodGhpcy5pc1JlZmVyZW5jZSl7dGhyb3dCaW5kaW5nRXJyb3IoIm51bGwgaXMgbm90IGEgdmFsaWQgIit0aGlzLm5hbWUpfXJldHVybiAwfWlmKCFoYW5kbGUuJCQpe3Rocm93QmluZGluZ0Vycm9yKCdDYW5ub3QgcGFzcyAiJytfZW1iaW5kX3JlcHIoaGFuZGxlKSsnIiBhcyBhICcrdGhpcy5uYW1lKX1pZighaGFuZGxlLiQkLnB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIrdGhpcy5uYW1lKX1pZihoYW5kbGUuJCQucHRyVHlwZS5pc0NvbnN0KXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAiK2hhbmRsZS4kJC5wdHJUeXBlLm5hbWUrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9dmFyIGhhbmRsZUNsYXNzPWhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczt2YXIgcHRyPXVwY2FzdFBvaW50ZXIoaGFuZGxlLiQkLnB0cixoYW5kbGVDbGFzcyx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIHB0cn1mdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcl9nZXRQb2ludGVlKHB0cil7aWYodGhpcy5yYXdHZXRQb2ludGVlKXtwdHI9dGhpcy5yYXdHZXRQb2ludGVlKHB0cil9cmV0dXJuIHB0cn1mdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcl9kZXN0cnVjdG9yKHB0cil7aWYodGhpcy5yYXdEZXN0cnVjdG9yKXt0aGlzLnJhd0Rlc3RydWN0b3IocHRyKX19ZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXJfZGVsZXRlT2JqZWN0KGhhbmRsZSl7aWYoaGFuZGxlIT09bnVsbCl7aGFuZGxlWyJkZWxldGUiXSgpfX1mdW5jdGlvbiBkb3duY2FzdFBvaW50ZXIocHRyLHB0ckNsYXNzLGRlc2lyZWRDbGFzcyl7aWYocHRyQ2xhc3M9PT1kZXNpcmVkQ2xhc3Mpe3JldHVybiBwdHJ9aWYodW5kZWZpbmVkPT09ZGVzaXJlZENsYXNzLmJhc2VDbGFzcyl7cmV0dXJuIG51bGx9dmFyIHJ2PWRvd25jYXN0UG9pbnRlcihwdHIscHRyQ2xhc3MsZGVzaXJlZENsYXNzLmJhc2VDbGFzcyk7aWYocnY9PT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gZGVzaXJlZENsYXNzLmRvd25jYXN0KHJ2KX1mdW5jdGlvbiBnZXRJbmhlcml0ZWRJbnN0YW5jZUNvdW50KCl7cmV0dXJuIE9iamVjdC5rZXlzKHJlZ2lzdGVyZWRJbnN0YW5jZXMpLmxlbmd0aH1mdW5jdGlvbiBnZXRMaXZlSW5oZXJpdGVkSW5zdGFuY2VzKCl7dmFyIHJ2PVtdO2Zvcih2YXIgayBpbiByZWdpc3RlcmVkSW5zdGFuY2VzKXtpZihyZWdpc3RlcmVkSW5zdGFuY2VzLmhhc093blByb3BlcnR5KGspKXtydi5wdXNoKHJlZ2lzdGVyZWRJbnN0YW5jZXNba10pfX1yZXR1cm4gcnZ9ZnVuY3Rpb24gc2V0RGVsYXlGdW5jdGlvbihmbil7ZGVsYXlGdW5jdGlvbj1mbjtpZihkZWxldGlvblF1ZXVlLmxlbmd0aCYmZGVsYXlGdW5jdGlvbil7ZGVsYXlGdW5jdGlvbihmbHVzaFBlbmRpbmdEZWxldGVzKX19ZnVuY3Rpb24gaW5pdF9lbWJpbmQoKXtNb2R1bGVbImdldEluaGVyaXRlZEluc3RhbmNlQ291bnQiXT1nZXRJbmhlcml0ZWRJbnN0YW5jZUNvdW50O01vZHVsZVsiZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcyJdPWdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM7TW9kdWxlWyJmbHVzaFBlbmRpbmdEZWxldGVzIl09Zmx1c2hQZW5kaW5nRGVsZXRlcztNb2R1bGVbInNldERlbGF5RnVuY3Rpb24iXT1zZXREZWxheUZ1bmN0aW9ufXZhciByZWdpc3RlcmVkSW5zdGFuY2VzPXt9O2Z1bmN0aW9uIGdldEJhc2VzdFBvaW50ZXIoY2xhc3NfLHB0cil7aWYocHRyPT09dW5kZWZpbmVkKXt0aHJvd0JpbmRpbmdFcnJvcigicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIil9d2hpbGUoY2xhc3NfLmJhc2VDbGFzcyl7cHRyPWNsYXNzXy51cGNhc3QocHRyKTtjbGFzc189Y2xhc3NfLmJhc2VDbGFzc31yZXR1cm4gcHRyfWZ1bmN0aW9uIGdldEluaGVyaXRlZEluc3RhbmNlKGNsYXNzXyxwdHIpe3B0cj1nZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpO3JldHVybiByZWdpc3RlcmVkSW5zdGFuY2VzW3B0cl19ZnVuY3Rpb24gbWFrZUNsYXNzSGFuZGxlKHByb3RvdHlwZSxyZWNvcmQpe2lmKCFyZWNvcmQucHRyVHlwZXx8IXJlY29yZC5wdHIpe3Rocm93SW50ZXJuYWxFcnJvcigibWFrZUNsYXNzSGFuZGxlIHJlcXVpcmVzIHB0ciBhbmQgcHRyVHlwZSIpfXZhciBoYXNTbWFydFB0clR5cGU9ISFyZWNvcmQuc21hcnRQdHJUeXBlO3ZhciBoYXNTbWFydFB0cj0hIXJlY29yZC5zbWFydFB0cjtpZihoYXNTbWFydFB0clR5cGUhPT1oYXNTbWFydFB0cil7dGhyb3dJbnRlcm5hbEVycm9yKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKX1yZWNvcmQuY291bnQ9e3ZhbHVlOjF9O3JldHVybiBhdHRhY2hGaW5hbGl6ZXIoT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUseyQkOnt2YWx1ZTpyZWNvcmR9fSkpfWZ1bmN0aW9uIFJlZ2lzdGVyZWRQb2ludGVyX2Zyb21XaXJlVHlwZShwdHIpe3ZhciByYXdQb2ludGVyPXRoaXMuZ2V0UG9pbnRlZShwdHIpO2lmKCFyYXdQb2ludGVyKXt0aGlzLmRlc3RydWN0b3IocHRyKTtyZXR1cm4gbnVsbH12YXIgcmVnaXN0ZXJlZEluc3RhbmNlPWdldEluaGVyaXRlZEluc3RhbmNlKHRoaXMucmVnaXN0ZXJlZENsYXNzLHJhd1BvaW50ZXIpO2lmKHVuZGVmaW5lZCE9PXJlZ2lzdGVyZWRJbnN0YW5jZSl7aWYoMD09PXJlZ2lzdGVyZWRJbnN0YW5jZS4kJC5jb3VudC52YWx1ZSl7cmVnaXN0ZXJlZEluc3RhbmNlLiQkLnB0cj1yYXdQb2ludGVyO3JlZ2lzdGVyZWRJbnN0YW5jZS4kJC5zbWFydFB0cj1wdHI7cmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpfWVsc2V7dmFyIHJ2PXJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpO3RoaXMuZGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn19ZnVuY3Rpb24gbWFrZURlZmF1bHRIYW5kbGUoKXtpZih0aGlzLmlzU21hcnRQb2ludGVyKXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnJhd1BvaW50ZXIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOnB0cn0pfX12YXIgYWN0dWFsVHlwZT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHJhd1BvaW50ZXIpO3ZhciByZWdpc3RlcmVkUG9pbnRlclJlY29yZD1yZWdpc3RlcmVkUG9pbnRlcnNbYWN0dWFsVHlwZV07aWYoIXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkKXtyZXR1cm4gbWFrZURlZmF1bHRIYW5kbGUuY2FsbCh0aGlzKX12YXIgdG9UeXBlO2lmKHRoaXMuaXNDb25zdCl7dG9UeXBlPXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkLmNvbnN0UG9pbnRlclR5cGV9ZWxzZXt0b1R5cGU9cmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQucG9pbnRlclR5cGV9dmFyIGRwPWRvd25jYXN0UG9pbnRlcihyYXdQb2ludGVyLHRoaXMucmVnaXN0ZXJlZENsYXNzLHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MpO2lmKGRwPT09bnVsbCl7cmV0dXJuIG1ha2VEZWZhdWx0SGFuZGxlLmNhbGwodGhpcyl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0b1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRvVHlwZSxwdHI6ZHAsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6dG9UeXBlLHB0cjpkcH0pfX1mdW5jdGlvbiBpbml0X1JlZ2lzdGVyZWRQb2ludGVyKCl7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlLmdldFBvaW50ZWU9UmVnaXN0ZXJlZFBvaW50ZXJfZ2V0UG9pbnRlZTtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGUuZGVzdHJ1Y3Rvcj1SZWdpc3RlcmVkUG9pbnRlcl9kZXN0cnVjdG9yO1JlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZVsiYXJnUGFja0FkdmFuY2UiXT04O1JlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZVsicmVhZFZhbHVlRnJvbVBvaW50ZXIiXT1zaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcjtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImRlbGV0ZU9iamVjdCJdPVJlZ2lzdGVyZWRQb2ludGVyX2RlbGV0ZU9iamVjdDtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImZyb21XaXJlVHlwZSJdPVJlZ2lzdGVyZWRQb2ludGVyX2Zyb21XaXJlVHlwZX1mdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHJlZ2lzdGVyZWRDbGFzcyxpc1JlZmVyZW5jZSxpc0NvbnN0LGlzU21hcnRQb2ludGVyLHBvaW50ZWVUeXBlLHNoYXJpbmdQb2xpY3kscmF3R2V0UG9pbnRlZSxyYXdDb25zdHJ1Y3RvcixyYXdTaGFyZSxyYXdEZXN0cnVjdG9yKXt0aGlzLm5hbWU9bmFtZTt0aGlzLnJlZ2lzdGVyZWRDbGFzcz1yZWdpc3RlcmVkQ2xhc3M7dGhpcy5pc1JlZmVyZW5jZT1pc1JlZmVyZW5jZTt0aGlzLmlzQ29uc3Q9aXNDb25zdDt0aGlzLmlzU21hcnRQb2ludGVyPWlzU21hcnRQb2ludGVyO3RoaXMucG9pbnRlZVR5cGU9cG9pbnRlZVR5cGU7dGhpcy5zaGFyaW5nUG9saWN5PXNoYXJpbmdQb2xpY3k7dGhpcy5yYXdHZXRQb2ludGVlPXJhd0dldFBvaW50ZWU7dGhpcy5yYXdDb25zdHJ1Y3Rvcj1yYXdDb25zdHJ1Y3Rvcjt0aGlzLnJhd1NoYXJlPXJhd1NoYXJlO3RoaXMucmF3RGVzdHJ1Y3Rvcj1yYXdEZXN0cnVjdG9yO2lmKCFpc1NtYXJ0UG9pbnRlciYmcmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcz09PXVuZGVmaW5lZCl7aWYoaXNDb25zdCl7dGhpc1sidG9XaXJlVHlwZSJdPWNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlO3RoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGx9ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09bm9uQ29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGU7dGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbH19ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09Z2VuZXJpY1BvaW50ZXJUb1dpcmVUeXBlfX1mdW5jdGlvbiByZXBsYWNlUHVibGljU3ltYm9sKG5hbWUsdmFsdWUsbnVtQXJndW1lbnRzKXtpZighTW9kdWxlLmhhc093blByb3BlcnR5KG5hbWUpKXt0aHJvd0ludGVybmFsRXJyb3IoIlJlcGxhY2luZyBub25leGlzdGFudCBwdWJsaWMgc3ltYm9sIil9aWYodW5kZWZpbmVkIT09TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGUmJnVuZGVmaW5lZCE9PW51bUFyZ3VtZW50cyl7TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXT12YWx1ZX1lbHNle01vZHVsZVtuYW1lXT12YWx1ZTtNb2R1bGVbbmFtZV0uYXJnQ291bnQ9bnVtQXJndW1lbnRzfX1mdW5jdGlvbiBkeW5DYWxsTGVnYWN5KHNpZyxwdHIsYXJncyl7aWYoYXJncyYmYXJncy5sZW5ndGgpe3JldHVybiBNb2R1bGVbImR5bkNhbGxfIitzaWddLmFwcGx5KG51bGwsW3B0cl0uY29uY2F0KGFyZ3MpKX1yZXR1cm4gTW9kdWxlWyJkeW5DYWxsXyIrc2lnXS5jYWxsKG51bGwscHRyKX1mdW5jdGlvbiBkeW5DYWxsKHNpZyxwdHIsYXJncyl7aWYoc2lnLmluZGV4T2YoImoiKSE9LTEpe3JldHVybiBkeW5DYWxsTGVnYWN5KHNpZyxwdHIsYXJncyl9cmV0dXJuIHdhc21UYWJsZS5nZXQocHRyKS5hcHBseShudWxsLGFyZ3MpfWZ1bmN0aW9uIGdldER5bkNhbGxlcihzaWcscHRyKXthc3NlcnQoc2lnLmluZGV4T2YoImoiKT49MCwiZ2V0RHluQ2FsbGVyIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aXRoIGk2NCBzaWdzIik7dmFyIGFyZ0NhY2hlPVtdO3JldHVybiBmdW5jdGlvbigpe2FyZ0NhY2hlLmxlbmd0aD1hcmd1bWVudHMubGVuZ3RoO2Zvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe2FyZ0NhY2hlW2ldPWFyZ3VtZW50c1tpXX1yZXR1cm4gZHluQ2FsbChzaWcscHRyLGFyZ0NhY2hlKX19ZnVuY3Rpb24gZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oc2lnbmF0dXJlLHJhd0Z1bmN0aW9uKXtzaWduYXR1cmU9cmVhZExhdGluMVN0cmluZyhzaWduYXR1cmUpO2Z1bmN0aW9uIG1ha2VEeW5DYWxsZXIoKXtpZihzaWduYXR1cmUuaW5kZXhPZigiaiIpIT0tMSl7cmV0dXJuIGdldER5bkNhbGxlcihzaWduYXR1cmUscmF3RnVuY3Rpb24pfXJldHVybiB3YXNtVGFibGUuZ2V0KHJhd0Z1bmN0aW9uKX12YXIgZnA9bWFrZUR5bkNhbGxlcigpO2lmKHR5cGVvZiBmcCE9PSJmdW5jdGlvbiIpe3Rocm93QmluZGluZ0Vycm9yKCJ1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgIitzaWduYXR1cmUrIjogIityYXdGdW5jdGlvbil9cmV0dXJuIGZwfXZhciBVbmJvdW5kVHlwZUVycm9yPXVuZGVmaW5lZDtmdW5jdGlvbiBnZXRUeXBlTmFtZSh0eXBlKXt2YXIgcHRyPV9fX2dldFR5cGVOYW1lKHR5cGUpO3ZhciBydj1yZWFkTGF0aW4xU3RyaW5nKHB0cik7X2ZyZWUocHRyKTtyZXR1cm4gcnZ9ZnVuY3Rpb24gdGhyb3dVbmJvdW5kVHlwZUVycm9yKG1lc3NhZ2UsdHlwZXMpe3ZhciB1bmJvdW5kVHlwZXM9W107dmFyIHNlZW49e307ZnVuY3Rpb24gdmlzaXQodHlwZSl7aWYoc2Vlblt0eXBlXSl7cmV0dXJufWlmKHJlZ2lzdGVyZWRUeXBlc1t0eXBlXSl7cmV0dXJufWlmKHR5cGVEZXBlbmRlbmNpZXNbdHlwZV0pe3R5cGVEZXBlbmRlbmNpZXNbdHlwZV0uZm9yRWFjaCh2aXNpdCk7cmV0dXJufXVuYm91bmRUeXBlcy5wdXNoKHR5cGUpO3NlZW5bdHlwZV09dHJ1ZX10eXBlcy5mb3JFYWNoKHZpc2l0KTt0aHJvdyBuZXcgVW5ib3VuZFR5cGVFcnJvcihtZXNzYWdlKyI6ICIrdW5ib3VuZFR5cGVzLm1hcChnZXRUeXBlTmFtZSkuam9pbihbIiwgIl0pKX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcyhyYXdUeXBlLHJhd1BvaW50ZXJUeXBlLHJhd0NvbnN0UG9pbnRlclR5cGUsYmFzZUNsYXNzUmF3VHlwZSxnZXRBY3R1YWxUeXBlU2lnbmF0dXJlLGdldEFjdHVhbFR5cGUsdXBjYXN0U2lnbmF0dXJlLHVwY2FzdCxkb3duY2FzdFNpZ25hdHVyZSxkb3duY2FzdCxuYW1lLGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcil7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO2dldEFjdHVhbFR5cGU9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oZ2V0QWN0dWFsVHlwZVNpZ25hdHVyZSxnZXRBY3R1YWxUeXBlKTtpZih1cGNhc3Qpe3VwY2FzdD1lbWJpbmRfX3JlcXVpcmVGdW5jdGlvbih1cGNhc3RTaWduYXR1cmUsdXBjYXN0KX1pZihkb3duY2FzdCl7ZG93bmNhc3Q9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oZG93bmNhc3RTaWduYXR1cmUsZG93bmNhc3QpfXJhd0Rlc3RydWN0b3I9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oZGVzdHJ1Y3RvclNpZ25hdHVyZSxyYXdEZXN0cnVjdG9yKTt2YXIgbGVnYWxGdW5jdGlvbk5hbWU9bWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpO2V4cG9zZVB1YmxpY1N5bWJvbChsZWdhbEZ1bmN0aW9uTmFtZSxmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiK25hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsW2Jhc2VDbGFzc1Jhd1R5cGVdKX0pO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtyYXdUeXBlLHJhd1BvaW50ZXJUeXBlLHJhd0NvbnN0UG9pbnRlclR5cGVdLGJhc2VDbGFzc1Jhd1R5cGU/W2Jhc2VDbGFzc1Jhd1R5cGVdOltdLGZ1bmN0aW9uKGJhc2Upe2Jhc2U9YmFzZVswXTt2YXIgYmFzZUNsYXNzO3ZhciBiYXNlUHJvdG90eXBlO2lmKGJhc2VDbGFzc1Jhd1R5cGUpe2Jhc2VDbGFzcz1iYXNlLnJlZ2lzdGVyZWRDbGFzcztiYXNlUHJvdG90eXBlPWJhc2VDbGFzcy5pbnN0YW5jZVByb3RvdHlwZX1lbHNle2Jhc2VQcm90b3R5cGU9Q2xhc3NIYW5kbGUucHJvdG90eXBlfXZhciBjb25zdHJ1Y3Rvcj1jcmVhdGVOYW1lZEZ1bmN0aW9uKGxlZ2FsRnVuY3Rpb25OYW1lLGZ1bmN0aW9uKCl7aWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpIT09aW5zdGFuY2VQcm90b3R5cGUpe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IoIlVzZSAnbmV3JyB0byBjb25zdHJ1Y3QgIituYW1lKX1pZih1bmRlZmluZWQ9PT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcihuYW1lKyIgaGFzIG5vIGFjY2Vzc2libGUgY29uc3RydWN0b3IiKX12YXIgYm9keT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmd1bWVudHMubGVuZ3RoXTtpZih1bmRlZmluZWQ9PT1ib2R5KXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJUcmllZCB0byBpbnZva2UgY3RvciBvZiAiK25hbWUrIiB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrYXJndW1lbnRzLmxlbmd0aCsiKSAtIGV4cGVjdGVkICgiK09iamVjdC5rZXlzKHJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KS50b1N0cmluZygpKyIpIHBhcmFtZXRlcnMgaW5zdGVhZCEiKX1yZXR1cm4gYm9keS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTt2YXIgaW5zdGFuY2VQcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiYXNlUHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6Y29uc3RydWN0b3J9fSk7Y29uc3RydWN0b3IucHJvdG90eXBlPWluc3RhbmNlUHJvdG90eXBlO3ZhciByZWdpc3RlcmVkQ2xhc3M9bmV3IFJlZ2lzdGVyZWRDbGFzcyhuYW1lLGNvbnN0cnVjdG9yLGluc3RhbmNlUHJvdG90eXBlLHJhd0Rlc3RydWN0b3IsYmFzZUNsYXNzLGdldEFjdHVhbFR5cGUsdXBjYXN0LGRvd25jYXN0KTt2YXIgcmVmZXJlbmNlQ29udmVydGVyPW5ldyBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHJlZ2lzdGVyZWRDbGFzcyx0cnVlLGZhbHNlLGZhbHNlKTt2YXIgcG9pbnRlckNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSsiKiIscmVnaXN0ZXJlZENsYXNzLGZhbHNlLGZhbHNlLGZhbHNlKTt2YXIgY29uc3RQb2ludGVyQ29udmVydGVyPW5ldyBSZWdpc3RlcmVkUG9pbnRlcihuYW1lKyIgY29uc3QqIixyZWdpc3RlcmVkQ2xhc3MsZmFsc2UsdHJ1ZSxmYWxzZSk7cmVnaXN0ZXJlZFBvaW50ZXJzW3Jhd1R5cGVdPXtwb2ludGVyVHlwZTpwb2ludGVyQ29udmVydGVyLGNvbnN0UG9pbnRlclR5cGU6Y29uc3RQb2ludGVyQ29udmVydGVyfTtyZXBsYWNlUHVibGljU3ltYm9sKGxlZ2FsRnVuY3Rpb25OYW1lLGNvbnN0cnVjdG9yKTtyZXR1cm5bcmVmZXJlbmNlQ29udmVydGVyLHBvaW50ZXJDb252ZXJ0ZXIsY29uc3RQb2ludGVyQ29udmVydGVyXX0pfWZ1bmN0aW9uIGhlYXAzMlZlY3RvclRvQXJyYXkoY291bnQsZmlyc3RFbGVtZW50KXt2YXIgYXJyYXk9W107Zm9yKHZhciBpPTA7aTxjb3VudDtpKyspe2FycmF5LnB1c2goSEVBUDMyWyhmaXJzdEVsZW1lbnQ+PjIpK2ldKX1yZXR1cm4gYXJyYXl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IocmF3Q2xhc3NUeXBlLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLGludm9rZXIscmF3Q29uc3RydWN0b3Ipe2Fzc2VydChhcmdDb3VudD4wKTt2YXIgcmF3QXJnVHlwZXM9aGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIpO2ludm9rZXI9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oaW52b2tlclNpZ25hdHVyZSxpbnZva2VyKTt2YXIgYXJncz1bcmF3Q29uc3RydWN0b3JdO3ZhciBkZXN0cnVjdG9ycz1bXTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbcmF3Q2xhc3NUeXBlXSxmdW5jdGlvbihjbGFzc1R5cGUpe2NsYXNzVHlwZT1jbGFzc1R5cGVbMF07dmFyIGh1bWFuTmFtZT0iY29uc3RydWN0b3IgIitjbGFzc1R5cGUubmFtZTtpZih1bmRlZmluZWQ9PT1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHkpe2NsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keT1bXX1pZih1bmRlZmluZWQhPT1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbYXJnQ291bnQtMV0pe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBjb25zdHJ1Y3RvcnMgd2l0aCBpZGVudGljYWwgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrKGFyZ0NvdW50LTEpKyIpIGZvciBjbGFzcyAnIitjbGFzc1R5cGUubmFtZSsiJyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hIil9Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdPWZ1bmN0aW9uIHVuYm91bmRUeXBlSGFuZGxlcigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiK2NsYXNzVHlwZS5uYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLHJhd0FyZ1R5cGVzKX07d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10scmF3QXJnVHlwZXMsZnVuY3Rpb24oYXJnVHlwZXMpe2NsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmdDb3VudC0xXT1mdW5jdGlvbiBjb25zdHJ1Y3Rvcl9ib2R5KCl7aWYoYXJndW1lbnRzLmxlbmd0aCE9PWFyZ0NvdW50LTEpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsiIGNhbGxlZCB3aXRoICIrYXJndW1lbnRzLmxlbmd0aCsiIGFyZ3VtZW50cywgZXhwZWN0ZWQgIisoYXJnQ291bnQtMSkpfWRlc3RydWN0b3JzLmxlbmd0aD0wO2FyZ3MubGVuZ3RoPWFyZ0NvdW50O2Zvcih2YXIgaT0xO2k8YXJnQ291bnQ7KytpKXthcmdzW2ldPWFyZ1R5cGVzW2ldWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsYXJndW1lbnRzW2ktMV0pfXZhciBwdHI9aW52b2tlci5hcHBseShudWxsLGFyZ3MpO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKTtyZXR1cm4gYXJnVHlwZXNbMF1bImZyb21XaXJlVHlwZSJdKHB0cil9O3JldHVybltdfSk7cmV0dXJuW119KX1mdW5jdGlvbiBuZXdfKGNvbnN0cnVjdG9yLGFyZ3VtZW50TGlzdCl7aWYoIShjb25zdHJ1Y3RvciBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigibmV3XyBjYWxsZWQgd2l0aCBjb25zdHJ1Y3RvciB0eXBlICIrdHlwZW9mIGNvbnN0cnVjdG9yKyIgd2hpY2ggaXMgbm90IGEgZnVuY3Rpb24iKX12YXIgZHVtbXk9Y3JlYXRlTmFtZWRGdW5jdGlvbihjb25zdHJ1Y3Rvci5uYW1lfHwidW5rbm93bkZ1bmN0aW9uTmFtZSIsZnVuY3Rpb24oKXt9KTtkdW1teS5wcm90b3R5cGU9Y29uc3RydWN0b3IucHJvdG90eXBlO3ZhciBvYmo9bmV3IGR1bW15O3ZhciByPWNvbnN0cnVjdG9yLmFwcGx5KG9iaixhcmd1bWVudExpc3QpO3JldHVybiByIGluc3RhbmNlb2YgT2JqZWN0P3I6b2JqfWZ1bmN0aW9uIGNyYWZ0SW52b2tlckZ1bmN0aW9uKGh1bWFuTmFtZSxhcmdUeXBlcyxjbGFzc1R5cGUsY3BwSW52b2tlckZ1bmMsY3BwVGFyZ2V0RnVuYyl7dmFyIGFyZ0NvdW50PWFyZ1R5cGVzLmxlbmd0aDtpZihhcmdDb3VudDwyKXt0aHJvd0JpbmRpbmdFcnJvcigiYXJnVHlwZXMgYXJyYXkgc2l6ZSBtaXNtYXRjaCEgTXVzdCBhdCBsZWFzdCBnZXQgcmV0dXJuIHZhbHVlIGFuZCAndGhpcycgdHlwZXMhIil9dmFyIGlzQ2xhc3NNZXRob2RGdW5jPWFyZ1R5cGVzWzFdIT09bnVsbCYmY2xhc3NUeXBlIT09bnVsbDt2YXIgbmVlZHNEZXN0cnVjdG9yU3RhY2s9ZmFsc2U7Zm9yKHZhciBpPTE7aTxhcmdUeXBlcy5sZW5ndGg7KytpKXtpZihhcmdUeXBlc1tpXSE9PW51bGwmJmFyZ1R5cGVzW2ldLmRlc3RydWN0b3JGdW5jdGlvbj09PXVuZGVmaW5lZCl7bmVlZHNEZXN0cnVjdG9yU3RhY2s9dHJ1ZTticmVha319dmFyIHJldHVybnM9YXJnVHlwZXNbMF0ubmFtZSE9PSJ2b2lkIjt2YXIgYXJnc0xpc3Q9IiI7dmFyIGFyZ3NMaXN0V2lyZWQ9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0yOysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpO2FyZ3NMaXN0V2lyZWQrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpKyJXaXJlZCJ9dmFyIGludm9rZXJGbkJvZHk9InJldHVybiBmdW5jdGlvbiAiK21ha2VMZWdhbEZ1bmN0aW9uTmFtZShodW1hbk5hbWUpKyIoIithcmdzTGlzdCsiKSB7XG4iKyJpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gIisoYXJnQ291bnQtMikrIikge1xuIisidGhyb3dCaW5kaW5nRXJyb3IoJ2Z1bmN0aW9uICIraHVtYW5OYW1lKyIgY2FsbGVkIHdpdGggJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cywgZXhwZWN0ZWQgIisoYXJnQ291bnQtMikrIiBhcmdzIScpO1xuIisifVxuIjtpZihuZWVkc0Rlc3RydWN0b3JTdGFjayl7aW52b2tlckZuQm9keSs9InZhciBkZXN0cnVjdG9ycyA9IFtdO1xuIn12YXIgZHRvclN0YWNrPW5lZWRzRGVzdHJ1Y3RvclN0YWNrPyJkZXN0cnVjdG9ycyI6Im51bGwiO3ZhciBhcmdzMT1bInRocm93QmluZGluZ0Vycm9yIiwiaW52b2tlciIsImZuIiwicnVuRGVzdHJ1Y3RvcnMiLCJyZXRUeXBlIiwiY2xhc3NQYXJhbSJdO3ZhciBhcmdzMj1bdGhyb3dCaW5kaW5nRXJyb3IsY3BwSW52b2tlckZ1bmMsY3BwVGFyZ2V0RnVuYyxydW5EZXN0cnVjdG9ycyxhcmdUeXBlc1swXSxhcmdUeXBlc1sxXV07aWYoaXNDbGFzc01ldGhvZEZ1bmMpe2ludm9rZXJGbkJvZHkrPSJ2YXIgdGhpc1dpcmVkID0gY2xhc3NQYXJhbS50b1dpcmVUeXBlKCIrZHRvclN0YWNrKyIsIHRoaXMpO1xuIn1mb3IodmFyIGk9MDtpPGFyZ0NvdW50LTI7KytpKXtpbnZva2VyRm5Cb2R5Kz0idmFyIGFyZyIraSsiV2lyZWQgPSBhcmdUeXBlIitpKyIudG9XaXJlVHlwZSgiK2R0b3JTdGFjaysiLCBhcmciK2krIik7IC8vICIrYXJnVHlwZXNbaSsyXS5uYW1lKyJcbiI7YXJnczEucHVzaCgiYXJnVHlwZSIraSk7YXJnczIucHVzaChhcmdUeXBlc1tpKzJdKX1pZihpc0NsYXNzTWV0aG9kRnVuYyl7YXJnc0xpc3RXaXJlZD0idGhpc1dpcmVkIisoYXJnc0xpc3RXaXJlZC5sZW5ndGg+MD8iLCAiOiIiKSthcmdzTGlzdFdpcmVkfWludm9rZXJGbkJvZHkrPShyZXR1cm5zPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGFyZ3NMaXN0V2lyZWQubGVuZ3RoPjA/IiwgIjoiIikrYXJnc0xpc3RXaXJlZCsiKTtcbiI7aWYobmVlZHNEZXN0cnVjdG9yU3RhY2spe2ludm9rZXJGbkJvZHkrPSJydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7XG4ifWVsc2V7Zm9yKHZhciBpPWlzQ2xhc3NNZXRob2RGdW5jPzE6MjtpPGFyZ1R5cGVzLmxlbmd0aDsrK2kpe3ZhciBwYXJhbU5hbWU9aT09PTE/InRoaXNXaXJlZCI6ImFyZyIrKGktMikrIldpcmVkIjtpZihhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsKXtpbnZva2VyRm5Cb2R5Kz1wYXJhbU5hbWUrIl9kdG9yKCIrcGFyYW1OYW1lKyIpOyAvLyAiK2FyZ1R5cGVzW2ldLm5hbWUrIlxuIjthcmdzMS5wdXNoKHBhcmFtTmFtZSsiX2R0b3IiKTthcmdzMi5wdXNoKGFyZ1R5cGVzW2ldLmRlc3RydWN0b3JGdW5jdGlvbil9fX1pZihyZXR1cm5zKXtpbnZva2VyRm5Cb2R5Kz0idmFyIHJldCA9IHJldFR5cGUuZnJvbVdpcmVUeXBlKHJ2KTtcbiIrInJldHVybiByZXQ7XG4ifWVsc2V7fWludm9rZXJGbkJvZHkrPSJ9XG4iO2FyZ3MxLnB1c2goaW52b2tlckZuQm9keSk7dmFyIGludm9rZXJGdW5jdGlvbj1uZXdfKEZ1bmN0aW9uLGFyZ3MxKS5hcHBseShudWxsLGFyZ3MyKTtyZXR1cm4gaW52b2tlckZ1bmN0aW9ufWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uKHJhd0NsYXNzVHlwZSxtZXRob2ROYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIsY29udGV4dCxpc1B1cmVWaXJ0dWFsKXt2YXIgcmF3QXJnVHlwZXM9aGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIpO21ldGhvZE5hbWU9cmVhZExhdGluMVN0cmluZyhtZXRob2ROYW1lKTtyYXdJbnZva2VyPWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGludm9rZXJTaWduYXR1cmUscmF3SW52b2tlcik7d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sW3Jhd0NsYXNzVHlwZV0sZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9Y2xhc3NUeXBlLm5hbWUrIi4iK21ldGhvZE5hbWU7aWYoaXNQdXJlVmlydHVhbCl7Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5wdXJlVmlydHVhbEZ1bmN0aW9ucy5wdXNoKG1ldGhvZE5hbWUpfWZ1bmN0aW9uIHVuYm91bmRUeXBlc0hhbmRsZXIoKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjYWxsICIraHVtYW5OYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLHJhd0FyZ1R5cGVzKX12YXIgcHJvdG89Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZTt2YXIgbWV0aG9kPXByb3RvW21ldGhvZE5hbWVdO2lmKHVuZGVmaW5lZD09PW1ldGhvZHx8dW5kZWZpbmVkPT09bWV0aG9kLm92ZXJsb2FkVGFibGUmJm1ldGhvZC5jbGFzc05hbWUhPT1jbGFzc1R5cGUubmFtZSYmbWV0aG9kLmFyZ0NvdW50PT09YXJnQ291bnQtMil7dW5ib3VuZFR5cGVzSGFuZGxlci5hcmdDb3VudD1hcmdDb3VudC0yO3VuYm91bmRUeXBlc0hhbmRsZXIuY2xhc3NOYW1lPWNsYXNzVHlwZS5uYW1lO3Byb3RvW21ldGhvZE5hbWVdPXVuYm91bmRUeXBlc0hhbmRsZXJ9ZWxzZXtlbnN1cmVPdmVybG9hZFRhYmxlKHByb3RvLG1ldGhvZE5hbWUsaHVtYW5OYW1lKTtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlW2FyZ0NvdW50LTJdPXVuYm91bmRUeXBlc0hhbmRsZXJ9d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10scmF3QXJnVHlwZXMsZnVuY3Rpb24oYXJnVHlwZXMpe3ZhciBtZW1iZXJGdW5jdGlvbj1jcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLHJhd0ludm9rZXIsY29udGV4dCk7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7bWVtYmVyRnVuY3Rpb24uYXJnQ291bnQ9YXJnQ291bnQtMjtwcm90b1ttZXRob2ROYW1lXT1tZW1iZXJGdW5jdGlvbn1lbHNle3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMl09bWVtYmVyRnVuY3Rpb259cmV0dXJuW119KTtyZXR1cm5bXX0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NvbnN0YW50KG5hbWUsdHlwZSx2YWx1ZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFt0eXBlXSxmdW5jdGlvbih0eXBlKXt0eXBlPXR5cGVbMF07TW9kdWxlW25hbWVdPXR5cGVbImZyb21XaXJlVHlwZSJdKHZhbHVlKTtyZXR1cm5bXX0pfXZhciBlbXZhbF9mcmVlX2xpc3Q9W107dmFyIGVtdmFsX2hhbmRsZV9hcnJheT1be30se3ZhbHVlOnVuZGVmaW5lZH0se3ZhbHVlOm51bGx9LHt2YWx1ZTp0cnVlfSx7dmFsdWU6ZmFsc2V9XTtmdW5jdGlvbiBfX2VtdmFsX2RlY3JlZihoYW5kbGUpe2lmKGhhbmRsZT40JiYwPT09LS1lbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS5yZWZjb3VudCl7ZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV09dW5kZWZpbmVkO2VtdmFsX2ZyZWVfbGlzdC5wdXNoKGhhbmRsZSl9fWZ1bmN0aW9uIGNvdW50X2VtdmFsX2hhbmRsZXMoKXt2YXIgY291bnQ9MDtmb3IodmFyIGk9NTtpPGVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7KytpKXtpZihlbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpeysrY291bnR9fXJldHVybiBjb3VudH1mdW5jdGlvbiBnZXRfZmlyc3RfZW12YWwoKXtmb3IodmFyIGk9NTtpPGVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7KytpKXtpZihlbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpe3JldHVybiBlbXZhbF9oYW5kbGVfYXJyYXlbaV19fXJldHVybiBudWxsfWZ1bmN0aW9uIGluaXRfZW12YWwoKXtNb2R1bGVbImNvdW50X2VtdmFsX2hhbmRsZXMiXT1jb3VudF9lbXZhbF9oYW5kbGVzO01vZHVsZVsiZ2V0X2ZpcnN0X2VtdmFsIl09Z2V0X2ZpcnN0X2VtdmFsfWZ1bmN0aW9uIF9fZW12YWxfcmVnaXN0ZXIodmFsdWUpe3N3aXRjaCh2YWx1ZSl7Y2FzZSB1bmRlZmluZWQ6e3JldHVybiAxfWNhc2UgbnVsbDp7cmV0dXJuIDJ9Y2FzZSB0cnVlOntyZXR1cm4gM31jYXNlIGZhbHNlOntyZXR1cm4gNH1kZWZhdWx0Ont2YXIgaGFuZGxlPWVtdmFsX2ZyZWVfbGlzdC5sZW5ndGg/ZW12YWxfZnJlZV9saXN0LnBvcCgpOmVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7ZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV09e3JlZmNvdW50OjEsdmFsdWU6dmFsdWV9O3JldHVybiBoYW5kbGV9fX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbXZhbChyYXdUeXBlLG5hbWUpe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKGhhbmRsZSl7dmFyIHJ2PWVtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlO19fZW12YWxfZGVjcmVmKGhhbmRsZSk7cmV0dXJuIHJ2fSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKHZhbHVlKX0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBlbnVtUmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCxzaWduZWQpe3N3aXRjaChzaGlmdCl7Y2FzZSAwOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDg6SEVBUFU4O3JldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShoZWFwW3BvaW50ZXJdKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDE2OkhFQVBVMTY7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+MV0pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKHBvaW50ZXIpe3ZhciBoZWFwPXNpZ25lZD9IRUFQMzI6SEVBUFUzMjtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oaGVhcFtwb2ludGVyPj4yXSl9O2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBpbnRlZ2VyIHR5cGU6ICIrbmFtZSl9fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2VudW0ocmF3VHlwZSxuYW1lLHNpemUsaXNTaWduZWQpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtmdW5jdGlvbiBjdG9yKCl7fWN0b3IudmFsdWVzPXt9O3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsY29uc3RydWN0b3I6Y3RvciwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci52YWx1ZXNbY119LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyxjKXtyZXR1cm4gYy52YWx1ZX0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6ZW51bVJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQsaXNTaWduZWQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSk7ZXhwb3NlUHVibGljU3ltYm9sKG5hbWUsY3Rvcil9ZnVuY3Rpb24gcmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJhd1R5cGUsaHVtYW5OYW1lKXt2YXIgaW1wbD1yZWdpc3RlcmVkVHlwZXNbcmF3VHlwZV07aWYodW5kZWZpbmVkPT09aW1wbCl7dGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lKyIgaGFzIHVua25vd24gdHlwZSAiK2dldFR5cGVOYW1lKHJhd1R5cGUpKX1yZXR1cm4gaW1wbH1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlKHJhd0VudW1UeXBlLG5hbWUsZW51bVZhbHVlKXt2YXIgZW51bVR5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJhd0VudW1UeXBlLCJlbnVtIik7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3ZhciBFbnVtPWVudW1UeXBlLmNvbnN0cnVjdG9yO3ZhciBWYWx1ZT1PYmplY3QuY3JlYXRlKGVudW1UeXBlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx7dmFsdWU6e3ZhbHVlOmVudW1WYWx1ZX0sY29uc3RydWN0b3I6e3ZhbHVlOmNyZWF0ZU5hbWVkRnVuY3Rpb24oZW51bVR5cGUubmFtZSsiXyIrbmFtZSxmdW5jdGlvbigpe30pfX0pO0VudW0udmFsdWVzW2VudW1WYWx1ZV09VmFsdWU7RW51bVtuYW1lXT1WYWx1ZX1mdW5jdGlvbiBfZW1iaW5kX3JlcHIodil7aWYodj09PW51bGwpe3JldHVybiJudWxsIn12YXIgdD10eXBlb2YgdjtpZih0PT09Im9iamVjdCJ8fHQ9PT0iYXJyYXkifHx0PT09ImZ1bmN0aW9uIil7cmV0dXJuIHYudG9TdHJpbmcoKX1lbHNle3JldHVybiIiK3Z9fWZ1bmN0aW9uIGZsb2F0UmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCl7c3dpdGNoKHNoaWZ0KXtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKHBvaW50ZXIpe3JldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShIRUFQRjMyW3BvaW50ZXI+PjJdKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oSEVBUEY2NFtwb2ludGVyPj4zXSl9O2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBmbG9hdCB0eXBlOiAiK25hbWUpfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdChyYXdUeXBlLG5hbWUsc2l6ZSl7dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6ZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZX0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0ibnVtYmVyIiYmdHlwZW9mIHZhbHVlIT09ImJvb2xlYW4iKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIHRvICcrdGhpcy5uYW1lKX1yZXR1cm4gdmFsdWV9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmZsb2F0UmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCksZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbihuYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixzaWduYXR1cmUscmF3SW52b2tlcixmbil7dmFyIGFyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmF3SW52b2tlcj1lbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihzaWduYXR1cmUscmF3SW52b2tlcik7ZXhwb3NlUHVibGljU3ltYm9sKG5hbWUsZnVuY3Rpb24oKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjYWxsICIrbmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixhcmdUeXBlcyl9LGFyZ0NvdW50LTEpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLGFyZ1R5cGVzLGZ1bmN0aW9uKGFyZ1R5cGVzKXt2YXIgaW52b2tlckFyZ3NBcnJheT1bYXJnVHlwZXNbMF0sbnVsbF0uY29uY2F0KGFyZ1R5cGVzLnNsaWNlKDEpKTtyZXBsYWNlUHVibGljU3ltYm9sKG5hbWUsY3JhZnRJbnZva2VyRnVuY3Rpb24obmFtZSxpbnZva2VyQXJnc0FycmF5LG51bGwscmF3SW52b2tlcixmbiksYXJnQ291bnQtMSk7cmV0dXJuW119KX1mdW5jdGlvbiBpbnRlZ2VyUmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCxzaWduZWQpe3N3aXRjaChzaGlmdCl7Y2FzZSAwOnJldHVybiBzaWduZWQ/ZnVuY3Rpb24gcmVhZFM4RnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIEhFQVA4W3BvaW50ZXJdfTpmdW5jdGlvbiByZWFkVThGcm9tUG9pbnRlcihwb2ludGVyKXtyZXR1cm4gSEVBUFU4W3BvaW50ZXJdfTtjYXNlIDE6cmV0dXJuIHNpZ25lZD9mdW5jdGlvbiByZWFkUzE2RnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIEhFQVAxNltwb2ludGVyPj4xXX06ZnVuY3Rpb24gcmVhZFUxNkZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQVTE2W3BvaW50ZXI+PjFdfTtjYXNlIDI6cmV0dXJuIHNpZ25lZD9mdW5jdGlvbiByZWFkUzMyRnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIEhFQVAzMltwb2ludGVyPj4yXX06ZnVuY3Rpb24gcmVhZFUzMkZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQVTMyW3BvaW50ZXI+PjJdfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gaW50ZWdlciB0eXBlOiAiK25hbWUpfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyKHByaW1pdGl2ZVR5cGUsbmFtZSxzaXplLG1pblJhbmdlLG1heFJhbmdlKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7aWYobWF4UmFuZ2U9PT0tMSl7bWF4UmFuZ2U9NDI5NDk2NzI5NX12YXIgc2hpZnQ9Z2V0U2hpZnRGcm9tU2l6ZShzaXplKTt2YXIgZnJvbVdpcmVUeXBlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWV9O2lmKG1pblJhbmdlPT09MCl7dmFyIGJpdHNoaWZ0PTMyLTgqc2l6ZTtmcm9tV2lyZVR5cGU9ZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZTw8Yml0c2hpZnQ+Pj5iaXRzaGlmdH19dmFyIGlzVW5zaWduZWRUeXBlPW5hbWUuaW5kZXhPZigidW5zaWduZWQiKSE9LTE7cmVnaXN0ZXJUeXBlKHByaW1pdGl2ZVR5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpmcm9tV2lyZVR5cGUsInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0ibnVtYmVyIiYmdHlwZW9mIHZhbHVlIT09ImJvb2xlYW4iKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIHRvICcrdGhpcy5uYW1lKX1pZih2YWx1ZTxtaW5SYW5nZXx8dmFsdWU+bWF4UmFuZ2Upe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1Bhc3NpbmcgYSBudW1iZXIgIicrX2VtYmluZF9yZXByKHZhbHVlKSsnIiBmcm9tIEpTIHNpZGUgdG8gQy9DKysgc2lkZSB0byBhbiBhcmd1bWVudCBvZiB0eXBlICInK25hbWUrJyIsIHdoaWNoIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIFsnK21pblJhbmdlKyIsICIrbWF4UmFuZ2UrIl0hIil9cmV0dXJuIGlzVW5zaWduZWRUeXBlP3ZhbHVlPj4+MDp2YWx1ZXwwfSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjppbnRlZ2VyUmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCxtaW5SYW5nZSE9PTApLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfbWVtb3J5X3ZpZXcocmF3VHlwZSxkYXRhVHlwZUluZGV4LG5hbWUpe3ZhciB0eXBlTWFwcGluZz1bSW50OEFycmF5LFVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXldO3ZhciBUQT10eXBlTWFwcGluZ1tkYXRhVHlwZUluZGV4XTtmdW5jdGlvbiBkZWNvZGVNZW1vcnlWaWV3KGhhbmRsZSl7aGFuZGxlPWhhbmRsZT4+Mjt2YXIgaGVhcD1IRUFQVTMyO3ZhciBzaXplPWhlYXBbaGFuZGxlXTt2YXIgZGF0YT1oZWFwW2hhbmRsZSsxXTtyZXR1cm4gbmV3IFRBKGJ1ZmZlcixkYXRhLHNpemUpfW5hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmRlY29kZU1lbW9yeVZpZXcsImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6ZGVjb2RlTWVtb3J5Vmlld30se2lnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnM6dHJ1ZX0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7dmFyIHN0ZFN0cmluZ0lzVVRGOD1uYW1lPT09InN0ZDo6c3RyaW5nIjtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHZhbHVlKXt2YXIgbGVuZ3RoPUhFQVBVMzJbdmFsdWU+PjJdO3ZhciBzdHI7aWYoc3RkU3RyaW5nSXNVVEY4KXt2YXIgZGVjb2RlU3RhcnRQdHI9dmFsdWUrNDtmb3IodmFyIGk9MDtpPD1sZW5ndGg7KytpKXt2YXIgY3VycmVudEJ5dGVQdHI9dmFsdWUrNCtpO2lmKGk9PWxlbmd0aHx8SEVBUFU4W2N1cnJlbnRCeXRlUHRyXT09MCl7dmFyIG1heFJlYWQ9Y3VycmVudEJ5dGVQdHItZGVjb2RlU3RhcnRQdHI7dmFyIHN0cmluZ1NlZ21lbnQ9VVRGOFRvU3RyaW5nKGRlY29kZVN0YXJ0UHRyLG1heFJlYWQpO2lmKHN0cj09PXVuZGVmaW5lZCl7c3RyPXN0cmluZ1NlZ21lbnR9ZWxzZXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMCk7c3RyKz1zdHJpbmdTZWdtZW50fWRlY29kZVN0YXJ0UHRyPWN1cnJlbnRCeXRlUHRyKzF9fX1lbHNle3ZhciBhPW5ldyBBcnJheShsZW5ndGgpO2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7YVtpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKEhFQVBVOFt2YWx1ZSs0K2ldKX1zdHI9YS5qb2luKCIiKX1fZnJlZSh2YWx1ZSk7cmV0dXJuIHN0cn0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXt2YWx1ZT1uZXcgVWludDhBcnJheSh2YWx1ZSl9dmFyIGdldExlbmd0aDt2YXIgdmFsdWVJc09mVHlwZVN0cmluZz10eXBlb2YgdmFsdWU9PT0ic3RyaW5nIjtpZighKHZhbHVlSXNPZlR5cGVTdHJpbmd8fHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheXx8dmFsdWUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheXx8dmFsdWUgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBzdGQ6OnN0cmluZyIpfWlmKHN0ZFN0cmluZ0lzVVRGOCYmdmFsdWVJc09mVHlwZVN0cmluZyl7Z2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIGxlbmd0aEJ5dGVzVVRGOCh2YWx1ZSl9fWVsc2V7Z2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlLmxlbmd0aH19dmFyIGxlbmd0aD1nZXRMZW5ndGgoKTt2YXIgcHRyPV9tYWxsb2MoNCtsZW5ndGgrMSk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aDtpZihzdGRTdHJpbmdJc1VURjgmJnZhbHVlSXNPZlR5cGVTdHJpbmcpe3N0cmluZ1RvVVRGOCh2YWx1ZSxwdHIrNCxsZW5ndGgrMSl9ZWxzZXtpZih2YWx1ZUlzT2ZUeXBlU3RyaW5nKXtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe3ZhciBjaGFyQ29kZT12YWx1ZS5jaGFyQ29kZUF0KGkpO2lmKGNoYXJDb2RlPjI1NSl7X2ZyZWUocHRyKTt0aHJvd0JpbmRpbmdFcnJvcigiU3RyaW5nIGhhcyBVVEYtMTYgY29kZSB1bml0cyB0aGF0IGRvIG5vdCBmaXQgaW4gOCBiaXRzIil9SEVBUFU4W3B0cis0K2ldPWNoYXJDb2RlfX1lbHNle2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7SEVBUFU4W3B0cis0K2ldPXZhbHVlW2ldfX19aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKF9mcmVlLHB0cil9cmV0dXJuIHB0cn0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOmZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX19KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZyhyYXdUeXBlLGNoYXJTaXplLG5hbWUpe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTt2YXIgZGVjb2RlU3RyaW5nLGVuY29kZVN0cmluZyxnZXRIZWFwLGxlbmd0aEJ5dGVzVVRGLHNoaWZ0O2lmKGNoYXJTaXplPT09Mil7ZGVjb2RlU3RyaW5nPVVURjE2VG9TdHJpbmc7ZW5jb2RlU3RyaW5nPXN0cmluZ1RvVVRGMTY7bGVuZ3RoQnl0ZXNVVEY9bGVuZ3RoQnl0ZXNVVEYxNjtnZXRIZWFwPWZ1bmN0aW9uKCl7cmV0dXJuIEhFQVBVMTZ9O3NoaWZ0PTF9ZWxzZSBpZihjaGFyU2l6ZT09PTQpe2RlY29kZVN0cmluZz1VVEYzMlRvU3RyaW5nO2VuY29kZVN0cmluZz1zdHJpbmdUb1VURjMyO2xlbmd0aEJ5dGVzVVRGPWxlbmd0aEJ5dGVzVVRGMzI7Z2V0SGVhcD1mdW5jdGlvbigpe3JldHVybiBIRUFQVTMyfTtzaGlmdD0yfXJlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6ZnVuY3Rpb24odmFsdWUpe3ZhciBsZW5ndGg9SEVBUFUzMlt2YWx1ZT4+Ml07dmFyIEhFQVA9Z2V0SGVhcCgpO3ZhciBzdHI7dmFyIGRlY29kZVN0YXJ0UHRyPXZhbHVlKzQ7Zm9yKHZhciBpPTA7aTw9bGVuZ3RoOysraSl7dmFyIGN1cnJlbnRCeXRlUHRyPXZhbHVlKzQraSpjaGFyU2l6ZTtpZihpPT1sZW5ndGh8fEhFQVBbY3VycmVudEJ5dGVQdHI+PnNoaWZ0XT09MCl7dmFyIG1heFJlYWRCeXRlcz1jdXJyZW50Qnl0ZVB0ci1kZWNvZGVTdGFydFB0cjt2YXIgc3RyaW5nU2VnbWVudD1kZWNvZGVTdHJpbmcoZGVjb2RlU3RhcnRQdHIsbWF4UmVhZEJ5dGVzKTtpZihzdHI9PT11bmRlZmluZWQpe3N0cj1zdHJpbmdTZWdtZW50fWVsc2V7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDApO3N0cis9c3RyaW5nU2VnbWVudH1kZWNvZGVTdGFydFB0cj1jdXJyZW50Qnl0ZVB0citjaGFyU2l6ZX19X2ZyZWUodmFsdWUpO3JldHVybiBzdHJ9LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7aWYoISh0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIikpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIEMrKyBzdHJpbmcgdHlwZSAiK25hbWUpfXZhciBsZW5ndGg9bGVuZ3RoQnl0ZXNVVEYodmFsdWUpO3ZhciBwdHI9X21hbGxvYyg0K2xlbmd0aCtjaGFyU2l6ZSk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aD4+c2hpZnQ7ZW5jb2RlU3RyaW5nKHZhbHVlLHB0cis0LGxlbmd0aCtjaGFyU2l6ZSk7aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKF9mcmVlLHB0cil9cmV0dXJuIHB0cn0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOmZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX19KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9vYmplY3QocmF3VHlwZSxuYW1lLGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yLGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcil7c3RydWN0UmVnaXN0cmF0aW9uc1tyYXdUeXBlXT17bmFtZTpyZWFkTGF0aW4xU3RyaW5nKG5hbWUpLHJhd0NvbnN0cnVjdG9yOmVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yKSxyYXdEZXN0cnVjdG9yOmVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3RvciksZmllbGRzOltdfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9vYmplY3RfZmllbGQoc3RydWN0VHlwZSxmaWVsZE5hbWUsZ2V0dGVyUmV0dXJuVHlwZSxnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyLGdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlLHNldHRlclNpZ25hdHVyZSxzZXR0ZXIsc2V0dGVyQ29udGV4dCl7c3RydWN0UmVnaXN0cmF0aW9uc1tzdHJ1Y3RUeXBlXS5maWVsZHMucHVzaCh7ZmllbGROYW1lOnJlYWRMYXRpbjFTdHJpbmcoZmllbGROYW1lKSxnZXR0ZXJSZXR1cm5UeXBlOmdldHRlclJldHVyblR5cGUsZ2V0dGVyOmVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGdldHRlclNpZ25hdHVyZSxnZXR0ZXIpLGdldHRlckNvbnRleHQ6Z2V0dGVyQ29udGV4dCxzZXR0ZXJBcmd1bWVudFR5cGU6c2V0dGVyQXJndW1lbnRUeXBlLHNldHRlcjplbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihzZXR0ZXJTaWduYXR1cmUsc2V0dGVyKSxzZXR0ZXJDb250ZXh0OnNldHRlckNvbnRleHR9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92b2lkKHJhd1R5cGUsbmFtZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtpc1ZvaWQ6dHJ1ZSxuYW1lOm5hbWUsImFyZ1BhY2tBZHZhbmNlIjowLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKCl7cmV0dXJuIHVuZGVmaW5lZH0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLG8pe3JldHVybiB1bmRlZmluZWR9fSl9ZnVuY3Rpb24gcmVxdWlyZUhhbmRsZShoYW5kbGUpe2lmKCFoYW5kbGUpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgdXNlIGRlbGV0ZWQgdmFsLiBoYW5kbGUgPSAiK2hhbmRsZSl9cmV0dXJuIGVtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlfWZ1bmN0aW9uIF9fZW12YWxfYXMoaGFuZGxlLHJldHVyblR5cGUsZGVzdHJ1Y3RvcnNSZWYpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7cmV0dXJuVHlwZT1yZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmV0dXJuVHlwZSwiZW12YWw6OmFzIik7dmFyIGRlc3RydWN0b3JzPVtdO3ZhciByZD1fX2VtdmFsX3JlZ2lzdGVyKGRlc3RydWN0b3JzKTtIRUFQMzJbZGVzdHJ1Y3RvcnNSZWY+PjJdPXJkO3JldHVybiByZXR1cm5UeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsaGFuZGxlKX12YXIgZW12YWxfc3ltYm9scz17fTtmdW5jdGlvbiBnZXRTdHJpbmdPclN5bWJvbChhZGRyZXNzKXt2YXIgc3ltYm9sPWVtdmFsX3N5bWJvbHNbYWRkcmVzc107aWYoc3ltYm9sPT09dW5kZWZpbmVkKXtyZXR1cm4gcmVhZExhdGluMVN0cmluZyhhZGRyZXNzKX1lbHNle3JldHVybiBzeW1ib2x9fXZhciBlbXZhbF9tZXRob2RDYWxsZXJzPVtdO2Z1bmN0aW9uIF9fZW12YWxfY2FsbF92b2lkX21ldGhvZChjYWxsZXIsaGFuZGxlLG1ldGhvZE5hbWUsYXJncyl7Y2FsbGVyPWVtdmFsX21ldGhvZENhbGxlcnNbY2FsbGVyXTtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO21ldGhvZE5hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobWV0aG9kTmFtZSk7Y2FsbGVyKGhhbmRsZSxtZXRob2ROYW1lLG51bGwsYXJncyl9ZnVuY3Rpb24gZW12YWxfZ2V0X2dsb2JhbCgpe2lmKHR5cGVvZiBnbG9iYWxUaGlzPT09Im9iamVjdCIpe3JldHVybiBnbG9iYWxUaGlzfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBGdW5jdGlvbn0oKSgicmV0dXJuIHRoaXMiKSgpfWZ1bmN0aW9uIF9fZW12YWxfZ2V0X2dsb2JhbChuYW1lKXtpZihuYW1lPT09MCl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZW12YWxfZ2V0X2dsb2JhbCgpKX1lbHNle25hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobmFtZSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZW12YWxfZ2V0X2dsb2JhbCgpW25hbWVdKX19ZnVuY3Rpb24gX19lbXZhbF9hZGRNZXRob2RDYWxsZXIoY2FsbGVyKXt2YXIgaWQ9ZW12YWxfbWV0aG9kQ2FsbGVycy5sZW5ndGg7ZW12YWxfbWV0aG9kQ2FsbGVycy5wdXNoKGNhbGxlcik7cmV0dXJuIGlkfWZ1bmN0aW9uIF9fZW12YWxfbG9va3VwVHlwZXMoYXJnQ291bnQsYXJnVHlwZXMpe3ZhciBhPW5ldyBBcnJheShhcmdDb3VudCk7Zm9yKHZhciBpPTA7aTxhcmdDb3VudDsrK2kpe2FbaV09cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKEhFQVAzMlsoYXJnVHlwZXM+PjIpK2ldLCJwYXJhbWV0ZXIgIitpKX1yZXR1cm4gYX1mdW5jdGlvbiBfX2VtdmFsX2dldF9tZXRob2RfY2FsbGVyKGFyZ0NvdW50LGFyZ1R5cGVzKXt2YXIgdHlwZXM9X19lbXZhbF9sb29rdXBUeXBlcyhhcmdDb3VudCxhcmdUeXBlcyk7dmFyIHJldFR5cGU9dHlwZXNbMF07dmFyIHNpZ25hdHVyZU5hbWU9cmV0VHlwZS5uYW1lKyJfJCIrdHlwZXMuc2xpY2UoMSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWV9KS5qb2luKCJfIikrIiQiO3ZhciBwYXJhbXM9WyJyZXRUeXBlIl07dmFyIGFyZ3M9W3JldFR5cGVdO3ZhciBhcmdzTGlzdD0iIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50LTE7KytpKXthcmdzTGlzdCs9KGkhPT0wPyIsICI6IiIpKyJhcmciK2k7cGFyYW1zLnB1c2goImFyZ1R5cGUiK2kpO2FyZ3MucHVzaCh0eXBlc1sxK2ldKX12YXIgZnVuY3Rpb25OYW1lPW1ha2VMZWdhbEZ1bmN0aW9uTmFtZSgibWV0aG9kQ2FsbGVyXyIrc2lnbmF0dXJlTmFtZSk7dmFyIGZ1bmN0aW9uQm9keT0icmV0dXJuIGZ1bmN0aW9uICIrZnVuY3Rpb25OYW1lKyIoaGFuZGxlLCBuYW1lLCBkZXN0cnVjdG9ycywgYXJncykge1xuIjt2YXIgb2Zmc2V0PTA7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7ZnVuY3Rpb25Cb2R5Kz0iICAgIHZhciBhcmciK2krIiA9IGFyZ1R5cGUiK2krIi5yZWFkVmFsdWVGcm9tUG9pbnRlcihhcmdzIisob2Zmc2V0PyIrIitvZmZzZXQ6IiIpKyIpO1xuIjtvZmZzZXQrPXR5cGVzW2krMV1bImFyZ1BhY2tBZHZhbmNlIl19ZnVuY3Rpb25Cb2R5Kz0iICAgIHZhciBydiA9IGhhbmRsZVtuYW1lXSgiK2FyZ3NMaXN0KyIpO1xuIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50LTE7KytpKXtpZih0eXBlc1tpKzFdWyJkZWxldGVPYmplY3QiXSl7ZnVuY3Rpb25Cb2R5Kz0iICAgIGFyZ1R5cGUiK2krIi5kZWxldGVPYmplY3QoYXJnIitpKyIpO1xuIn19aWYoIXJldFR5cGUuaXNWb2lkKXtmdW5jdGlvbkJvZHkrPSIgICAgcmV0dXJuIHJldFR5cGUudG9XaXJlVHlwZShkZXN0cnVjdG9ycywgcnYpO1xuIn1mdW5jdGlvbkJvZHkrPSJ9O1xuIjtwYXJhbXMucHVzaChmdW5jdGlvbkJvZHkpO3ZhciBpbnZva2VyRnVuY3Rpb249bmV3XyhGdW5jdGlvbixwYXJhbXMpLmFwcGx5KG51bGwsYXJncyk7cmV0dXJuIF9fZW12YWxfYWRkTWV0aG9kQ2FsbGVyKGludm9rZXJGdW5jdGlvbil9ZnVuY3Rpb24gX19lbXZhbF9nZXRfbW9kdWxlX3Byb3BlcnR5KG5hbWUpe25hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobmFtZSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoTW9kdWxlW25hbWVdKX1mdW5jdGlvbiBfX2VtdmFsX2dldF9wcm9wZXJ0eShoYW5kbGUsa2V5KXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO2tleT1yZXF1aXJlSGFuZGxlKGtleSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoaGFuZGxlW2tleV0pfWZ1bmN0aW9uIF9fZW12YWxfaW5jcmVmKGhhbmRsZSl7aWYoaGFuZGxlPjQpe2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnJlZmNvdW50Kz0xfX1mdW5jdGlvbiBjcmFmdEVtdmFsQWxsb2NhdG9yKGFyZ0NvdW50KXt2YXIgYXJnc0xpc3Q9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudDsrK2kpe2FyZ3NMaXN0Kz0oaSE9PTA/IiwgIjoiIikrImFyZyIraX12YXIgZnVuY3Rpb25Cb2R5PSJyZXR1cm4gZnVuY3Rpb24gZW12YWxfYWxsb2NhdG9yXyIrYXJnQ291bnQrIihjb25zdHJ1Y3RvciwgYXJnVHlwZXMsIGFyZ3MpIHtcbiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudDsrK2kpe2Z1bmN0aW9uQm9keSs9InZhciBhcmdUeXBlIitpKyIgPSByZXF1aXJlUmVnaXN0ZXJlZFR5cGUoTW9kdWxlWydIRUFQMzInXVsoYXJnVHlwZXMgPj4+IDIpICsgIitpKyddLCAicGFyYW1ldGVyICcraSsnIik7XG4nKyJ2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG4iKyJhcmdzICs9IGFyZ1R5cGUiK2krIlsnYXJnUGFja0FkdmFuY2UnXTtcbiJ9ZnVuY3Rpb25Cb2R5Kz0idmFyIG9iaiA9IG5ldyBjb25zdHJ1Y3RvcigiK2FyZ3NMaXN0KyIpO1xuIisicmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIob2JqKTtcbiIrIn1cbiI7cmV0dXJuIG5ldyBGdW5jdGlvbigicmVxdWlyZVJlZ2lzdGVyZWRUeXBlIiwiTW9kdWxlIiwiX19lbXZhbF9yZWdpc3RlciIsZnVuY3Rpb25Cb2R5KShyZXF1aXJlUmVnaXN0ZXJlZFR5cGUsTW9kdWxlLF9fZW12YWxfcmVnaXN0ZXIpfXZhciBlbXZhbF9uZXdlcnM9e307ZnVuY3Rpb24gX19lbXZhbF9uZXcoaGFuZGxlLGFyZ0NvdW50LGFyZ1R5cGVzLGFyZ3Mpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7dmFyIG5ld2VyPWVtdmFsX25ld2Vyc1thcmdDb3VudF07aWYoIW5ld2VyKXtuZXdlcj1jcmFmdEVtdmFsQWxsb2NhdG9yKGFyZ0NvdW50KTtlbXZhbF9uZXdlcnNbYXJnQ291bnRdPW5ld2VyfXJldHVybiBuZXdlcihoYW5kbGUsYXJnVHlwZXMsYXJncyl9ZnVuY3Rpb24gX19lbXZhbF9uZXdfY3N0cmluZyh2KXtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihnZXRTdHJpbmdPclN5bWJvbCh2KSl9ZnVuY3Rpb24gX19lbXZhbF9ydW5fZGVzdHJ1Y3RvcnMoaGFuZGxlKXt2YXIgZGVzdHJ1Y3RvcnM9ZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0udmFsdWU7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO19fZW12YWxfZGVjcmVmKGhhbmRsZSl9ZnVuY3Rpb24gX2Fib3J0KCl7YWJvcnQoKX1mdW5jdGlvbiBfbG9uZ2ptcChlbnYsdmFsdWUpe19zZXRUaHJldyhlbnYsdmFsdWV8fDEpO3Rocm93ImxvbmdqbXAifWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2xvbmdqbXAoYTAsYTEpe3JldHVybiBfbG9uZ2ptcChhMCxhMSl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0hFQVBVOC5jb3B5V2l0aGluKGRlc3Qsc3JjLHNyYytudW0pfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKXtyZXR1cm4gSEVBUFU4Lmxlbmd0aH1mdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpe3RyeXt3YXNtTWVtb3J5Lmdyb3coc2l6ZS1idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KTt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7cmV0dXJuIDF9Y2F0Y2goZSl7fX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKXtyZXF1ZXN0ZWRTaXplPXJlcXVlc3RlZFNpemU+Pj4wO3ZhciBvbGRTaXplPV9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTt2YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtpZihyZXF1ZXN0ZWRTaXplPm1heEhlYXBTaXplKXtyZXR1cm4gZmFsc2V9dmFyIG1pbkhlYXBTaXplPTE2Nzc3MjE2O2Zvcih2YXIgY3V0RG93bj0xO2N1dERvd248PTQ7Y3V0RG93bio9Mil7dmFyIG92ZXJHcm93bkhlYXBTaXplPW9sZFNpemUqKDErLjIvY3V0RG93bik7b3Zlckdyb3duSGVhcFNpemU9TWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUscmVxdWVzdGVkU2l6ZSsxMDA2NjMyOTYpO3ZhciBuZXdTaXplPU1hdGgubWluKG1heEhlYXBTaXplLGFsaWduVXAoTWF0aC5tYXgobWluSGVhcFNpemUscmVxdWVzdGVkU2l6ZSxvdmVyR3Jvd25IZWFwU2l6ZSksNjU1MzYpKTt2YXIgcmVwbGFjZW1lbnQ9ZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTtpZihyZXBsYWNlbWVudCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX1mdW5jdGlvbiBfZmRfY2xvc2UoZmQpe3RyeXt2YXIgc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7RlMuY2xvc2Uoc3RyZWFtKTtyZXR1cm4gMH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT0idW5kZWZpbmVkInx8IShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpYWJvcnQoZSk7cmV0dXJuIGUuZXJybm99fWZ1bmN0aW9uIF9mZF9yZWFkKGZkLGlvdixpb3ZjbnQscG51bSl7dHJ5e3ZhciBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTt2YXIgbnVtPVNZU0NBTExTLmRvUmVhZHYoc3RyZWFtLGlvdixpb3ZjbnQpO0hFQVAzMltwbnVtPj4yXT1udW07cmV0dXJuIDB9Y2F0Y2goZSl7aWYodHlwZW9mIEZTPT09InVuZGVmaW5lZCJ8fCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybiBlLmVycm5vfX1mdW5jdGlvbiBfZmRfc2VlayhmZCxvZmZzZXRfbG93LG9mZnNldF9oaWdoLHdoZW5jZSxuZXdPZmZzZXQpe3RyeXt2YXIgc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7dmFyIEhJR0hfT0ZGU0VUPTQyOTQ5NjcyOTY7dmFyIG9mZnNldD1vZmZzZXRfaGlnaCpISUdIX09GRlNFVCsob2Zmc2V0X2xvdz4+PjApO3ZhciBET1VCTEVfTElNSVQ9OTAwNzE5OTI1NDc0MDk5MjtpZihvZmZzZXQ8PS1ET1VCTEVfTElNSVR8fG9mZnNldD49RE9VQkxFX0xJTUlUKXtyZXR1cm4tNjF9RlMubGxzZWVrKHN0cmVhbSxvZmZzZXQsd2hlbmNlKTt0ZW1wSTY0PVtzdHJlYW0ucG9zaXRpb24+Pj4wLCh0ZW1wRG91YmxlPXN0cmVhbS5wb3NpdGlvbiwrTWF0aC5hYnModGVtcERvdWJsZSk+PTE/dGVtcERvdWJsZT4wPyhNYXRoLm1pbigrTWF0aC5mbG9vcih0ZW1wRG91YmxlLzQyOTQ5NjcyOTYpLDQyOTQ5NjcyOTUpfDApPj4+MDp+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUtKyh+fnRlbXBEb3VibGU+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxIRUFQMzJbbmV3T2Zmc2V0Pj4yXT10ZW1wSTY0WzBdLEhFQVAzMltuZXdPZmZzZXQrND4+Ml09dGVtcEk2NFsxXTtpZihzdHJlYW0uZ2V0ZGVudHMmJm9mZnNldD09PTAmJndoZW5jZT09PTApc3RyZWFtLmdldGRlbnRzPW51bGw7cmV0dXJuIDB9Y2F0Y2goZSl7aWYodHlwZW9mIEZTPT09InVuZGVmaW5lZCJ8fCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybiBlLmVycm5vfX1mdW5jdGlvbiBfZmRfd3JpdGUoZmQsaW92LGlvdmNudCxwbnVtKXt0cnl7dmFyIHN0cmVhbT1TWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpO3ZhciBudW09U1lTQ0FMTFMuZG9Xcml0ZXYoc3RyZWFtLGlvdixpb3ZjbnQpO0hFQVAzMltwbnVtPj4yXT1udW07cmV0dXJuIDB9Y2F0Y2goZSl7aWYodHlwZW9mIEZTPT09InVuZGVmaW5lZCJ8fCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybiBlLmVycm5vfX1mdW5jdGlvbiBfZ2V0VGVtcFJldDAoKXtyZXR1cm4gZ2V0VGVtcFJldDAoKXwwfWZ1bmN0aW9uIF9nZXR0aW1lb2ZkYXkocHRyKXt2YXIgbm93PURhdGUubm93KCk7SEVBUDMyW3B0cj4+Ml09bm93LzFlM3wwO0hFQVAzMltwdHIrND4+Ml09bm93JTFlMyoxZTN8MDtyZXR1cm4gMH1mdW5jdGlvbiBfcHRocmVhZF9qb2luKCl7cmV0dXJuIDI4fWZ1bmN0aW9uIF9zZXRUZW1wUmV0MCgkaSl7c2V0VGVtcFJldDAoJGl8MCl9ZnVuY3Rpb24gX3N5c2NvbmYobmFtZSl7c3dpdGNoKG5hbWUpe2Nhc2UgMzA6cmV0dXJuIDE2Mzg0O2Nhc2UgODU6dmFyIG1heEhlYXBTaXplPTIxNDc0ODM2NDg7cmV0dXJuIG1heEhlYXBTaXplLzE2Mzg0O2Nhc2UgMTMyOmNhc2UgMTMzOmNhc2UgMTI6Y2FzZSAxMzc6Y2FzZSAxMzg6Y2FzZSAxNTpjYXNlIDIzNTpjYXNlIDE2OmNhc2UgMTc6Y2FzZSAxODpjYXNlIDE5OmNhc2UgMjA6Y2FzZSAxNDk6Y2FzZSAxMzpjYXNlIDEwOmNhc2UgMjM2OmNhc2UgMTUzOmNhc2UgOTpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAxNTk6Y2FzZSAxNTQ6Y2FzZSAxNDpjYXNlIDc3OmNhc2UgNzg6Y2FzZSAxMzk6Y2FzZSA4MDpjYXNlIDgxOmNhc2UgODI6Y2FzZSA2ODpjYXNlIDY3OmNhc2UgMTY0OmNhc2UgMTE6Y2FzZSAyOTpjYXNlIDQ3OmNhc2UgNDg6Y2FzZSA5NTpjYXNlIDUyOmNhc2UgNTE6Y2FzZSA0NjpjYXNlIDc5OnJldHVybiAyMDA4MDk7Y2FzZSAyNzpjYXNlIDI0NjpjYXNlIDEyNzpjYXNlIDEyODpjYXNlIDIzOmNhc2UgMjQ6Y2FzZSAxNjA6Y2FzZSAxNjE6Y2FzZSAxODE6Y2FzZSAxODI6Y2FzZSAyNDI6Y2FzZSAxODM6Y2FzZSAxODQ6Y2FzZSAyNDM6Y2FzZSAyNDQ6Y2FzZSAyNDU6Y2FzZSAxNjU6Y2FzZSAxNzg6Y2FzZSAxNzk6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgMTY4OmNhc2UgMTY5OmNhc2UgMTc1OmNhc2UgMTcwOmNhc2UgMTcxOmNhc2UgMTcyOmNhc2UgOTc6Y2FzZSA3NjpjYXNlIDMyOmNhc2UgMTczOmNhc2UgMzU6cmV0dXJuLTE7Y2FzZSAxNzY6Y2FzZSAxNzc6Y2FzZSA3OmNhc2UgMTU1OmNhc2UgODpjYXNlIDE1NzpjYXNlIDEyNTpjYXNlIDEyNjpjYXNlIDkyOmNhc2UgOTM6Y2FzZSAxMjk6Y2FzZSAxMzA6Y2FzZSAxMzE6Y2FzZSA5NDpjYXNlIDkxOnJldHVybiAxO2Nhc2UgNzQ6Y2FzZSA2MDpjYXNlIDY5OmNhc2UgNzA6Y2FzZSA0OnJldHVybiAxMDI0O2Nhc2UgMzE6Y2FzZSA0MjpjYXNlIDcyOnJldHVybiAzMjtjYXNlIDg3OmNhc2UgMjY6Y2FzZSAzMzpyZXR1cm4gMjE0NzQ4MzY0NztjYXNlIDM0OmNhc2UgMTpyZXR1cm4gNDc4Mzk7Y2FzZSAzODpjYXNlIDM2OnJldHVybiA5OTtjYXNlIDQzOmNhc2UgMzc6cmV0dXJuIDIwNDg7Y2FzZSAwOnJldHVybiAyMDk3MTUyO2Nhc2UgMzpyZXR1cm4gNjU1MzY7Y2FzZSAyODpyZXR1cm4gMzI3Njg7Y2FzZSA0NDpyZXR1cm4gMzI3Njc7Y2FzZSA3NTpyZXR1cm4gMTYzODQ7Y2FzZSAzOTpyZXR1cm4gMWUzO2Nhc2UgODk6cmV0dXJuIDcwMDtjYXNlIDcxOnJldHVybiAyNTY7Y2FzZSA0MDpyZXR1cm4gMjU1O2Nhc2UgMjpyZXR1cm4gMTAwO2Nhc2UgMTgwOnJldHVybiA2NDtjYXNlIDI1OnJldHVybiAyMDtjYXNlIDU6cmV0dXJuIDE2O2Nhc2UgNjpyZXR1cm4gNjtjYXNlIDczOnJldHVybiA0O2Nhc2UgODQ6e2lmKHR5cGVvZiBuYXZpZ2F0b3I9PT0ib2JqZWN0IilyZXR1cm4gbmF2aWdhdG9yWyJoYXJkd2FyZUNvbmN1cnJlbmN5Il18fDE7cmV0dXJuIDF9fXNldEVyck5vKDI4KTtyZXR1cm4tMX12YXIgRlNOb2RlPWZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUscmRldil7aWYoIXBhcmVudCl7cGFyZW50PXRoaXN9dGhpcy5wYXJlbnQ9cGFyZW50O3RoaXMubW91bnQ9cGFyZW50Lm1vdW50O3RoaXMubW91bnRlZD1udWxsO3RoaXMuaWQ9RlMubmV4dElub2RlKys7dGhpcy5uYW1lPW5hbWU7dGhpcy5tb2RlPW1vZGU7dGhpcy5ub2RlX29wcz17fTt0aGlzLnN0cmVhbV9vcHM9e307dGhpcy5yZGV2PXJkZXZ9O3ZhciByZWFkTW9kZT0yOTJ8NzM7dmFyIHdyaXRlTW9kZT0xNDY7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRlNOb2RlLnByb3RvdHlwZSx7cmVhZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZyZWFkTW9kZSk9PT1yZWFkTW9kZX0sc2V0OmZ1bmN0aW9uKHZhbCl7dmFsP3RoaXMubW9kZXw9cmVhZE1vZGU6dGhpcy5tb2RlJj1+cmVhZE1vZGV9fSx3cml0ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZ3cml0ZU1vZGUpPT09d3JpdGVNb2RlfSxzZXQ6ZnVuY3Rpb24odmFsKXt2YWw/dGhpcy5tb2RlfD13cml0ZU1vZGU6dGhpcy5tb2RlJj1+d3JpdGVNb2RlfX0saXNGb2xkZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBGUy5pc0Rpcih0aGlzLm1vZGUpfX0saXNEZXZpY2U6e2dldDpmdW5jdGlvbigpe3JldHVybiBGUy5pc0NocmRldih0aGlzLm1vZGUpfX19KTtGUy5GU05vZGU9RlNOb2RlO0ZTLnN0YXRpY0luaXQoKTtJbnRlcm5hbEVycm9yPU1vZHVsZVsiSW50ZXJuYWxFcnJvciJdPWV4dGVuZEVycm9yKEVycm9yLCJJbnRlcm5hbEVycm9yIik7ZW1iaW5kX2luaXRfY2hhckNvZGVzKCk7QmluZGluZ0Vycm9yPU1vZHVsZVsiQmluZGluZ0Vycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkJpbmRpbmdFcnJvciIpO2luaXRfQ2xhc3NIYW5kbGUoKTtpbml0X1JlZ2lzdGVyZWRQb2ludGVyKCk7aW5pdF9lbWJpbmQoKTtVbmJvdW5kVHlwZUVycm9yPU1vZHVsZVsiVW5ib3VuZFR5cGVFcnJvciJdPWV4dGVuZEVycm9yKEVycm9yLCJVbmJvdW5kVHlwZUVycm9yIik7aW5pdF9lbXZhbCgpO2Z1bmN0aW9uIGludEFycmF5RnJvbVN0cmluZyhzdHJpbmd5LGRvbnRBZGROdWxsLGxlbmd0aCl7dmFyIGxlbj1sZW5ndGg+MD9sZW5ndGg6bGVuZ3RoQnl0ZXNVVEY4KHN0cmluZ3kpKzE7dmFyIHU4YXJyYXk9bmV3IEFycmF5KGxlbik7dmFyIG51bUJ5dGVzV3JpdHRlbj1zdHJpbmdUb1VURjhBcnJheShzdHJpbmd5LHU4YXJyYXksMCx1OGFycmF5Lmxlbmd0aCk7aWYoZG9udEFkZE51bGwpdThhcnJheS5sZW5ndGg9bnVtQnl0ZXNXcml0dGVuO3JldHVybiB1OGFycmF5fV9fQVRJTklUX18ucHVzaCh7ZnVuYzpmdW5jdGlvbigpe19fX3dhc21fY2FsbF9jdG9ycygpfX0pO3ZhciBhc21MaWJyYXJ5QXJnPXsiSyI6X19fY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbiwiSiI6X19fY3hhX3Rocm93LCJHIjpfX19zeXNfZmNudGw2NCwiUiI6X19fc3lzX2lvY3RsLCJTIjpfX19zeXNfb3BlbiwieCI6X19lbWJpbmRfZmluYWxpemVfdmFsdWVfb2JqZWN0LCJVIjpfX2VtYmluZF9yZWdpc3Rlcl9ib29sLCJBIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcywieiI6X19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IsImEiOl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uLCJlIjpfX2VtYmluZF9yZWdpc3Rlcl9jb25zdGFudCwiVCI6X19lbWJpbmRfcmVnaXN0ZXJfZW12YWwsInEiOl9fZW1iaW5kX3JlZ2lzdGVyX2VudW0sImMiOl9fZW1iaW5kX3JlZ2lzdGVyX2VudW1fdmFsdWUsIkgiOl9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0LCJtIjpfX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbiwibiI6X19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlciwiayI6X19lbWJpbmRfcmVnaXN0ZXJfbWVtb3J5X3ZpZXcsIkkiOl9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcsIkIiOl9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nLCJ5IjpfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9vYmplY3QsImQiOl9fZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX29iamVjdF9maWVsZCwiViI6X19lbWJpbmRfcmVnaXN0ZXJfdm9pZCwicCI6X19lbXZhbF9hcywiciI6X19lbXZhbF9jYWxsX3ZvaWRfbWV0aG9kLCJiIjpfX2VtdmFsX2RlY3JlZiwiRCI6X19lbXZhbF9nZXRfZ2xvYmFsLCJzIjpfX2VtdmFsX2dldF9tZXRob2RfY2FsbGVyLCJ1IjpfX2VtdmFsX2dldF9tb2R1bGVfcHJvcGVydHksImYiOl9fZW12YWxfZ2V0X3Byb3BlcnR5LCJqIjpfX2VtdmFsX2luY3JlZiwidCI6X19lbXZhbF9uZXcsImciOl9fZW12YWxfbmV3X2NzdHJpbmcsIm8iOl9fZW12YWxfcnVuX2Rlc3RydWN0b3JzLCJoIjpfYWJvcnQsInciOl9lbXNjcmlwdGVuX2xvbmdqbXAsIk0iOl9lbXNjcmlwdGVuX21lbWNweV9iaWcsIk4iOl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLCJGIjpfZmRfY2xvc2UsIlEiOl9mZF9yZWFkLCJMIjpfZmRfc2VlaywiRSI6X2ZkX3dyaXRlLCJsIjpfZ2V0VGVtcFJldDAsIkMiOl9nZXR0aW1lb2ZkYXksIlgiOmludm9rZV9paSwidiI6aW52b2tlX3ZpLCJXIjppbnZva2VfdmlpLCJZIjppbnZva2VfdmlpaSwiUCI6X3B0aHJlYWRfam9pbiwiaSI6X3NldFRlbXBSZXQwLCJPIjpfc3lzY29uZn07dmFyIGFzbT1jcmVhdGVXYXNtKCk7dmFyIF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdPU1vZHVsZVsiYXNtIl1bIiQiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2ZyZWU9TW9kdWxlWyJfZnJlZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9mcmVlPU1vZHVsZVsiX2ZyZWUiXT1Nb2R1bGVbImFzbSJdWyJhYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWFsbG9jPU1vZHVsZVsiX21hbGxvYyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9tYWxsb2M9TW9kdWxlWyJfbWFsbG9jIl09TW9kdWxlWyJhc20iXVsiYmEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZ2V0VHlwZU5hbWU9TW9kdWxlWyJfX19nZXRUeXBlTmFtZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX2dldFR5cGVOYW1lPU1vZHVsZVsiX19fZ2V0VHlwZU5hbWUiXT1Nb2R1bGVbImFzbSJdWyJjYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX19lbWJpbmRfcmVnaXN0ZXJfbmF0aXZlX2FuZF9idWlsdGluX3R5cGVzPU1vZHVsZVsiX19fZW1iaW5kX3JlZ2lzdGVyX25hdGl2ZV9hbmRfYnVpbHRpbl90eXBlcyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXM9TW9kdWxlWyJfX19lbWJpbmRfcmVnaXN0ZXJfbmF0aXZlX2FuZF9idWlsdGluX3R5cGVzIl09TW9kdWxlWyJhc20iXVsiZGEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZXJybm9fbG9jYXRpb249TW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX2Vycm5vX2xvY2F0aW9uPU1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXT1Nb2R1bGVbImFzbSJdWyJlYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja1NhdmU9TW9kdWxlWyJzdGFja1NhdmUiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1NhdmU9TW9kdWxlWyJzdGFja1NhdmUiXT1Nb2R1bGVbImFzbSJdWyJmYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja1Jlc3RvcmU9TW9kdWxlWyJzdGFja1Jlc3RvcmUiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1Jlc3RvcmU9TW9kdWxlWyJzdGFja1Jlc3RvcmUiXT1Nb2R1bGVbImFzbSJdWyJnYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfc2V0VGhyZXc9TW9kdWxlWyJfc2V0VGhyZXciXT1mdW5jdGlvbigpe3JldHVybihfc2V0VGhyZXc9TW9kdWxlWyJfc2V0VGhyZXciXT1Nb2R1bGVbImFzbSJdWyJoYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2ppaWlpPU1vZHVsZVsiZHluQ2FsbF9qaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfamlpaWk9TW9kdWxlWyJkeW5DYWxsX2ppaWlpIl09TW9kdWxlWyJhc20iXVsiaWEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9qaWppPU1vZHVsZVsiZHluQ2FsbF9qaWppIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9qaWppPU1vZHVsZVsiZHluQ2FsbF9qaWppIl09TW9kdWxlWyJhc20iXVsiamEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtmdW5jdGlvbiBpbnZva2VfdmkoaW5kZXgsYTEpe3ZhciBzcD1zdGFja1NhdmUoKTt0cnl7d2FzbVRhYmxlLmdldChpbmRleCkoYTEpfWNhdGNoKGUpe3N0YWNrUmVzdG9yZShzcCk7aWYoZSE9PWUrMCYmZSE9PSJsb25nam1wIil0aHJvdyBlO19zZXRUaHJldygxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaShpbmRleCxhMSxhMixhMyl7dmFyIHNwPXN0YWNrU2F2ZSgpO3RyeXt3YXNtVGFibGUuZ2V0KGluZGV4KShhMSxhMixhMyl9Y2F0Y2goZSl7c3RhY2tSZXN0b3JlKHNwKTtpZihlIT09ZSswJiZlIT09ImxvbmdqbXAiKXRocm93IGU7X3NldFRocmV3KDEsMCl9fWZ1bmN0aW9uIGludm9rZV9paShpbmRleCxhMSl7dmFyIHNwPXN0YWNrU2F2ZSgpO3RyeXtyZXR1cm4gd2FzbVRhYmxlLmdldChpbmRleCkoYTEpfWNhdGNoKGUpe3N0YWNrUmVzdG9yZShzcCk7aWYoZSE9PWUrMCYmZSE9PSJsb25nam1wIil0aHJvdyBlO19zZXRUaHJldygxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpKGluZGV4LGExLGEyKXt2YXIgc3A9c3RhY2tTYXZlKCk7dHJ5e3dhc21UYWJsZS5nZXQoaW5kZXgpKGExLGEyKX1jYXRjaChlKXtzdGFja1Jlc3RvcmUoc3ApO2lmKGUhPT1lKzAmJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTtfc2V0VGhyZXcoMSwwKX19dmFyIGNhbGxlZFJ1bjtmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cyl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIjt0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitzdGF0dXMrIikiO3RoaXMuc3RhdHVzPXN0YXR1c31kZXBlbmRlbmNpZXNGdWxmaWxsZWQ9ZnVuY3Rpb24gcnVuQ2FsbGVyKCl7aWYoIWNhbGxlZFJ1bilydW4oKTtpZighY2FsbGVkUnVuKWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1ydW5DYWxsZXJ9O2Z1bmN0aW9uIHJ1bihhcmdzKXthcmdzPWFyZ3N8fGFyZ3VtZW50c187aWYocnVuRGVwZW5kZW5jaWVzPjApe3JldHVybn1wcmVSdW4oKTtpZihydW5EZXBlbmRlbmNpZXM+MClyZXR1cm47ZnVuY3Rpb24gZG9SdW4oKXtpZihjYWxsZWRSdW4pcmV0dXJuO2NhbGxlZFJ1bj10cnVlO01vZHVsZVsiY2FsbGVkUnVuIl09dHJ1ZTtpZihBQk9SVClyZXR1cm47aW5pdFJ1bnRpbWUoKTtwcmVNYWluKCk7cmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpO2lmKE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSlNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTtwb3N0UnVuKCl9aWYoTW9kdWxlWyJzZXRTdGF0dXMiXSl7TW9kdWxlWyJzZXRTdGF0dXMiXSgiUnVubmluZy4uLiIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TW9kdWxlWyJzZXRTdGF0dXMiXSgiIil9LDEpO2RvUnVuKCl9LDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlWyJydW4iXT1ydW47aWYoTW9kdWxlWyJwcmVJbml0Il0pe2lmKHR5cGVvZiBNb2R1bGVbInByZUluaXQiXT09ImZ1bmN0aW9uIilNb2R1bGVbInByZUluaXQiXT1bTW9kdWxlWyJwcmVJbml0Il1dO3doaWxlKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aD4wKXtNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpfX1ub0V4aXRSdW50aW1lPXRydWU7cnVuKCk7Cit2YXIgTW9kdWxlPXR5cGVvZiBCQVNJUyE9PSJ1bmRlZmluZWQiP0JBU0lTOnt9O3ZhciByZWFkeVByb21pc2VSZXNvbHZlLHJlYWR5UHJvbWlzZVJlamVjdDtNb2R1bGVbInJlYWR5Il09bmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3JlYWR5UHJvbWlzZVJlc29sdmU9cmVzb2x2ZTtyZWFkeVByb21pc2VSZWplY3Q9cmVqZWN0fSk7dmFyIG1vZHVsZU92ZXJyaWRlcz17fTt2YXIga2V5O2ZvcihrZXkgaW4gTW9kdWxlKXtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkoa2V5KSl7bW9kdWxlT3ZlcnJpZGVzW2tleV09TW9kdWxlW2tleV19fXZhciBhcmd1bWVudHNfPVtdO3ZhciB0aGlzUHJvZ3JhbT0iLi90aGlzLnByb2dyYW0iO3ZhciBxdWl0Xz1mdW5jdGlvbihzdGF0dXMsdG9UaHJvdyl7dGhyb3cgdG9UaHJvd307dmFyIEVOVklST05NRU5UX0lTX1dFQj1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19OT0RFPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD1mYWxzZTtFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PSJvYmplY3QiO0VOVklST05NRU5UX0lTX1dPUktFUj10eXBlb2YgaW1wb3J0U2NyaXB0cz09PSJmdW5jdGlvbiI7RU5WSVJPTk1FTlRfSVNfTk9ERT10eXBlb2YgcHJvY2Vzcz09PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlPT09InN0cmluZyI7RU5WSVJPTk1FTlRfSVNfU0hFTEw9IUVOVklST05NRU5UX0lTX1dFQiYmIUVOVklST05NRU5UX0lTX05PREUmJiFFTlZJUk9OTUVOVF9JU19XT1JLRVI7dmFyIHNjcmlwdERpcmVjdG9yeT0iIjtmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpe2lmKE1vZHVsZVsibG9jYXRlRmlsZSJdKXtyZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCxzY3JpcHREaXJlY3RvcnkpfXJldHVybiBzY3JpcHREaXJlY3RvcnkrcGF0aH12YXIgcmVhZF8scmVhZEFzeW5jLHJlYWRCaW5hcnksc2V0V2luZG93VGl0bGU7dmFyIG5vZGVGUzt2YXIgbm9kZVBhdGg7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9cmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSsiLyJ9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9X19kaXJuYW1lKyIvIn1yZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLGJpbmFyeSl7aWYoIW5vZGVGUylub2RlRlM9cmVxdWlyZSgiZnMiKTtpZighbm9kZVBhdGgpbm9kZVBhdGg9cmVxdWlyZSgicGF0aCIpO2ZpbGVuYW1lPW5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7cmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsYmluYXJ5P251bGw6InV0ZjgiKX07cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXt2YXIgcmV0PXJlYWRfKGZpbGVuYW1lLHRydWUpO2lmKCFyZXQuYnVmZmVyKXtyZXQ9bmV3IFVpbnQ4QXJyYXkocmV0KX1hc3NlcnQocmV0LmJ1ZmZlcik7cmV0dXJuIHJldH07aWYocHJvY2Vzc1siYXJndiJdLmxlbmd0aD4xKXt0aGlzUHJvZ3JhbT1wcm9jZXNzWyJhcmd2Il1bMV0ucmVwbGFjZSgvXFwvZywiLyIpfWFyZ3VtZW50c189cHJvY2Vzc1siYXJndiJdLnNsaWNlKDIpO3Byb2Nlc3NbIm9uIl0oInVuY2F1Z2h0RXhjZXB0aW9uIixmdW5jdGlvbihleCl7aWYoIShleCBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpKXt0aHJvdyBleH19KTtwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLGFib3J0KTtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3Byb2Nlc3NbImV4aXQiXShzdGF0dXMpfTtNb2R1bGVbImluc3BlY3QiXT1mdW5jdGlvbigpe3JldHVybiJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XSJ9fWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKHR5cGVvZiByZWFkIT0idW5kZWZpbmVkIil7cmVhZF89ZnVuY3Rpb24gc2hlbGxfcmVhZChmKXtyZXR1cm4gcmVhZChmKX19cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGYpe3ZhciBkYXRhO2lmKHR5cGVvZiByZWFkYnVmZmVyPT09ImZ1bmN0aW9uIil7cmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpfWRhdGE9cmVhZChmLCJiaW5hcnkiKTthc3NlcnQodHlwZW9mIGRhdGE9PT0ib2JqZWN0Iik7cmV0dXJuIGRhdGF9O2lmKHR5cGVvZiBzY3JpcHRBcmdzIT0idW5kZWZpbmVkIil7YXJndW1lbnRzXz1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9InVuZGVmaW5lZCIpe2FyZ3VtZW50c189YXJndW1lbnRzfWlmKHR5cGVvZiBxdWl0PT09ImZ1bmN0aW9uIil7cXVpdF89ZnVuY3Rpb24oc3RhdHVzKXtxdWl0KHN0YXR1cyl9fWlmKHR5cGVvZiBwcmludCE9PSJ1bmRlZmluZWQiKXtpZih0eXBlb2YgY29uc29sZT09PSJ1bmRlZmluZWQiKWNvbnNvbGU9e307Y29uc29sZS5sb2c9cHJpbnQ7Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9dHlwZW9mIHByaW50RXJyIT09InVuZGVmaW5lZCI/cHJpbnRFcnI6cHJpbnR9fWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfV0VCfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpe2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7c2NyaXB0RGlyZWN0b3J5PXNlbGYubG9jYXRpb24uaHJlZn1lbHNlIGlmKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpe3NjcmlwdERpcmVjdG9yeT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY31pZihfc2NyaXB0RGlyKXtzY3JpcHREaXJlY3Rvcnk9X3NjcmlwdERpcn1pZihzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9IiJ9e3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQodXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO3JldHVybiB4aHIucmVzcG9uc2VUZXh0fTtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeSh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24gcmVhZEFzeW5jKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oIkdFVCIsdXJsLHRydWUpO3hoci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIjt4aHIub25sb2FkPWZ1bmN0aW9uIHhocl9vbmxvYWQoKXtpZih4aHIuc3RhdHVzPT0yMDB8fHhoci5zdGF0dXM9PTAmJnhoci5yZXNwb25zZSl7b25sb2FkKHhoci5yZXNwb25zZSk7cmV0dXJufW9uZXJyb3IoKX07eGhyLm9uZXJyb3I9b25lcnJvcjt4aHIuc2VuZChudWxsKX19c2V0V2luZG93VGl0bGU9ZnVuY3Rpb24odGl0bGUpe2RvY3VtZW50LnRpdGxlPXRpdGxlfX1lbHNle312YXIgb3V0PU1vZHVsZVsicHJpbnQiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVsicHJpbnRFcnIiXXx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7Zm9yKGtleSBpbiBtb2R1bGVPdmVycmlkZXMpe2lmKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtNb2R1bGVba2V5XT1tb2R1bGVPdmVycmlkZXNba2V5XX19bW9kdWxlT3ZlcnJpZGVzPW51bGw7aWYoTW9kdWxlWyJhcmd1bWVudHMiXSlhcmd1bWVudHNfPU1vZHVsZVsiYXJndW1lbnRzIl07aWYoTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdKXRoaXNQcm9ncmFtPU1vZHVsZVsidGhpc1Byb2dyYW0iXTtpZihNb2R1bGVbInF1aXQiXSlxdWl0Xz1Nb2R1bGVbInF1aXQiXTt2YXIgdGVtcFJldDA9MDt2YXIgc2V0VGVtcFJldDA9ZnVuY3Rpb24odmFsdWUpe3RlbXBSZXQwPXZhbHVlfTt2YXIgZ2V0VGVtcFJldDA9ZnVuY3Rpb24oKXtyZXR1cm4gdGVtcFJldDB9O3ZhciB3YXNtQmluYXJ5O2lmKE1vZHVsZVsid2FzbUJpbmFyeSJdKXdhc21CaW5hcnk9TW9kdWxlWyJ3YXNtQmluYXJ5Il07dmFyIG5vRXhpdFJ1bnRpbWU7aWYoTW9kdWxlWyJub0V4aXRSdW50aW1lIl0pbm9FeGl0UnVudGltZT1Nb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXTtpZih0eXBlb2YgV2ViQXNzZW1ibHkhPT0ib2JqZWN0Iil7ZXJyKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIil9dmFyIHdhc21NZW1vcnk7dmFyIHdhc21UYWJsZT1uZXcgV2ViQXNzZW1ibHkuVGFibGUoeyJpbml0aWFsIjozMjUsIm1heGltdW0iOjMyNSswLCJlbGVtZW50IjoiYW55ZnVuYyJ9KTt2YXIgQUJPUlQ9ZmFsc2U7dmFyIEVYSVRTVEFUVVM9MDtmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiK3RleHQpfX12YXIgVVRGOERlY29kZXI9dHlwZW9mIFRleHREZWNvZGVyIT09InVuZGVmaW5lZCI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dW5kZWZpbmVkO2Z1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsaWR4LG1heEJ5dGVzVG9SZWFkKXt2YXIgZW5kSWR4PWlkeCttYXhCeXRlc1RvUmVhZDt2YXIgZW5kUHRyPWlkeDt3aGlsZShoZWFwW2VuZFB0cl0mJiEoZW5kUHRyPj1lbmRJZHgpKSsrZW5kUHRyO2lmKGVuZFB0ci1pZHg+MTYmJmhlYXAuc3ViYXJyYXkmJlVURjhEZWNvZGVyKXtyZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LGVuZFB0cikpfWVsc2V7dmFyIHN0cj0iIjt3aGlsZShpZHg8ZW5kUHRyKXt2YXIgdTA9aGVhcFtpZHgrK107aWYoISh1MCYxMjgpKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApO2NvbnRpbnVlfXZhciB1MT1oZWFwW2lkeCsrXSY2MztpZigodTAmMjI0KT09MTkyKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKHUwJjMxKTw8Nnx1MSk7Y29udGludWV9dmFyIHUyPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyNDApPT0yMjQpe3UwPSh1MCYxNSk8PDEyfHUxPDw2fHUyfWVsc2V7dTA9KHUwJjcpPDwxOHx1MTw8MTJ8dTI8PDZ8aGVhcFtpZHgrK10mNjN9aWYodTA8NjU1MzYpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCl9ZWxzZXt2YXIgY2g9dTAtNjU1MzY7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGNoPj4xMCw1NjMyMHxjaCYxMDIzKX19fXJldHVybiBzdHJ9ZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0cixtYXhCeXRlc1RvUmVhZCl7cmV0dXJuIHB0cj9VVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgscHRyLG1heEJ5dGVzVG9SZWFkKToiIn1mdW5jdGlvbiBzdHJpbmdUb1VURjhBcnJheShzdHIsaGVhcCxvdXRJZHgsbWF4Qnl0ZXNUb1dyaXRlKXtpZighKG1heEJ5dGVzVG9Xcml0ZT4wKSlyZXR1cm4gMDt2YXIgc3RhcnRJZHg9b3V0SWR4O3ZhciBlbmRJZHg9b3V0SWR4K21heEJ5dGVzVG9Xcml0ZS0xO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciB1PXN0ci5jaGFyQ29kZUF0KGkpO2lmKHU+PTU1Mjk2JiZ1PD01NzM0Myl7dmFyIHUxPXN0ci5jaGFyQ29kZUF0KCsraSk7dT02NTUzNisoKHUmMTAyMyk8PDEwKXx1MSYxMDIzfWlmKHU8PTEyNyl7aWYob3V0SWR4Pj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109dX1lbHNlIGlmKHU8PTIwNDcpe2lmKG91dElkeCsxPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MTkyfHU+PjY7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZSBpZih1PD02NTUzNSl7aWYob3V0SWR4KzI+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0yMjR8dT4+MTI7aGVhcFtvdXRJZHgrK109MTI4fHU+PjYmNjM7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZXtpZihvdXRJZHgrMz49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTI0MHx1Pj4xODtoZWFwW291dElkeCsrXT0xMjh8dT4+MTImNjM7aGVhcFtvdXRJZHgrK109MTI4fHU+PjYmNjM7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9fWhlYXBbb3V0SWR4XT0wO3JldHVybiBvdXRJZHgtc3RhcnRJZHh9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4KHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtyZXR1cm4gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLEhFQVBVOCxvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKX1mdW5jdGlvbiBsZW5ndGhCeXRlc1VURjgoc3RyKXt2YXIgbGVuPTA7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXU9NjU1MzYrKCh1JjEwMjMpPDwxMCl8c3RyLmNoYXJDb2RlQXQoKytpKSYxMDIzO2lmKHU8PTEyNykrK2xlbjtlbHNlIGlmKHU8PTIwNDcpbGVuKz0yO2Vsc2UgaWYodTw9NjU1MzUpbGVuKz0zO2Vsc2UgbGVuKz00fXJldHVybiBsZW59dmFyIFVURjE2RGVjb2Rlcj10eXBlb2YgVGV4dERlY29kZXIhPT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0Zi0xNmxlIik6dW5kZWZpbmVkO2Z1bmN0aW9uIFVURjE2VG9TdHJpbmcocHRyLG1heEJ5dGVzVG9SZWFkKXt2YXIgZW5kUHRyPXB0cjt2YXIgaWR4PWVuZFB0cj4+MTt2YXIgbWF4SWR4PWlkeCttYXhCeXRlc1RvUmVhZC8yO3doaWxlKCEoaWR4Pj1tYXhJZHgpJiZIRUFQVTE2W2lkeF0pKytpZHg7ZW5kUHRyPWlkeDw8MTtpZihlbmRQdHItcHRyPjMyJiZVVEYxNkRlY29kZXIpe3JldHVybiBVVEYxNkRlY29kZXIuZGVjb2RlKEhFQVBVOC5zdWJhcnJheShwdHIsZW5kUHRyKSl9ZWxzZXt2YXIgaT0wO3ZhciBzdHI9IiI7d2hpbGUoMSl7dmFyIGNvZGVVbml0PUhFQVAxNltwdHIraSoyPj4xXTtpZihjb2RlVW5pdD09MHx8aT09bWF4Qnl0ZXNUb1JlYWQvMilyZXR1cm4gc3RyOysraTtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVVuaXQpfX19ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNihzdHIsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl7aWYobWF4Qnl0ZXNUb1dyaXRlPT09dW5kZWZpbmVkKXttYXhCeXRlc1RvV3JpdGU9MjE0NzQ4MzY0N31pZihtYXhCeXRlc1RvV3JpdGU8MilyZXR1cm4gMDttYXhCeXRlc1RvV3JpdGUtPTI7dmFyIHN0YXJ0UHRyPW91dFB0cjt2YXIgbnVtQ2hhcnNUb1dyaXRlPW1heEJ5dGVzVG9Xcml0ZTxzdHIubGVuZ3RoKjI/bWF4Qnl0ZXNUb1dyaXRlLzI6c3RyLmxlbmd0aDtmb3IodmFyIGk9MDtpPG51bUNoYXJzVG9Xcml0ZTsrK2kpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpKTtIRUFQMTZbb3V0UHRyPj4xXT1jb2RlVW5pdDtvdXRQdHIrPTJ9SEVBUDE2W291dFB0cj4+MV09MDtyZXR1cm4gb3V0UHRyLXN0YXJ0UHRyfWZ1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGMTYoc3RyKXtyZXR1cm4gc3RyLmxlbmd0aCoyfWZ1bmN0aW9uIFVURjMyVG9TdHJpbmcocHRyLG1heEJ5dGVzVG9SZWFkKXt2YXIgaT0wO3ZhciBzdHI9IiI7d2hpbGUoIShpPj1tYXhCeXRlc1RvUmVhZC80KSl7dmFyIHV0ZjMyPUhFQVAzMltwdHIraSo0Pj4yXTtpZih1dGYzMj09MClicmVhazsrK2k7aWYodXRmMzI+PTY1NTM2KXt2YXIgY2g9dXRmMzItNjU1MzY7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGNoPj4xMCw1NjMyMHxjaCYxMDIzKX1lbHNle3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1dGYzMil9fXJldHVybiBzdHJ9ZnVuY3Rpb24gc3RyaW5nVG9VVEYzMihzdHIsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl7aWYobWF4Qnl0ZXNUb1dyaXRlPT09dW5kZWZpbmVkKXttYXhCeXRlc1RvV3JpdGU9MjE0NzQ4MzY0N31pZihtYXhCeXRlc1RvV3JpdGU8NClyZXR1cm4gMDt2YXIgc3RhcnRQdHI9b3V0UHRyO3ZhciBlbmRQdHI9c3RhcnRQdHIrbWF4Qnl0ZXNUb1dyaXRlLTQ7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIGNvZGVVbml0PXN0ci5jaGFyQ29kZUF0KGkpO2lmKGNvZGVVbml0Pj01NTI5NiYmY29kZVVuaXQ8PTU3MzQzKXt2YXIgdHJhaWxTdXJyb2dhdGU9c3RyLmNoYXJDb2RlQXQoKytpKTtjb2RlVW5pdD02NTUzNisoKGNvZGVVbml0JjEwMjMpPDwxMCl8dHJhaWxTdXJyb2dhdGUmMTAyM31IRUFQMzJbb3V0UHRyPj4yXT1jb2RlVW5pdDtvdXRQdHIrPTQ7aWYob3V0UHRyKzQ+ZW5kUHRyKWJyZWFrfUhFQVAzMltvdXRQdHI+PjJdPTA7cmV0dXJuIG91dFB0ci1zdGFydFB0cn1mdW5jdGlvbiBsZW5ndGhCeXRlc1VURjMyKHN0cil7dmFyIGxlbj0wO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpKTtpZihjb2RlVW5pdD49NTUyOTYmJmNvZGVVbml0PD01NzM0MykrK2k7bGVuKz00fXJldHVybiBsZW59dmFyIFdBU01fUEFHRV9TSVpFPTY1NTM2O2Z1bmN0aW9uIGFsaWduVXAoeCxtdWx0aXBsZSl7aWYoeCVtdWx0aXBsZT4wKXt4Kz1tdWx0aXBsZS14JW11bHRpcGxlfXJldHVybiB4fXZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlWyJIRUFQOCJdPUhFQVA4PW5ldyBJbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVAxNiJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUDMyIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQVTgiXT1IRUFQVTg9bmV3IFVpbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVBVMTYiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUFUzMiJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjMyIl09SEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjY0Il09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIERZTkFNSUNfQkFTRT01NjUwMzIwLERZTkFNSUNUT1BfUFRSPTQwNzI4MDt2YXIgSU5JVElBTF9JTklUSUFMX01FTU9SWT1Nb2R1bGVbIklOSVRJQUxfTUVNT1JZIl18fDI5OTk1ODI3MjtpZihNb2R1bGVbIndhc21NZW1vcnkiXSl7d2FzbU1lbW9yeT1Nb2R1bGVbIndhc21NZW1vcnkiXX1lbHNle3dhc21NZW1vcnk9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7ImluaXRpYWwiOklOSVRJQUxfSU5JVElBTF9NRU1PUlkvV0FTTV9QQUdFX1NJWkUsIm1heGltdW0iOjIxNDc0ODM2NDgvV0FTTV9QQUdFX1NJWkV9KX1pZih3YXNtTWVtb3J5KXtidWZmZXI9d2FzbU1lbW9yeS5idWZmZXJ9SU5JVElBTF9JTklUSUFMX01FTU9SWT1idWZmZXIuYnl0ZUxlbmd0aDt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWZmZXIpO0hFQVAzMltEWU5BTUlDVE9QX1BUUj4+Ml09RFlOQU1JQ19CQVNFO2Z1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT0iZnVuY3Rpb24iKXtjYWxsYmFjayhNb2R1bGUpO2NvbnRpbnVlfXZhciBmdW5jPWNhbGxiYWNrLmZ1bmM7aWYodHlwZW9mIGZ1bmM9PT0ibnVtYmVyIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXtNb2R1bGVbImR5bkNhbGxfdiJdKGZ1bmMpfWVsc2V7TW9kdWxlWyJkeW5DYWxsX3ZpIl0oZnVuYyxjYWxsYmFjay5hcmcpfX1lbHNle2Z1bmMoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkP251bGw6Y2FsbGJhY2suYXJnKX19fXZhciBfX0FUUFJFUlVOX189W107dmFyIF9fQVRJTklUX189W107dmFyIF9fQVRNQUlOX189W107dmFyIF9fQVRQT1NUUlVOX189W107dmFyIHJ1bnRpbWVJbml0aWFsaXplZD1mYWxzZTtmdW5jdGlvbiBwcmVSdW4oKXtpZihNb2R1bGVbInByZVJ1biJdKXtpZih0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXT09ImZ1bmN0aW9uIilNb2R1bGVbInByZVJ1biJdPVtNb2R1bGVbInByZVJ1biJdXTt3aGlsZShNb2R1bGVbInByZVJ1biJdLmxlbmd0aCl7YWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKX1mdW5jdGlvbiBpbml0UnVudGltZSgpe3J1bnRpbWVJbml0aWFsaXplZD10cnVlO2lmKCFNb2R1bGVbIm5vRlNJbml0Il0mJiFGUy5pbml0LmluaXRpYWxpemVkKUZTLmluaXQoKTtUVFkuaW5pdCgpO2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRJTklUX18pfWZ1bmN0aW9uIHByZU1haW4oKXtGUy5pZ25vcmVQZXJtaXNzaW9ucz1mYWxzZTtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUTUFJTl9fKX1mdW5jdGlvbiBwb3N0UnVuKCl7aWYoTW9kdWxlWyJwb3N0UnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInBvc3RSdW4iXT09ImZ1bmN0aW9uIilNb2R1bGVbInBvc3RSdW4iXT1bTW9kdWxlWyJwb3N0UnVuIl1dO3doaWxlKE1vZHVsZVsicG9zdFJ1biJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKX1mdW5jdGlvbiBhZGRPblByZVJ1bihjYil7X19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpfWZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYil7X19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKX12YXIgTWF0aF9hYnM9TWF0aC5hYnM7dmFyIE1hdGhfY2VpbD1NYXRoLmNlaWw7dmFyIE1hdGhfZmxvb3I9TWF0aC5mbG9vcjt2YXIgTWF0aF9taW49TWF0aC5taW47dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBnZXRVbmlxdWVSdW5EZXBlbmRlbmN5KGlkKXtyZXR1cm4gaWR9ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pe01vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyl9fWZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcy0tO2lmKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKXtNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyIGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXT17fTtNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdPXt9O2Z1bmN0aW9uIGFib3J0KHdoYXQpe2lmKE1vZHVsZVsib25BYm9ydCJdKXtNb2R1bGVbIm9uQWJvcnQiXSh3aGF0KX13aGF0Kz0iIjtvdXQod2hhdCk7ZXJyKHdoYXQpO0FCT1JUPXRydWU7RVhJVFNUQVRVUz0xO3doYXQ9ImFib3J0KCIrd2hhdCsiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iO3Rocm93IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCl9ZnVuY3Rpb24gaGFzUHJlZml4KHN0cixwcmVmaXgpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGg/c3RyLnN0YXJ0c1dpdGgocHJlZml4KTpzdHIuaW5kZXhPZihwcmVmaXgpPT09MH12YXIgZGF0YVVSSVByZWZpeD0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGRhdGFVUklQcmVmaXgpfXZhciBmaWxlVVJJUHJlZml4PSJmaWxlOi8vIjtmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZmlsZVVSSVByZWZpeCl9dmFyIHdhc21CaW5hcnlGaWxlPSJiYXNpc19lbmNvZGVyLndhc20iO2lmKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKXt3YXNtQmluYXJ5RmlsZT1sb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKX1mdW5jdGlvbiBnZXRCaW5hcnkoKXt0cnl7aWYod2FzbUJpbmFyeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpfWlmKHJlYWRCaW5hcnkpe3JldHVybiByZWFkQmluYXJ5KHdhc21CaW5hcnlGaWxlKX1lbHNle3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn19Y2F0Y2goZXJyKXthYm9ydChlcnIpfX1mdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCl7aWYoIXdhc21CaW5hcnkmJihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUikmJnR5cGVvZiBmZXRjaD09PSJmdW5jdGlvbiImJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXtpZighcmVzcG9uc2VbIm9rIl0pe3Rocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrd2FzbUJpbmFyeUZpbGUrIicifXJldHVybiByZXNwb25zZVsiYXJyYXlCdWZmZXIiXSgpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KCl9KX1yZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3Jlc29sdmUoZ2V0QmluYXJ5KCkpfSl9ZnVuY3Rpb24gY3JlYXRlV2FzbSgpe3ZhciBpbmZvPXsiYSI6YXNtTGlicmFyeUFyZ307ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLG1vZHVsZSl7dmFyIGV4cG9ydHM9aW5zdGFuY2UuZXhwb3J0cztNb2R1bGVbImFzbSJdPWV4cG9ydHM7cmVtb3ZlUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpfWFkZFJ1bkRlcGVuZGVuY3koIndhc20taW5zdGFudGlhdGUiKTtmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCl7cmVjZWl2ZUluc3RhbmNlKG91dHB1dFsiaW5zdGFuY2UiXSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcil7cmV0dXJuIGdldEJpbmFyeVByb21pc2UoKS50aGVuKGZ1bmN0aW9uKGJpbmFyeSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSxpbmZvKX0pLnRoZW4ocmVjZWl2ZXIsZnVuY3Rpb24ocmVhc29uKXtlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrcmVhc29uKTthYm9ydChyZWFzb24pfSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpe2lmKCF3YXNtQmluYXJ5JiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PT0iZnVuY3Rpb24iJiYhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkmJnR5cGVvZiBmZXRjaD09PSJmdW5jdGlvbiIpe2ZldGNoKHdhc21CaW5hcnlGaWxlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7dmFyIHJlc3VsdD1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSxpbmZvKTtyZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSxmdW5jdGlvbihyZWFzb24pe2Vycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrcmVhc29uKTtlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7aW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX0pfSl9ZWxzZXtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX19aWYoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSl7dHJ5e3ZhciBleHBvcnRzPU1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbyxyZWNlaXZlSW5zdGFuY2UpO3JldHVybiBleHBvcnRzfWNhdGNoKGUpe2VycigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKTtyZXR1cm4gZmFsc2V9fWluc3RhbnRpYXRlQXN5bmMoKTtyZXR1cm57fX12YXIgdGVtcERvdWJsZTt2YXIgdGVtcEk2NDtfX0FUSU5JVF9fLnB1c2goe2Z1bmM6ZnVuY3Rpb24oKXtfX193YXNtX2NhbGxfY3RvcnMoKX19KTtmdW5jdGlvbiBkZW1hbmdsZShmdW5jKXtyZXR1cm4gZnVuY31mdW5jdGlvbiBkZW1hbmdsZUFsbCh0ZXh0KXt2YXIgcmVnZXg9L1xiX1pbXHdcZF9dKy9nO3JldHVybiB0ZXh0LnJlcGxhY2UocmVnZXgsZnVuY3Rpb24oeCl7dmFyIHk9ZGVtYW5nbGUoeCk7cmV0dXJuIHg9PT15P3g6eSsiIFsiK3grIl0ifSl9ZnVuY3Rpb24ganNTdGFja1RyYWNlKCl7dmFyIGVycj1uZXcgRXJyb3I7aWYoIWVyci5zdGFjayl7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChlKXtlcnI9ZX1pZighZXJyLnN0YWNrKXtyZXR1cm4iKG5vIHN0YWNrIHRyYWNlIGF2YWlsYWJsZSkifX1yZXR1cm4gZXJyLnN0YWNrLnRvU3RyaW5nKCl9ZnVuY3Rpb24gc3RhY2tUcmFjZSgpe3ZhciBqcz1qc1N0YWNrVHJhY2UoKTtpZihNb2R1bGVbImV4dHJhU3RhY2tUcmFjZSJdKWpzKz0iXG4iK01vZHVsZVsiZXh0cmFTdGFja1RyYWNlIl0oKTtyZXR1cm4gZGVtYW5nbGVBbGwoanMpfWZ1bmN0aW9uIF9fX2N4YV9hbGxvY2F0ZV9leGNlcHRpb24oc2l6ZSl7cmV0dXJuIF9tYWxsb2Moc2l6ZSl9dmFyIF9fX2V4Y2VwdGlvbl9pbmZvcz17fTt2YXIgX19fZXhjZXB0aW9uX2xhc3Q9MDtmdW5jdGlvbiBfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udigpe3JldHVybiBfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udi51bmNhdWdodF9leGNlcHRpb25zPjB9ZnVuY3Rpb24gX19fY3hhX3Rocm93KHB0cix0eXBlLGRlc3RydWN0b3Ipe19fX2V4Y2VwdGlvbl9pbmZvc1twdHJdPXtwdHI6cHRyLGFkanVzdGVkOltwdHJdLHR5cGU6dHlwZSxkZXN0cnVjdG9yOmRlc3RydWN0b3IscmVmY291bnQ6MCxjYXVnaHQ6ZmFsc2UscmV0aHJvd246ZmFsc2V9O19fX2V4Y2VwdGlvbl9sYXN0PXB0cjtpZighKCJ1bmNhdWdodF9leGNlcHRpb24iaW4gX19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYpKXtfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udi51bmNhdWdodF9leGNlcHRpb25zPTF9ZWxzZXtfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udi51bmNhdWdodF9leGNlcHRpb25zKyt9dGhyb3cgcHRyfWZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKXtIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKT4+Ml09dmFsdWU7cmV0dXJuIHZhbHVlfXZhciBQQVRIPXtzcGxpdFBhdGg6ZnVuY3Rpb24oZmlsZW5hbWUpe3ZhciBzcGxpdFBhdGhSZT0vXihcLz98KShbXHNcU10qPykoKD86XC57MSwyfXxbXlwvXSs/fCkoXC5bXi5cL10qfCkpKD86W1wvXSopJC87cmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTpmdW5jdGlvbihwYXJ0cyxhbGxvd0Fib3ZlUm9vdCl7dmFyIHVwPTA7Zm9yKHZhciBpPXBhcnRzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgbGFzdD1wYXJ0c1tpXTtpZihsYXN0PT09Ii4iKXtwYXJ0cy5zcGxpY2UoaSwxKX1lbHNlIGlmKGxhc3Q9PT0iLi4iKXtwYXJ0cy5zcGxpY2UoaSwxKTt1cCsrfWVsc2UgaWYodXApe3BhcnRzLnNwbGljZShpLDEpO3VwLS19fWlmKGFsbG93QWJvdmVSb290KXtmb3IoO3VwO3VwLS0pe3BhcnRzLnVuc2hpZnQoIi4uIil9fXJldHVybiBwYXJ0c30sbm9ybWFsaXplOmZ1bmN0aW9uKHBhdGgpe3ZhciBpc0Fic29sdXRlPXBhdGguY2hhckF0KDApPT09Ii8iLHRyYWlsaW5nU2xhc2g9cGF0aC5zdWJzdHIoLTEpPT09Ii8iO3BhdGg9UEFUSC5ub3JtYWxpemVBcnJheShwYXRoLnNwbGl0KCIvIikuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiEhcH0pLCFpc0Fic29sdXRlKS5qb2luKCIvIik7aWYoIXBhdGgmJiFpc0Fic29sdXRlKXtwYXRoPSIuIn1pZihwYXRoJiZ0cmFpbGluZ1NsYXNoKXtwYXRoKz0iLyJ9cmV0dXJuKGlzQWJzb2x1dGU/Ii8iOiIiKStwYXRofSxkaXJuYW1lOmZ1bmN0aW9uKHBhdGgpe3ZhciByZXN1bHQ9UEFUSC5zcGxpdFBhdGgocGF0aCkscm9vdD1yZXN1bHRbMF0sZGlyPXJlc3VsdFsxXTtpZighcm9vdCYmIWRpcil7cmV0dXJuIi4ifWlmKGRpcil7ZGlyPWRpci5zdWJzdHIoMCxkaXIubGVuZ3RoLTEpfXJldHVybiByb290K2Rpcn0sYmFzZW5hbWU6ZnVuY3Rpb24ocGF0aCl7aWYocGF0aD09PSIvIilyZXR1cm4iLyI7dmFyIGxhc3RTbGFzaD1wYXRoLmxhc3RJbmRleE9mKCIvIik7aWYobGFzdFNsYXNoPT09LTEpcmV0dXJuIHBhdGg7cmV0dXJuIHBhdGguc3Vic3RyKGxhc3RTbGFzaCsxKX0sZXh0bmFtZTpmdW5jdGlvbihwYXRoKXtyZXR1cm4gUEFUSC5zcGxpdFBhdGgocGF0aClbM119LGpvaW46ZnVuY3Rpb24oKXt2YXIgcGF0aHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBQQVRILm5vcm1hbGl6ZShwYXRocy5qb2luKCIvIikpfSxqb2luMjpmdW5jdGlvbihsLHIpe3JldHVybiBQQVRILm5vcm1hbGl6ZShsKyIvIityKX19O3ZhciBQQVRIX0ZTPXtyZXNvbHZlOmZ1bmN0aW9uKCl7dmFyIHJlc29sdmVkUGF0aD0iIixyZXNvbHZlZEFic29sdXRlPWZhbHNlO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49LTEmJiFyZXNvbHZlZEFic29sdXRlO2ktLSl7dmFyIHBhdGg9aT49MD9hcmd1bWVudHNbaV06RlMuY3dkKCk7aWYodHlwZW9mIHBhdGghPT0ic3RyaW5nIil7dGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKX1lbHNlIGlmKCFwYXRoKXtyZXR1cm4iIn1yZXNvbHZlZFBhdGg9cGF0aCsiLyIrcmVzb2x2ZWRQYXRoO3Jlc29sdmVkQWJzb2x1dGU9cGF0aC5jaGFyQXQoMCk9PT0iLyJ9cmVzb2x2ZWRQYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocmVzb2x2ZWRQYXRoLnNwbGl0KCIvIikuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiEhcH0pLCFyZXNvbHZlZEFic29sdXRlKS5qb2luKCIvIik7cmV0dXJuKHJlc29sdmVkQWJzb2x1dGU/Ii8iOiIiKStyZXNvbHZlZFBhdGh8fCIuIn0scmVsYXRpdmU6ZnVuY3Rpb24oZnJvbSx0byl7ZnJvbT1QQVRIX0ZTLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO3RvPVBBVEhfRlMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO2Z1bmN0aW9uIHRyaW0oYXJyKXt2YXIgc3RhcnQ9MDtmb3IoO3N0YXJ0PGFyci5sZW5ndGg7c3RhcnQrKyl7aWYoYXJyW3N0YXJ0XSE9PSIiKWJyZWFrfXZhciBlbmQ9YXJyLmxlbmd0aC0xO2Zvcig7ZW5kPj0wO2VuZC0tKXtpZihhcnJbZW5kXSE9PSIiKWJyZWFrfWlmKHN0YXJ0PmVuZClyZXR1cm5bXTtyZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LGVuZC1zdGFydCsxKX12YXIgZnJvbVBhcnRzPXRyaW0oZnJvbS5zcGxpdCgiLyIpKTt2YXIgdG9QYXJ0cz10cmltKHRvLnNwbGl0KCIvIikpO3ZhciBsZW5ndGg9TWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCx0b1BhcnRzLmxlbmd0aCk7dmFyIHNhbWVQYXJ0c0xlbmd0aD1sZW5ndGg7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXtpZihmcm9tUGFydHNbaV0hPT10b1BhcnRzW2ldKXtzYW1lUGFydHNMZW5ndGg9aTticmVha319dmFyIG91dHB1dFBhcnRzPVtdO2Zvcih2YXIgaT1zYW1lUGFydHNMZW5ndGg7aTxmcm9tUGFydHMubGVuZ3RoO2krKyl7b3V0cHV0UGFydHMucHVzaCgiLi4iKX1vdXRwdXRQYXJ0cz1vdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtyZXR1cm4gb3V0cHV0UGFydHMuam9pbigiLyIpfX07dmFyIFRUWT17dHR5czpbXSxpbml0OmZ1bmN0aW9uKCl7fSxzaHV0ZG93bjpmdW5jdGlvbigpe30scmVnaXN0ZXI6ZnVuY3Rpb24oZGV2LG9wcyl7VFRZLnR0eXNbZGV2XT17aW5wdXQ6W10sb3V0cHV0OltdLG9wczpvcHN9O0ZTLnJlZ2lzdGVyRGV2aWNlKGRldixUVFkuc3RyZWFtX29wcyl9LHN0cmVhbV9vcHM6e29wZW46ZnVuY3Rpb24oc3RyZWFtKXt2YXIgdHR5PVRUWS50dHlzW3N0cmVhbS5ub2RlLnJkZXZdO2lmKCF0dHkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDQzKX1zdHJlYW0udHR5PXR0eTtzdHJlYW0uc2Vla2FibGU9ZmFsc2V9LGNsb3NlOmZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnR0eS5vcHMuZmx1c2goc3RyZWFtLnR0eSl9LGZsdXNoOmZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnR0eS5vcHMuZmx1c2goc3RyZWFtLnR0eSl9LHJlYWQ6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7aWYoIXN0cmVhbS50dHl8fCFzdHJlYW0udHR5Lm9wcy5nZXRfY2hhcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjApfXZhciBieXRlc1JlYWQ9MDtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3ZhciByZXN1bHQ7dHJ5e3Jlc3VsdD1zdHJlYW0udHR5Lm9wcy5nZXRfY2hhcihzdHJlYW0udHR5KX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2KX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSx3cml0ZTpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtpZighc3RyZWFtLnR0eXx8IXN0cmVhbS50dHkub3BzLnB1dF9jaGFyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2MCl9dHJ5e2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7c3RyZWFtLnR0eS5vcHMucHV0X2NoYXIoc3RyZWFtLnR0eSxidWZmZXJbb2Zmc2V0K2ldKX19Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpfWlmKGxlbmd0aCl7c3RyZWFtLm5vZGUudGltZXN0YW1wPURhdGUubm93KCl9cmV0dXJuIGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyOmZ1bmN0aW9uKHR0eSl7aWYoIXR0eS5pbnB1dC5sZW5ndGgpe3ZhciByZXN1bHQ9bnVsbDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXt2YXIgQlVGU0laRT0yNTY7dmFyIGJ1Zj1CdWZmZXIuYWxsb2M/QnVmZmVyLmFsbG9jKEJVRlNJWkUpOm5ldyBCdWZmZXIoQlVGU0laRSk7dmFyIGJ5dGVzUmVhZD0wO3RyeXtieXRlc1JlYWQ9bm9kZUZTLnJlYWRTeW5jKHByb2Nlc3Muc3RkaW4uZmQsYnVmLDAsQlVGU0laRSxudWxsKX1jYXRjaChlKXtpZihlLnRvU3RyaW5nKCkuaW5kZXhPZigiRU9GIikhPS0xKWJ5dGVzUmVhZD0wO2Vsc2UgdGhyb3cgZX1pZihieXRlc1JlYWQ+MCl7cmVzdWx0PWJ1Zi5zbGljZSgwLGJ5dGVzUmVhZCkudG9TdHJpbmcoInV0Zi04Iil9ZWxzZXtyZXN1bHQ9bnVsbH19ZWxzZSBpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5wcm9tcHQ9PSJmdW5jdGlvbiIpe3Jlc3VsdD13aW5kb3cucHJvbXB0KCJJbnB1dDogIik7aWYocmVzdWx0IT09bnVsbCl7cmVzdWx0Kz0iXG4ifX1lbHNlIGlmKHR5cGVvZiByZWFkbGluZT09ImZ1bmN0aW9uIil7cmVzdWx0PXJlYWRsaW5lKCk7aWYocmVzdWx0IT09bnVsbCl7cmVzdWx0Kz0iXG4ifX1pZighcmVzdWx0KXtyZXR1cm4gbnVsbH10dHkuaW5wdXQ9aW50QXJyYXlGcm9tU3RyaW5nKHJlc3VsdCx0cnVlKX1yZXR1cm4gdHR5LmlucHV0LnNoaWZ0KCl9LHB1dF9jaGFyOmZ1bmN0aW9uKHR0eSx2YWwpe2lmKHZhbD09PW51bGx8fHZhbD09PTEwKXtvdXQoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwwKSk7dHR5Lm91dHB1dD1bXX1lbHNle2lmKHZhbCE9MCl0dHkub3V0cHV0LnB1c2godmFsKX19LGZsdXNoOmZ1bmN0aW9uKHR0eSl7aWYodHR5Lm91dHB1dCYmdHR5Lm91dHB1dC5sZW5ndGg+MCl7b3V0KFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119fX0sZGVmYXVsdF90dHkxX29wczp7cHV0X2NoYXI6ZnVuY3Rpb24odHR5LHZhbCl7aWYodmFsPT09bnVsbHx8dmFsPT09MTApe2VycihVVEY4QXJyYXlUb1N0cmluZyh0dHkub3V0cHV0LDApKTt0dHkub3V0cHV0PVtdfWVsc2V7aWYodmFsIT0wKXR0eS5vdXRwdXQucHVzaCh2YWwpfX0sZmx1c2g6ZnVuY3Rpb24odHR5KXtpZih0dHkub3V0cHV0JiZ0dHkub3V0cHV0Lmxlbmd0aD4wKXtlcnIoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwwKSk7dHR5Lm91dHB1dD1bXX19fX07dmFyIE1FTUZTPXtvcHNfdGFibGU6bnVsbCxtb3VudDpmdW5jdGlvbihtb3VudCl7cmV0dXJuIE1FTUZTLmNyZWF0ZU5vZGUobnVsbCwiLyIsMTYzODR8NTExLDApfSxjcmVhdGVOb2RlOmZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXtpZihGUy5pc0Jsa2Rldihtb2RlKXx8RlMuaXNGSUZPKG1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myl9aWYoIU1FTUZTLm9wc190YWJsZSl7TUVNRlMub3BzX3RhYmxlPXtkaXI6e25vZGU6e2dldGF0dHI6TUVNRlMubm9kZV9vcHMuZ2V0YXR0cixzZXRhdHRyOk1FTUZTLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOk1FTUZTLm5vZGVfb3BzLmxvb2t1cCxta25vZDpNRU1GUy5ub2RlX29wcy5ta25vZCxyZW5hbWU6TUVNRlMubm9kZV9vcHMucmVuYW1lLHVubGluazpNRU1GUy5ub2RlX29wcy51bmxpbmsscm1kaXI6TUVNRlMubm9kZV9vcHMucm1kaXIscmVhZGRpcjpNRU1GUy5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6TUVNRlMubm9kZV9vcHMuc3ltbGlua30sc3RyZWFtOntsbHNlZWs6TUVNRlMuc3RyZWFtX29wcy5sbHNlZWt9fSxmaWxlOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06e2xsc2VlazpNRU1GUy5zdHJlYW1fb3BzLmxsc2VlayxyZWFkOk1FTUZTLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpNRU1GUy5zdHJlYW1fb3BzLndyaXRlLGFsbG9jYXRlOk1FTUZTLnN0cmVhbV9vcHMuYWxsb2NhdGUsbW1hcDpNRU1GUy5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6TUVNRlMuc3RyZWFtX29wcy5tc3luY319LGxpbms6e25vZGU6e2dldGF0dHI6TUVNRlMubm9kZV9vcHMuZ2V0YXR0cixzZXRhdHRyOk1FTUZTLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6TUVNRlMubm9kZV9vcHMucmVhZGxpbmt9LHN0cmVhbTp7fX0sY2hyZGV2Ontub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06RlMuY2hyZGV2X3N0cmVhbV9vcHN9fX12YXIgbm9kZT1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KTtpZihGUy5pc0Rpcihub2RlLm1vZGUpKXtub2RlLm5vZGVfb3BzPU1FTUZTLm9wc190YWJsZS5kaXIubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmRpci5zdHJlYW07bm9kZS5jb250ZW50cz17fX1lbHNlIGlmKEZTLmlzRmlsZShub2RlLm1vZGUpKXtub2RlLm5vZGVfb3BzPU1FTUZTLm9wc190YWJsZS5maWxlLm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5maWxlLnN0cmVhbTtub2RlLnVzZWRCeXRlcz0wO25vZGUuY29udGVudHM9bnVsbH1lbHNlIGlmKEZTLmlzTGluayhub2RlLm1vZGUpKXtub2RlLm5vZGVfb3BzPU1FTUZTLm9wc190YWJsZS5saW5rLm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5saW5rLnN0cmVhbX1lbHNlIGlmKEZTLmlzQ2hyZGV2KG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmNocmRldi5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbX1ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpO2lmKHBhcmVudCl7cGFyZW50LmNvbnRlbnRzW25hbWVdPW5vZGV9cmV0dXJuIG5vZGV9LGdldEZpbGVEYXRhQXNSZWd1bGFyQXJyYXk6ZnVuY3Rpb24obm9kZSl7aWYobm9kZS5jb250ZW50cyYmbm9kZS5jb250ZW50cy5zdWJhcnJheSl7dmFyIGFycj1bXTtmb3IodmFyIGk9MDtpPG5vZGUudXNlZEJ5dGVzOysraSlhcnIucHVzaChub2RlLmNvbnRlbnRzW2ldKTtyZXR1cm4gYXJyfXJldHVybiBub2RlLmNvbnRlbnRzfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheTpmdW5jdGlvbihub2RlKXtpZighbm9kZS5jb250ZW50cylyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7aWYobm9kZS5jb250ZW50cy5zdWJhcnJheSlyZXR1cm4gbm9kZS5jb250ZW50cy5zdWJhcnJheSgwLG5vZGUudXNlZEJ5dGVzKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobm9kZS5jb250ZW50cyl9LGV4cGFuZEZpbGVTdG9yYWdlOmZ1bmN0aW9uKG5vZGUsbmV3Q2FwYWNpdHkpe3ZhciBwcmV2Q2FwYWNpdHk9bm9kZS5jb250ZW50cz9ub2RlLmNvbnRlbnRzLmxlbmd0aDowO2lmKHByZXZDYXBhY2l0eT49bmV3Q2FwYWNpdHkpcmV0dXJuO3ZhciBDQVBBQ0lUWV9ET1VCTElOR19NQVg9MTAyNCoxMDI0O25ld0NhcGFjaXR5PU1hdGgubWF4KG5ld0NhcGFjaXR5LHByZXZDYXBhY2l0eSoocHJldkNhcGFjaXR5PENBUEFDSVRZX0RPVUJMSU5HX01BWD8yOjEuMTI1KT4+PjApO2lmKHByZXZDYXBhY2l0eSE9MCluZXdDYXBhY2l0eT1NYXRoLm1heChuZXdDYXBhY2l0eSwyNTYpO3ZhciBvbGRDb250ZW50cz1ub2RlLmNvbnRlbnRzO25vZGUuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkobmV3Q2FwYWNpdHkpO2lmKG5vZGUudXNlZEJ5dGVzPjApbm9kZS5jb250ZW50cy5zZXQob2xkQ29udGVudHMuc3ViYXJyYXkoMCxub2RlLnVzZWRCeXRlcyksMCk7cmV0dXJufSxyZXNpemVGaWxlU3RvcmFnZTpmdW5jdGlvbihub2RlLG5ld1NpemUpe2lmKG5vZGUudXNlZEJ5dGVzPT1uZXdTaXplKXJldHVybjtpZihuZXdTaXplPT0wKXtub2RlLmNvbnRlbnRzPW51bGw7bm9kZS51c2VkQnl0ZXM9MDtyZXR1cm59aWYoIW5vZGUuY29udGVudHN8fG5vZGUuY29udGVudHMuc3ViYXJyYXkpe3ZhciBvbGRDb250ZW50cz1ub2RlLmNvbnRlbnRzO25vZGUuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkobmV3U2l6ZSk7aWYob2xkQ29udGVudHMpe25vZGUuY29udGVudHMuc2V0KG9sZENvbnRlbnRzLnN1YmFycmF5KDAsTWF0aC5taW4obmV3U2l6ZSxub2RlLnVzZWRCeXRlcykpKX1ub2RlLnVzZWRCeXRlcz1uZXdTaXplO3JldHVybn1pZighbm9kZS5jb250ZW50cylub2RlLmNvbnRlbnRzPVtdO2lmKG5vZGUuY29udGVudHMubGVuZ3RoPm5ld1NpemUpbm9kZS5jb250ZW50cy5sZW5ndGg9bmV3U2l6ZTtlbHNlIHdoaWxlKG5vZGUuY29udGVudHMubGVuZ3RoPG5ld1NpemUpbm9kZS5jb250ZW50cy5wdXNoKDApO25vZGUudXNlZEJ5dGVzPW5ld1NpemV9LG5vZGVfb3BzOntnZXRhdHRyOmZ1bmN0aW9uKG5vZGUpe3ZhciBhdHRyPXt9O2F0dHIuZGV2PUZTLmlzQ2hyZGV2KG5vZGUubW9kZSk/bm9kZS5pZDoxO2F0dHIuaW5vPW5vZGUuaWQ7YXR0ci5tb2RlPW5vZGUubW9kZTthdHRyLm5saW5rPTE7YXR0ci51aWQ9MDthdHRyLmdpZD0wO2F0dHIucmRldj1ub2RlLnJkZXY7aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7YXR0ci5zaXplPTQwOTZ9ZWxzZSBpZihGUy5pc0ZpbGUobm9kZS5tb2RlKSl7YXR0ci5zaXplPW5vZGUudXNlZEJ5dGVzfWVsc2UgaWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT1ub2RlLmxpbmsubGVuZ3RofWVsc2V7YXR0ci5zaXplPTB9YXR0ci5hdGltZT1uZXcgRGF0ZShub2RlLnRpbWVzdGFtcCk7YXR0ci5tdGltZT1uZXcgRGF0ZShub2RlLnRpbWVzdGFtcCk7YXR0ci5jdGltZT1uZXcgRGF0ZShub2RlLnRpbWVzdGFtcCk7YXR0ci5ibGtzaXplPTQwOTY7YXR0ci5ibG9ja3M9TWF0aC5jZWlsKGF0dHIuc2l6ZS9hdHRyLmJsa3NpemUpO3JldHVybiBhdHRyfSxzZXRhdHRyOmZ1bmN0aW9uKG5vZGUsYXR0cil7aWYoYXR0ci5tb2RlIT09dW5kZWZpbmVkKXtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXtub2RlLnRpbWVzdGFtcD1hdHRyLnRpbWVzdGFtcH1pZihhdHRyLnNpemUhPT11bmRlZmluZWQpe01FTUZTLnJlc2l6ZUZpbGVTdG9yYWdlKG5vZGUsYXR0ci5zaXplKX19LGxvb2t1cDpmdW5jdGlvbihwYXJlbnQsbmFtZSl7dGhyb3cgRlMuZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kOmZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXtyZXR1cm4gTUVNRlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlLGRldil9LHJlbmFtZTpmdW5jdGlvbihvbGRfbm9kZSxuZXdfZGlyLG5ld19uYW1lKXtpZihGUy5pc0RpcihvbGRfbm9kZS5tb2RlKSl7dmFyIG5ld19ub2RlO3RyeXtuZXdfbm9kZT1GUy5sb29rdXBOb2RlKG5ld19kaXIsbmV3X25hbWUpfWNhdGNoKGUpe31pZihuZXdfbm9kZSl7Zm9yKHZhciBpIGluIG5ld19ub2RlLmNvbnRlbnRzKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NSl9fX1kZWxldGUgb2xkX25vZGUucGFyZW50LmNvbnRlbnRzW29sZF9ub2RlLm5hbWVdO29sZF9ub2RlLm5hbWU9bmV3X25hbWU7bmV3X2Rpci5jb250ZW50c1tuZXdfbmFtZV09b2xkX25vZGU7b2xkX25vZGUucGFyZW50PW5ld19kaXJ9LHVubGluazpmdW5jdGlvbihwYXJlbnQsbmFtZSl7ZGVsZXRlIHBhcmVudC5jb250ZW50c1tuYW1lXX0scm1kaXI6ZnVuY3Rpb24ocGFyZW50LG5hbWUpe3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO2Zvcih2YXIgaSBpbiBub2RlLmNvbnRlbnRzKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NSl9ZGVsZXRlIHBhcmVudC5jb250ZW50c1tuYW1lXX0scmVhZGRpcjpmdW5jdGlvbihub2RlKXt2YXIgZW50cmllcz1bIi4iLCIuLiJdO2Zvcih2YXIga2V5IGluIG5vZGUuY29udGVudHMpe2lmKCFub2RlLmNvbnRlbnRzLmhhc093blByb3BlcnR5KGtleSkpe2NvbnRpbnVlfWVudHJpZXMucHVzaChrZXkpfXJldHVybiBlbnRyaWVzfSxzeW1saW5rOmZ1bmN0aW9uKHBhcmVudCxuZXduYW1lLG9sZHBhdGgpe3ZhciBub2RlPU1FTUZTLmNyZWF0ZU5vZGUocGFyZW50LG5ld25hbWUsNTExfDQwOTYwLDApO25vZGUubGluaz1vbGRwYXRoO3JldHVybiBub2RlfSxyZWFkbGluazpmdW5jdGlvbihub2RlKXtpZighRlMuaXNMaW5rKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX1yZXR1cm4gbm9kZS5saW5rfX0sc3RyZWFtX29wczp7cmVhZDpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50cztpZihwb3NpdGlvbj49c3RyZWFtLm5vZGUudXNlZEJ5dGVzKXJldHVybiAwO3ZhciBzaXplPU1hdGgubWluKHN0cmVhbS5ub2RlLnVzZWRCeXRlcy1wb3NpdGlvbixsZW5ndGgpO2lmKHNpemU+OCYmY29udGVudHMuc3ViYXJyYXkpe2J1ZmZlci5zZXQoY29udGVudHMuc3ViYXJyYXkocG9zaXRpb24scG9zaXRpb24rc2l6ZSksb2Zmc2V0KX1lbHNle2Zvcih2YXIgaT0wO2k8c2l6ZTtpKyspYnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX1yZXR1cm4gc2l6ZX0sd3JpdGU6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bil7aWYoYnVmZmVyLmJ1ZmZlcj09PUhFQVA4LmJ1ZmZlcil7Y2FuT3duPWZhbHNlfWlmKCFsZW5ndGgpcmV0dXJuIDA7dmFyIG5vZGU9c3RyZWFtLm5vZGU7bm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKTtpZihidWZmZXIuc3ViYXJyYXkmJighbm9kZS5jb250ZW50c3x8bm9kZS5jb250ZW50cy5zdWJhcnJheSkpe2lmKGNhbk93bil7bm9kZS5jb250ZW50cz1idWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpO25vZGUudXNlZEJ5dGVzPWxlbmd0aDtyZXR1cm4gbGVuZ3RofWVsc2UgaWYobm9kZS51c2VkQnl0ZXM9PT0wJiZwb3NpdGlvbj09PTApe25vZGUuY29udGVudHM9YnVmZmVyLnNsaWNlKG9mZnNldCxvZmZzZXQrbGVuZ3RoKTtub2RlLnVzZWRCeXRlcz1sZW5ndGg7cmV0dXJuIGxlbmd0aH1lbHNlIGlmKHBvc2l0aW9uK2xlbmd0aDw9bm9kZS51c2VkQnl0ZXMpe25vZGUuY29udGVudHMuc2V0KGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aCkscG9zaXRpb24pO3JldHVybiBsZW5ndGh9fU1FTUZTLmV4cGFuZEZpbGVTdG9yYWdlKG5vZGUscG9zaXRpb24rbGVuZ3RoKTtpZihub2RlLmNvbnRlbnRzLnN1YmFycmF5JiZidWZmZXIuc3ViYXJyYXkpbm9kZS5jb250ZW50cy5zZXQoYnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKSxwb3NpdGlvbik7ZWxzZXtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe25vZGUuY29udGVudHNbcG9zaXRpb24raV09YnVmZmVyW29mZnNldCtpXX19bm9kZS51c2VkQnl0ZXM9TWF0aC5tYXgobm9kZS51c2VkQnl0ZXMscG9zaXRpb24rbGVuZ3RoKTtyZXR1cm4gbGVuZ3RofSxsbHNlZWs6ZnVuY3Rpb24oc3RyZWFtLG9mZnNldCx3aGVuY2Upe3ZhciBwb3NpdGlvbj1vZmZzZXQ7aWYod2hlbmNlPT09MSl7cG9zaXRpb24rPXN0cmVhbS5wb3NpdGlvbn1lbHNlIGlmKHdoZW5jZT09PTIpe2lmKEZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSl7cG9zaXRpb24rPXN0cmVhbS5ub2RlLnVzZWRCeXRlc319aWYocG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfXJldHVybiBwb3NpdGlvbn0sYWxsb2NhdGU6ZnVuY3Rpb24oc3RyZWFtLG9mZnNldCxsZW5ndGgpe01FTUZTLmV4cGFuZEZpbGVTdG9yYWdlKHN0cmVhbS5ub2RlLG9mZnNldCtsZW5ndGgpO3N0cmVhbS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChzdHJlYW0ubm9kZS51c2VkQnl0ZXMsb2Zmc2V0K2xlbmd0aCl9LG1tYXA6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3Mpe2lmKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDQzKX12YXIgcHRyO3ZhciBhbGxvY2F0ZWQ7dmFyIGNvbnRlbnRzPXN0cmVhbS5ub2RlLmNvbnRlbnRzO2lmKCEoZmxhZ3MmMikmJmNvbnRlbnRzLmJ1ZmZlcj09PWJ1ZmZlci5idWZmZXIpe2FsbG9jYXRlZD1mYWxzZTtwdHI9Y29udGVudHMuYnl0ZU9mZnNldH1lbHNle2lmKHBvc2l0aW9uPjB8fHBvc2l0aW9uK2xlbmd0aDxjb250ZW50cy5sZW5ndGgpe2lmKGNvbnRlbnRzLnN1YmFycmF5KXtjb250ZW50cz1jb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpfWVsc2V7Y29udGVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGVudHMscG9zaXRpb24scG9zaXRpb24rbGVuZ3RoKX19YWxsb2NhdGVkPXRydWU7dmFyIGZyb21IZWFwPWJ1ZmZlci5idWZmZXI9PUhFQVA4LmJ1ZmZlcjtwdHI9X21hbGxvYyhsZW5ndGgpO2lmKCFwdHIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ4KX0oZnJvbUhlYXA/SEVBUDg6YnVmZmVyKS5zZXQoY29udGVudHMscHRyKX1yZXR1cm57cHRyOnB0cixhbGxvY2F0ZWQ6YWxsb2NhdGVkfX0sbXN5bmM6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLG1tYXBGbGFncyl7aWYoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDMpfWlmKG1tYXBGbGFncyYyKXtyZXR1cm4gMH12YXIgYnl0ZXNXcml0dGVuPU1FTUZTLnN0cmVhbV9vcHMud3JpdGUoc3RyZWFtLGJ1ZmZlciwwLGxlbmd0aCxvZmZzZXQsZmFsc2UpO3JldHVybiAwfX19O3ZhciBGUz17cm9vdDpudWxsLG1vdW50czpbXSxkZXZpY2VzOnt9LHN0cmVhbXM6W10sbmV4dElub2RlOjEsbmFtZVRhYmxlOm51bGwsY3VycmVudFBhdGg6Ii8iLGluaXRpYWxpemVkOmZhbHNlLGlnbm9yZVBlcm1pc3Npb25zOnRydWUsdHJhY2tpbmdEZWxlZ2F0ZTp7fSx0cmFja2luZzp7b3BlbkZsYWdzOntSRUFEOjEsV1JJVEU6Mn19LEVycm5vRXJyb3I6bnVsbCxnZW5lcmljRXJyb3JzOnt9LGZpbGVzeXN0ZW1zOm51bGwsc3luY0ZTUmVxdWVzdHM6MCxoYW5kbGVGU0Vycm9yOmZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKXRocm93IGUrIiA6ICIrc3RhY2tUcmFjZSgpO3JldHVybiBzZXRFcnJObyhlLmVycm5vKX0sbG9va3VwUGF0aDpmdW5jdGlvbihwYXRoLG9wdHMpe3BhdGg9UEFUSF9GUy5yZXNvbHZlKEZTLmN3ZCgpLHBhdGgpO29wdHM9b3B0c3x8e307aWYoIXBhdGgpcmV0dXJue3BhdGg6IiIsbm9kZTpudWxsfTt2YXIgZGVmYXVsdHM9e2ZvbGxvd19tb3VudDp0cnVlLHJlY3Vyc2VfY291bnQ6MH07Zm9yKHZhciBrZXkgaW4gZGVmYXVsdHMpe2lmKG9wdHNba2V5XT09PXVuZGVmaW5lZCl7b3B0c1trZXldPWRlZmF1bHRzW2tleV19fWlmKG9wdHMucmVjdXJzZV9jb3VudD44KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMil9dmFyIHBhcnRzPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgiLyIpLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSxmYWxzZSk7dmFyIGN1cnJlbnQ9RlMucm9vdDt2YXIgY3VycmVudF9wYXRoPSIvIjtmb3IodmFyIGk9MDtpPHBhcnRzLmxlbmd0aDtpKyspe3ZhciBpc2xhc3Q9aT09PXBhcnRzLmxlbmd0aC0xO2lmKGlzbGFzdCYmb3B0cy5wYXJlbnQpe2JyZWFrfWN1cnJlbnQ9RlMubG9va3VwTm9kZShjdXJyZW50LHBhcnRzW2ldKTtjdXJyZW50X3BhdGg9UEFUSC5qb2luMihjdXJyZW50X3BhdGgscGFydHNbaV0pO2lmKEZTLmlzTW91bnRwb2ludChjdXJyZW50KSl7aWYoIWlzbGFzdHx8aXNsYXN0JiZvcHRzLmZvbGxvd19tb3VudCl7Y3VycmVudD1jdXJyZW50Lm1vdW50ZWQucm9vdH19aWYoIWlzbGFzdHx8b3B0cy5mb2xsb3cpe3ZhciBjb3VudD0wO3doaWxlKEZTLmlzTGluayhjdXJyZW50Lm1vZGUpKXt2YXIgbGluaz1GUy5yZWFkbGluayhjdXJyZW50X3BhdGgpO2N1cnJlbnRfcGF0aD1QQVRIX0ZTLnJlc29sdmUoUEFUSC5kaXJuYW1lKGN1cnJlbnRfcGF0aCksbGluayk7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKGN1cnJlbnRfcGF0aCx7cmVjdXJzZV9jb3VudDpvcHRzLnJlY3Vyc2VfY291bnR9KTtjdXJyZW50PWxvb2t1cC5ub2RlO2lmKGNvdW50Kys+NDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDMyKX19fX1yZXR1cm57cGF0aDpjdXJyZW50X3BhdGgsbm9kZTpjdXJyZW50fX0sZ2V0UGF0aDpmdW5jdGlvbihub2RlKXt2YXIgcGF0aDt3aGlsZSh0cnVlKXtpZihGUy5pc1Jvb3Qobm9kZSkpe3ZhciBtb3VudD1ub2RlLm1vdW50Lm1vdW50cG9pbnQ7aWYoIXBhdGgpcmV0dXJuIG1vdW50O3JldHVybiBtb3VudFttb3VudC5sZW5ndGgtMV0hPT0iLyI/bW91bnQrIi8iK3BhdGg6bW91bnQrcGF0aH1wYXRoPXBhdGg/bm9kZS5uYW1lKyIvIitwYXRoOm5vZGUubmFtZTtub2RlPW5vZGUucGFyZW50fX0saGFzaE5hbWU6ZnVuY3Rpb24ocGFyZW50aWQsbmFtZSl7dmFyIGhhc2g9MDtmb3IodmFyIGk9MDtpPG5hbWUubGVuZ3RoO2krKyl7aGFzaD0oaGFzaDw8NSktaGFzaCtuYW1lLmNoYXJDb2RlQXQoaSl8MH1yZXR1cm4ocGFyZW50aWQraGFzaD4+PjApJUZTLm5hbWVUYWJsZS5sZW5ndGh9LGhhc2hBZGROb2RlOmZ1bmN0aW9uKG5vZGUpe3ZhciBoYXNoPUZTLmhhc2hOYW1lKG5vZGUucGFyZW50LmlkLG5vZGUubmFtZSk7bm9kZS5uYW1lX25leHQ9RlMubmFtZVRhYmxlW2hhc2hdO0ZTLm5hbWVUYWJsZVtoYXNoXT1ub2RlfSxoYXNoUmVtb3ZlTm9kZTpmdW5jdGlvbihub2RlKXt2YXIgaGFzaD1GUy5oYXNoTmFtZShub2RlLnBhcmVudC5pZCxub2RlLm5hbWUpO2lmKEZTLm5hbWVUYWJsZVtoYXNoXT09PW5vZGUpe0ZTLm5hbWVUYWJsZVtoYXNoXT1ub2RlLm5hbWVfbmV4dH1lbHNle3ZhciBjdXJyZW50PUZTLm5hbWVUYWJsZVtoYXNoXTt3aGlsZShjdXJyZW50KXtpZihjdXJyZW50Lm5hbWVfbmV4dD09PW5vZGUpe2N1cnJlbnQubmFtZV9uZXh0PW5vZGUubmFtZV9uZXh0O2JyZWFrfWN1cnJlbnQ9Y3VycmVudC5uYW1lX25leHR9fX0sbG9va3VwTm9kZTpmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIGVyckNvZGU9RlMubWF5TG9va3VwKHBhcmVudCk7aWYoZXJyQ29kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSxwYXJlbnQpfXZhciBoYXNoPUZTLmhhc2hOYW1lKHBhcmVudC5pZCxuYW1lKTtmb3IodmFyIG5vZGU9RlMubmFtZVRhYmxlW2hhc2hdO25vZGU7bm9kZT1ub2RlLm5hbWVfbmV4dCl7dmFyIG5vZGVOYW1lPW5vZGUubmFtZTtpZihub2RlLnBhcmVudC5pZD09PXBhcmVudC5pZCYmbm9kZU5hbWU9PT1uYW1lKXtyZXR1cm4gbm9kZX19cmV0dXJuIEZTLmxvb2t1cChwYXJlbnQsbmFtZSl9LGNyZWF0ZU5vZGU6ZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxyZGV2KXt2YXIgbm9kZT1uZXcgRlMuRlNOb2RlKHBhcmVudCxuYW1lLG1vZGUscmRldik7RlMuaGFzaEFkZE5vZGUobm9kZSk7cmV0dXJuIG5vZGV9LGRlc3Ryb3lOb2RlOmZ1bmN0aW9uKG5vZGUpe0ZTLmhhc2hSZW1vdmVOb2RlKG5vZGUpfSxpc1Jvb3Q6ZnVuY3Rpb24obm9kZSl7cmV0dXJuIG5vZGU9PT1ub2RlLnBhcmVudH0saXNNb3VudHBvaW50OmZ1bmN0aW9uKG5vZGUpe3JldHVybiEhbm9kZS5tb3VudGVkfSxpc0ZpbGU6ZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MzI3Njh9LGlzRGlyOmZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTE2Mzg0fSxpc0xpbms6ZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09NDA5NjB9LGlzQ2hyZGV2OmZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTgxOTJ9LGlzQmxrZGV2OmZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTI0NTc2fSxpc0ZJRk86ZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09NDA5Nn0saXNTb2NrZXQ6ZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNDkxNTIpPT09NDkxNTJ9LGZsYWdNb2Rlczp7InIiOjAsInJzIjoxMDUyNjcyLCJyKyI6MiwidyI6NTc3LCJ3eCI6NzA1LCJ4dyI6NzA1LCJ3KyI6NTc4LCJ3eCsiOjcwNiwieHcrIjo3MDYsImEiOjEwODksImF4IjoxMjE3LCJ4YSI6MTIxNywiYSsiOjEwOTAsImF4KyI6MTIxOCwieGErIjoxMjE4fSxtb2RlU3RyaW5nVG9GbGFnczpmdW5jdGlvbihzdHIpe3ZhciBmbGFncz1GUy5mbGFnTW9kZXNbc3RyXTtpZih0eXBlb2YgZmxhZ3M9PT0idW5kZWZpbmVkIil7dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAiK3N0cil9cmV0dXJuIGZsYWdzfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZzpmdW5jdGlvbihmbGFnKXt2YXIgcGVybXM9WyJyIiwidyIsInJ3Il1bZmxhZyYzXTtpZihmbGFnJjUxMil7cGVybXMrPSJ3In1yZXR1cm4gcGVybXN9LG5vZGVQZXJtaXNzaW9uczpmdW5jdGlvbihub2RlLHBlcm1zKXtpZihGUy5pZ25vcmVQZXJtaXNzaW9ucyl7cmV0dXJuIDB9aWYocGVybXMuaW5kZXhPZigiciIpIT09LTEmJiEobm9kZS5tb2RlJjI5Mikpe3JldHVybiAyfWVsc2UgaWYocGVybXMuaW5kZXhPZigidyIpIT09LTEmJiEobm9kZS5tb2RlJjE0Nikpe3JldHVybiAyfWVsc2UgaWYocGVybXMuaW5kZXhPZigieCIpIT09LTEmJiEobm9kZS5tb2RlJjczKSl7cmV0dXJuIDJ9cmV0dXJuIDB9LG1heUxvb2t1cDpmdW5jdGlvbihkaXIpe3ZhciBlcnJDb2RlPUZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsIngiKTtpZihlcnJDb2RlKXJldHVybiBlcnJDb2RlO2lmKCFkaXIubm9kZV9vcHMubG9va3VwKXJldHVybiAyO3JldHVybiAwfSxtYXlDcmVhdGU6ZnVuY3Rpb24oZGlyLG5hbWUpe3RyeXt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKGRpcixuYW1lKTtyZXR1cm4gMjB9Y2F0Y2goZSl7fXJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLCJ3eCIpfSxtYXlEZWxldGU6ZnVuY3Rpb24oZGlyLG5hbWUsaXNkaXIpe3ZhciBub2RlO3RyeXtub2RlPUZTLmxvb2t1cE5vZGUoZGlyLG5hbWUpfWNhdGNoKGUpe3JldHVybiBlLmVycm5vfXZhciBlcnJDb2RlPUZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsInd4Iik7aWYoZXJyQ29kZSl7cmV0dXJuIGVyckNvZGV9aWYoaXNkaXIpe2lmKCFGUy5pc0Rpcihub2RlLm1vZGUpKXtyZXR1cm4gNTR9aWYoRlMuaXNSb290KG5vZGUpfHxGUy5nZXRQYXRoKG5vZGUpPT09RlMuY3dkKCkpe3JldHVybiAxMH19ZWxzZXtpZihGUy5pc0Rpcihub2RlLm1vZGUpKXtyZXR1cm4gMzF9fXJldHVybiAwfSxtYXlPcGVuOmZ1bmN0aW9uKG5vZGUsZmxhZ3Mpe2lmKCFub2RlKXtyZXR1cm4gNDR9aWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe3JldHVybiAzMn1lbHNlIGlmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2lmKEZTLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzKSE9PSJyInx8ZmxhZ3MmNTEyKXtyZXR1cm4gMzF9fXJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMobm9kZSxGUy5mbGFnc1RvUGVybWlzc2lvblN0cmluZyhmbGFncykpfSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQ6ZnVuY3Rpb24oZmRfc3RhcnQsZmRfZW5kKXtmZF9zdGFydD1mZF9zdGFydHx8MDtmZF9lbmQ9ZmRfZW5kfHxGUy5NQVhfT1BFTl9GRFM7Zm9yKHZhciBmZD1mZF9zdGFydDtmZDw9ZmRfZW5kO2ZkKyspe2lmKCFGUy5zdHJlYW1zW2ZkXSl7cmV0dXJuIGZkfX10aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMyl9LGdldFN0cmVhbTpmdW5jdGlvbihmZCl7cmV0dXJuIEZTLnN0cmVhbXNbZmRdfSxjcmVhdGVTdHJlYW06ZnVuY3Rpb24oc3RyZWFtLGZkX3N0YXJ0LGZkX2VuZCl7aWYoIUZTLkZTU3RyZWFtKXtGUy5GU1N0cmVhbT1mdW5jdGlvbigpe307RlMuRlNTdHJlYW0ucHJvdG90eXBlPXtvYmplY3Q6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGV9LHNldDpmdW5jdGlvbih2YWwpe3RoaXMubm9kZT12YWx9fSxpc1JlYWQ6e2dldDpmdW5jdGlvbigpe3JldHVybih0aGlzLmZsYWdzJjIwOTcxNTUpIT09MX19LGlzV3JpdGU6e2dldDpmdW5jdGlvbigpe3JldHVybih0aGlzLmZsYWdzJjIwOTcxNTUpIT09MH19LGlzQXBwZW5kOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mbGFncyYxMDI0fX19fXZhciBuZXdTdHJlYW09bmV3IEZTLkZTU3RyZWFtO2Zvcih2YXIgcCBpbiBzdHJlYW0pe25ld1N0cmVhbVtwXT1zdHJlYW1bcF19c3RyZWFtPW5ld1N0cmVhbTt2YXIgZmQ9RlMubmV4dGZkKGZkX3N0YXJ0LGZkX2VuZCk7c3RyZWFtLmZkPWZkO0ZTLnN0cmVhbXNbZmRdPXN0cmVhbTtyZXR1cm4gc3RyZWFtfSxjbG9zZVN0cmVhbTpmdW5jdGlvbihmZCl7RlMuc3RyZWFtc1tmZF09bnVsbH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW46ZnVuY3Rpb24oc3RyZWFtKXt2YXIgZGV2aWNlPUZTLmdldERldmljZShzdHJlYW0ubm9kZS5yZGV2KTtzdHJlYW0uc3RyZWFtX29wcz1kZXZpY2Uuc3RyZWFtX29wcztpZihzdHJlYW0uc3RyZWFtX29wcy5vcGVuKXtzdHJlYW0uc3RyZWFtX29wcy5vcGVuKHN0cmVhbSl9fSxsbHNlZWs6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig3MCl9fSxtYWpvcjpmdW5jdGlvbihkZXYpe3JldHVybiBkZXY+Pjh9LG1pbm9yOmZ1bmN0aW9uKGRldil7cmV0dXJuIGRldiYyNTV9LG1ha2VkZXY6ZnVuY3Rpb24obWEsbWkpe3JldHVybiBtYTw8OHxtaX0scmVnaXN0ZXJEZXZpY2U6ZnVuY3Rpb24oZGV2LG9wcyl7RlMuZGV2aWNlc1tkZXZdPXtzdHJlYW1fb3BzOm9wc319LGdldERldmljZTpmdW5jdGlvbihkZXYpe3JldHVybiBGUy5kZXZpY2VzW2Rldl19LGdldE1vdW50czpmdW5jdGlvbihtb3VudCl7dmFyIG1vdW50cz1bXTt2YXIgY2hlY2s9W21vdW50XTt3aGlsZShjaGVjay5sZW5ndGgpe3ZhciBtPWNoZWNrLnBvcCgpO21vdW50cy5wdXNoKG0pO2NoZWNrLnB1c2guYXBwbHkoY2hlY2ssbS5tb3VudHMpfXJldHVybiBtb3VudHN9LHN5bmNmczpmdW5jdGlvbihwb3B1bGF0ZSxjYWxsYmFjayl7aWYodHlwZW9mIHBvcHVsYXRlPT09ImZ1bmN0aW9uIil7Y2FsbGJhY2s9cG9wdWxhdGU7cG9wdWxhdGU9ZmFsc2V9RlMuc3luY0ZTUmVxdWVzdHMrKztpZihGUy5zeW5jRlNSZXF1ZXN0cz4xKXtlcnIoIndhcm5pbmc6ICIrRlMuc3luY0ZTUmVxdWVzdHMrIiBGUy5zeW5jZnMgb3BlcmF0aW9ucyBpbiBmbGlnaHQgYXQgb25jZSwgcHJvYmFibHkganVzdCBkb2luZyBleHRyYSB3b3JrIil9dmFyIG1vdW50cz1GUy5nZXRNb3VudHMoRlMucm9vdC5tb3VudCk7dmFyIGNvbXBsZXRlZD0wO2Z1bmN0aW9uIGRvQ2FsbGJhY2soZXJyQ29kZSl7RlMuc3luY0ZTUmVxdWVzdHMtLTtyZXR1cm4gY2FsbGJhY2soZXJyQ29kZSl9ZnVuY3Rpb24gZG9uZShlcnJDb2RlKXtpZihlcnJDb2RlKXtpZighZG9uZS5lcnJvcmVkKXtkb25lLmVycm9yZWQ9dHJ1ZTtyZXR1cm4gZG9DYWxsYmFjayhlcnJDb2RlKX1yZXR1cm59aWYoKytjb21wbGV0ZWQ+PW1vdW50cy5sZW5ndGgpe2RvQ2FsbGJhY2sobnVsbCl9fW1vdW50cy5mb3JFYWNoKGZ1bmN0aW9uKG1vdW50KXtpZighbW91bnQudHlwZS5zeW5jZnMpe3JldHVybiBkb25lKG51bGwpfW1vdW50LnR5cGUuc3luY2ZzKG1vdW50LHBvcHVsYXRlLGRvbmUpfSl9LG1vdW50OmZ1bmN0aW9uKHR5cGUsb3B0cyxtb3VudHBvaW50KXt2YXIgcm9vdD1tb3VudHBvaW50PT09Ii8iO3ZhciBwc2V1ZG89IW1vdW50cG9pbnQ7dmFyIG5vZGU7aWYocm9vdCYmRlMucm9vdCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTApfWVsc2UgaWYoIXJvb3QmJiFwc2V1ZG8pe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChtb3VudHBvaW50LHtmb2xsb3dfbW91bnQ6ZmFsc2V9KTttb3VudHBvaW50PWxvb2t1cC5wYXRoO25vZGU9bG9va3VwLm5vZGU7aWYoRlMuaXNNb3VudHBvaW50KG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCl9aWYoIUZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDU0KX19dmFyIG1vdW50PXt0eXBlOnR5cGUsb3B0czpvcHRzLG1vdW50cG9pbnQ6bW91bnRwb2ludCxtb3VudHM6W119O3ZhciBtb3VudFJvb3Q9dHlwZS5tb3VudChtb3VudCk7bW91bnRSb290Lm1vdW50PW1vdW50O21vdW50LnJvb3Q9bW91bnRSb290O2lmKHJvb3Qpe0ZTLnJvb3Q9bW91bnRSb290fWVsc2UgaWYobm9kZSl7bm9kZS5tb3VudGVkPW1vdW50O2lmKG5vZGUubW91bnQpe25vZGUubW91bnQubW91bnRzLnB1c2gobW91bnQpfX1yZXR1cm4gbW91bnRSb290fSx1bm1vdW50OmZ1bmN0aW9uKG1vdW50cG9pbnQpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChtb3VudHBvaW50LHtmb2xsb3dfbW91bnQ6ZmFsc2V9KTtpZighRlMuaXNNb3VudHBvaW50KGxvb2t1cC5ub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfXZhciBub2RlPWxvb2t1cC5ub2RlO3ZhciBtb3VudD1ub2RlLm1vdW50ZWQ7dmFyIG1vdW50cz1GUy5nZXRNb3VudHMobW91bnQpO09iamVjdC5rZXlzKEZTLm5hbWVUYWJsZSkuZm9yRWFjaChmdW5jdGlvbihoYXNoKXt2YXIgY3VycmVudD1GUy5uYW1lVGFibGVbaGFzaF07d2hpbGUoY3VycmVudCl7dmFyIG5leHQ9Y3VycmVudC5uYW1lX25leHQ7aWYobW91bnRzLmluZGV4T2YoY3VycmVudC5tb3VudCkhPT0tMSl7RlMuZGVzdHJveU5vZGUoY3VycmVudCl9Y3VycmVudD1uZXh0fX0pO25vZGUubW91bnRlZD1udWxsO3ZhciBpZHg9bm9kZS5tb3VudC5tb3VudHMuaW5kZXhPZihtb3VudCk7bm9kZS5tb3VudC5tb3VudHMuc3BsaWNlKGlkeCwxKX0sbG9va3VwOmZ1bmN0aW9uKHBhcmVudCxuYW1lKXtyZXR1cm4gcGFyZW50Lm5vZGVfb3BzLmxvb2t1cChwYXJlbnQsbmFtZSl9LG1rbm9kOmZ1bmN0aW9uKHBhdGgsbW9kZSxkZXYpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTtpZighbmFtZXx8bmFtZT09PSIuInx8bmFtZT09PSIuLiIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX12YXIgZXJyQ29kZT1GUy5tYXlDcmVhdGUocGFyZW50LG5hbWUpO2lmKGVyckNvZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpfWlmKCFwYXJlbnQubm9kZV9vcHMubWtub2Qpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKX1yZXR1cm4gcGFyZW50Lm5vZGVfb3BzLm1rbm9kKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0sY3JlYXRlOmZ1bmN0aW9uKHBhdGgsbW9kZSl7bW9kZT1tb2RlIT09dW5kZWZpbmVkP21vZGU6NDM4O21vZGUmPTQwOTU7bW9kZXw9MzI3Njg7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSwwKX0sbWtkaXI6ZnVuY3Rpb24ocGF0aCxtb2RlKXttb2RlPW1vZGUhPT11bmRlZmluZWQ/bW9kZTo1MTE7bW9kZSY9NTExfDUxMjttb2RlfD0xNjM4NDtyZXR1cm4gRlMubWtub2QocGF0aCxtb2RlLDApfSxta2RpclRyZWU6ZnVuY3Rpb24ocGF0aCxtb2RlKXt2YXIgZGlycz1wYXRoLnNwbGl0KCIvIik7dmFyIGQ9IiI7Zm9yKHZhciBpPTA7aTxkaXJzLmxlbmd0aDsrK2kpe2lmKCFkaXJzW2ldKWNvbnRpbnVlO2QrPSIvIitkaXJzW2ldO3RyeXtGUy5ta2RpcihkLG1vZGUpfWNhdGNoKGUpe2lmKGUuZXJybm8hPTIwKXRocm93IGV9fX0sbWtkZXY6ZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7aWYodHlwZW9mIGRldj09PSJ1bmRlZmluZWQiKXtkZXY9bW9kZTttb2RlPTQzOH1tb2RlfD04MTkyO3JldHVybiBGUy5ta25vZChwYXRoLG1vZGUsZGV2KX0sc3ltbGluazpmdW5jdGlvbihvbGRwYXRoLG5ld3BhdGgpe2lmKCFQQVRIX0ZTLnJlc29sdmUob2xkcGF0aCkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KX12YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgobmV3cGF0aCx7cGFyZW50OnRydWV9KTt2YXIgcGFyZW50PWxvb2t1cC5ub2RlO2lmKCFwYXJlbnQpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KX12YXIgbmV3bmFtZT1QQVRILmJhc2VuYW1lKG5ld3BhdGgpO3ZhciBlcnJDb2RlPUZTLm1heUNyZWF0ZShwYXJlbnQsbmV3bmFtZSk7aWYoZXJyQ29kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSl9aWYoIXBhcmVudC5ub2RlX29wcy5zeW1saW5rKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myl9cmV0dXJuIHBhcmVudC5ub2RlX29wcy5zeW1saW5rKHBhcmVudCxuZXduYW1lLG9sZHBhdGgpfSxyZW5hbWU6ZnVuY3Rpb24ob2xkX3BhdGgsbmV3X3BhdGgpe3ZhciBvbGRfZGlybmFtZT1QQVRILmRpcm5hbWUob2xkX3BhdGgpO3ZhciBuZXdfZGlybmFtZT1QQVRILmRpcm5hbWUobmV3X3BhdGgpO3ZhciBvbGRfbmFtZT1QQVRILmJhc2VuYW1lKG9sZF9wYXRoKTt2YXIgbmV3X25hbWU9UEFUSC5iYXNlbmFtZShuZXdfcGF0aCk7dmFyIGxvb2t1cCxvbGRfZGlyLG5ld19kaXI7dHJ5e2xvb2t1cD1GUy5sb29rdXBQYXRoKG9sZF9wYXRoLHtwYXJlbnQ6dHJ1ZX0pO29sZF9kaXI9bG9va3VwLm5vZGU7bG9va3VwPUZTLmxvb2t1cFBhdGgobmV3X3BhdGgse3BhcmVudDp0cnVlfSk7bmV3X2Rpcj1sb29rdXAubm9kZX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCl9aWYoIW9sZF9kaXJ8fCFuZXdfZGlyKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTtpZihvbGRfZGlyLm1vdW50IT09bmV3X2Rpci5tb3VudCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzUpfXZhciBvbGRfbm9kZT1GUy5sb29rdXBOb2RlKG9sZF9kaXIsb2xkX25hbWUpO3ZhciByZWxhdGl2ZT1QQVRIX0ZTLnJlbGF0aXZlKG9sZF9wYXRoLG5ld19kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT0iLiIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX1yZWxhdGl2ZT1QQVRIX0ZTLnJlbGF0aXZlKG5ld19wYXRoLG9sZF9kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT0iLiIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDU1KX12YXIgbmV3X25vZGU7dHJ5e25ld19ub2RlPUZTLmxvb2t1cE5vZGUobmV3X2RpcixuZXdfbmFtZSl9Y2F0Y2goZSl7fWlmKG9sZF9ub2RlPT09bmV3X25vZGUpe3JldHVybn12YXIgaXNkaXI9RlMuaXNEaXIob2xkX25vZGUubW9kZSk7dmFyIGVyckNvZGU9RlMubWF5RGVsZXRlKG9sZF9kaXIsb2xkX25hbWUsaXNkaXIpO2lmKGVyckNvZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpfWVyckNvZGU9bmV3X25vZGU/RlMubWF5RGVsZXRlKG5ld19kaXIsbmV3X25hbWUsaXNkaXIpOkZTLm1heUNyZWF0ZShuZXdfZGlyLG5ld19uYW1lKTtpZihlcnJDb2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKX1pZighb2xkX2Rpci5ub2RlX29wcy5yZW5hbWUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKX1pZihGUy5pc01vdW50cG9pbnQob2xkX25vZGUpfHxuZXdfbm9kZSYmRlMuaXNNb3VudHBvaW50KG5ld19ub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTApfWlmKG5ld19kaXIhPT1vbGRfZGlyKXtlcnJDb2RlPUZTLm5vZGVQZXJtaXNzaW9ucyhvbGRfZGlyLCJ3Iik7aWYoZXJyQ29kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSl9fXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsTW92ZVBhdGgiXSl7RlMudHJhY2tpbmdEZWxlZ2F0ZVsid2lsbE1vdmVQYXRoIl0ob2xkX3BhdGgsbmV3X3BhdGgpfX1jYXRjaChlKXtlcnIoIkZTLnRyYWNraW5nRGVsZWdhdGVbJ3dpbGxNb3ZlUGF0aCddKCciK29sZF9wYXRoKyInLCAnIituZXdfcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9RlMuaGFzaFJlbW92ZU5vZGUob2xkX25vZGUpO3RyeXtvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZShvbGRfbm9kZSxuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt0aHJvdyBlfWZpbmFsbHl7RlMuaGFzaEFkZE5vZGUob2xkX25vZGUpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbk1vdmVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Nb3ZlUGF0aCJdKG9sZF9wYXRoLG5ld19wYXRoKX1jYXRjaChlKXtlcnIoIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uTW92ZVBhdGgnXSgnIitvbGRfcGF0aCsiJywgJyIrbmV3X3BhdGgrIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UpfX0scm1kaXI6ZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyIHBhcmVudD1sb29rdXAubm9kZTt2YXIgbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO3ZhciBlcnJDb2RlPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSx0cnVlKTtpZihlcnJDb2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKX1pZighcGFyZW50Lm5vZGVfb3BzLnJtZGlyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myl9aWYoRlMuaXNNb3VudHBvaW50KG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCl9dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0ocGF0aCl9fWNhdGNoKGUpe2VycigiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMucm1kaXIocGFyZW50LG5hbWUpO0ZTLmRlc3Ryb3lOb2RlKG5vZGUpO3RyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXSlGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXShwYXRoKX1jYXRjaChlKXtlcnIoIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uRGVsZXRlUGF0aCddKCciK3BhdGgrIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UpfX0scmVhZGRpcjpmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtpZighbm9kZS5ub2RlX29wcy5yZWFkZGlyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCl9cmV0dXJuIG5vZGUubm9kZV9vcHMucmVhZGRpcihub2RlKX0sdW5saW5rOmZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyQ29kZT1GUy5tYXlEZWxldGUocGFyZW50LG5hbWUsZmFsc2UpO2lmKGVyckNvZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpfWlmKCFwYXJlbnQubm9kZV9vcHMudW5saW5rKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myl9aWYoRlMuaXNNb3VudHBvaW50KG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCl9dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0ocGF0aCl9fWNhdGNoKGUpe2VycigiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMudW5saW5rKHBhcmVudCxuYW1lKTtGUy5kZXN0cm95Tm9kZShub2RlKTt0cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0ocGF0aCl9Y2F0Y2goZSl7ZXJyKCJGUy50cmFja2luZ0RlbGVnYXRlWydvbkRlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX19LHJlYWRsaW5rOmZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTt2YXIgbGluaz1sb29rdXAubm9kZTtpZighbGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpfWlmKCFsaW5rLm5vZGVfb3BzLnJlYWRsaW5rKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9cmV0dXJuIFBBVEhfRlMucmVzb2x2ZShGUy5nZXRQYXRoKGxpbmsucGFyZW50KSxsaW5rLm5vZGVfb3BzLnJlYWRsaW5rKGxpbmspKX0sc3RhdDpmdW5jdGlvbihwYXRoLGRvbnRGb2xsb3cpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRGb2xsb3d9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtpZighbm9kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpfWlmKCFub2RlLm5vZGVfb3BzLmdldGF0dHIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKX1yZXR1cm4gbm9kZS5ub2RlX29wcy5nZXRhdHRyKG5vZGUpfSxsc3RhdDpmdW5jdGlvbihwYXRoKXtyZXR1cm4gRlMuc3RhdChwYXRoLHRydWUpfSxjaG1vZDpmdW5jdGlvbihwYXRoLG1vZGUsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzohZG9udEZvbGxvd30pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHttb2RlOm1vZGUmNDA5NXxub2RlLm1vZGUmfjQwOTUsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sbGNobW9kOmZ1bmN0aW9uKHBhdGgsbW9kZSl7RlMuY2htb2QocGF0aCxtb2RlLHRydWUpfSxmY2htb2Q6ZnVuY3Rpb24oZmQsbW9kZSl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfUZTLmNobW9kKHN0cmVhbS5ub2RlLG1vZGUpfSxjaG93bjpmdW5jdGlvbihwYXRoLHVpZCxnaWQsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzohZG9udEZvbGxvd30pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd246ZnVuY3Rpb24ocGF0aCx1aWQsZ2lkKXtGUy5jaG93bihwYXRoLHVpZCxnaWQsdHJ1ZSl9LGZjaG93bjpmdW5jdGlvbihmZCx1aWQsZ2lkKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCl9RlMuY2hvd24oc3RyZWFtLm5vZGUsdWlkLGdpZCl9LHRydW5jYXRlOmZ1bmN0aW9uKHBhdGgsbGVuKXtpZihsZW48MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfXZhciBub2RlO2lmKHR5cGVvZiBwYXRoPT09InN0cmluZyIpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6dHJ1ZX0pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpfWlmKEZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDMxKX1pZighRlMuaXNGaWxlKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX12YXIgZXJyQ29kZT1GUy5ub2RlUGVybWlzc2lvbnMobm9kZSwidyIpO2lmKGVyckNvZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHtzaXplOmxlbix0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxmdHJ1bmNhdGU6ZnVuY3Rpb24oZmQsbGVuKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX1GUy50cnVuY2F0ZShzdHJlYW0ubm9kZSxsZW4pfSx1dGltZTpmdW5jdGlvbihwYXRoLGF0aW1lLG10aW1lKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7dGltZXN0YW1wOk1hdGgubWF4KGF0aW1lLG10aW1lKX0pfSxvcGVuOmZ1bmN0aW9uKHBhdGgsZmxhZ3MsbW9kZSxmZF9zdGFydCxmZF9lbmQpe2lmKHBhdGg9PT0iIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpfWZsYWdzPXR5cGVvZiBmbGFncz09PSJzdHJpbmciP0ZTLm1vZGVTdHJpbmdUb0ZsYWdzKGZsYWdzKTpmbGFnczttb2RlPXR5cGVvZiBtb2RlPT09InVuZGVmaW5lZCI/NDM4Om1vZGU7aWYoZmxhZ3MmNjQpe21vZGU9bW9kZSY0MDk1fDMyNzY4fWVsc2V7bW9kZT0wfXZhciBub2RlO2lmKHR5cGVvZiBwYXRoPT09Im9iamVjdCIpe25vZGU9cGF0aH1lbHNle3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IShmbGFncyYxMzEwNzIpfSk7bm9kZT1sb29rdXAubm9kZX1jYXRjaChlKXt9fXZhciBjcmVhdGVkPWZhbHNlO2lmKGZsYWdzJjY0KXtpZihub2RlKXtpZihmbGFncyYxMjgpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDIwKX19ZWxzZXtub2RlPUZTLm1rbm9kKHBhdGgsbW9kZSwwKTtjcmVhdGVkPXRydWV9fWlmKCFub2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCl9aWYoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSl7ZmxhZ3MmPX41MTJ9aWYoZmxhZ3MmNjU1MzYmJiFGUy5pc0Rpcihub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCl9aWYoIWNyZWF0ZWQpe3ZhciBlcnJDb2RlPUZTLm1heU9wZW4obm9kZSxmbGFncyk7aWYoZXJyQ29kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSl9fWlmKGZsYWdzJjUxMil7RlMudHJ1bmNhdGUobm9kZSwwKX1mbGFncyY9figxMjh8NTEyfDEzMTA3Mik7dmFyIHN0cmVhbT1GUy5jcmVhdGVTdHJlYW0oe25vZGU6bm9kZSxwYXRoOkZTLmdldFBhdGgobm9kZSksZmxhZ3M6ZmxhZ3Msc2Vla2FibGU6dHJ1ZSxwb3NpdGlvbjowLHN0cmVhbV9vcHM6bm9kZS5zdHJlYW1fb3BzLHVuZ290dGVuOltdLGVycm9yOmZhbHNlfSxmZF9zdGFydCxmZF9lbmQpO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX1pZihNb2R1bGVbImxvZ1JlYWRGaWxlcyJdJiYhKGZsYWdzJjEpKXtpZighRlMucmVhZEZpbGVzKUZTLnJlYWRGaWxlcz17fTtpZighKHBhdGggaW4gRlMucmVhZEZpbGVzKSl7RlMucmVhZEZpbGVzW3BhdGhdPTE7ZXJyKCJGUy50cmFja2luZ0RlbGVnYXRlIGVycm9yIG9uIHJlYWQgZmlsZTogIitwYXRoKX19dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbIm9uT3BlbkZpbGUiXSl7dmFyIHRyYWNraW5nRmxhZ3M9MDtpZigoZmxhZ3MmMjA5NzE1NSkhPT0xKXt0cmFja2luZ0ZsYWdzfD1GUy50cmFja2luZy5vcGVuRmxhZ3MuUkVBRH1pZigoZmxhZ3MmMjA5NzE1NSkhPT0wKXt0cmFja2luZ0ZsYWdzfD1GUy50cmFja2luZy5vcGVuRmxhZ3MuV1JJVEV9RlMudHJhY2tpbmdEZWxlZ2F0ZVsib25PcGVuRmlsZSJdKHBhdGgsdHJhY2tpbmdGbGFncyl9fWNhdGNoKGUpe2VycigiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25PcGVuRmlsZSddKCciK3BhdGgrIicsIGZsYWdzKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1yZXR1cm4gc3RyZWFtfSxjbG9zZTpmdW5jdGlvbihzdHJlYW0pe2lmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKHN0cmVhbS5nZXRkZW50cylzdHJlYW0uZ2V0ZGVudHM9bnVsbDt0cnl7aWYoc3RyZWFtLnN0cmVhbV9vcHMuY2xvc2Upe3N0cmVhbS5zdHJlYW1fb3BzLmNsb3NlKHN0cmVhbSl9fWNhdGNoKGUpe3Rocm93IGV9ZmluYWxseXtGUy5jbG9zZVN0cmVhbShzdHJlYW0uZmQpfXN0cmVhbS5mZD1udWxsfSxpc0Nsb3NlZDpmdW5jdGlvbihzdHJlYW0pe3JldHVybiBzdHJlYW0uZmQ9PT1udWxsfSxsbHNlZWs6ZnVuY3Rpb24oc3RyZWFtLG9mZnNldCx3aGVuY2Upe2lmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKCFzdHJlYW0uc2Vla2FibGV8fCFzdHJlYW0uc3RyZWFtX29wcy5sbHNlZWspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKX1pZih3aGVuY2UhPTAmJndoZW5jZSE9MSYmd2hlbmNlIT0yKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9c3RyZWFtLnBvc2l0aW9uPXN0cmVhbS5zdHJlYW1fb3BzLmxsc2VlayhzdHJlYW0sb2Zmc2V0LHdoZW5jZSk7c3RyZWFtLnVuZ290dGVuPVtdO3JldHVybiBzdHJlYW0ucG9zaXRpb259LHJlYWQ6ZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfWlmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0xKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzEpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy5yZWFkKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCl9dmFyIHNlZWtpbmc9dHlwZW9mIHBvc2l0aW9uIT09InVuZGVmaW5lZCI7aWYoIXNlZWtpbmcpe3Bvc2l0aW9uPXN0cmVhbS5wb3NpdGlvbn1lbHNlIGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKX12YXIgYnl0ZXNSZWFkPXN0cmVhbS5zdHJlYW1fb3BzLnJlYWQoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKTtpZighc2Vla2luZylzdHJlYW0ucG9zaXRpb24rPWJ5dGVzUmVhZDtyZXR1cm4gYnl0ZXNSZWFkfSx3cml0ZTpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24sY2FuT3duKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfWlmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzEpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy53cml0ZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpfWlmKHN0cmVhbS5zZWVrYWJsZSYmc3RyZWFtLmZsYWdzJjEwMjQpe0ZTLmxsc2VlayhzdHJlYW0sMCwyKX12YXIgc2Vla2luZz10eXBlb2YgcG9zaXRpb24hPT0idW5kZWZpbmVkIjtpZighc2Vla2luZyl7cG9zaXRpb249c3RyZWFtLnBvc2l0aW9ufWVsc2UgaWYoIXN0cmVhbS5zZWVrYWJsZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzApfXZhciBieXRlc1dyaXR0ZW49c3RyZWFtLnN0cmVhbV9vcHMud3JpdGUoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bik7aWYoIXNlZWtpbmcpc3RyZWFtLnBvc2l0aW9uKz1ieXRlc1dyaXR0ZW47dHJ5e2lmKHN0cmVhbS5wYXRoJiZGUy50cmFja2luZ0RlbGVnYXRlWyJvbldyaXRlVG9GaWxlIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Xcml0ZVRvRmlsZSJdKHN0cmVhbS5wYXRoKX1jYXRjaChlKXtlcnIoIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uV3JpdGVUb0ZpbGUnXSgnIitzdHJlYW0ucGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9cmV0dXJuIGJ5dGVzV3JpdHRlbn0sYWxsb2NhdGU6ZnVuY3Rpb24oc3RyZWFtLG9mZnNldCxsZW5ndGgpe2lmKEZTLmlzQ2xvc2VkKHN0cmVhbSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpfWlmKG9mZnNldDwwfHxsZW5ndGg8PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KX1pZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCl9aWYoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSYmIUZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myl9aWYoIXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMzgpfXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKX0sbW1hcDpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24scHJvdCxmbGFncyl7aWYoKHByb3QmMikhPT0wJiYoZmxhZ3MmMik9PT0wJiYoc3RyZWFtLmZsYWdzJjIwOTcxNTUpIT09Mil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMil9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDIpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy5tbWFwKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myl9cmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1tYXAoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3MpfSxtc3luYzpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgsbW1hcEZsYWdzKXtpZighc3RyZWFtfHwhc3RyZWFtLnN0cmVhbV9vcHMubXN5bmMpe3JldHVybiAwfXJldHVybiBzdHJlYW0uc3RyZWFtX29wcy5tc3luYyhzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgsbW1hcEZsYWdzKX0sbXVubWFwOmZ1bmN0aW9uKHN0cmVhbSl7cmV0dXJuIDB9LGlvY3RsOmZ1bmN0aW9uKHN0cmVhbSxjbWQsYXJnKXtpZighc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDU5KX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwoc3RyZWFtLGNtZCxhcmcpfSxyZWFkRmlsZTpmdW5jdGlvbihwYXRoLG9wdHMpe29wdHM9b3B0c3x8e307b3B0cy5mbGFncz1vcHRzLmZsYWdzfHwiciI7b3B0cy5lbmNvZGluZz1vcHRzLmVuY29kaW5nfHwiYmluYXJ5IjtpZihvcHRzLmVuY29kaW5nIT09InV0ZjgiJiZvcHRzLmVuY29kaW5nIT09ImJpbmFyeSIpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmNvZGluZyB0eXBlICInK29wdHMuZW5jb2RpbmcrJyInKX12YXIgcmV0O3ZhciBzdHJlYW09RlMub3BlbihwYXRoLG9wdHMuZmxhZ3MpO3ZhciBzdGF0PUZTLnN0YXQocGF0aCk7dmFyIGxlbmd0aD1zdGF0LnNpemU7dmFyIGJ1Zj1uZXcgVWludDhBcnJheShsZW5ndGgpO0ZTLnJlYWQoc3RyZWFtLGJ1ZiwwLGxlbmd0aCwwKTtpZihvcHRzLmVuY29kaW5nPT09InV0ZjgiKXtyZXQ9VVRGOEFycmF5VG9TdHJpbmcoYnVmLDApfWVsc2UgaWYob3B0cy5lbmNvZGluZz09PSJiaW5hcnkiKXtyZXQ9YnVmfUZTLmNsb3NlKHN0cmVhbSk7cmV0dXJuIHJldH0sd3JpdGVGaWxlOmZ1bmN0aW9uKHBhdGgsZGF0YSxvcHRzKXtvcHRzPW9wdHN8fHt9O29wdHMuZmxhZ3M9b3B0cy5mbGFnc3x8InciO3ZhciBzdHJlYW09RlMub3BlbihwYXRoLG9wdHMuZmxhZ3Msb3B0cy5tb2RlKTtpZih0eXBlb2YgZGF0YT09PSJzdHJpbmciKXt2YXIgYnVmPW5ldyBVaW50OEFycmF5KGxlbmd0aEJ5dGVzVVRGOChkYXRhKSsxKTt2YXIgYWN0dWFsTnVtQnl0ZXM9c3RyaW5nVG9VVEY4QXJyYXkoZGF0YSxidWYsMCxidWYubGVuZ3RoKTtGUy53cml0ZShzdHJlYW0sYnVmLDAsYWN0dWFsTnVtQnl0ZXMsdW5kZWZpbmVkLG9wdHMuY2FuT3duKX1lbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhkYXRhKSl7RlMud3JpdGUoc3RyZWFtLGRhdGEsMCxkYXRhLmJ5dGVMZW5ndGgsdW5kZWZpbmVkLG9wdHMuY2FuT3duKX1lbHNle3Rocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgZGF0YSB0eXBlIil9RlMuY2xvc2Uoc3RyZWFtKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIEZTLmN1cnJlbnRQYXRofSxjaGRpcjpmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTtpZihsb29rdXAubm9kZT09PW51bGwpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KX1pZighRlMuaXNEaXIobG9va3VwLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKDU0KX12YXIgZXJyQ29kZT1GUy5ub2RlUGVybWlzc2lvbnMobG9va3VwLm5vZGUsIngiKTtpZihlcnJDb2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKX1GUy5jdXJyZW50UGF0aD1sb29rdXAucGF0aH0sY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzOmZ1bmN0aW9uKCl7RlMubWtkaXIoIi90bXAiKTtGUy5ta2RpcigiL2hvbWUiKTtGUy5ta2RpcigiL2hvbWUvd2ViX3VzZXIiKX0sY3JlYXRlRGVmYXVsdERldmljZXM6ZnVuY3Rpb24oKXtGUy5ta2RpcigiL2RldiIpO0ZTLnJlZ2lzdGVyRGV2aWNlKEZTLm1ha2VkZXYoMSwzKSx7cmVhZDpmdW5jdGlvbigpe3JldHVybiAwfSx3cml0ZTpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtyZXR1cm4gbGVuZ3RofX0pO0ZTLm1rZGV2KCIvZGV2L251bGwiLEZTLm1ha2VkZXYoMSwzKSk7VFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNSwwKSxUVFkuZGVmYXVsdF90dHlfb3BzKTtUVFkucmVnaXN0ZXIoRlMubWFrZWRldig2LDApLFRUWS5kZWZhdWx0X3R0eTFfb3BzKTtGUy5ta2RldigiL2Rldi90dHkiLEZTLm1ha2VkZXYoNSwwKSk7RlMubWtkZXYoIi9kZXYvdHR5MSIsRlMubWFrZWRldig2LDApKTt2YXIgcmFuZG9tX2RldmljZTtpZih0eXBlb2YgY3J5cHRvPT09Im9iamVjdCImJnR5cGVvZiBjcnlwdG9bImdldFJhbmRvbVZhbHVlcyJdPT09ImZ1bmN0aW9uIil7dmFyIHJhbmRvbUJ1ZmZlcj1uZXcgVWludDhBcnJheSgxKTtyYW5kb21fZGV2aWNlPWZ1bmN0aW9uKCl7Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21CdWZmZXIpO3JldHVybiByYW5kb21CdWZmZXJbMF19fWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7dHJ5e3ZhciBjcnlwdG9fbW9kdWxlPXJlcXVpcmUoImNyeXB0byIpO3JhbmRvbV9kZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gY3J5cHRvX21vZHVsZVsicmFuZG9tQnl0ZXMiXSgxKVswXX19Y2F0Y2goZSl7fX1lbHNle31pZighcmFuZG9tX2RldmljZSl7cmFuZG9tX2RldmljZT1mdW5jdGlvbigpe2Fib3J0KCJyYW5kb21fZGV2aWNlIil9fUZTLmNyZWF0ZURldmljZSgiL2RldiIsInJhbmRvbSIscmFuZG9tX2RldmljZSk7RlMuY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIscmFuZG9tX2RldmljZSk7RlMubWtkaXIoIi9kZXYvc2htIik7RlMubWtkaXIoIi9kZXYvc2htL3RtcCIpfSxjcmVhdGVTcGVjaWFsRGlyZWN0b3JpZXM6ZnVuY3Rpb24oKXtGUy5ta2RpcigiL3Byb2MiKTtGUy5ta2RpcigiL3Byb2Mvc2VsZiIpO0ZTLm1rZGlyKCIvcHJvYy9zZWxmL2ZkIik7RlMubW91bnQoe21vdW50OmZ1bmN0aW9uKCl7dmFyIG5vZGU9RlMuY3JlYXRlTm9kZSgiL3Byb2Mvc2VsZiIsImZkIiwxNjM4NHw1MTEsNzMpO25vZGUubm9kZV9vcHM9e2xvb2t1cDpmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIGZkPStuYW1lO3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZkKTtpZighc3RyZWFtKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpO3ZhciByZXQ9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOmZ1bmN0aW9uKCl7cmV0dXJuIHN0cmVhbS5wYXRofX19O3JldC5wYXJlbnQ9cmV0O3JldHVybiByZXR9fTtyZXR1cm4gbm9kZX19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtczpmdW5jdGlvbigpe2lmKE1vZHVsZVsic3RkaW4iXSl7RlMuY3JlYXRlRGV2aWNlKCIvZGV2Iiwic3RkaW4iLE1vZHVsZVsic3RkaW4iXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKX1pZihNb2R1bGVbInN0ZG91dCJdKXtGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRvdXQiLG51bGwsTW9kdWxlWyJzdGRvdXQiXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0Iil9aWYoTW9kdWxlWyJzdGRlcnIiXSl7RlMuY3JlYXRlRGV2aWNlKCIvZGV2Iiwic3RkZXJyIixudWxsLE1vZHVsZVsic3RkZXJyIl0pfWVsc2V7RlMuc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKX12YXIgc3RkaW49RlMub3BlbigiL2Rldi9zdGRpbiIsInIiKTt2YXIgc3Rkb3V0PUZTLm9wZW4oIi9kZXYvc3Rkb3V0IiwidyIpO3ZhciBzdGRlcnI9RlMub3BlbigiL2Rldi9zdGRlcnIiLCJ3Iil9LGVuc3VyZUVycm5vRXJyb3I6ZnVuY3Rpb24oKXtpZihGUy5FcnJub0Vycm9yKXJldHVybjtGUy5FcnJub0Vycm9yPWZ1bmN0aW9uIEVycm5vRXJyb3IoZXJybm8sbm9kZSl7dGhpcy5ub2RlPW5vZGU7dGhpcy5zZXRFcnJubz1mdW5jdGlvbihlcnJubyl7dGhpcy5lcnJubz1lcnJub307dGhpcy5zZXRFcnJubyhlcnJubyk7dGhpcy5tZXNzYWdlPSJGUyBlcnJvciJ9O0ZTLkVycm5vRXJyb3IucHJvdG90eXBlPW5ldyBFcnJvcjtGUy5FcnJub0Vycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GUy5FcnJub0Vycm9yO1s0NF0uZm9yRWFjaChmdW5jdGlvbihjb2RlKXtGUy5nZW5lcmljRXJyb3JzW2NvZGVdPW5ldyBGUy5FcnJub0Vycm9yKGNvZGUpO0ZTLmdlbmVyaWNFcnJvcnNbY29kZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSl9LHN0YXRpY0luaXQ6ZnVuY3Rpb24oKXtGUy5lbnN1cmVFcnJub0Vycm9yKCk7RlMubmFtZVRhYmxlPW5ldyBBcnJheSg0MDk2KTtGUy5tb3VudChNRU1GUyx7fSwiLyIpO0ZTLmNyZWF0ZURlZmF1bHREaXJlY3RvcmllcygpO0ZTLmNyZWF0ZURlZmF1bHREZXZpY2VzKCk7RlMuY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCk7RlMuZmlsZXN5c3RlbXM9eyJNRU1GUyI6TUVNRlN9fSxpbml0OmZ1bmN0aW9uKGlucHV0LG91dHB1dCxlcnJvcil7RlMuaW5pdC5pbml0aWFsaXplZD10cnVlO0ZTLmVuc3VyZUVycm5vRXJyb3IoKTtNb2R1bGVbInN0ZGluIl09aW5wdXR8fE1vZHVsZVsic3RkaW4iXTtNb2R1bGVbInN0ZG91dCJdPW91dHB1dHx8TW9kdWxlWyJzdGRvdXQiXTtNb2R1bGVbInN0ZGVyciJdPWVycm9yfHxNb2R1bGVbInN0ZGVyciJdO0ZTLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0OmZ1bmN0aW9uKCl7RlMuaW5pdC5pbml0aWFsaXplZD1mYWxzZTt2YXIgZmZsdXNoPU1vZHVsZVsiX2ZmbHVzaCJdO2lmKGZmbHVzaClmZmx1c2goMCk7Zm9yKHZhciBpPTA7aTxGUy5zdHJlYW1zLmxlbmd0aDtpKyspe3ZhciBzdHJlYW09RlMuc3RyZWFtc1tpXTtpZighc3RyZWFtKXtjb250aW51ZX1GUy5jbG9zZShzdHJlYW0pfX0sZ2V0TW9kZTpmdW5jdGlvbihjYW5SZWFkLGNhbldyaXRlKXt2YXIgbW9kZT0wO2lmKGNhblJlYWQpbW9kZXw9MjkyfDczO2lmKGNhbldyaXRlKW1vZGV8PTE0NjtyZXR1cm4gbW9kZX0sam9pblBhdGg6ZnVuY3Rpb24ocGFydHMsZm9yY2VSZWxhdGl2ZSl7dmFyIHBhdGg9UEFUSC5qb2luLmFwcGx5KG51bGwscGFydHMpO2lmKGZvcmNlUmVsYXRpdmUmJnBhdGhbMF09PSIvIilwYXRoPXBhdGguc3Vic3RyKDEpO3JldHVybiBwYXRofSxhYnNvbHV0ZVBhdGg6ZnVuY3Rpb24ocmVsYXRpdmUsYmFzZSl7cmV0dXJuIFBBVEhfRlMucmVzb2x2ZShiYXNlLHJlbGF0aXZlKX0sc3RhbmRhcmRpemVQYXRoOmZ1bmN0aW9uKHBhdGgpe3JldHVybiBQQVRILm5vcm1hbGl6ZShwYXRoKX0sZmluZE9iamVjdDpmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3ZhciByZXQ9RlMuYW5hbHl6ZVBhdGgocGF0aCxkb250UmVzb2x2ZUxhc3RMaW5rKTtpZihyZXQuZXhpc3RzKXtyZXR1cm4gcmV0Lm9iamVjdH1lbHNle3NldEVyck5vKHJldC5lcnJvcik7cmV0dXJuIG51bGx9fSxhbmFseXplUGF0aDpmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3RyeXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cGF0aD1sb29rdXAucGF0aH1jYXRjaChlKXt9dmFyIHJldD17aXNSb290OmZhbHNlLGV4aXN0czpmYWxzZSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOmZhbHNlLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3JldC5wYXJlbnRFeGlzdHM9dHJ1ZTtyZXQucGFyZW50UGF0aD1sb29rdXAucGF0aDtyZXQucGFyZW50T2JqZWN0PWxvb2t1cC5ub2RlO3JldC5uYW1lPVBBVEguYmFzZW5hbWUocGF0aCk7bG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cmV0LmV4aXN0cz10cnVlO3JldC5wYXRoPWxvb2t1cC5wYXRoO3JldC5vYmplY3Q9bG9va3VwLm5vZGU7cmV0Lm5hbWU9bG9va3VwLm5vZGUubmFtZTtyZXQuaXNSb290PWxvb2t1cC5wYXRoPT09Ii8ifWNhdGNoKGUpe3JldC5lcnJvcj1lLmVycm5vfXJldHVybiByZXR9LGNyZWF0ZUZvbGRlcjpmdW5jdGlvbihwYXJlbnQsbmFtZSxjYW5SZWFkLGNhbldyaXRlKXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT0ic3RyaW5nIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpO3ZhciBtb2RlPUZTLmdldE1vZGUoY2FuUmVhZCxjYW5Xcml0ZSk7cmV0dXJuIEZTLm1rZGlyKHBhdGgsbW9kZSl9LGNyZWF0ZVBhdGg6ZnVuY3Rpb24ocGFyZW50LHBhdGgsY2FuUmVhZCxjYW5Xcml0ZSl7cGFyZW50PXR5cGVvZiBwYXJlbnQ9PT0ic3RyaW5nIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpO3ZhciBwYXJ0cz1wYXRoLnNwbGl0KCIvIikucmV2ZXJzZSgpO3doaWxlKHBhcnRzLmxlbmd0aCl7dmFyIHBhcnQ9cGFydHMucG9wKCk7aWYoIXBhcnQpY29udGludWU7dmFyIGN1cnJlbnQ9UEFUSC5qb2luMihwYXJlbnQscGFydCk7dHJ5e0ZTLm1rZGlyKGN1cnJlbnQpfWNhdGNoKGUpe31wYXJlbnQ9Y3VycmVudH1yZXR1cm4gY3VycmVudH0sY3JlYXRlRmlsZTpmdW5jdGlvbihwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpe3ZhciBwYXRoPVBBVEguam9pbjIodHlwZW9mIHBhcmVudD09PSJzdHJpbmciP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMuY3JlYXRlKHBhdGgsbW9kZSl9LGNyZWF0ZURhdGFGaWxlOmZ1bmN0aW9uKHBhcmVudCxuYW1lLGRhdGEsY2FuUmVhZCxjYW5Xcml0ZSxjYW5Pd24pe3ZhciBwYXRoPW5hbWU/UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTpwYXJlbnQ7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTt2YXIgbm9kZT1GUy5jcmVhdGUocGF0aCxtb2RlKTtpZihkYXRhKXtpZih0eXBlb2YgZGF0YT09PSJzdHJpbmciKXt2YXIgYXJyPW5ldyBBcnJheShkYXRhLmxlbmd0aCk7Zm9yKHZhciBpPTAsbGVuPWRhdGEubGVuZ3RoO2k8bGVuOysraSlhcnJbaV09ZGF0YS5jaGFyQ29kZUF0KGkpO2RhdGE9YXJyfUZTLmNobW9kKG5vZGUsbW9kZXwxNDYpO3ZhciBzdHJlYW09RlMub3Blbihub2RlLCJ3Iik7RlMud3JpdGUoc3RyZWFtLGRhdGEsMCxkYXRhLmxlbmd0aCwwLGNhbk93bik7RlMuY2xvc2Uoc3RyZWFtKTtGUy5jaG1vZChub2RlLG1vZGUpfXJldHVybiBub2RlfSxjcmVhdGVEZXZpY2U6ZnVuY3Rpb24ocGFyZW50LG5hbWUsaW5wdXQsb3V0cHV0KXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT0ic3RyaW5nIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpO3ZhciBtb2RlPUZTLmdldE1vZGUoISFpbnB1dCwhIW91dHB1dCk7aWYoIUZTLmNyZWF0ZURldmljZS5tYWpvcilGUy5jcmVhdGVEZXZpY2UubWFqb3I9NjQ7dmFyIGRldj1GUy5tYWtlZGV2KEZTLmNyZWF0ZURldmljZS5tYWpvcisrLDApO0ZTLnJlZ2lzdGVyRGV2aWNlKGRldix7b3BlbjpmdW5jdGlvbihzdHJlYW0pe3N0cmVhbS5zZWVrYWJsZT1mYWxzZX0sY2xvc2U6ZnVuY3Rpb24oc3RyZWFtKXtpZihvdXRwdXQmJm91dHB1dC5idWZmZXImJm91dHB1dC5idWZmZXIubGVuZ3RoKXtvdXRwdXQoMTApfX0scmVhZDpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXt2YXIgYnl0ZXNSZWFkPTA7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt2YXIgcmVzdWx0O3RyeXtyZXN1bHQ9aW5wdXQoKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2KX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSx3cml0ZTpmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3RyeXtvdXRwdXQoYnVmZmVyW29mZnNldCtpXSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpfX1pZihsZW5ndGgpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBpfX0pO3JldHVybiBGUy5ta2RldihwYXRoLG1vZGUsZGV2KX0sY3JlYXRlTGluazpmdW5jdGlvbihwYXJlbnQsbmFtZSx0YXJnZXQsY2FuUmVhZCxjYW5Xcml0ZSl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTtyZXR1cm4gRlMuc3ltbGluayh0YXJnZXQscGF0aCl9LGZvcmNlTG9hZEZpbGU6ZnVuY3Rpb24ob2JqKXtpZihvYmouaXNEZXZpY2V8fG9iai5pc0ZvbGRlcnx8b2JqLmxpbmt8fG9iai5jb250ZW50cylyZXR1cm4gdHJ1ZTt2YXIgc3VjY2Vzcz10cnVlO2lmKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9PSJ1bmRlZmluZWQiKXt0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpfWVsc2UgaWYocmVhZF8pe3RyeXtvYmouY29udGVudHM9aW50QXJyYXlGcm9tU3RyaW5nKHJlYWRfKG9iai51cmwpLHRydWUpO29iai51c2VkQnl0ZXM9b2JqLmNvbnRlbnRzLmxlbmd0aH1jYXRjaChlKXtzdWNjZXNzPWZhbHNlfX1lbHNle3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgd2l0aG91dCByZWFkKCkgb3IgWE1MSHR0cFJlcXVlc3QuIil9aWYoIXN1Y2Nlc3Mpc2V0RXJyTm8oMjkpO3JldHVybiBzdWNjZXNzfSxjcmVhdGVMYXp5RmlsZTpmdW5jdGlvbihwYXJlbnQsbmFtZSx1cmwsY2FuUmVhZCxjYW5Xcml0ZSl7ZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXkoKXt0aGlzLmxlbmd0aEtub3duPWZhbHNlO3RoaXMuY2h1bmtzPVtdfUxhenlVaW50OEFycmF5LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXlfZ2V0KGlkeCl7aWYoaWR4PnRoaXMubGVuZ3RoLTF8fGlkeDwwKXtyZXR1cm4gdW5kZWZpbmVkfXZhciBjaHVua09mZnNldD1pZHgldGhpcy5jaHVua1NpemU7dmFyIGNodW5rTnVtPWlkeC90aGlzLmNodW5rU2l6ZXwwO3JldHVybiB0aGlzLmdldHRlcihjaHVua051bSlbY2h1bmtPZmZzZXRdfTtMYXp5VWludDhBcnJheS5wcm90b3R5cGUuc2V0RGF0YUdldHRlcj1mdW5jdGlvbiBMYXp5VWludDhBcnJheV9zZXREYXRhR2V0dGVyKGdldHRlcil7dGhpcy5nZXR0ZXI9Z2V0dGVyfTtMYXp5VWludDhBcnJheS5wcm90b3R5cGUuY2FjaGVMZW5ndGg9ZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXlfY2FjaGVMZW5ndGgoKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiSEVBRCIsdXJsLGZhbHNlKTt4aHIuc2VuZChudWxsKTtpZighKHhoci5zdGF0dXM+PTIwMCYmeGhyLnN0YXR1czwzMDB8fHhoci5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3VybCsiLiBTdGF0dXM6ICIreGhyLnN0YXR1cyk7dmFyIGRhdGFsZW5ndGg9TnVtYmVyKHhoci5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSk7dmFyIGhlYWRlcjt2YXIgaGFzQnl0ZVNlcnZpbmc9KGhlYWRlcj14aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJmhlYWRlcj09PSJieXRlcyI7dmFyIHVzZXNHemlwPShoZWFkZXI9eGhyLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LUVuY29kaW5nIikpJiZoZWFkZXI9PT0iZ3ppcCI7dmFyIGNodW5rU2l6ZT0xMDI0KjEwMjQ7aWYoIWhhc0J5dGVTZXJ2aW5nKWNodW5rU2l6ZT1kYXRhbGVuZ3RoO3ZhciBkb1hIUj1mdW5jdGlvbihmcm9tLHRvKXtpZihmcm9tPnRvKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCByYW5nZSAoIitmcm9tKyIsICIrdG8rIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKHRvPmRhdGFsZW5ndGgtMSl0aHJvdyBuZXcgRXJyb3IoIm9ubHkgIitkYXRhbGVuZ3RoKyIgYnl0ZXMgYXZhaWxhYmxlISBwcm9ncmFtbWVyIGVycm9yISIpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7aWYoZGF0YWxlbmd0aCE9PWNodW5rU2l6ZSl4aHIuc2V0UmVxdWVzdEhlYWRlcigiUmFuZ2UiLCJieXRlcz0iK2Zyb20rIi0iK3RvKTtpZih0eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCIpeGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO2lmKHhoci5vdmVycmlkZU1pbWVUeXBlKXt4aHIub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpfXhoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIrdXJsKyIuIFN0YXR1czogIit4aHIuc3RhdHVzKTtpZih4aHIucmVzcG9uc2UhPT11bmRlZmluZWQpe3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2V8fFtdKX1lbHNle3JldHVybiBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dHx8IiIsdHJ1ZSl9fTt2YXIgbGF6eUFycmF5PXRoaXM7bGF6eUFycmF5LnNldERhdGFHZXR0ZXIoZnVuY3Rpb24oY2h1bmtOdW0pe3ZhciBzdGFydD1jaHVua051bSpjaHVua1NpemU7dmFyIGVuZD0oY2h1bmtOdW0rMSkqY2h1bmtTaXplLTE7ZW5kPU1hdGgubWluKGVuZCxkYXRhbGVuZ3RoLTEpO2lmKHR5cGVvZiBsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXT09PSJ1bmRlZmluZWQiKXtsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXT1kb1hIUihzdGFydCxlbmQpfWlmKHR5cGVvZiBsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXT09PSJ1bmRlZmluZWQiKXRocm93IG5ldyBFcnJvcigiZG9YSFIgZmFpbGVkISIpO3JldHVybiBsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXX0pO2lmKHVzZXNHemlwfHwhZGF0YWxlbmd0aCl7Y2h1bmtTaXplPWRhdGFsZW5ndGg9MTtkYXRhbGVuZ3RoPXRoaXMuZ2V0dGVyKDApLmxlbmd0aDtjaHVua1NpemU9ZGF0YWxlbmd0aDtvdXQoIkxhenlGaWxlcyBvbiBnemlwIGZvcmNlcyBkb3dubG9hZCBvZiB0aGUgd2hvbGUgZmlsZSB3aGVuIGxlbmd0aCBpcyBhY2Nlc3NlZCIpfXRoaXMuX2xlbmd0aD1kYXRhbGVuZ3RoO3RoaXMuX2NodW5rU2l6ZT1jaHVua1NpemU7dGhpcy5sZW5ndGhLbm93bj10cnVlfTtpZih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPT0idW5kZWZpbmVkIil7aWYoIUVOVklST05NRU5UX0lTX1dPUktFUil0aHJvdyJDYW5ub3QgZG8gc3luY2hyb25vdXMgYmluYXJ5IFhIUnMgb3V0c2lkZSB3ZWJ3b3JrZXJzIGluIG1vZGVybiBicm93c2Vycy4gVXNlIC0tZW1iZWQtZmlsZSBvciAtLXByZWxvYWQtZmlsZSBpbiBlbWNjIjt2YXIgbGF6eUFycmF5PW5ldyBMYXp5VWludDhBcnJheTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5QXJyYXkse2xlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7aWYoIXRoaXMubGVuZ3RoS25vd24pe3RoaXMuY2FjaGVMZW5ndGgoKX1yZXR1cm4gdGhpcy5fbGVuZ3RofX0sY2h1bmtTaXplOntnZXQ6ZnVuY3Rpb24oKXtpZighdGhpcy5sZW5ndGhLbm93bil7dGhpcy5jYWNoZUxlbmd0aCgpfXJldHVybiB0aGlzLl9jaHVua1NpemV9fX0pO3ZhciBwcm9wZXJ0aWVzPXtpc0RldmljZTpmYWxzZSxjb250ZW50czpsYXp5QXJyYXl9fWVsc2V7dmFyIHByb3BlcnRpZXM9e2lzRGV2aWNlOmZhbHNlLHVybDp1cmx9fXZhciBub2RlPUZTLmNyZWF0ZUZpbGUocGFyZW50LG5hbWUscHJvcGVydGllcyxjYW5SZWFkLGNhbldyaXRlKTtpZihwcm9wZXJ0aWVzLmNvbnRlbnRzKXtub2RlLmNvbnRlbnRzPXByb3BlcnRpZXMuY29udGVudHN9ZWxzZSBpZihwcm9wZXJ0aWVzLnVybCl7bm9kZS5jb250ZW50cz1udWxsO25vZGUudXJsPXByb3BlcnRpZXMudXJsfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5vZGUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgc3RyZWFtX29wcz17fTt2YXIga2V5cz1PYmplY3Qua2V5cyhub2RlLnN0cmVhbV9vcHMpO2tleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpe3ZhciBmbj1ub2RlLnN0cmVhbV9vcHNba2V5XTtzdHJlYW1fb3BzW2tleV09ZnVuY3Rpb24gZm9yY2VMb2FkTGF6eUZpbGUoKXtpZighRlMuZm9yY2VMb2FkRmlsZShub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpfXJldHVybiBmbi5hcHBseShudWxsLGFyZ3VtZW50cyl9fSk7c3RyZWFtX29wcy5yZWFkPWZ1bmN0aW9uIHN0cmVhbV9vcHNfcmVhZChzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKCFGUy5mb3JjZUxvYWRGaWxlKG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSl9dmFyIGNvbnRlbnRzPXN0cmVhbS5ub2RlLmNvbnRlbnRzO2lmKHBvc2l0aW9uPj1jb250ZW50cy5sZW5ndGgpcmV0dXJuIDA7dmFyIHNpemU9TWF0aC5taW4oY29udGVudHMubGVuZ3RoLXBvc2l0aW9uLGxlbmd0aCk7aWYoY29udGVudHMuc2xpY2Upe2Zvcih2YXIgaT0wO2k8c2l6ZTtpKyspe2J1ZmZlcltvZmZzZXQraV09Y29udGVudHNbcG9zaXRpb24raV19fWVsc2V7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50cy5nZXQocG9zaXRpb24raSl9fXJldHVybiBzaXplfTtub2RlLnN0cmVhbV9vcHM9c3RyZWFtX29wcztyZXR1cm4gbm9kZX0sY3JlYXRlUHJlbG9hZGVkRmlsZTpmdW5jdGlvbihwYXJlbnQsbmFtZSx1cmwsY2FuUmVhZCxjYW5Xcml0ZSxvbmxvYWQsb25lcnJvcixkb250Q3JlYXRlRmlsZSxjYW5Pd24scHJlRmluaXNoKXtCcm93c2VyLmluaXQoKTt2YXIgZnVsbG5hbWU9bmFtZT9QQVRIX0ZTLnJlc29sdmUoUEFUSC5qb2luMihwYXJlbnQsbmFtZSkpOnBhcmVudDt2YXIgZGVwPWdldFVuaXF1ZVJ1bkRlcGVuZGVuY3koImNwICIrZnVsbG5hbWUpO2Z1bmN0aW9uIHByb2Nlc3NEYXRhKGJ5dGVBcnJheSl7ZnVuY3Rpb24gZmluaXNoKGJ5dGVBcnJheSl7aWYocHJlRmluaXNoKXByZUZpbmlzaCgpO2lmKCFkb250Q3JlYXRlRmlsZSl7RlMuY3JlYXRlRGF0YUZpbGUocGFyZW50LG5hbWUsYnl0ZUFycmF5LGNhblJlYWQsY2FuV3JpdGUsY2FuT3duKX1pZihvbmxvYWQpb25sb2FkKCk7cmVtb3ZlUnVuRGVwZW5kZW5jeShkZXApfXZhciBoYW5kbGVkPWZhbHNlO01vZHVsZVsicHJlbG9hZFBsdWdpbnMiXS5mb3JFYWNoKGZ1bmN0aW9uKHBsdWdpbil7aWYoaGFuZGxlZClyZXR1cm47aWYocGx1Z2luWyJjYW5IYW5kbGUiXShmdWxsbmFtZSkpe3BsdWdpblsiaGFuZGxlIl0oYnl0ZUFycmF5LGZ1bGxuYW1lLGZpbmlzaCxmdW5jdGlvbigpe2lmKG9uZXJyb3Ipb25lcnJvcigpO3JlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKX0pO2hhbmRsZWQ9dHJ1ZX19KTtpZighaGFuZGxlZClmaW5pc2goYnl0ZUFycmF5KX1hZGRSdW5EZXBlbmRlbmN5KGRlcCk7aWYodHlwZW9mIHVybD09InN0cmluZyIpe0Jyb3dzZXIuYXN5bmNMb2FkKHVybCxmdW5jdGlvbihieXRlQXJyYXkpe3Byb2Nlc3NEYXRhKGJ5dGVBcnJheSl9LG9uZXJyb3IpfWVsc2V7cHJvY2Vzc0RhdGEodXJsKX19LGluZGV4ZWREQjpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW5kZXhlZERCfHx3aW5kb3cubW96SW5kZXhlZERCfHx3aW5kb3cud2Via2l0SW5kZXhlZERCfHx3aW5kb3cubXNJbmRleGVkREJ9LERCX05BTUU6ZnVuY3Rpb24oKXtyZXR1cm4iRU1fRlNfIit3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9LERCX1ZFUlNJT046MjAsREJfU1RPUkVfTkFNRToiRklMRV9EQVRBIixzYXZlRmlsZXNUb0RCOmZ1bmN0aW9uKHBhdGhzLG9ubG9hZCxvbmVycm9yKXtvbmxvYWQ9b25sb2FkfHxmdW5jdGlvbigpe307b25lcnJvcj1vbmVycm9yfHxmdW5jdGlvbigpe307dmFyIGluZGV4ZWREQj1GUy5pbmRleGVkREIoKTt0cnl7dmFyIG9wZW5SZXF1ZXN0PWluZGV4ZWREQi5vcGVuKEZTLkRCX05BTUUoKSxGUy5EQl9WRVJTSU9OKX1jYXRjaChlKXtyZXR1cm4gb25lcnJvcihlKX1vcGVuUmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQ9ZnVuY3Rpb24gb3BlblJlcXVlc3Rfb251cGdyYWRlbmVlZGVkKCl7b3V0KCJjcmVhdGluZyBkYiIpO3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7ZGIuY3JlYXRlT2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSl9O29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sInJlYWR3cml0ZSIpO3ZhciBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXIgb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uIGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZSBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaChmdW5jdGlvbihwYXRoKXt2YXIgcHV0UmVxdWVzdD1maWxlcy5wdXQoRlMuYW5hbHl6ZVBhdGgocGF0aCkub2JqZWN0LmNvbnRlbnRzLHBhdGgpO3B1dFJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIHB1dFJlcXVlc3Rfb25zdWNjZXNzKCl7b2srKztpZihvaytmYWlsPT10b3RhbClmaW5pc2goKX07cHV0UmVxdWVzdC5vbmVycm9yPWZ1bmN0aW9uIHB1dFJlcXVlc3Rfb25lcnJvcigpe2ZhaWwrKztpZihvaytmYWlsPT10b3RhbClmaW5pc2goKX19KTt0cmFuc2FjdGlvbi5vbmVycm9yPW9uZXJyb3J9O29wZW5SZXF1ZXN0Lm9uZXJyb3I9b25lcnJvcn0sbG9hZEZpbGVzRnJvbURCOmZ1bmN0aW9uKHBhdGhzLG9ubG9hZCxvbmVycm9yKXtvbmxvYWQ9b25sb2FkfHxmdW5jdGlvbigpe307b25lcnJvcj1vbmVycm9yfHxmdW5jdGlvbigpe307dmFyIGluZGV4ZWREQj1GUy5pbmRleGVkREIoKTt0cnl7dmFyIG9wZW5SZXF1ZXN0PWluZGV4ZWREQi5vcGVuKEZTLkRCX05BTUUoKSxGUy5EQl9WRVJTSU9OKX1jYXRjaChlKXtyZXR1cm4gb25lcnJvcihlKX1vcGVuUmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQ9b25lcnJvcjtvcGVuUmVxdWVzdC5vbnN1Y2Nlc3M9ZnVuY3Rpb24gb3BlblJlcXVlc3Rfb25zdWNjZXNzKCl7dmFyIGRiPW9wZW5SZXF1ZXN0LnJlc3VsdDt0cnl7dmFyIHRyYW5zYWN0aW9uPWRiLnRyYW5zYWN0aW9uKFtGUy5EQl9TVE9SRV9OQU1FXSwicmVhZG9ubHkiKX1jYXRjaChlKXtvbmVycm9yKGUpO3JldHVybn12YXIgZmlsZXM9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSk7dmFyIG9rPTAsZmFpbD0wLHRvdGFsPXBhdGhzLmxlbmd0aDtmdW5jdGlvbiBmaW5pc2goKXtpZihmYWlsPT0wKW9ubG9hZCgpO2Vsc2Ugb25lcnJvcigpfXBhdGhzLmZvckVhY2goZnVuY3Rpb24ocGF0aCl7dmFyIGdldFJlcXVlc3Q9ZmlsZXMuZ2V0KHBhdGgpO2dldFJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIGdldFJlcXVlc3Rfb25zdWNjZXNzKCl7aWYoRlMuYW5hbHl6ZVBhdGgocGF0aCkuZXhpc3RzKXtGUy51bmxpbmsocGF0aCl9RlMuY3JlYXRlRGF0YUZpbGUoUEFUSC5kaXJuYW1lKHBhdGgpLFBBVEguYmFzZW5hbWUocGF0aCksZ2V0UmVxdWVzdC5yZXN1bHQsdHJ1ZSx0cnVlLHRydWUpO29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O2dldFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvbiBnZXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSk7dHJhbnNhY3Rpb24ub25lcnJvcj1vbmVycm9yfTtvcGVuUmVxdWVzdC5vbmVycm9yPW9uZXJyb3J9fTt2YXIgU1lTQ0FMTFM9e21hcHBpbmdzOnt9LERFRkFVTFRfUE9MTE1BU0s6NSx1bWFzazo1MTEsY2FsY3VsYXRlQXQ6ZnVuY3Rpb24oZGlyZmQscGF0aCl7aWYocGF0aFswXSE9PSIvIil7dmFyIGRpcjtpZihkaXJmZD09PS0xMDApe2Rpcj1GUy5jd2QoKX1lbHNle3ZhciBkaXJzdHJlYW09RlMuZ2V0U3RyZWFtKGRpcmZkKTtpZighZGlyc3RyZWFtKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpO2Rpcj1kaXJzdHJlYW0ucGF0aH1wYXRoPVBBVEguam9pbjIoZGlyLHBhdGgpfXJldHVybiBwYXRofSxkb1N0YXQ6ZnVuY3Rpb24oZnVuYyxwYXRoLGJ1Zil7dHJ5e3ZhciBzdGF0PWZ1bmMocGF0aCl9Y2F0Y2goZSl7aWYoZSYmZS5ub2RlJiZQQVRILm5vcm1hbGl6ZShwYXRoKSE9PVBBVEgubm9ybWFsaXplKEZTLmdldFBhdGgoZS5ub2RlKSkpe3JldHVybi01NH10aHJvdyBlfUhFQVAzMltidWY+PjJdPXN0YXQuZGV2O0hFQVAzMltidWYrND4+Ml09MDtIRUFQMzJbYnVmKzg+PjJdPXN0YXQuaW5vO0hFQVAzMltidWYrMTI+PjJdPXN0YXQubW9kZTtIRUFQMzJbYnVmKzE2Pj4yXT1zdGF0Lm5saW5rO0hFQVAzMltidWYrMjA+PjJdPXN0YXQudWlkO0hFQVAzMltidWYrMjQ+PjJdPXN0YXQuZ2lkO0hFQVAzMltidWYrMjg+PjJdPXN0YXQucmRldjtIRUFQMzJbYnVmKzMyPj4yXT0wO3RlbXBJNjQ9W3N0YXQuc2l6ZT4+PjAsKHRlbXBEb3VibGU9c3RhdC5zaXplLCtNYXRoX2Ficyh0ZW1wRG91YmxlKT49MT90ZW1wRG91YmxlPjA/KE1hdGhfbWluKCtNYXRoX2Zsb29yKHRlbXBEb3VibGUvNDI5NDk2NzI5NiksNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGhfY2VpbCgodGVtcERvdWJsZS0rKH5+dGVtcERvdWJsZT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLEhFQVAzMltidWYrNDA+PjJdPXRlbXBJNjRbMF0sSEVBUDMyW2J1Zis0ND4+Ml09dGVtcEk2NFsxXTtIRUFQMzJbYnVmKzQ4Pj4yXT00MDk2O0hFQVAzMltidWYrNTI+PjJdPXN0YXQuYmxvY2tzO0hFQVAzMltidWYrNTY+PjJdPXN0YXQuYXRpbWUuZ2V0VGltZSgpLzFlM3wwO0hFQVAzMltidWYrNjA+PjJdPTA7SEVBUDMyW2J1Zis2ND4+Ml09c3RhdC5tdGltZS5nZXRUaW1lKCkvMWUzfDA7SEVBUDMyW2J1Zis2OD4+Ml09MDtIRUFQMzJbYnVmKzcyPj4yXT1zdGF0LmN0aW1lLmdldFRpbWUoKS8xZTN8MDtIRUFQMzJbYnVmKzc2Pj4yXT0wO3RlbXBJNjQ9W3N0YXQuaW5vPj4+MCwodGVtcERvdWJsZT1zdGF0LmlubywrTWF0aF9hYnModGVtcERvdWJsZSk+PTE/dGVtcERvdWJsZT4wPyhNYXRoX21pbigrTWF0aF9mbG9vcih0ZW1wRG91YmxlLzQyOTQ5NjcyOTYpLDQyOTQ5NjcyOTUpfDApPj4+MDp+fitNYXRoX2NlaWwoKHRlbXBEb3VibGUtKyh+fnRlbXBEb3VibGU+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxIRUFQMzJbYnVmKzgwPj4yXT10ZW1wSTY0WzBdLEhFQVAzMltidWYrODQ+PjJdPXRlbXBJNjRbMV07cmV0dXJuIDB9LGRvTXN5bmM6ZnVuY3Rpb24oYWRkcixzdHJlYW0sbGVuLGZsYWdzLG9mZnNldCl7dmFyIGJ1ZmZlcj1IRUFQVTguc2xpY2UoYWRkcixhZGRyK2xlbik7RlMubXN5bmMoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuLGZsYWdzKX0sZG9Na2RpcjpmdW5jdGlvbihwYXRoLG1vZGUpe3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7aWYocGF0aFtwYXRoLmxlbmd0aC0xXT09PSIvIilwYXRoPXBhdGguc3Vic3RyKDAscGF0aC5sZW5ndGgtMSk7RlMubWtkaXIocGF0aCxtb2RlLDApO3JldHVybiAwfSxkb01rbm9kOmZ1bmN0aW9uKHBhdGgsbW9kZSxkZXYpe3N3aXRjaChtb2RlJjYxNDQwKXtjYXNlIDMyNzY4OmNhc2UgODE5MjpjYXNlIDI0NTc2OmNhc2UgNDA5NjpjYXNlIDQ5MTUyOmJyZWFrO2RlZmF1bHQ6cmV0dXJuLTI4fUZTLm1rbm9kKHBhdGgsbW9kZSxkZXYpO3JldHVybiAwfSxkb1JlYWRsaW5rOmZ1bmN0aW9uKHBhdGgsYnVmLGJ1ZnNpemUpe2lmKGJ1ZnNpemU8PTApcmV0dXJuLTI4O3ZhciByZXQ9RlMucmVhZGxpbmsocGF0aCk7dmFyIGxlbj1NYXRoLm1pbihidWZzaXplLGxlbmd0aEJ5dGVzVVRGOChyZXQpKTt2YXIgZW5kQ2hhcj1IRUFQOFtidWYrbGVuXTtzdHJpbmdUb1VURjgocmV0LGJ1ZixidWZzaXplKzEpO0hFQVA4W2J1ZitsZW5dPWVuZENoYXI7cmV0dXJuIGxlbn0sZG9BY2Nlc3M6ZnVuY3Rpb24ocGF0aCxhbW9kZSl7aWYoYW1vZGUmfjcpe3JldHVybi0yOH12YXIgbm9kZTt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTtub2RlPWxvb2t1cC5ub2RlO2lmKCFub2RlKXtyZXR1cm4tNDR9dmFyIHBlcm1zPSIiO2lmKGFtb2RlJjQpcGVybXMrPSJyIjtpZihhbW9kZSYyKXBlcm1zKz0idyI7aWYoYW1vZGUmMSlwZXJtcys9IngiO2lmKHBlcm1zJiZGUy5ub2RlUGVybWlzc2lvbnMobm9kZSxwZXJtcykpe3JldHVybi0yfXJldHVybiAwfSxkb0R1cDpmdW5jdGlvbihwYXRoLGZsYWdzLHN1Z2dlc3RGRCl7dmFyIHN1Z2dlc3Q9RlMuZ2V0U3RyZWFtKHN1Z2dlc3RGRCk7aWYoc3VnZ2VzdClGUy5jbG9zZShzdWdnZXN0KTtyZXR1cm4gRlMub3BlbihwYXRoLGZsYWdzLDAsc3VnZ2VzdEZELHN1Z2dlc3RGRCkuZmR9LGRvUmVhZHY6ZnVuY3Rpb24oc3RyZWFtLGlvdixpb3ZjbnQsb2Zmc2V0KXt2YXIgcmV0PTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXIgbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07dmFyIGN1cnI9RlMucmVhZChzdHJlYW0sSEVBUDgscHRyLGxlbixvZmZzZXQpO2lmKGN1cnI8MClyZXR1cm4tMTtyZXQrPWN1cnI7aWYoY3VycjxsZW4pYnJlYWt9cmV0dXJuIHJldH0sZG9Xcml0ZXY6ZnVuY3Rpb24oc3RyZWFtLGlvdixpb3ZjbnQsb2Zmc2V0KXt2YXIgcmV0PTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXIgbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07dmFyIGN1cnI9RlMud3JpdGUoc3RyZWFtLEhFQVA4LHB0cixsZW4sb2Zmc2V0KTtpZihjdXJyPDApcmV0dXJuLTE7cmV0Kz1jdXJyfXJldHVybiByZXR9LHZhcmFyZ3M6dW5kZWZpbmVkLGdldDpmdW5jdGlvbigpe1NZU0NBTExTLnZhcmFyZ3MrPTQ7dmFyIHJldD1IRUFQMzJbU1lTQ0FMTFMudmFyYXJncy00Pj4yXTtyZXR1cm4gcmV0fSxnZXRTdHI6ZnVuY3Rpb24ocHRyKXt2YXIgcmV0PVVURjhUb1N0cmluZyhwdHIpO3JldHVybiByZXR9LGdldFN0cmVhbUZyb21GRDpmdW5jdGlvbihmZCl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7cmV0dXJuIHN0cmVhbX0sZ2V0NjQ6ZnVuY3Rpb24obG93LGhpZ2gpe3JldHVybiBsb3d9fTtmdW5jdGlvbiBfX19zeXNfZmNudGw2NChmZCxjbWQsdmFyYXJncyl7U1lTQ0FMTFMudmFyYXJncz12YXJhcmdzO3RyeXt2YXIgc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7c3dpdGNoKGNtZCl7Y2FzZSAwOnt2YXIgYXJnPVNZU0NBTExTLmdldCgpO2lmKGFyZzwwKXtyZXR1cm4tMjh9dmFyIG5ld1N0cmVhbTtuZXdTdHJlYW09RlMub3BlbihzdHJlYW0ucGF0aCxzdHJlYW0uZmxhZ3MsMCxhcmcpO3JldHVybiBuZXdTdHJlYW0uZmR9Y2FzZSAxOmNhc2UgMjpyZXR1cm4gMDtjYXNlIDM6cmV0dXJuIHN0cmVhbS5mbGFncztjYXNlIDQ6e3ZhciBhcmc9U1lTQ0FMTFMuZ2V0KCk7c3RyZWFtLmZsYWdzfD1hcmc7cmV0dXJuIDB9Y2FzZSAxMjp7dmFyIGFyZz1TWVNDQUxMUy5nZXQoKTt2YXIgb2Zmc2V0PTA7SEVBUDE2W2FyZytvZmZzZXQ+PjFdPTI7cmV0dXJuIDB9Y2FzZSAxMzpjYXNlIDE0OnJldHVybiAwO2Nhc2UgMTY6Y2FzZSA4OnJldHVybi0yODtjYXNlIDk6c2V0RXJyTm8oMjgpO3JldHVybi0xO2RlZmF1bHQ6e3JldHVybi0yOH19fWNhdGNoKGUpe2lmKHR5cGVvZiBGUz09PSJ1bmRlZmluZWQifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4tZS5lcnJub319ZnVuY3Rpb24gX19fc3lzX2lvY3RsKGZkLG9wLHZhcmFyZ3Mpe1NZU0NBTExTLnZhcmFyZ3M9dmFyYXJnczt0cnl7dmFyIHN0cmVhbT1TWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpO3N3aXRjaChvcCl7Y2FzZSAyMTUwOTpjYXNlIDIxNTA1OntpZighc3RyZWFtLnR0eSlyZXR1cm4tNTk7cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6Y2FzZSAyMTUwNjpjYXNlIDIxNTA3OmNhc2UgMjE1MDg6e2lmKCFzdHJlYW0udHR5KXJldHVybi01OTtyZXR1cm4gMH1jYXNlIDIxNTE5OntpZighc3RyZWFtLnR0eSlyZXR1cm4tNTk7dmFyIGFyZ3A9U1lTQ0FMTFMuZ2V0KCk7SEVBUDMyW2FyZ3A+PjJdPTA7cmV0dXJuIDB9Y2FzZSAyMTUyMDp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLTU5O3JldHVybi0yOH1jYXNlIDIxNTMxOnt2YXIgYXJncD1TWVNDQUxMUy5nZXQoKTtyZXR1cm4gRlMuaW9jdGwoc3RyZWFtLG9wLGFyZ3ApfWNhc2UgMjE1MjM6e2lmKCFzdHJlYW0udHR5KXJldHVybi01OTtyZXR1cm4gMH1jYXNlIDIxNTI0OntpZighc3RyZWFtLnR0eSlyZXR1cm4tNTk7cmV0dXJuIDB9ZGVmYXVsdDphYm9ydCgiYmFkIGlvY3RsIHN5c2NhbGwgIitvcCl9fWNhdGNoKGUpe2lmKHR5cGVvZiBGUz09PSJ1bmRlZmluZWQifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4tZS5lcnJub319ZnVuY3Rpb24gX19fc3lzX29wZW4ocGF0aCxmbGFncyx2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzPXZhcmFyZ3M7dHJ5e3ZhciBwYXRobmFtZT1TWVNDQUxMUy5nZXRTdHIocGF0aCk7dmFyIG1vZGU9U1lTQ0FMTFMuZ2V0KCk7dmFyIHN0cmVhbT1GUy5vcGVuKHBhdGhuYW1lLGZsYWdzLG1vZGUpO3JldHVybiBzdHJlYW0uZmR9Y2F0Y2goZSl7aWYodHlwZW9mIEZTPT09InVuZGVmaW5lZCJ8fCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybi1lLmVycm5vfX12YXIgc3RydWN0UmVnaXN0cmF0aW9ucz17fTtmdW5jdGlvbiBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyl7d2hpbGUoZGVzdHJ1Y3RvcnMubGVuZ3RoKXt2YXIgcHRyPWRlc3RydWN0b3JzLnBvcCgpO3ZhciBkZWw9ZGVzdHJ1Y3RvcnMucG9wKCk7ZGVsKHB0cil9fWZ1bmN0aW9uIHNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShIRUFQVTMyW3BvaW50ZXI+PjJdKX12YXIgYXdhaXRpbmdEZXBlbmRlbmNpZXM9e307dmFyIHJlZ2lzdGVyZWRUeXBlcz17fTt2YXIgdHlwZURlcGVuZGVuY2llcz17fTt2YXIgY2hhcl8wPTQ4O3ZhciBjaGFyXzk9NTc7ZnVuY3Rpb24gbWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpe2lmKHVuZGVmaW5lZD09PW5hbWUpe3JldHVybiJfdW5rbm93biJ9bmFtZT1uYW1lLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywiJCIpO3ZhciBmPW5hbWUuY2hhckNvZGVBdCgwKTtpZihmPj1jaGFyXzAmJmY8PWNoYXJfOSl7cmV0dXJuIl8iK25hbWV9ZWxzZXtyZXR1cm4gbmFtZX19ZnVuY3Rpb24gY3JlYXRlTmFtZWRGdW5jdGlvbihuYW1lLGJvZHkpe25hbWU9bWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpO3JldHVybiBuZXcgRnVuY3Rpb24oImJvZHkiLCJyZXR1cm4gZnVuY3Rpb24gIituYW1lKyIoKSB7XG4iKycgICAgInVzZSBzdHJpY3QiOycrIiAgICByZXR1cm4gYm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuIisifTtcbiIpKGJvZHkpfWZ1bmN0aW9uIGV4dGVuZEVycm9yKGJhc2VFcnJvclR5cGUsZXJyb3JOYW1lKXt2YXIgZXJyb3JDbGFzcz1jcmVhdGVOYW1lZEZ1bmN0aW9uKGVycm9yTmFtZSxmdW5jdGlvbihtZXNzYWdlKXt0aGlzLm5hbWU9ZXJyb3JOYW1lO3RoaXMubWVzc2FnZT1tZXNzYWdlO3ZhciBzdGFjaz1uZXcgRXJyb3IobWVzc2FnZSkuc3RhY2s7aWYoc3RhY2shPT11bmRlZmluZWQpe3RoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpKyJcbiIrc3RhY2sucmVwbGFjZSgvXkVycm9yKDpbXlxuXSopP1xuLywiIil9fSk7ZXJyb3JDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JUeXBlLnByb3RvdHlwZSk7ZXJyb3JDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZXJyb3JDbGFzcztlcnJvckNsYXNzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2lmKHRoaXMubWVzc2FnZT09PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXMubmFtZX1lbHNle3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9fTtyZXR1cm4gZXJyb3JDbGFzc312YXIgSW50ZXJuYWxFcnJvcj11bmRlZmluZWQ7ZnVuY3Rpb24gdGhyb3dJbnRlcm5hbEVycm9yKG1lc3NhZ2Upe3Rocm93IG5ldyBJbnRlcm5hbEVycm9yKG1lc3NhZ2UpfWZ1bmN0aW9uIHdoZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKG15VHlwZXMsZGVwZW5kZW50VHlwZXMsZ2V0VHlwZUNvbnZlcnRlcnMpe215VHlwZXMuZm9yRWFjaChmdW5jdGlvbih0eXBlKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdPWRlcGVuZGVudFR5cGVzfSk7ZnVuY3Rpb24gb25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl7dmFyIG15VHlwZUNvbnZlcnRlcnM9Z2V0VHlwZUNvbnZlcnRlcnModHlwZUNvbnZlcnRlcnMpO2lmKG15VHlwZUNvbnZlcnRlcnMubGVuZ3RoIT09bXlUeXBlcy5sZW5ndGgpe3Rocm93SW50ZXJuYWxFcnJvcigiTWlzbWF0Y2hlZCB0eXBlIGNvbnZlcnRlciBjb3VudCIpfWZvcih2YXIgaT0wO2k8bXlUeXBlcy5sZW5ndGg7KytpKXtyZWdpc3RlclR5cGUobXlUeXBlc1tpXSxteVR5cGVDb252ZXJ0ZXJzW2ldKX19dmFyIHR5cGVDb252ZXJ0ZXJzPW5ldyBBcnJheShkZXBlbmRlbnRUeXBlcy5sZW5ndGgpO3ZhciB1bnJlZ2lzdGVyZWRUeXBlcz1bXTt2YXIgcmVnaXN0ZXJlZD0wO2RlcGVuZGVudFR5cGVzLmZvckVhY2goZnVuY3Rpb24oZHQsaSl7aWYocmVnaXN0ZXJlZFR5cGVzLmhhc093blByb3BlcnR5KGR0KSl7dHlwZUNvbnZlcnRlcnNbaV09cmVnaXN0ZXJlZFR5cGVzW2R0XX1lbHNle3VucmVnaXN0ZXJlZFR5cGVzLnB1c2goZHQpO2lmKCFhd2FpdGluZ0RlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShkdCkpe2F3YWl0aW5nRGVwZW5kZW5jaWVzW2R0XT1bXX1hd2FpdGluZ0RlcGVuZGVuY2llc1tkdF0ucHVzaChmdW5jdGlvbigpe3R5cGVDb252ZXJ0ZXJzW2ldPXJlZ2lzdGVyZWRUeXBlc1tkdF07KytyZWdpc3RlcmVkO2lmKHJlZ2lzdGVyZWQ9PT11bnJlZ2lzdGVyZWRUeXBlcy5sZW5ndGgpe29uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpfX0pfX0pO2lmKDA9PT11bnJlZ2lzdGVyZWRUeXBlcy5sZW5ndGgpe29uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpfX1mdW5jdGlvbiBfX2VtYmluZF9maW5hbGl6ZV92YWx1ZV9vYmplY3Qoc3RydWN0VHlwZSl7dmFyIHJlZz1zdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO2RlbGV0ZSBzdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO3ZhciByYXdDb25zdHJ1Y3Rvcj1yZWcucmF3Q29uc3RydWN0b3I7dmFyIHJhd0Rlc3RydWN0b3I9cmVnLnJhd0Rlc3RydWN0b3I7dmFyIGZpZWxkUmVjb3Jkcz1yZWcuZmllbGRzO3ZhciBmaWVsZFR5cGVzPWZpZWxkUmVjb3Jkcy5tYXAoZnVuY3Rpb24oZmllbGQpe3JldHVybiBmaWVsZC5nZXR0ZXJSZXR1cm5UeXBlfSkuY29uY2F0KGZpZWxkUmVjb3Jkcy5tYXAoZnVuY3Rpb24oZmllbGQpe3JldHVybiBmaWVsZC5zZXR0ZXJBcmd1bWVudFR5cGV9KSk7d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW3N0cnVjdFR5cGVdLGZpZWxkVHlwZXMsZnVuY3Rpb24oZmllbGRUeXBlcyl7dmFyIGZpZWxkcz17fTtmaWVsZFJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCxpKXt2YXIgZmllbGROYW1lPWZpZWxkLmZpZWxkTmFtZTt2YXIgZ2V0dGVyUmV0dXJuVHlwZT1maWVsZFR5cGVzW2ldO3ZhciBnZXR0ZXI9ZmllbGQuZ2V0dGVyO3ZhciBnZXR0ZXJDb250ZXh0PWZpZWxkLmdldHRlckNvbnRleHQ7dmFyIHNldHRlckFyZ3VtZW50VHlwZT1maWVsZFR5cGVzW2krZmllbGRSZWNvcmRzLmxlbmd0aF07dmFyIHNldHRlcj1maWVsZC5zZXR0ZXI7dmFyIHNldHRlckNvbnRleHQ9ZmllbGQuc2V0dGVyQ29udGV4dDtmaWVsZHNbZmllbGROYW1lXT17cmVhZDpmdW5jdGlvbihwdHIpe3JldHVybiBnZXR0ZXJSZXR1cm5UeXBlWyJmcm9tV2lyZVR5cGUiXShnZXR0ZXIoZ2V0dGVyQ29udGV4dCxwdHIpKX0sd3JpdGU6ZnVuY3Rpb24ocHRyLG8pe3ZhciBkZXN0cnVjdG9ycz1bXTtzZXR0ZXIoc2V0dGVyQ29udGV4dCxwdHIsc2V0dGVyQXJndW1lbnRUeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsbykpO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKX19fSk7cmV0dXJuW3tuYW1lOnJlZy5uYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHB0cil7dmFyIHJ2PXt9O2Zvcih2YXIgaSBpbiBmaWVsZHMpe3J2W2ldPWZpZWxkc1tpXS5yZWFkKHB0cil9cmF3RGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLG8pe2Zvcih2YXIgZmllbGROYW1lIGluIGZpZWxkcyl7aWYoIShmaWVsZE5hbWUgaW4gbykpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk1pc3NpbmcgZmllbGQiKX19dmFyIHB0cj1yYXdDb25zdHJ1Y3RvcigpO2ZvcihmaWVsZE5hbWUgaW4gZmllbGRzKXtmaWVsZHNbZmllbGROYW1lXS53cml0ZShwdHIsb1tmaWVsZE5hbWVdKX1pZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2gocmF3RGVzdHJ1Y3RvcixwdHIpfXJldHVybiBwdHJ9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpyYXdEZXN0cnVjdG9yfV19KX1mdW5jdGlvbiBnZXRTaGlmdEZyb21TaXplKHNpemUpe3N3aXRjaChzaXplKXtjYXNlIDE6cmV0dXJuIDA7Y2FzZSAyOnJldHVybiAxO2Nhc2UgNDpyZXR1cm4gMjtjYXNlIDg6cmV0dXJuIDM7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIHR5cGUgc2l6ZTogIitzaXplKX19ZnVuY3Rpb24gZW1iaW5kX2luaXRfY2hhckNvZGVzKCl7dmFyIGNvZGVzPW5ldyBBcnJheSgyNTYpO2Zvcih2YXIgaT0wO2k8MjU2OysraSl7Y29kZXNbaV09U3RyaW5nLmZyb21DaGFyQ29kZShpKX1lbWJpbmRfY2hhckNvZGVzPWNvZGVzfXZhciBlbWJpbmRfY2hhckNvZGVzPXVuZGVmaW5lZDtmdW5jdGlvbiByZWFkTGF0aW4xU3RyaW5nKHB0cil7dmFyIHJldD0iIjt2YXIgYz1wdHI7d2hpbGUoSEVBUFU4W2NdKXtyZXQrPWVtYmluZF9jaGFyQ29kZXNbSEVBUFU4W2MrK11dfXJldHVybiByZXR9dmFyIEJpbmRpbmdFcnJvcj11bmRlZmluZWQ7ZnVuY3Rpb24gdGhyb3dCaW5kaW5nRXJyb3IobWVzc2FnZSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcihtZXNzYWdlKX1mdW5jdGlvbiByZWdpc3RlclR5cGUocmF3VHlwZSxyZWdpc3RlcmVkSW5zdGFuY2Usb3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTtpZighKCJhcmdQYWNrQWR2YW5jZSJpbiByZWdpc3RlcmVkSW5zdGFuY2UpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWdpc3RlclR5cGUgcmVnaXN0ZXJlZEluc3RhbmNlIHJlcXVpcmVzIGFyZ1BhY2tBZHZhbmNlIil9dmFyIG5hbWU9cmVnaXN0ZXJlZEluc3RhbmNlLm5hbWU7aWYoIXJhd1R5cGUpe3Rocm93QmluZGluZ0Vycm9yKCd0eXBlICInK25hbWUrJyIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcicpfWlmKHJlZ2lzdGVyZWRUeXBlcy5oYXNPd25Qcm9wZXJ0eShyYXdUeXBlKSl7aWYob3B0aW9ucy5pZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zKXtyZXR1cm59ZWxzZXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHR5cGUgJyIrbmFtZSsiJyB0d2ljZSIpfX1yZWdpc3RlcmVkVHlwZXNbcmF3VHlwZV09cmVnaXN0ZXJlZEluc3RhbmNlO2RlbGV0ZSB0eXBlRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2lmKGF3YWl0aW5nRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHJhd1R5cGUpKXt2YXIgY2FsbGJhY2tzPWF3YWl0aW5nRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2RlbGV0ZSBhd2FpdGluZ0RlcGVuZGVuY2llc1tyYXdUeXBlXTtjYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihjYil7Y2IoKX0pfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9ib29sKHJhd1R5cGUsbmFtZSxzaXplLHRydWVWYWx1ZSxmYWxzZVZhbHVlKXt2YXIgc2hpZnQ9Z2V0U2hpZnRGcm9tU2l6ZShzaXplKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbih3dCl7cmV0dXJuISF3dH0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLG8pe3JldHVybiBvP3RydWVWYWx1ZTpmYWxzZVZhbHVlfSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcDtpZihzaXplPT09MSl7aGVhcD1IRUFQOH1lbHNlIGlmKHNpemU9PT0yKXtoZWFwPUhFQVAxNn1lbHNlIGlmKHNpemU9PT00KXtoZWFwPUhFQVAzMn1lbHNle3Rocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gYm9vbGVhbiB0eXBlIHNpemU6ICIrbmFtZSl9cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+c2hpZnRdKX0sZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9pc0FsaWFzT2Yob3RoZXIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIENsYXNzSGFuZGxlKSl7cmV0dXJuIGZhbHNlfWlmKCEob3RoZXIgaW5zdGFuY2VvZiBDbGFzc0hhbmRsZSkpe3JldHVybiBmYWxzZX12YXIgbGVmdENsYXNzPXRoaXMuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIGxlZnQ9dGhpcy4kJC5wdHI7dmFyIHJpZ2h0Q2xhc3M9b3RoZXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHJpZ2h0PW90aGVyLiQkLnB0cjt3aGlsZShsZWZ0Q2xhc3MuYmFzZUNsYXNzKXtsZWZ0PWxlZnRDbGFzcy51cGNhc3QobGVmdCk7bGVmdENsYXNzPWxlZnRDbGFzcy5iYXNlQ2xhc3N9d2hpbGUocmlnaHRDbGFzcy5iYXNlQ2xhc3Mpe3JpZ2h0PXJpZ2h0Q2xhc3MudXBjYXN0KHJpZ2h0KTtyaWdodENsYXNzPXJpZ2h0Q2xhc3MuYmFzZUNsYXNzfXJldHVybiBsZWZ0Q2xhc3M9PT1yaWdodENsYXNzJiZsZWZ0PT09cmlnaHR9ZnVuY3Rpb24gc2hhbGxvd0NvcHlJbnRlcm5hbFBvaW50ZXIobyl7cmV0dXJue2NvdW50Om8uY291bnQsZGVsZXRlU2NoZWR1bGVkOm8uZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOm8ucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOm8ucHRyLHB0clR5cGU6by5wdHJUeXBlLHNtYXJ0UHRyOm8uc21hcnRQdHIsc21hcnRQdHJUeXBlOm8uc21hcnRQdHJUeXBlfX1mdW5jdGlvbiB0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQob2JqKXtmdW5jdGlvbiBnZXRJbnN0YW5jZVR5cGVOYW1lKGhhbmRsZSl7cmV0dXJuIGhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcy5uYW1lfXRocm93QmluZGluZ0Vycm9yKGdldEluc3RhbmNlVHlwZU5hbWUob2JqKSsiIGluc3RhbmNlIGFscmVhZHkgZGVsZXRlZCIpfXZhciBmaW5hbGl6YXRpb25Hcm91cD1mYWxzZTtmdW5jdGlvbiBkZXRhY2hGaW5hbGl6ZXIoaGFuZGxlKXt9ZnVuY3Rpb24gcnVuRGVzdHJ1Y3RvcigkJCl7aWYoJCQuc21hcnRQdHIpeyQkLnNtYXJ0UHRyVHlwZS5yYXdEZXN0cnVjdG9yKCQkLnNtYXJ0UHRyKX1lbHNleyQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoJCQucHRyKX19ZnVuY3Rpb24gcmVsZWFzZUNsYXNzSGFuZGxlKCQkKXskJC5jb3VudC52YWx1ZS09MTt2YXIgdG9EZWxldGU9MD09PSQkLmNvdW50LnZhbHVlO2lmKHRvRGVsZXRlKXtydW5EZXN0cnVjdG9yKCQkKX19ZnVuY3Rpb24gYXR0YWNoRmluYWxpemVyKGhhbmRsZSl7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgRmluYWxpemF0aW9uR3JvdXApe2F0dGFjaEZpbmFsaXplcj1mdW5jdGlvbihoYW5kbGUpe3JldHVybiBoYW5kbGV9O3JldHVybiBoYW5kbGV9ZmluYWxpemF0aW9uR3JvdXA9bmV3IEZpbmFsaXphdGlvbkdyb3VwKGZ1bmN0aW9uKGl0ZXIpe2Zvcih2YXIgcmVzdWx0PWl0ZXIubmV4dCgpOyFyZXN1bHQuZG9uZTtyZXN1bHQ9aXRlci5uZXh0KCkpe3ZhciAkJD1yZXN1bHQudmFsdWU7aWYoISQkLnB0cil7Y29uc29sZS53YXJuKCJvYmplY3QgYWxyZWFkeSBkZWxldGVkOiAiKyQkLnB0cil9ZWxzZXtyZWxlYXNlQ2xhc3NIYW5kbGUoJCQpfX19KTthdHRhY2hGaW5hbGl6ZXI9ZnVuY3Rpb24oaGFuZGxlKXtmaW5hbGl6YXRpb25Hcm91cC5yZWdpc3RlcihoYW5kbGUsaGFuZGxlLiQkLGhhbmRsZS4kJCk7cmV0dXJuIGhhbmRsZX07ZGV0YWNoRmluYWxpemVyPWZ1bmN0aW9uKGhhbmRsZSl7ZmluYWxpemF0aW9uR3JvdXAudW5yZWdpc3RlcihoYW5kbGUuJCQpfTtyZXR1cm4gYXR0YWNoRmluYWxpemVyKGhhbmRsZSl9ZnVuY3Rpb24gQ2xhc3NIYW5kbGVfY2xvbmUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aGlzLiQkLmNvdW50LnZhbHVlKz0xO3JldHVybiB0aGlzfWVsc2V7dmFyIGNsb25lPWF0dGFjaEZpbmFsaXplcihPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOnNoYWxsb3dDb3B5SW50ZXJuYWxQb2ludGVyKHRoaXMuJCQpfX0pKTtjbG9uZS4kJC5jb3VudC52YWx1ZSs9MTtjbG9uZS4kJC5kZWxldGVTY2hlZHVsZWQ9ZmFsc2U7cmV0dXJuIGNsb25lfX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9kZWxldGUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3Rocm93QmluZGluZ0Vycm9yKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIil9ZGV0YWNoRmluYWxpemVyKHRoaXMpO3JlbGVhc2VDbGFzc0hhbmRsZSh0aGlzLiQkKTtpZighdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSl7dGhpcy4kJC5zbWFydFB0cj11bmRlZmluZWQ7dGhpcy4kJC5wdHI9dW5kZWZpbmVkfX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9pc0RlbGV0ZWQoKXtyZXR1cm4hdGhpcy4kJC5wdHJ9dmFyIGRlbGF5RnVuY3Rpb249dW5kZWZpbmVkO3ZhciBkZWxldGlvblF1ZXVlPVtdO2Z1bmN0aW9uIGZsdXNoUGVuZGluZ0RlbGV0ZXMoKXt3aGlsZShkZWxldGlvblF1ZXVlLmxlbmd0aCl7dmFyIG9iaj1kZWxldGlvblF1ZXVlLnBvcCgpO29iai4kJC5kZWxldGVTY2hlZHVsZWQ9ZmFsc2U7b2JqWyJkZWxldGUiXSgpfX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9kZWxldGVMYXRlcigpe2lmKCF0aGlzLiQkLnB0cil7dGhyb3dJbnN0YW5jZUFscmVhZHlEZWxldGVkKHRoaXMpfWlmKHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSl7dGhyb3dCaW5kaW5nRXJyb3IoIk9iamVjdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgZGVsZXRpb24iKX1kZWxldGlvblF1ZXVlLnB1c2godGhpcyk7aWYoZGVsZXRpb25RdWV1ZS5sZW5ndGg9PT0xJiZkZWxheUZ1bmN0aW9uKXtkZWxheUZ1bmN0aW9uKGZsdXNoUGVuZGluZ0RlbGV0ZXMpfXRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkPXRydWU7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gaW5pdF9DbGFzc0hhbmRsZSgpe0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNBbGlhc09mIl09Q2xhc3NIYW5kbGVfaXNBbGlhc09mO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiY2xvbmUiXT1DbGFzc0hhbmRsZV9jbG9uZTtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImRlbGV0ZSJdPUNsYXNzSGFuZGxlX2RlbGV0ZTtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImlzRGVsZXRlZCJdPUNsYXNzSGFuZGxlX2lzRGVsZXRlZDtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImRlbGV0ZUxhdGVyIl09Q2xhc3NIYW5kbGVfZGVsZXRlTGF0ZXJ9ZnVuY3Rpb24gQ2xhc3NIYW5kbGUoKXt9dmFyIHJlZ2lzdGVyZWRQb2ludGVycz17fTtmdW5jdGlvbiBlbnN1cmVPdmVybG9hZFRhYmxlKHByb3RvLG1ldGhvZE5hbWUsaHVtYW5OYW1lKXtpZih1bmRlZmluZWQ9PT1wcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlKXt2YXIgcHJldkZ1bmM9cHJvdG9bbWV0aG9kTmFtZV07cHJvdG9bbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtpZighcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZS5oYXNPd25Qcm9wZXJ0eShhcmd1bWVudHMubGVuZ3RoKSl7dGhyb3dCaW5kaW5nRXJyb3IoIkZ1bmN0aW9uICciK2h1bWFuTmFtZSsiJyBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgKCIrYXJndW1lbnRzLmxlbmd0aCsiKSAtIGV4cGVjdHMgb25lIG9mICgiK3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGUrIikhIil9cmV0dXJuIHByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJndW1lbnRzLmxlbmd0aF0uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlPVtdO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbcHJldkZ1bmMuYXJnQ291bnRdPXByZXZGdW5jfX1mdW5jdGlvbiBleHBvc2VQdWJsaWNTeW1ib2wobmFtZSx2YWx1ZSxudW1Bcmd1bWVudHMpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7aWYodW5kZWZpbmVkPT09bnVtQXJndW1lbnRzfHx1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSYmdW5kZWZpbmVkIT09TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBwdWJsaWMgbmFtZSAnIituYW1lKyInIHR3aWNlIil9ZW5zdXJlT3ZlcmxvYWRUYWJsZShNb2R1bGUsbmFtZSxuYW1lKTtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkobnVtQXJndW1lbnRzKSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBvdmVybG9hZHMgb2YgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgKCIrbnVtQXJndW1lbnRzKyIpISIpfU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlW251bUFyZ3VtZW50c109dmFsdWV9ZWxzZXtNb2R1bGVbbmFtZV09dmFsdWU7aWYodW5kZWZpbmVkIT09bnVtQXJndW1lbnRzKXtNb2R1bGVbbmFtZV0ubnVtQXJndW1lbnRzPW51bUFyZ3VtZW50c319fWZ1bmN0aW9uIFJlZ2lzdGVyZWRDbGFzcyhuYW1lLGNvbnN0cnVjdG9yLGluc3RhbmNlUHJvdG90eXBlLHJhd0Rlc3RydWN0b3IsYmFzZUNsYXNzLGdldEFjdHVhbFR5cGUsdXBjYXN0LGRvd25jYXN0KXt0aGlzLm5hbWU9bmFtZTt0aGlzLmNvbnN0cnVjdG9yPWNvbnN0cnVjdG9yO3RoaXMuaW5zdGFuY2VQcm90b3R5cGU9aW5zdGFuY2VQcm90b3R5cGU7dGhpcy5yYXdEZXN0cnVjdG9yPXJhd0Rlc3RydWN0b3I7dGhpcy5iYXNlQ2xhc3M9YmFzZUNsYXNzO3RoaXMuZ2V0QWN0dWFsVHlwZT1nZXRBY3R1YWxUeXBlO3RoaXMudXBjYXN0PXVwY2FzdDt0aGlzLmRvd25jYXN0PWRvd25jYXN0O3RoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119ZnVuY3Rpb24gdXBjYXN0UG9pbnRlcihwdHIscHRyQ2xhc3MsZGVzaXJlZENsYXNzKXt3aGlsZShwdHJDbGFzcyE9PWRlc2lyZWRDbGFzcyl7aWYoIXB0ckNsYXNzLnVwY2FzdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkV4cGVjdGVkIG51bGwgb3IgaW5zdGFuY2Ugb2YgIitkZXNpcmVkQ2xhc3MubmFtZSsiLCBnb3QgYW4gaW5zdGFuY2Ugb2YgIitwdHJDbGFzcy5uYW1lKX1wdHI9cHRyQ2xhc3MudXBjYXN0KHB0cik7cHRyQ2xhc3M9cHRyQ2xhc3MuYmFzZUNsYXNzfXJldHVybiBwdHJ9ZnVuY3Rpb24gY29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGUoZGVzdHJ1Y3RvcnMsaGFuZGxlKXtpZihoYW5kbGU9PT1udWxsKXtpZih0aGlzLmlzUmVmZXJlbmNlKXt0aHJvd0JpbmRpbmdFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSl9cmV0dXJuIDB9aWYoIWhhbmRsZS4kJCl7dGhyb3dCaW5kaW5nRXJyb3IoJ0Nhbm5vdCBwYXNzICInK19lbWJpbmRfcmVwcihoYW5kbGUpKyciIGFzIGEgJyt0aGlzLm5hbWUpfWlmKCFoYW5kbGUuJCQucHRyKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBwdHJ9ZnVuY3Rpb24gZ2VuZXJpY1BvaW50ZXJUb1dpcmVUeXBlKGRlc3RydWN0b3JzLGhhbmRsZSl7dmFyIHB0cjtpZihoYW5kbGU9PT1udWxsKXtpZih0aGlzLmlzUmVmZXJlbmNlKXt0aHJvd0JpbmRpbmdFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cHRyPXRoaXMucmF3Q29uc3RydWN0b3IoKTtpZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHB0cil9cmV0dXJuIHB0cn1lbHNle3JldHVybiAwfX1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9aWYoIXRoaXMuaXNDb25zdCYmaGFuZGxlLiQkLnB0clR5cGUuaXNDb25zdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZT9oYW5kbGUuJCQuc21hcnRQdHJUeXBlLm5hbWU6aGFuZGxlLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9dmFyIGhhbmRsZUNsYXNzPWhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcztwdHI9dXBjYXN0UG9pbnRlcihoYW5kbGUuJCQucHRyLGhhbmRsZUNsYXNzLHRoaXMucmVnaXN0ZXJlZENsYXNzKTtpZih0aGlzLmlzU21hcnRQb2ludGVyKXtpZih1bmRlZmluZWQ9PT1oYW5kbGUuJCQuc21hcnRQdHIpe3Rocm93QmluZGluZ0Vycm9yKCJQYXNzaW5nIHJhdyBwb2ludGVyIHRvIHNtYXJ0IHBvaW50ZXIgaXMgaWxsZWdhbCIpfXN3aXRjaCh0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDppZihoYW5kbGUuJCQuc21hcnRQdHJUeXBlPT09dGhpcyl7cHRyPWhhbmRsZS4kJC5zbWFydFB0cn1lbHNle3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIrKGhhbmRsZS4kJC5zbWFydFB0clR5cGU/aGFuZGxlLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOmhhbmRsZS4kJC5wdHJUeXBlLm5hbWUpKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfWJyZWFrO2Nhc2UgMTpwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihoYW5kbGUuJCQuc21hcnRQdHJUeXBlPT09dGhpcyl7cHRyPWhhbmRsZS4kJC5zbWFydFB0cn1lbHNle3ZhciBjbG9uZWRIYW5kbGU9aGFuZGxlWyJjbG9uZSJdKCk7cHRyPXRoaXMucmF3U2hhcmUocHRyLF9fZW12YWxfcmVnaXN0ZXIoZnVuY3Rpb24oKXtjbG9uZWRIYW5kbGVbImRlbGV0ZSJdKCl9KSk7aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKHRoaXMucmF3RGVzdHJ1Y3RvcixwdHIpfX1icmVhaztkZWZhdWx0OnRocm93QmluZGluZ0Vycm9yKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX19cmV0dXJuIHB0cn1mdW5jdGlvbiBub25Db25zdE5vU21hcnRQdHJSYXdQb2ludGVyVG9XaXJlVHlwZShkZXN0cnVjdG9ycyxoYW5kbGUpe2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1yZXR1cm4gMH1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9aWYoaGFuZGxlLiQkLnB0clR5cGUuaXNDb25zdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIitoYW5kbGUuJCQucHRyVHlwZS5uYW1lKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBwdHJ9ZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXJfZ2V0UG9pbnRlZShwdHIpe2lmKHRoaXMucmF3R2V0UG9pbnRlZSl7cHRyPXRoaXMucmF3R2V0UG9pbnRlZShwdHIpfXJldHVybiBwdHJ9ZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXJfZGVzdHJ1Y3RvcihwdHIpe2lmKHRoaXMucmF3RGVzdHJ1Y3Rvcil7dGhpcy5yYXdEZXN0cnVjdG9yKHB0cil9fWZ1bmN0aW9uIFJlZ2lzdGVyZWRQb2ludGVyX2RlbGV0ZU9iamVjdChoYW5kbGUpe2lmKGhhbmRsZSE9PW51bGwpe2hhbmRsZVsiZGVsZXRlIl0oKX19ZnVuY3Rpb24gZG93bmNhc3RQb2ludGVyKHB0cixwdHJDbGFzcyxkZXNpcmVkQ2xhc3Mpe2lmKHB0ckNsYXNzPT09ZGVzaXJlZENsYXNzKXtyZXR1cm4gcHRyfWlmKHVuZGVmaW5lZD09PWRlc2lyZWRDbGFzcy5iYXNlQ2xhc3Mpe3JldHVybiBudWxsfXZhciBydj1kb3duY2FzdFBvaW50ZXIocHRyLHB0ckNsYXNzLGRlc2lyZWRDbGFzcy5iYXNlQ2xhc3MpO2lmKHJ2PT09bnVsbCl7cmV0dXJuIG51bGx9cmV0dXJuIGRlc2lyZWRDbGFzcy5kb3duY2FzdChydil9ZnVuY3Rpb24gZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudCgpe3JldHVybiBPYmplY3Qua2V5cyhyZWdpc3RlcmVkSW5zdGFuY2VzKS5sZW5ndGh9ZnVuY3Rpb24gZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcygpe3ZhciBydj1bXTtmb3IodmFyIGsgaW4gcmVnaXN0ZXJlZEluc3RhbmNlcyl7aWYocmVnaXN0ZXJlZEluc3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShrKSl7cnYucHVzaChyZWdpc3RlcmVkSW5zdGFuY2VzW2tdKX19cmV0dXJuIHJ2fWZ1bmN0aW9uIHNldERlbGF5RnVuY3Rpb24oZm4pe2RlbGF5RnVuY3Rpb249Zm47aWYoZGVsZXRpb25RdWV1ZS5sZW5ndGgmJmRlbGF5RnVuY3Rpb24pe2RlbGF5RnVuY3Rpb24oZmx1c2hQZW5kaW5nRGVsZXRlcyl9fWZ1bmN0aW9uIGluaXRfZW1iaW5kKCl7TW9kdWxlWyJnZXRJbmhlcml0ZWRJbnN0YW5jZUNvdW50Il09Z2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudDtNb2R1bGVbImdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXMiXT1nZXRMaXZlSW5oZXJpdGVkSW5zdGFuY2VzO01vZHVsZVsiZmx1c2hQZW5kaW5nRGVsZXRlcyJdPWZsdXNoUGVuZGluZ0RlbGV0ZXM7TW9kdWxlWyJzZXREZWxheUZ1bmN0aW9uIl09c2V0RGVsYXlGdW5jdGlvbn12YXIgcmVnaXN0ZXJlZEluc3RhbmNlcz17fTtmdW5jdGlvbiBnZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpe2lmKHB0cj09PXVuZGVmaW5lZCl7dGhyb3dCaW5kaW5nRXJyb3IoInB0ciBzaG91bGQgbm90IGJlIHVuZGVmaW5lZCIpfXdoaWxlKGNsYXNzXy5iYXNlQ2xhc3Mpe3B0cj1jbGFzc18udXBjYXN0KHB0cik7Y2xhc3NfPWNsYXNzXy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiBnZXRJbmhlcml0ZWRJbnN0YW5jZShjbGFzc18scHRyKXtwdHI9Z2V0QmFzZXN0UG9pbnRlcihjbGFzc18scHRyKTtyZXR1cm4gcmVnaXN0ZXJlZEluc3RhbmNlc1twdHJdfWZ1bmN0aW9uIG1ha2VDbGFzc0hhbmRsZShwcm90b3R5cGUscmVjb3JkKXtpZighcmVjb3JkLnB0clR5cGV8fCFyZWNvcmQucHRyKXt0aHJvd0ludGVybmFsRXJyb3IoIm1ha2VDbGFzc0hhbmRsZSByZXF1aXJlcyBwdHIgYW5kIHB0clR5cGUiKX12YXIgaGFzU21hcnRQdHJUeXBlPSEhcmVjb3JkLnNtYXJ0UHRyVHlwZTt2YXIgaGFzU21hcnRQdHI9ISFyZWNvcmQuc21hcnRQdHI7aWYoaGFzU21hcnRQdHJUeXBlIT09aGFzU21hcnRQdHIpe3Rocm93SW50ZXJuYWxFcnJvcigiQm90aCBzbWFydFB0clR5cGUgYW5kIHNtYXJ0UHRyIG11c3QgYmUgc3BlY2lmaWVkIil9cmVjb3JkLmNvdW50PXt2YWx1ZToxfTtyZXR1cm4gYXR0YWNoRmluYWxpemVyKE9iamVjdC5jcmVhdGUocHJvdG90eXBlLHskJDp7dmFsdWU6cmVjb3JkfX0pKX1mdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcl9mcm9tV2lyZVR5cGUocHRyKXt2YXIgcmF3UG9pbnRlcj10aGlzLmdldFBvaW50ZWUocHRyKTtpZighcmF3UG9pbnRlcil7dGhpcy5kZXN0cnVjdG9yKHB0cik7cmV0dXJuIG51bGx9dmFyIHJlZ2lzdGVyZWRJbnN0YW5jZT1nZXRJbmhlcml0ZWRJbnN0YW5jZSh0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyYXdQb2ludGVyKTtpZih1bmRlZmluZWQhPT1yZWdpc3RlcmVkSW5zdGFuY2Upe2lmKDA9PT1yZWdpc3RlcmVkSW5zdGFuY2UuJCQuY291bnQudmFsdWUpe3JlZ2lzdGVyZWRJbnN0YW5jZS4kJC5wdHI9cmF3UG9pbnRlcjtyZWdpc3RlcmVkSW5zdGFuY2UuJCQuc21hcnRQdHI9cHRyO3JldHVybiByZWdpc3RlcmVkSW5zdGFuY2VbImNsb25lIl0oKX1lbHNle3ZhciBydj1yZWdpc3RlcmVkSW5zdGFuY2VbImNsb25lIl0oKTt0aGlzLmRlc3RydWN0b3IocHRyKTtyZXR1cm4gcnZ9fWZ1bmN0aW9uIG1ha2VEZWZhdWx0SGFuZGxlKCl7aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0aGlzLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTp0aGlzLnBvaW50ZWVUeXBlLHB0cjpyYXdQb2ludGVyLHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOnB0cn0pfWVsc2V7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0aGlzLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTp0aGlzLHB0cjpwdHJ9KX19dmFyIGFjdHVhbFR5cGU9dGhpcy5yZWdpc3RlcmVkQ2xhc3MuZ2V0QWN0dWFsVHlwZShyYXdQb2ludGVyKTt2YXIgcmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQ9cmVnaXN0ZXJlZFBvaW50ZXJzW2FjdHVhbFR5cGVdO2lmKCFyZWdpc3RlcmVkUG9pbnRlclJlY29yZCl7cmV0dXJuIG1ha2VEZWZhdWx0SGFuZGxlLmNhbGwodGhpcyl9dmFyIHRvVHlwZTtpZih0aGlzLmlzQ29uc3Qpe3RvVHlwZT1yZWdpc3RlcmVkUG9pbnRlclJlY29yZC5jb25zdFBvaW50ZXJUeXBlfWVsc2V7dG9UeXBlPXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkLnBvaW50ZXJUeXBlfXZhciBkcD1kb3duY2FzdFBvaW50ZXIocmF3UG9pbnRlcix0aGlzLnJlZ2lzdGVyZWRDbGFzcyx0b1R5cGUucmVnaXN0ZXJlZENsYXNzKTtpZihkcD09PW51bGwpe3JldHVybiBtYWtlRGVmYXVsdEhhbmRsZS5jYWxsKHRoaXMpfWlmKHRoaXMuaXNTbWFydFBvaW50ZXIpe3JldHVybiBtYWtlQ2xhc3NIYW5kbGUodG9UeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTp0b1R5cGUscHRyOmRwLHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOnB0cn0pfWVsc2V7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0b1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRvVHlwZSxwdHI6ZHB9KX19ZnVuY3Rpb24gaW5pdF9SZWdpc3RlcmVkUG9pbnRlcigpe1JlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZS5nZXRQb2ludGVlPVJlZ2lzdGVyZWRQb2ludGVyX2dldFBvaW50ZWU7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlLmRlc3RydWN0b3I9UmVnaXN0ZXJlZFBvaW50ZXJfZGVzdHJ1Y3RvcjtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImFyZ1BhY2tBZHZhbmNlIl09ODtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl09c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXI7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJkZWxldGVPYmplY3QiXT1SZWdpc3RlcmVkUG9pbnRlcl9kZWxldGVPYmplY3Q7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJmcm9tV2lyZVR5cGUiXT1SZWdpc3RlcmVkUG9pbnRlcl9mcm9tV2lyZVR5cGV9ZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSxyZWdpc3RlcmVkQ2xhc3MsaXNSZWZlcmVuY2UsaXNDb25zdCxpc1NtYXJ0UG9pbnRlcixwb2ludGVlVHlwZSxzaGFyaW5nUG9saWN5LHJhd0dldFBvaW50ZWUscmF3Q29uc3RydWN0b3IscmF3U2hhcmUscmF3RGVzdHJ1Y3Rvcil7dGhpcy5uYW1lPW5hbWU7dGhpcy5yZWdpc3RlcmVkQ2xhc3M9cmVnaXN0ZXJlZENsYXNzO3RoaXMuaXNSZWZlcmVuY2U9aXNSZWZlcmVuY2U7dGhpcy5pc0NvbnN0PWlzQ29uc3Q7dGhpcy5pc1NtYXJ0UG9pbnRlcj1pc1NtYXJ0UG9pbnRlcjt0aGlzLnBvaW50ZWVUeXBlPXBvaW50ZWVUeXBlO3RoaXMuc2hhcmluZ1BvbGljeT1zaGFyaW5nUG9saWN5O3RoaXMucmF3R2V0UG9pbnRlZT1yYXdHZXRQb2ludGVlO3RoaXMucmF3Q29uc3RydWN0b3I9cmF3Q29uc3RydWN0b3I7dGhpcy5yYXdTaGFyZT1yYXdTaGFyZTt0aGlzLnJhd0Rlc3RydWN0b3I9cmF3RGVzdHJ1Y3RvcjtpZighaXNTbWFydFBvaW50ZXImJnJlZ2lzdGVyZWRDbGFzcy5iYXNlQ2xhc3M9PT11bmRlZmluZWQpe2lmKGlzQ29uc3Qpe3RoaXNbInRvV2lyZVR5cGUiXT1jb25zdE5vU21hcnRQdHJSYXdQb2ludGVyVG9XaXJlVHlwZTt0aGlzLmRlc3RydWN0b3JGdW5jdGlvbj1udWxsfWVsc2V7dGhpc1sidG9XaXJlVHlwZSJdPW5vbkNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlO3RoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGx9fWVsc2V7dGhpc1sidG9XaXJlVHlwZSJdPWdlbmVyaWNQb2ludGVyVG9XaXJlVHlwZX19ZnVuY3Rpb24gcmVwbGFjZVB1YmxpY1N5bWJvbChuYW1lLHZhbHVlLG51bUFyZ3VtZW50cyl7aWYoIU1vZHVsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7dGhyb3dJbnRlcm5hbEVycm9yKCJSZXBsYWNpbmcgbm9uZXhpc3RhbnQgcHVibGljIHN5bWJvbCIpfWlmKHVuZGVmaW5lZCE9PU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlJiZ1bmRlZmluZWQhPT1udW1Bcmd1bWVudHMpe01vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlW251bUFyZ3VtZW50c109dmFsdWV9ZWxzZXtNb2R1bGVbbmFtZV09dmFsdWU7TW9kdWxlW25hbWVdLmFyZ0NvdW50PW51bUFyZ3VtZW50c319ZnVuY3Rpb24gZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oc2lnbmF0dXJlLHJhd0Z1bmN0aW9uKXtzaWduYXR1cmU9cmVhZExhdGluMVN0cmluZyhzaWduYXR1cmUpO2Z1bmN0aW9uIG1ha2VEeW5DYWxsZXIoZHluQ2FsbCl7dmFyIGFyZ3M9W107Zm9yKHZhciBpPTE7aTxzaWduYXR1cmUubGVuZ3RoOysraSl7YXJncy5wdXNoKCJhIitpKX12YXIgbmFtZT0iZHluQ2FsbF8iK3NpZ25hdHVyZSsiXyIrcmF3RnVuY3Rpb247dmFyIGJvZHk9InJldHVybiBmdW5jdGlvbiAiK25hbWUrIigiK2FyZ3Muam9pbigiLCAiKSsiKSB7XG4iO2JvZHkrPSIgICAgcmV0dXJuIGR5bkNhbGwocmF3RnVuY3Rpb24iKyhhcmdzLmxlbmd0aD8iLCAiOiIiKSthcmdzLmpvaW4oIiwgIikrIik7XG4iO2JvZHkrPSJ9O1xuIjtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJkeW5DYWxsIiwicmF3RnVuY3Rpb24iLGJvZHkpKGR5bkNhbGwscmF3RnVuY3Rpb24pfXZhciBkYz1Nb2R1bGVbImR5bkNhbGxfIitzaWduYXR1cmVdO3ZhciBmcD1tYWtlRHluQ2FsbGVyKGRjKTtpZih0eXBlb2YgZnAhPT0iZnVuY3Rpb24iKXt0aHJvd0JpbmRpbmdFcnJvcigidW5rbm93biBmdW5jdGlvbiBwb2ludGVyIHdpdGggc2lnbmF0dXJlICIrc2lnbmF0dXJlKyI6ICIrcmF3RnVuY3Rpb24pfXJldHVybiBmcH12YXIgVW5ib3VuZFR5cGVFcnJvcj11bmRlZmluZWQ7ZnVuY3Rpb24gZ2V0VHlwZU5hbWUodHlwZSl7dmFyIHB0cj1fX19nZXRUeXBlTmFtZSh0eXBlKTt2YXIgcnY9cmVhZExhdGluMVN0cmluZyhwdHIpO19mcmVlKHB0cik7cmV0dXJuIHJ2fWZ1bmN0aW9uIHRocm93VW5ib3VuZFR5cGVFcnJvcihtZXNzYWdlLHR5cGVzKXt2YXIgdW5ib3VuZFR5cGVzPVtdO3ZhciBzZWVuPXt9O2Z1bmN0aW9uIHZpc2l0KHR5cGUpe2lmKHNlZW5bdHlwZV0pe3JldHVybn1pZihyZWdpc3RlcmVkVHlwZXNbdHlwZV0pe3JldHVybn1pZih0eXBlRGVwZW5kZW5jaWVzW3R5cGVdKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdLmZvckVhY2godmlzaXQpO3JldHVybn11bmJvdW5kVHlwZXMucHVzaCh0eXBlKTtzZWVuW3R5cGVdPXRydWV9dHlwZXMuZm9yRWFjaCh2aXNpdCk7dGhyb3cgbmV3IFVuYm91bmRUeXBlRXJyb3IobWVzc2FnZSsiOiAiK3VuYm91bmRUeXBlcy5tYXAoZ2V0VHlwZU5hbWUpLmpvaW4oWyIsICJdKSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3MocmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlLGJhc2VDbGFzc1Jhd1R5cGUsZ2V0QWN0dWFsVHlwZVNpZ25hdHVyZSxnZXRBY3R1YWxUeXBlLHVwY2FzdFNpZ25hdHVyZSx1cGNhc3QsZG93bmNhc3RTaWduYXR1cmUsZG93bmNhc3QsbmFtZSxkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtnZXRBY3R1YWxUeXBlPWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGdldEFjdHVhbFR5cGVTaWduYXR1cmUsZ2V0QWN0dWFsVHlwZSk7aWYodXBjYXN0KXt1cGNhc3Q9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24odXBjYXN0U2lnbmF0dXJlLHVwY2FzdCl9aWYoZG93bmNhc3Qpe2Rvd25jYXN0PWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGRvd25jYXN0U2lnbmF0dXJlLGRvd25jYXN0KX1yYXdEZXN0cnVjdG9yPWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcik7dmFyIGxlZ2FsRnVuY3Rpb25OYW1lPW1ha2VMZWdhbEZ1bmN0aW9uTmFtZShuYW1lKTtleHBvc2VQdWJsaWNTeW1ib2wobGVnYWxGdW5jdGlvbk5hbWUsZnVuY3Rpb24oKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjb25zdHJ1Y3QgIituYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLFtiYXNlQ2xhc3NSYXdUeXBlXSl9KTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbcmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlXSxiYXNlQ2xhc3NSYXdUeXBlP1tiYXNlQ2xhc3NSYXdUeXBlXTpbXSxmdW5jdGlvbihiYXNlKXtiYXNlPWJhc2VbMF07dmFyIGJhc2VDbGFzczt2YXIgYmFzZVByb3RvdHlwZTtpZihiYXNlQ2xhc3NSYXdUeXBlKXtiYXNlQ2xhc3M9YmFzZS5yZWdpc3RlcmVkQ2xhc3M7YmFzZVByb3RvdHlwZT1iYXNlQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGV9ZWxzZXtiYXNlUHJvdG90eXBlPUNsYXNzSGFuZGxlLnByb3RvdHlwZX12YXIgY29uc3RydWN0b3I9Y3JlYXRlTmFtZWRGdW5jdGlvbihsZWdhbEZ1bmN0aW9uTmFtZSxmdW5jdGlvbigpe2lmKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSE9PWluc3RhbmNlUHJvdG90eXBlKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJVc2UgJ25ldycgdG8gY29uc3RydWN0ICIrbmFtZSl9aWYodW5kZWZpbmVkPT09cmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHkpe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IobmFtZSsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIil9dmFyIGJvZHk9cmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbYXJndW1lbnRzLmxlbmd0aF07aWYodW5kZWZpbmVkPT09Ym9keSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcigiVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgIituYW1lKyIgd2l0aCBpbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzICgiK2FyZ3VtZW50cy5sZW5ndGgrIikgLSBleHBlY3RlZCAoIitPYmplY3Qua2V5cyhyZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keSkudG9TdHJpbmcoKSsiKSBwYXJhbWV0ZXJzIGluc3RlYWQhIil9cmV0dXJuIGJvZHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSk7dmFyIGluc3RhbmNlUHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYmFzZVByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmNvbnN0cnVjdG9yfX0pO2NvbnN0cnVjdG9yLnByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt2YXIgcmVnaXN0ZXJlZENsYXNzPW5ldyBSZWdpc3RlcmVkQ2xhc3MobmFtZSxjb25zdHJ1Y3RvcixpbnN0YW5jZVByb3RvdHlwZSxyYXdEZXN0cnVjdG9yLGJhc2VDbGFzcyxnZXRBY3R1YWxUeXBlLHVwY2FzdCxkb3duY2FzdCk7dmFyIHJlZmVyZW5jZUNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSxyZWdpc3RlcmVkQ2xhc3MsdHJ1ZSxmYWxzZSxmYWxzZSk7dmFyIHBvaW50ZXJDb252ZXJ0ZXI9bmV3IFJlZ2lzdGVyZWRQb2ludGVyKG5hbWUrIioiLHJlZ2lzdGVyZWRDbGFzcyxmYWxzZSxmYWxzZSxmYWxzZSk7dmFyIGNvbnN0UG9pbnRlckNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSsiIGNvbnN0KiIscmVnaXN0ZXJlZENsYXNzLGZhbHNlLHRydWUsZmFsc2UpO3JlZ2lzdGVyZWRQb2ludGVyc1tyYXdUeXBlXT17cG9pbnRlclR5cGU6cG9pbnRlckNvbnZlcnRlcixjb25zdFBvaW50ZXJUeXBlOmNvbnN0UG9pbnRlckNvbnZlcnRlcn07cmVwbGFjZVB1YmxpY1N5bWJvbChsZWdhbEZ1bmN0aW9uTmFtZSxjb25zdHJ1Y3Rvcik7cmV0dXJuW3JlZmVyZW5jZUNvbnZlcnRlcixwb2ludGVyQ29udmVydGVyLGNvbnN0UG9pbnRlckNvbnZlcnRlcl19KX1mdW5jdGlvbiBoZWFwMzJWZWN0b3JUb0FycmF5KGNvdW50LGZpcnN0RWxlbWVudCl7dmFyIGFycmF5PVtdO2Zvcih2YXIgaT0wO2k8Y291bnQ7aSsrKXthcnJheS5wdXNoKEhFQVAzMlsoZmlyc3RFbGVtZW50Pj4yKStpXSl9cmV0dXJuIGFycmF5fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yKHJhd0NsYXNzVHlwZSxhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIsaW52b2tlclNpZ25hdHVyZSxpbnZva2VyLHJhd0NvbnN0cnVjdG9yKXthc3NlcnQoYXJnQ291bnQ+MCk7dmFyIHJhd0FyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTtpbnZva2VyPWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGludm9rZXJTaWduYXR1cmUsaW52b2tlcik7dmFyIGFyZ3M9W3Jhd0NvbnN0cnVjdG9yXTt2YXIgZGVzdHJ1Y3RvcnM9W107d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sW3Jhd0NsYXNzVHlwZV0sZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9ImNvbnN0cnVjdG9yICIrY2xhc3NUeXBlLm5hbWU7aWYodW5kZWZpbmVkPT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9W119aWYodW5kZWZpbmVkIT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgiKyhhcmdDb3VudC0xKSsiKSBmb3IgY2xhc3MgJyIrY2xhc3NUeXBlLm5hbWUrIichIE92ZXJsb2FkIHJlc29sdXRpb24gaXMgY3VycmVudGx5IG9ubHkgcGVyZm9ybWVkIHVzaW5nIHRoZSBwYXJhbWV0ZXIgY291bnQsIG5vdCBhY3R1YWwgdHlwZSBpbmZvISIpfWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmdDb3VudC0xXT1mdW5jdGlvbiB1bmJvdW5kVHlwZUhhbmRsZXIoKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjb25zdHJ1Y3QgIitjbGFzc1R5cGUubmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixyYXdBcmdUeXBlcyl9O3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLHJhd0FyZ1R5cGVzLGZ1bmN0aW9uKGFyZ1R5cGVzKXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbYXJnQ291bnQtMV09ZnVuY3Rpb24gY29uc3RydWN0b3JfYm9keSgpe2lmKGFyZ3VtZW50cy5sZW5ndGghPT1hcmdDb3VudC0xKXt0aHJvd0JpbmRpbmdFcnJvcihodW1hbk5hbWUrIiBjYWxsZWQgd2l0aCAiK2FyZ3VtZW50cy5sZW5ndGgrIiBhcmd1bWVudHMsIGV4cGVjdGVkICIrKGFyZ0NvdW50LTEpKX1kZXN0cnVjdG9ycy5sZW5ndGg9MDthcmdzLmxlbmd0aD1hcmdDb3VudDtmb3IodmFyIGk9MTtpPGFyZ0NvdW50OysraSl7YXJnc1tpXT1hcmdUeXBlc1tpXVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLGFyZ3VtZW50c1tpLTFdKX12YXIgcHRyPWludm9rZXIuYXBwbHkobnVsbCxhcmdzKTtydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7cmV0dXJuIGFyZ1R5cGVzWzBdWyJmcm9tV2lyZVR5cGUiXShwdHIpfTtyZXR1cm5bXX0pO3JldHVybltdfSl9ZnVuY3Rpb24gbmV3Xyhjb25zdHJ1Y3Rvcixhcmd1bWVudExpc3Qpe2lmKCEoY29uc3RydWN0b3IgaW5zdGFuY2VvZiBGdW5jdGlvbikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIm5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAiK3R5cGVvZiBjb25zdHJ1Y3RvcisiIHdoaWNoIGlzIG5vdCBhIGZ1bmN0aW9uIil9dmFyIGR1bW15PWNyZWF0ZU5hbWVkRnVuY3Rpb24oY29uc3RydWN0b3IubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7ZHVtbXkucHJvdG90eXBlPWNvbnN0cnVjdG9yLnByb3RvdHlwZTt2YXIgb2JqPW5ldyBkdW1teTt2YXIgcj1jb25zdHJ1Y3Rvci5hcHBseShvYmosYXJndW1lbnRMaXN0KTtyZXR1cm4gciBpbnN0YW5jZW9mIE9iamVjdD9yOm9ian1mdW5jdGlvbiBjcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLGNwcEludm9rZXJGdW5jLGNwcFRhcmdldEZ1bmMpe3ZhciBhcmdDb3VudD1hcmdUeXBlcy5sZW5ndGg7aWYoYXJnQ291bnQ8Mil7dGhyb3dCaW5kaW5nRXJyb3IoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpfXZhciBpc0NsYXNzTWV0aG9kRnVuYz1hcmdUeXBlc1sxXSE9PW51bGwmJmNsYXNzVHlwZSE9PW51bGw7dmFyIG5lZWRzRGVzdHJ1Y3RvclN0YWNrPWZhbHNlO2Zvcih2YXIgaT0xO2k8YXJnVHlwZXMubGVuZ3RoOysraSl7aWYoYXJnVHlwZXNbaV0hPT1udWxsJiZhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb249PT11bmRlZmluZWQpe25lZWRzRGVzdHJ1Y3RvclN0YWNrPXRydWU7YnJlYWt9fXZhciByZXR1cm5zPWFyZ1R5cGVzWzBdLm5hbWUhPT0idm9pZCI7dmFyIGFyZ3NMaXN0PSIiO3ZhciBhcmdzTGlzdFdpcmVkPSIiO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMjsrK2kpe2FyZ3NMaXN0Kz0oaSE9PTA/IiwgIjoiIikrImFyZyIraTthcmdzTGlzdFdpcmVkKz0oaSE9PTA/IiwgIjoiIikrImFyZyIraSsiV2lyZWQifXZhciBpbnZva2VyRm5Cb2R5PSJyZXR1cm4gZnVuY3Rpb24gIittYWtlTGVnYWxGdW5jdGlvbk5hbWUoaHVtYW5OYW1lKSsiKCIrYXJnc0xpc3QrIikge1xuIisiaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09ICIrKGFyZ0NvdW50LTIpKyIpIHtcbiIrInRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAiK2h1bWFuTmFtZSsiIGNhbGxlZCB3aXRoICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMsIGV4cGVjdGVkICIrKGFyZ0NvdW50LTIpKyIgYXJncyEnKTtcbiIrIn1cbiI7aWYobmVlZHNEZXN0cnVjdG9yU3RhY2spe2ludm9rZXJGbkJvZHkrPSJ2YXIgZGVzdHJ1Y3RvcnMgPSBbXTtcbiJ9dmFyIGR0b3JTdGFjaz1uZWVkc0Rlc3RydWN0b3JTdGFjaz8iZGVzdHJ1Y3RvcnMiOiJudWxsIjt2YXIgYXJnczE9WyJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTt2YXIgYXJnczI9W3Rocm93QmluZGluZ0Vycm9yLGNwcEludm9rZXJGdW5jLGNwcFRhcmdldEZ1bmMscnVuRGVzdHJ1Y3RvcnMsYXJnVHlwZXNbMF0sYXJnVHlwZXNbMV1dO2lmKGlzQ2xhc3NNZXRob2RGdW5jKXtpbnZva2VyRm5Cb2R5Kz0idmFyIHRoaXNXaXJlZCA9IGNsYXNzUGFyYW0udG9XaXJlVHlwZSgiK2R0b3JTdGFjaysiLCB0aGlzKTtcbiJ9Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0yOysraSl7aW52b2tlckZuQm9keSs9InZhciBhcmciK2krIldpcmVkID0gYXJnVHlwZSIraSsiLnRvV2lyZVR5cGUoIitkdG9yU3RhY2srIiwgYXJnIitpKyIpOyAvLyAiK2FyZ1R5cGVzW2krMl0ubmFtZSsiXG4iO2FyZ3MxLnB1c2goImFyZ1R5cGUiK2kpO2FyZ3MyLnB1c2goYXJnVHlwZXNbaSsyXSl9aWYoaXNDbGFzc01ldGhvZEZ1bmMpe2FyZ3NMaXN0V2lyZWQ9InRoaXNXaXJlZCIrKGFyZ3NMaXN0V2lyZWQubGVuZ3RoPjA/IiwgIjoiIikrYXJnc0xpc3RXaXJlZH1pbnZva2VyRm5Cb2R5Kz0ocmV0dXJucz8idmFyIHJ2ID0gIjoiIikrImludm9rZXIoZm4iKyhhcmdzTGlzdFdpcmVkLmxlbmd0aD4wPyIsICI6IiIpK2FyZ3NMaXN0V2lyZWQrIik7XG4iO2lmKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKXtpbnZva2VyRm5Cb2R5Kz0icnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO1xuIn1lbHNle2Zvcih2YXIgaT1pc0NsYXNzTWV0aG9kRnVuYz8xOjI7aTxhcmdUeXBlcy5sZW5ndGg7KytpKXt2YXIgcGFyYW1OYW1lPWk9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyhpLTIpKyJXaXJlZCI7aWYoYXJnVHlwZXNbaV0uZGVzdHJ1Y3RvckZ1bmN0aW9uIT09bnVsbCl7aW52b2tlckZuQm9keSs9cGFyYW1OYW1lKyJfZHRvcigiK3BhcmFtTmFtZSsiKTsgLy8gIithcmdUeXBlc1tpXS5uYW1lKyJcbiI7YXJnczEucHVzaChwYXJhbU5hbWUrIl9kdG9yIik7YXJnczIucHVzaChhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24pfX19aWYocmV0dXJucyl7aW52b2tlckZuQm9keSs9InZhciByZXQgPSByZXRUeXBlLmZyb21XaXJlVHlwZShydik7XG4iKyJyZXR1cm4gcmV0O1xuIn1lbHNle31pbnZva2VyRm5Cb2R5Kz0ifVxuIjthcmdzMS5wdXNoKGludm9rZXJGbkJvZHkpO3ZhciBpbnZva2VyRnVuY3Rpb249bmV3XyhGdW5jdGlvbixhcmdzMSkuYXBwbHkobnVsbCxhcmdzMik7cmV0dXJuIGludm9rZXJGdW5jdGlvbn1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbihyYXdDbGFzc1R5cGUsbWV0aG9kTmFtZSxhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIsaW52b2tlclNpZ25hdHVyZSxyYXdJbnZva2VyLGNvbnRleHQsaXNQdXJlVmlydHVhbCl7dmFyIHJhd0FyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTttZXRob2ROYW1lPXJlYWRMYXRpbjFTdHJpbmcobWV0aG9kTmFtZSk7cmF3SW52b2tlcj1lbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFtyYXdDbGFzc1R5cGVdLGZ1bmN0aW9uKGNsYXNzVHlwZSl7Y2xhc3NUeXBlPWNsYXNzVHlwZVswXTt2YXIgaHVtYW5OYW1lPWNsYXNzVHlwZS5uYW1lKyIuIittZXRob2ROYW1lO2lmKGlzUHVyZVZpcnR1YWwpe2NsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChtZXRob2ROYW1lKX1mdW5jdGlvbiB1bmJvdW5kVHlwZXNIYW5kbGVyKCl7dGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgY2FsbCAiK2h1bWFuTmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixyYXdBcmdUeXBlcyl9dmFyIHByb3RvPWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGU7dmFyIG1ldGhvZD1wcm90b1ttZXRob2ROYW1lXTtpZih1bmRlZmluZWQ9PT1tZXRob2R8fHVuZGVmaW5lZD09PW1ldGhvZC5vdmVybG9hZFRhYmxlJiZtZXRob2QuY2xhc3NOYW1lIT09Y2xhc3NUeXBlLm5hbWUmJm1ldGhvZC5hcmdDb3VudD09PWFyZ0NvdW50LTIpe3VuYm91bmRUeXBlc0hhbmRsZXIuYXJnQ291bnQ9YXJnQ291bnQtMjt1bmJvdW5kVHlwZXNIYW5kbGVyLmNsYXNzTmFtZT1jbGFzc1R5cGUubmFtZTtwcm90b1ttZXRob2ROYW1lXT11bmJvdW5kVHlwZXNIYW5kbGVyfWVsc2V7ZW5zdXJlT3ZlcmxvYWRUYWJsZShwcm90byxtZXRob2ROYW1lLGh1bWFuTmFtZSk7cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmdDb3VudC0yXT11bmJvdW5kVHlwZXNIYW5kbGVyfXdoZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLHJhd0FyZ1R5cGVzLGZ1bmN0aW9uKGFyZ1R5cGVzKXt2YXIgbWVtYmVyRnVuY3Rpb249Y3JhZnRJbnZva2VyRnVuY3Rpb24oaHVtYW5OYW1lLGFyZ1R5cGVzLGNsYXNzVHlwZSxyYXdJbnZva2VyLGNvbnRleHQpO2lmKHVuZGVmaW5lZD09PXByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGUpe21lbWJlckZ1bmN0aW9uLmFyZ0NvdW50PWFyZ0NvdW50LTI7cHJvdG9bbWV0aG9kTmFtZV09bWVtYmVyRnVuY3Rpb259ZWxzZXtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlW2FyZ0NvdW50LTJdPW1lbWJlckZ1bmN0aW9ufXJldHVybltdfSk7cmV0dXJuW119KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jb25zdGFudChuYW1lLHR5cGUsdmFsdWUpe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbdHlwZV0sZnVuY3Rpb24odHlwZSl7dHlwZT10eXBlWzBdO01vZHVsZVtuYW1lXT10eXBlWyJmcm9tV2lyZVR5cGUiXSh2YWx1ZSk7cmV0dXJuW119KX12YXIgZW12YWxfZnJlZV9saXN0PVtdO3ZhciBlbXZhbF9oYW5kbGVfYXJyYXk9W3t9LHt2YWx1ZTp1bmRlZmluZWR9LHt2YWx1ZTpudWxsfSx7dmFsdWU6dHJ1ZX0se3ZhbHVlOmZhbHNlfV07ZnVuY3Rpb24gX19lbXZhbF9kZWNyZWYoaGFuZGxlKXtpZihoYW5kbGU+NCYmMD09PS0tZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0ucmVmY291bnQpe2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdPXVuZGVmaW5lZDtlbXZhbF9mcmVlX2xpc3QucHVzaChoYW5kbGUpfX1mdW5jdGlvbiBjb3VudF9lbXZhbF9oYW5kbGVzKCl7dmFyIGNvdW50PTA7Zm9yKHZhciBpPTU7aTxlbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoOysraSl7aWYoZW12YWxfaGFuZGxlX2FycmF5W2ldIT09dW5kZWZpbmVkKXsrK2NvdW50fX1yZXR1cm4gY291bnR9ZnVuY3Rpb24gZ2V0X2ZpcnN0X2VtdmFsKCl7Zm9yKHZhciBpPTU7aTxlbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoOysraSl7aWYoZW12YWxfaGFuZGxlX2FycmF5W2ldIT09dW5kZWZpbmVkKXtyZXR1cm4gZW12YWxfaGFuZGxlX2FycmF5W2ldfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBpbml0X2VtdmFsKCl7TW9kdWxlWyJjb3VudF9lbXZhbF9oYW5kbGVzIl09Y291bnRfZW12YWxfaGFuZGxlcztNb2R1bGVbImdldF9maXJzdF9lbXZhbCJdPWdldF9maXJzdF9lbXZhbH1mdW5jdGlvbiBfX2VtdmFsX3JlZ2lzdGVyKHZhbHVlKXtzd2l0Y2godmFsdWUpe2Nhc2UgdW5kZWZpbmVkOntyZXR1cm4gMX1jYXNlIG51bGw6e3JldHVybiAyfWNhc2UgdHJ1ZTp7cmV0dXJuIDN9Y2FzZSBmYWxzZTp7cmV0dXJuIDR9ZGVmYXVsdDp7dmFyIGhhbmRsZT1lbXZhbF9mcmVlX2xpc3QubGVuZ3RoP2VtdmFsX2ZyZWVfbGlzdC5wb3AoKTplbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoO2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdPXtyZWZjb3VudDoxLHZhbHVlOnZhbHVlfTtyZXR1cm4gaGFuZGxlfX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbihoYW5kbGUpe3ZhciBydj1lbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS52YWx1ZTtfX2VtdmFsX2RlY3JlZihoYW5kbGUpO3JldHVybiBydn0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtyZXR1cm4gX19lbXZhbF9yZWdpc3Rlcih2YWx1ZSl9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gZW51bVJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQsc2lnbmVkKXtzd2l0Y2goc2hpZnQpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24ocG9pbnRlcil7dmFyIGhlYXA9c2lnbmVkP0hFQVA4OkhFQVBVODtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oaGVhcFtwb2ludGVyXSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24ocG9pbnRlcil7dmFyIGhlYXA9c2lnbmVkP0hFQVAxNjpIRUFQVTE2O3JldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShoZWFwW3BvaW50ZXI+PjFdKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDMyOkhFQVBVMzI7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+Ml0pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gaW50ZWdlciB0eXBlOiAiK25hbWUpfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtKHJhd1R5cGUsbmFtZSxzaXplLGlzU2lnbmVkKXt2YXIgc2hpZnQ9Z2V0U2hpZnRGcm9tU2l6ZShzaXplKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7ZnVuY3Rpb24gY3Rvcigpe31jdG9yLnZhbHVlcz17fTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLGNvbnN0cnVjdG9yOmN0b3IsImZyb21XaXJlVHlwZSI6ZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudmFsdWVzW2NdfSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsYyl7cmV0dXJuIGMudmFsdWV9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmVudW1SZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LGlzU2lnbmVkKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLGN0b3IpfWZ1bmN0aW9uIHJlcXVpcmVSZWdpc3RlcmVkVHlwZShyYXdUeXBlLGh1bWFuTmFtZSl7dmFyIGltcGw9cmVnaXN0ZXJlZFR5cGVzW3Jhd1R5cGVdO2lmKHVuZGVmaW5lZD09PWltcGwpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsiIGhhcyB1bmtub3duIHR5cGUgIitnZXRUeXBlTmFtZShyYXdUeXBlKSl9cmV0dXJuIGltcGx9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW51bV92YWx1ZShyYXdFbnVtVHlwZSxuYW1lLGVudW1WYWx1ZSl7dmFyIGVudW1UeXBlPXJlcXVpcmVSZWdpc3RlcmVkVHlwZShyYXdFbnVtVHlwZSwiZW51bSIpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTt2YXIgRW51bT1lbnVtVHlwZS5jb25zdHJ1Y3Rvcjt2YXIgVmFsdWU9T2JqZWN0LmNyZWF0ZShlbnVtVHlwZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUse3ZhbHVlOnt2YWx1ZTplbnVtVmFsdWV9LGNvbnN0cnVjdG9yOnt2YWx1ZTpjcmVhdGVOYW1lZEZ1bmN0aW9uKGVudW1UeXBlLm5hbWUrIl8iK25hbWUsZnVuY3Rpb24oKXt9KX19KTtFbnVtLnZhbHVlc1tlbnVtVmFsdWVdPVZhbHVlO0VudW1bbmFtZV09VmFsdWV9ZnVuY3Rpb24gX2VtYmluZF9yZXByKHYpe2lmKHY9PT1udWxsKXtyZXR1cm4ibnVsbCJ9dmFyIHQ9dHlwZW9mIHY7aWYodD09PSJvYmplY3QifHx0PT09ImFycmF5Inx8dD09PSJmdW5jdGlvbiIpe3JldHVybiB2LnRvU3RyaW5nKCl9ZWxzZXtyZXR1cm4iIit2fX1mdW5jdGlvbiBmbG9hdFJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQpe3N3aXRjaChzaGlmdCl7Y2FzZSAyOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oSEVBUEYzMltwb2ludGVyPj4yXSl9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24ocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBGNjRbcG9pbnRlcj4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZmxvYXQgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZmxvYXQocmF3VHlwZSxuYW1lLHNpemUpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWV9LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7aWYodHlwZW9mIHZhbHVlIT09Im51bWJlciImJnR5cGVvZiB2YWx1ZSE9PSJib29sZWFuIil7dGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrX2VtYmluZF9yZXByKHZhbHVlKSsnIiB0byAnK3RoaXMubmFtZSl9cmV0dXJuIHZhbHVlfSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpmbG9hdFJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZnVuY3Rpb24obmFtZSxhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIsc2lnbmF0dXJlLHJhd0ludm9rZXIsZm4pe3ZhciBhcmdUeXBlcz1oZWFwMzJWZWN0b3JUb0FycmF5KGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcik7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3Jhd0ludm9rZXI9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oc2lnbmF0dXJlLHJhd0ludm9rZXIpO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLGZ1bmN0aW9uKCl7dGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgY2FsbCAiK25hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsYXJnVHlwZXMpfSxhcmdDb3VudC0xKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxhcmdUeXBlcyxmdW5jdGlvbihhcmdUeXBlcyl7dmFyIGludm9rZXJBcmdzQXJyYXk9W2FyZ1R5cGVzWzBdLG51bGxdLmNvbmNhdChhcmdUeXBlcy5zbGljZSgxKSk7cmVwbGFjZVB1YmxpY1N5bWJvbChuYW1lLGNyYWZ0SW52b2tlckZ1bmN0aW9uKG5hbWUsaW52b2tlckFyZ3NBcnJheSxudWxsLHJhd0ludm9rZXIsZm4pLGFyZ0NvdW50LTEpO3JldHVybltdfSl9ZnVuY3Rpb24gaW50ZWdlclJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQsc2lnbmVkKXtzd2l0Y2goc2hpZnQpe2Nhc2UgMDpyZXR1cm4gc2lnbmVkP2Z1bmN0aW9uIHJlYWRTOEZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQOFtwb2ludGVyXX06ZnVuY3Rpb24gcmVhZFU4RnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIEhFQVBVOFtwb2ludGVyXX07Y2FzZSAxOnJldHVybiBzaWduZWQ/ZnVuY3Rpb24gcmVhZFMxNkZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQMTZbcG9pbnRlcj4+MV19OmZ1bmN0aW9uIHJlYWRVMTZGcm9tUG9pbnRlcihwb2ludGVyKXtyZXR1cm4gSEVBUFUxNltwb2ludGVyPj4xXX07Y2FzZSAyOnJldHVybiBzaWduZWQ/ZnVuY3Rpb24gcmVhZFMzMkZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQMzJbcG9pbnRlcj4+Ml19OmZ1bmN0aW9uIHJlYWRVMzJGcm9tUG9pbnRlcihwb2ludGVyKXtyZXR1cm4gSEVBUFUzMltwb2ludGVyPj4yXX07ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGludGVnZXIgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcihwcmltaXRpdmVUeXBlLG5hbWUsc2l6ZSxtaW5SYW5nZSxtYXhSYW5nZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO2lmKG1heFJhbmdlPT09LTEpe21heFJhbmdlPTQyOTQ5NjcyOTV9dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7dmFyIGZyb21XaXJlVHlwZT1mdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHZhbHVlfTtpZihtaW5SYW5nZT09PTApe3ZhciBiaXRzaGlmdD0zMi04KnNpemU7ZnJvbVdpcmVUeXBlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWU8PGJpdHNoaWZ0Pj4+Yml0c2hpZnR9fXZhciBpc1Vuc2lnbmVkVHlwZT1uYW1lLmluZGV4T2YoInVuc2lnbmVkIikhPS0xO3JlZ2lzdGVyVHlwZShwcmltaXRpdmVUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6ZnJvbVdpcmVUeXBlLCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7aWYodHlwZW9mIHZhbHVlIT09Im51bWJlciImJnR5cGVvZiB2YWx1ZSE9PSJib29sZWFuIil7dGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrX2VtYmluZF9yZXByKHZhbHVlKSsnIiB0byAnK3RoaXMubmFtZSl9aWYodmFsdWU8bWluUmFuZ2V8fHZhbHVlPm1heFJhbmdlKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXNzaW5nIGEgbnVtYmVyICInK19lbWJpbmRfcmVwcih2YWx1ZSkrJyIgZnJvbSBKUyBzaWRlIHRvIEMvQysrIHNpZGUgdG8gYW4gYXJndW1lbnQgb2YgdHlwZSAiJytuYW1lKyciLCB3aGljaCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBbJyttaW5SYW5nZSsiLCAiK21heFJhbmdlKyJdISIpfXJldHVybiBpc1Vuc2lnbmVkVHlwZT92YWx1ZT4+PjA6dmFsdWV8MH0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6aW50ZWdlclJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQsbWluUmFuZ2UhPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX21lbW9yeV92aWV3KHJhd1R5cGUsZGF0YVR5cGVJbmRleCxuYW1lKXt2YXIgdHlwZU1hcHBpbmc9W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XTt2YXIgVEE9dHlwZU1hcHBpbmdbZGF0YVR5cGVJbmRleF07ZnVuY3Rpb24gZGVjb2RlTWVtb3J5VmlldyhoYW5kbGUpe2hhbmRsZT1oYW5kbGU+PjI7dmFyIGhlYXA9SEVBUFUzMjt2YXIgc2l6ZT1oZWFwW2hhbmRsZV07dmFyIGRhdGE9aGVhcFtoYW5kbGUrMV07cmV0dXJuIG5ldyBUQShidWZmZXIsZGF0YSxzaXplKX1uYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpkZWNvZGVNZW1vcnlWaWV3LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmRlY29kZU1lbW9yeVZpZXd9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOnRydWV9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nKHJhd1R5cGUsbmFtZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3ZhciBzdGRTdHJpbmdJc1VURjg9bmFtZT09PSJzdGQ6OnN0cmluZyI7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbih2YWx1ZSl7dmFyIGxlbmd0aD1IRUFQVTMyW3ZhbHVlPj4yXTt2YXIgc3RyO2lmKHN0ZFN0cmluZ0lzVVRGOCl7dmFyIGRlY29kZVN0YXJ0UHRyPXZhbHVlKzQ7Zm9yKHZhciBpPTA7aTw9bGVuZ3RoOysraSl7dmFyIGN1cnJlbnRCeXRlUHRyPXZhbHVlKzQraTtpZihIRUFQVThbY3VycmVudEJ5dGVQdHJdPT0wfHxpPT1sZW5ndGgpe3ZhciBtYXhSZWFkPWN1cnJlbnRCeXRlUHRyLWRlY29kZVN0YXJ0UHRyO3ZhciBzdHJpbmdTZWdtZW50PVVURjhUb1N0cmluZyhkZWNvZGVTdGFydFB0cixtYXhSZWFkKTtpZihzdHI9PT11bmRlZmluZWQpe3N0cj1zdHJpbmdTZWdtZW50fWVsc2V7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDApO3N0cis9c3RyaW5nU2VnbWVudH1kZWNvZGVTdGFydFB0cj1jdXJyZW50Qnl0ZVB0cisxfX19ZWxzZXt2YXIgYT1uZXcgQXJyYXkobGVuZ3RoKTtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe2FbaV09U3RyaW5nLmZyb21DaGFyQ29kZShIRUFQVThbdmFsdWUrNCtpXSl9c3RyPWEuam9pbigiIil9X2ZyZWUodmFsdWUpO3JldHVybiBzdHJ9LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7aWYodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7dmFsdWU9bmV3IFVpbnQ4QXJyYXkodmFsdWUpfXZhciBnZXRMZW5ndGg7dmFyIHZhbHVlSXNPZlR5cGVTdHJpbmc9dHlwZW9mIHZhbHVlPT09InN0cmluZyI7aWYoISh2YWx1ZUlzT2ZUeXBlU3RyaW5nfHx2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHZhbHVlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXl8fHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5KSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIG5vbi1zdHJpbmcgdG8gc3RkOjpzdHJpbmciKX1pZihzdGRTdHJpbmdJc1VURjgmJnZhbHVlSXNPZlR5cGVTdHJpbmcpe2dldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiBsZW5ndGhCeXRlc1VURjgodmFsdWUpfX1lbHNle2dldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB2YWx1ZS5sZW5ndGh9fXZhciBsZW5ndGg9Z2V0TGVuZ3RoKCk7dmFyIHB0cj1fbWFsbG9jKDQrbGVuZ3RoKzEpO0hFQVBVMzJbcHRyPj4yXT1sZW5ndGg7aWYoc3RkU3RyaW5nSXNVVEY4JiZ2YWx1ZUlzT2ZUeXBlU3RyaW5nKXtzdHJpbmdUb1VURjgodmFsdWUscHRyKzQsbGVuZ3RoKzEpfWVsc2V7aWYodmFsdWVJc09mVHlwZVN0cmluZyl7Zm9yKHZhciBpPTA7aTxsZW5ndGg7KytpKXt2YXIgY2hhckNvZGU9dmFsdWUuY2hhckNvZGVBdChpKTtpZihjaGFyQ29kZT4yNTUpe19mcmVlKHB0cik7dGhyb3dCaW5kaW5nRXJyb3IoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpfUhFQVBVOFtwdHIrNCtpXT1jaGFyQ29kZX19ZWxzZXtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe0hFQVBVOFtwdHIrNCtpXT12YWx1ZVtpXX19fWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpmdW5jdGlvbihwdHIpe19mcmVlKHB0cil9fSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcocmF3VHlwZSxjaGFyU2l6ZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7dmFyIGRlY29kZVN0cmluZyxlbmNvZGVTdHJpbmcsZ2V0SGVhcCxsZW5ndGhCeXRlc1VURixzaGlmdDtpZihjaGFyU2l6ZT09PTIpe2RlY29kZVN0cmluZz1VVEYxNlRvU3RyaW5nO2VuY29kZVN0cmluZz1zdHJpbmdUb1VURjE2O2xlbmd0aEJ5dGVzVVRGPWxlbmd0aEJ5dGVzVVRGMTY7Z2V0SGVhcD1mdW5jdGlvbigpe3JldHVybiBIRUFQVTE2fTtzaGlmdD0xfWVsc2UgaWYoY2hhclNpemU9PT00KXtkZWNvZGVTdHJpbmc9VVRGMzJUb1N0cmluZztlbmNvZGVTdHJpbmc9c3RyaW5nVG9VVEYzMjtsZW5ndGhCeXRlc1VURj1sZW5ndGhCeXRlc1VURjMyO2dldEhlYXA9ZnVuY3Rpb24oKXtyZXR1cm4gSEVBUFUzMn07c2hpZnQ9Mn1yZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHZhbHVlKXt2YXIgbGVuZ3RoPUhFQVBVMzJbdmFsdWU+PjJdO3ZhciBIRUFQPWdldEhlYXAoKTt2YXIgc3RyO3ZhciBkZWNvZGVTdGFydFB0cj12YWx1ZSs0O2Zvcih2YXIgaT0wO2k8PWxlbmd0aDsrK2kpe3ZhciBjdXJyZW50Qnl0ZVB0cj12YWx1ZSs0K2kqY2hhclNpemU7aWYoSEVBUFtjdXJyZW50Qnl0ZVB0cj4+c2hpZnRdPT0wfHxpPT1sZW5ndGgpe3ZhciBtYXhSZWFkQnl0ZXM9Y3VycmVudEJ5dGVQdHItZGVjb2RlU3RhcnRQdHI7dmFyIHN0cmluZ1NlZ21lbnQ9ZGVjb2RlU3RyaW5nKGRlY29kZVN0YXJ0UHRyLG1heFJlYWRCeXRlcyk7aWYoc3RyPT09dW5kZWZpbmVkKXtzdHI9c3RyaW5nU2VnbWVudH1lbHNle3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgwKTtzdHIrPXN0cmluZ1NlZ21lbnR9ZGVjb2RlU3RhcnRQdHI9Y3VycmVudEJ5dGVQdHIrY2hhclNpemV9fV9mcmVlKHZhbHVlKTtyZXR1cm4gc3RyfSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe2lmKCEodHlwZW9mIHZhbHVlPT09InN0cmluZyIpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgIituYW1lKX12YXIgbGVuZ3RoPWxlbmd0aEJ5dGVzVVRGKHZhbHVlKTt2YXIgcHRyPV9tYWxsb2MoNCtsZW5ndGgrY2hhclNpemUpO0hFQVBVMzJbcHRyPj4yXT1sZW5ndGg+PnNoaWZ0O2VuY29kZVN0cmluZyh2YWx1ZSxwdHIrNCxsZW5ndGgrY2hhclNpemUpO2lmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpmdW5jdGlvbihwdHIpe19mcmVlKHB0cil9fSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0KHJhd1R5cGUsbmFtZSxjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3RvcixkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe3N0cnVjdFJlZ2lzdHJhdGlvbnNbcmF3VHlwZV09e25hbWU6cmVhZExhdGluMVN0cmluZyhuYW1lKSxyYXdDb25zdHJ1Y3RvcjplbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3RvcikscmF3RGVzdHJ1Y3RvcjplbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpLGZpZWxkczpbXX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0X2ZpZWxkKHN0cnVjdFR5cGUsZmllbGROYW1lLGdldHRlclJldHVyblR5cGUsZ2V0dGVyU2lnbmF0dXJlLGdldHRlcixnZXR0ZXJDb250ZXh0LHNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXJTaWduYXR1cmUsc2V0dGVyLHNldHRlckNvbnRleHQpe3N0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV0uZmllbGRzLnB1c2goe2ZpZWxkTmFtZTpyZWFkTGF0aW4xU3RyaW5nKGZpZWxkTmFtZSksZ2V0dGVyUmV0dXJuVHlwZTpnZXR0ZXJSZXR1cm5UeXBlLGdldHRlcjplbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyKSxnZXR0ZXJDb250ZXh0OmdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlOnNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXI6ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oc2V0dGVyU2lnbmF0dXJlLHNldHRlciksc2V0dGVyQ29udGV4dDpzZXR0ZXJDb250ZXh0fSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdm9pZChyYXdUeXBlLG5hbWUpe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7aXNWb2lkOnRydWUsbmFtZTpuYW1lLCJhcmdQYWNrQWR2YW5jZSI6MCwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbigpe3JldHVybiB1bmRlZmluZWR9LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyxvKXtyZXR1cm4gdW5kZWZpbmVkfX0pfWZ1bmN0aW9uIHJlcXVpcmVIYW5kbGUoaGFuZGxlKXtpZighaGFuZGxlKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHVzZSBkZWxldGVkIHZhbC4gaGFuZGxlID0gIitoYW5kbGUpfXJldHVybiBlbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS52YWx1ZX1mdW5jdGlvbiBfX2VtdmFsX2FzKGhhbmRsZSxyZXR1cm5UeXBlLGRlc3RydWN0b3JzUmVmKXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO3JldHVyblR5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJldHVyblR5cGUsImVtdmFsOjphcyIpO3ZhciBkZXN0cnVjdG9ycz1bXTt2YXIgcmQ9X19lbXZhbF9yZWdpc3RlcihkZXN0cnVjdG9ycyk7SEVBUDMyW2Rlc3RydWN0b3JzUmVmPj4yXT1yZDtyZXR1cm4gcmV0dXJuVHlwZVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLGhhbmRsZSl9dmFyIGVtdmFsX3N5bWJvbHM9e307ZnVuY3Rpb24gZ2V0U3RyaW5nT3JTeW1ib2woYWRkcmVzcyl7dmFyIHN5bWJvbD1lbXZhbF9zeW1ib2xzW2FkZHJlc3NdO2lmKHN5bWJvbD09PXVuZGVmaW5lZCl7cmV0dXJuIHJlYWRMYXRpbjFTdHJpbmcoYWRkcmVzcyl9ZWxzZXtyZXR1cm4gc3ltYm9sfX12YXIgZW12YWxfbWV0aG9kQ2FsbGVycz1bXTtmdW5jdGlvbiBfX2VtdmFsX2NhbGxfdm9pZF9tZXRob2QoY2FsbGVyLGhhbmRsZSxtZXRob2ROYW1lLGFyZ3Mpe2NhbGxlcj1lbXZhbF9tZXRob2RDYWxsZXJzW2NhbGxlcl07aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTttZXRob2ROYW1lPWdldFN0cmluZ09yU3ltYm9sKG1ldGhvZE5hbWUpO2NhbGxlcihoYW5kbGUsbWV0aG9kTmFtZSxudWxsLGFyZ3MpfWZ1bmN0aW9uIGVtdmFsX2dldF9nbG9iYWwoKXtpZih0eXBlb2YgZ2xvYmFsVGhpcz09PSJvYmplY3QiKXtyZXR1cm4gZ2xvYmFsVGhpc31yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRnVuY3Rpb259KCkoInJldHVybiB0aGlzIikoKX1mdW5jdGlvbiBfX2VtdmFsX2dldF9nbG9iYWwobmFtZSl7aWYobmFtZT09PTApe3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGVtdmFsX2dldF9nbG9iYWwoKSl9ZWxzZXtuYW1lPWdldFN0cmluZ09yU3ltYm9sKG5hbWUpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGVtdmFsX2dldF9nbG9iYWwoKVtuYW1lXSl9fWZ1bmN0aW9uIF9fZW12YWxfYWRkTWV0aG9kQ2FsbGVyKGNhbGxlcil7dmFyIGlkPWVtdmFsX21ldGhvZENhbGxlcnMubGVuZ3RoO2VtdmFsX21ldGhvZENhbGxlcnMucHVzaChjYWxsZXIpO3JldHVybiBpZH1mdW5jdGlvbiBfX2VtdmFsX2xvb2t1cFR5cGVzKGFyZ0NvdW50LGFyZ1R5cGVzKXt2YXIgYT1uZXcgQXJyYXkoYXJnQ291bnQpO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXthW2ldPXJlcXVpcmVSZWdpc3RlcmVkVHlwZShIRUFQMzJbKGFyZ1R5cGVzPj4yKStpXSwicGFyYW1ldGVyICIraSl9cmV0dXJuIGF9ZnVuY3Rpb24gX19lbXZhbF9nZXRfbWV0aG9kX2NhbGxlcihhcmdDb3VudCxhcmdUeXBlcyl7dmFyIHR5cGVzPV9fZW12YWxfbG9va3VwVHlwZXMoYXJnQ291bnQsYXJnVHlwZXMpO3ZhciByZXRUeXBlPXR5cGVzWzBdO3ZhciBzaWduYXR1cmVOYW1lPXJldFR5cGUubmFtZSsiXyQiK3R5cGVzLnNsaWNlKDEpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5uYW1lfSkuam9pbigiXyIpKyIkIjt2YXIgcGFyYW1zPVsicmV0VHlwZSJdO3ZhciBhcmdzPVtyZXRUeXBlXTt2YXIgYXJnc0xpc3Q9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpO3BhcmFtcy5wdXNoKCJhcmdUeXBlIitpKTthcmdzLnB1c2godHlwZXNbMStpXSl9dmFyIGZ1bmN0aW9uTmFtZT1tYWtlTGVnYWxGdW5jdGlvbk5hbWUoIm1ldGhvZENhbGxlcl8iK3NpZ25hdHVyZU5hbWUpO3ZhciBmdW5jdGlvbkJvZHk9InJldHVybiBmdW5jdGlvbiAiK2Z1bmN0aW9uTmFtZSsiKGhhbmRsZSwgbmFtZSwgZGVzdHJ1Y3RvcnMsIGFyZ3MpIHtcbiI7dmFyIG9mZnNldD0wO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMTsrK2kpe2Z1bmN0aW9uQm9keSs9IiAgICB2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyIrKG9mZnNldD8iKyIrb2Zmc2V0OiIiKSsiKTtcbiI7b2Zmc2V0Kz10eXBlc1tpKzFdWyJhcmdQYWNrQWR2YW5jZSJdfWZ1bmN0aW9uQm9keSs9IiAgICB2YXIgcnYgPSBoYW5kbGVbbmFtZV0oIithcmdzTGlzdCsiKTtcbiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7aWYodHlwZXNbaSsxXVsiZGVsZXRlT2JqZWN0Il0pe2Z1bmN0aW9uQm9keSs9IiAgICBhcmdUeXBlIitpKyIuZGVsZXRlT2JqZWN0KGFyZyIraSsiKTtcbiJ9fWlmKCFyZXRUeXBlLmlzVm9pZCl7ZnVuY3Rpb25Cb2R5Kz0iICAgIHJldHVybiByZXRUeXBlLnRvV2lyZVR5cGUoZGVzdHJ1Y3RvcnMsIHJ2KTtcbiJ9ZnVuY3Rpb25Cb2R5Kz0ifTtcbiI7cGFyYW1zLnB1c2goZnVuY3Rpb25Cb2R5KTt2YXIgaW52b2tlckZ1bmN0aW9uPW5ld18oRnVuY3Rpb24scGFyYW1zKS5hcHBseShudWxsLGFyZ3MpO3JldHVybiBfX2VtdmFsX2FkZE1ldGhvZENhbGxlcihpbnZva2VyRnVuY3Rpb24pfWZ1bmN0aW9uIF9fZW12YWxfZ2V0X21vZHVsZV9wcm9wZXJ0eShuYW1lKXtuYW1lPWdldFN0cmluZ09yU3ltYm9sKG5hbWUpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKE1vZHVsZVtuYW1lXSl9ZnVuY3Rpb24gX19lbXZhbF9nZXRfcHJvcGVydHkoaGFuZGxlLGtleSl7aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTtrZXk9cmVxdWlyZUhhbmRsZShrZXkpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGhhbmRsZVtrZXldKX1mdW5jdGlvbiBfX2VtdmFsX2luY3JlZihoYW5kbGUpe2lmKGhhbmRsZT40KXtlbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS5yZWZjb3VudCs9MX19ZnVuY3Rpb24gY3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCl7dmFyIGFyZ3NMaXN0PSIiO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXthcmdzTGlzdCs9KGkhPT0wPyIsICI6IiIpKyJhcmciK2l9dmFyIGZ1bmN0aW9uQm9keT0icmV0dXJuIGZ1bmN0aW9uIGVtdmFsX2FsbG9jYXRvcl8iK2FyZ0NvdW50KyIoY29uc3RydWN0b3IsIGFyZ1R5cGVzLCBhcmdzKSB7XG4iO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXtmdW5jdGlvbkJvZHkrPSJ2YXIgYXJnVHlwZSIraSsiID0gcmVxdWlyZVJlZ2lzdGVyZWRUeXBlKE1vZHVsZVsnSEVBUDMyJ11bKGFyZ1R5cGVzID4+PiAyKSArICIraSsnXSwgInBhcmFtZXRlciAnK2krJyIpO1xuJysidmFyIGFyZyIraSsiID0gYXJnVHlwZSIraSsiLnJlYWRWYWx1ZUZyb21Qb2ludGVyKGFyZ3MpO1xuIisiYXJncyArPSBhcmdUeXBlIitpKyJbJ2FyZ1BhY2tBZHZhbmNlJ107XG4ifWZ1bmN0aW9uQm9keSs9InZhciBvYmogPSBuZXcgY29uc3RydWN0b3IoIithcmdzTGlzdCsiKTtcbiIrInJldHVybiBfX2VtdmFsX3JlZ2lzdGVyKG9iaik7XG4iKyJ9XG4iO3JldHVybiBuZXcgRnVuY3Rpb24oInJlcXVpcmVSZWdpc3RlcmVkVHlwZSIsIk1vZHVsZSIsIl9fZW12YWxfcmVnaXN0ZXIiLGZ1bmN0aW9uQm9keSkocmVxdWlyZVJlZ2lzdGVyZWRUeXBlLE1vZHVsZSxfX2VtdmFsX3JlZ2lzdGVyKX12YXIgZW12YWxfbmV3ZXJzPXt9O2Z1bmN0aW9uIF9fZW12YWxfbmV3KGhhbmRsZSxhcmdDb3VudCxhcmdUeXBlcyxhcmdzKXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO3ZhciBuZXdlcj1lbXZhbF9uZXdlcnNbYXJnQ291bnRdO2lmKCFuZXdlcil7bmV3ZXI9Y3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCk7ZW12YWxfbmV3ZXJzW2FyZ0NvdW50XT1uZXdlcn1yZXR1cm4gbmV3ZXIoaGFuZGxlLGFyZ1R5cGVzLGFyZ3MpfWZ1bmN0aW9uIF9fZW12YWxfbmV3X2NzdHJpbmcodil7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZ2V0U3RyaW5nT3JTeW1ib2wodikpfWZ1bmN0aW9uIF9fZW12YWxfcnVuX2Rlc3RydWN0b3JzKGhhbmRsZSl7dmFyIGRlc3RydWN0b3JzPWVtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKTtfX2VtdmFsX2RlY3JlZihoYW5kbGUpfWZ1bmN0aW9uIF9hYm9ydCgpe2Fib3J0KCl9dmFyIHNldGptcElkPTA7ZnVuY3Rpb24gX3NhdmVTZXRqbXAoZW52LGxhYmVsLHRhYmxlLHNpemUpe2Vudj1lbnZ8MDtsYWJlbD1sYWJlbHwwO3RhYmxlPXRhYmxlfDA7c2l6ZT1zaXplfDA7dmFyIGk9MDtzZXRqbXBJZD1zZXRqbXBJZCsxfDA7SEVBUDMyW2Vudj4+Ml09c2V0am1wSWQ7d2hpbGUoKGl8MCk8KHNpemV8MCkpe2lmKChIRUFQMzJbdGFibGUrKGk8PDMpPj4yXXwwKT09MCl7SEVBUDMyW3RhYmxlKyhpPDwzKT4+Ml09c2V0am1wSWQ7SEVBUDMyW3RhYmxlKygoaTw8MykrNCk+PjJdPWxhYmVsO0hFQVAzMlt0YWJsZSsoKGk8PDMpKzgpPj4yXT0wO3NldFRlbXBSZXQwKHNpemV8MCk7cmV0dXJuIHRhYmxlfDB9aT1pKzF8MH1zaXplPXNpemUqMnwwO3RhYmxlPV9yZWFsbG9jKHRhYmxlfDAsOCooc2l6ZSsxfDApfDApfDA7dGFibGU9X3NhdmVTZXRqbXAoZW52fDAsbGFiZWx8MCx0YWJsZXwwLHNpemV8MCl8MDtzZXRUZW1wUmV0MChzaXplfDApO3JldHVybiB0YWJsZXwwfWZ1bmN0aW9uIF90ZXN0U2V0am1wKGlkLHRhYmxlLHNpemUpe2lkPWlkfDA7dGFibGU9dGFibGV8MDtzaXplPXNpemV8MDt2YXIgaT0wLGN1cnI9MDt3aGlsZSgoaXwwKTwoc2l6ZXwwKSl7Y3Vycj1IRUFQMzJbdGFibGUrKGk8PDMpPj4yXXwwO2lmKChjdXJyfDApPT0wKWJyZWFrO2lmKChjdXJyfDApPT0oaWR8MCkpe3JldHVybiBIRUFQMzJbdGFibGUrKChpPDwzKSs0KT4+Ml18MH1pPWkrMXwwfXJldHVybiAwfWZ1bmN0aW9uIF9sb25nam1wKGVudix2YWx1ZSl7X3NldFRocmV3KGVudix2YWx1ZXx8MSk7dGhyb3cibG9uZ2ptcCJ9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbG9uZ2ptcChlbnYsdmFsdWUpe19sb25nam1wKGVudix2YWx1ZSl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0hFQVBVOC5jb3B5V2l0aGluKGRlc3Qsc3JjLHNyYytudW0pfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKXtyZXR1cm4gSEVBUFU4Lmxlbmd0aH1mdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpe3RyeXt3YXNtTWVtb3J5Lmdyb3coc2l6ZS1idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KTt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7cmV0dXJuIDF9Y2F0Y2goZSl7fX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKXtyZXF1ZXN0ZWRTaXplPXJlcXVlc3RlZFNpemU+Pj4wO3ZhciBvbGRTaXplPV9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTt2YXIgUEFHRV9NVUxUSVBMRT02NTUzNjt2YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtpZihyZXF1ZXN0ZWRTaXplPm1heEhlYXBTaXplKXtyZXR1cm4gZmFsc2V9dmFyIG1pbkhlYXBTaXplPTE2Nzc3MjE2O2Zvcih2YXIgY3V0RG93bj0xO2N1dERvd248PTQ7Y3V0RG93bio9Mil7dmFyIG92ZXJHcm93bkhlYXBTaXplPW9sZFNpemUqKDErLjIvY3V0RG93bik7b3Zlckdyb3duSGVhcFNpemU9TWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUscmVxdWVzdGVkU2l6ZSsxMDA2NjMyOTYpO3ZhciBuZXdTaXplPU1hdGgubWluKG1heEhlYXBTaXplLGFsaWduVXAoTWF0aC5tYXgobWluSGVhcFNpemUscmVxdWVzdGVkU2l6ZSxvdmVyR3Jvd25IZWFwU2l6ZSksUEFHRV9NVUxUSVBMRSkpO3ZhciByZXBsYWNlbWVudD1lbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpO2lmKHJlcGxhY2VtZW50KXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIF9mZF9jbG9zZShmZCl7dHJ5e3ZhciBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTtGUy5jbG9zZShzdHJlYW0pO3JldHVybiAwfWNhdGNoKGUpe2lmKHR5cGVvZiBGUz09PSJ1bmRlZmluZWQifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4gZS5lcnJub319ZnVuY3Rpb24gX2ZkX3JlYWQoZmQsaW92LGlvdmNudCxwbnVtKXt0cnl7dmFyIHN0cmVhbT1TWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpO3ZhciBudW09U1lTQ0FMTFMuZG9SZWFkdihzdHJlYW0saW92LGlvdmNudCk7SEVBUDMyW3BudW0+PjJdPW51bTtyZXR1cm4gMH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT0idW5kZWZpbmVkInx8IShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpYWJvcnQoZSk7cmV0dXJuIGUuZXJybm99fWZ1bmN0aW9uIF9mZF9zZWVrKGZkLG9mZnNldF9sb3csb2Zmc2V0X2hpZ2gsd2hlbmNlLG5ld09mZnNldCl7dHJ5e3ZhciBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTt2YXIgSElHSF9PRkZTRVQ9NDI5NDk2NzI5Njt2YXIgb2Zmc2V0PW9mZnNldF9oaWdoKkhJR0hfT0ZGU0VUKyhvZmZzZXRfbG93Pj4+MCk7dmFyIERPVUJMRV9MSU1JVD05MDA3MTk5MjU0NzQwOTkyO2lmKG9mZnNldDw9LURPVUJMRV9MSU1JVHx8b2Zmc2V0Pj1ET1VCTEVfTElNSVQpe3JldHVybi02MX1GUy5sbHNlZWsoc3RyZWFtLG9mZnNldCx3aGVuY2UpO3RlbXBJNjQ9W3N0cmVhbS5wb3NpdGlvbj4+PjAsKHRlbXBEb3VibGU9c3RyZWFtLnBvc2l0aW9uLCtNYXRoX2Ficyh0ZW1wRG91YmxlKT49MT90ZW1wRG91YmxlPjA/KE1hdGhfbWluKCtNYXRoX2Zsb29yKHRlbXBEb3VibGUvNDI5NDk2NzI5NiksNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGhfY2VpbCgodGVtcERvdWJsZS0rKH5+dGVtcERvdWJsZT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLEhFQVAzMltuZXdPZmZzZXQ+PjJdPXRlbXBJNjRbMF0sSEVBUDMyW25ld09mZnNldCs0Pj4yXT10ZW1wSTY0WzFdO2lmKHN0cmVhbS5nZXRkZW50cyYmb2Zmc2V0PT09MCYmd2hlbmNlPT09MClzdHJlYW0uZ2V0ZGVudHM9bnVsbDtyZXR1cm4gMH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT0idW5kZWZpbmVkInx8IShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpYWJvcnQoZSk7cmV0dXJuIGUuZXJybm99fWZ1bmN0aW9uIF9mZF93cml0ZShmZCxpb3YsaW92Y250LHBudW0pe3RyeXt2YXIgc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7dmFyIG51bT1TWVNDQUxMUy5kb1dyaXRldihzdHJlYW0saW92LGlvdmNudCk7SEVBUDMyW3BudW0+PjJdPW51bTtyZXR1cm4gMH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT0idW5kZWZpbmVkInx8IShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpYWJvcnQoZSk7cmV0dXJuIGUuZXJybm99fWZ1bmN0aW9uIF9nZXRUZW1wUmV0MCgpe3JldHVybiBnZXRUZW1wUmV0MCgpfDB9ZnVuY3Rpb24gX2dldHRpbWVvZmRheShwdHIpe3ZhciBub3c9RGF0ZS5ub3coKTtIRUFQMzJbcHRyPj4yXT1ub3cvMWUzfDA7SEVBUDMyW3B0cis0Pj4yXT1ub3clMWUzKjFlM3wwO3JldHVybiAwfWZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKXt9ZnVuY3Rpb24gX3JvdW5kZihkKXtkPStkO3JldHVybiBkPj0rMD8rTWF0aF9mbG9vcihkKyArLjUpOitNYXRoX2NlaWwoZC0rLjUpfWZ1bmN0aW9uIF9zZXRUZW1wUmV0MCgkaSl7c2V0VGVtcFJldDAoJGl8MCl9ZnVuY3Rpb24gX3N5c2NvbmYobmFtZSl7c3dpdGNoKG5hbWUpe2Nhc2UgMzA6cmV0dXJuIDE2Mzg0O2Nhc2UgODU6dmFyIG1heEhlYXBTaXplPTIxNDc0ODM2NDg7cmV0dXJuIG1heEhlYXBTaXplLzE2Mzg0O2Nhc2UgMTMyOmNhc2UgMTMzOmNhc2UgMTI6Y2FzZSAxMzc6Y2FzZSAxMzg6Y2FzZSAxNTpjYXNlIDIzNTpjYXNlIDE2OmNhc2UgMTc6Y2FzZSAxODpjYXNlIDE5OmNhc2UgMjA6Y2FzZSAxNDk6Y2FzZSAxMzpjYXNlIDEwOmNhc2UgMjM2OmNhc2UgMTUzOmNhc2UgOTpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAxNTk6Y2FzZSAxNTQ6Y2FzZSAxNDpjYXNlIDc3OmNhc2UgNzg6Y2FzZSAxMzk6Y2FzZSA4MDpjYXNlIDgxOmNhc2UgODI6Y2FzZSA2ODpjYXNlIDY3OmNhc2UgMTY0OmNhc2UgMTE6Y2FzZSAyOTpjYXNlIDQ3OmNhc2UgNDg6Y2FzZSA5NTpjYXNlIDUyOmNhc2UgNTE6Y2FzZSA0NjpjYXNlIDc5OnJldHVybiAyMDA4MDk7Y2FzZSAyNzpjYXNlIDI0NjpjYXNlIDEyNzpjYXNlIDEyODpjYXNlIDIzOmNhc2UgMjQ6Y2FzZSAxNjA6Y2FzZSAxNjE6Y2FzZSAxODE6Y2FzZSAxODI6Y2FzZSAyNDI6Y2FzZSAxODM6Y2FzZSAxODQ6Y2FzZSAyNDM6Y2FzZSAyNDQ6Y2FzZSAyNDU6Y2FzZSAxNjU6Y2FzZSAxNzg6Y2FzZSAxNzk6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgMTY4OmNhc2UgMTY5OmNhc2UgMTc1OmNhc2UgMTcwOmNhc2UgMTcxOmNhc2UgMTcyOmNhc2UgOTc6Y2FzZSA3NjpjYXNlIDMyOmNhc2UgMTczOmNhc2UgMzU6cmV0dXJuLTE7Y2FzZSAxNzY6Y2FzZSAxNzc6Y2FzZSA3OmNhc2UgMTU1OmNhc2UgODpjYXNlIDE1NzpjYXNlIDEyNTpjYXNlIDEyNjpjYXNlIDkyOmNhc2UgOTM6Y2FzZSAxMjk6Y2FzZSAxMzA6Y2FzZSAxMzE6Y2FzZSA5NDpjYXNlIDkxOnJldHVybiAxO2Nhc2UgNzQ6Y2FzZSA2MDpjYXNlIDY5OmNhc2UgNzA6Y2FzZSA0OnJldHVybiAxMDI0O2Nhc2UgMzE6Y2FzZSA0MjpjYXNlIDcyOnJldHVybiAzMjtjYXNlIDg3OmNhc2UgMjY6Y2FzZSAzMzpyZXR1cm4gMjE0NzQ4MzY0NztjYXNlIDM0OmNhc2UgMTpyZXR1cm4gNDc4Mzk7Y2FzZSAzODpjYXNlIDM2OnJldHVybiA5OTtjYXNlIDQzOmNhc2UgMzc6cmV0dXJuIDIwNDg7Y2FzZSAwOnJldHVybiAyMDk3MTUyO2Nhc2UgMzpyZXR1cm4gNjU1MzY7Y2FzZSAyODpyZXR1cm4gMzI3Njg7Y2FzZSA0NDpyZXR1cm4gMzI3Njc7Y2FzZSA3NTpyZXR1cm4gMTYzODQ7Y2FzZSAzOTpyZXR1cm4gMWUzO2Nhc2UgODk6cmV0dXJuIDcwMDtjYXNlIDcxOnJldHVybiAyNTY7Y2FzZSA0MDpyZXR1cm4gMjU1O2Nhc2UgMjpyZXR1cm4gMTAwO2Nhc2UgMTgwOnJldHVybiA2NDtjYXNlIDI1OnJldHVybiAyMDtjYXNlIDU6cmV0dXJuIDE2O2Nhc2UgNjpyZXR1cm4gNjtjYXNlIDczOnJldHVybiA0O2Nhc2UgODQ6e2lmKHR5cGVvZiBuYXZpZ2F0b3I9PT0ib2JqZWN0IilyZXR1cm4gbmF2aWdhdG9yWyJoYXJkd2FyZUNvbmN1cnJlbmN5Il18fDE7cmV0dXJuIDF9fXNldEVyck5vKDI4KTtyZXR1cm4tMX12YXIgRlNOb2RlPWZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUscmRldil7aWYoIXBhcmVudCl7cGFyZW50PXRoaXN9dGhpcy5wYXJlbnQ9cGFyZW50O3RoaXMubW91bnQ9cGFyZW50Lm1vdW50O3RoaXMubW91bnRlZD1udWxsO3RoaXMuaWQ9RlMubmV4dElub2RlKys7dGhpcy5uYW1lPW5hbWU7dGhpcy5tb2RlPW1vZGU7dGhpcy5ub2RlX29wcz17fTt0aGlzLnN0cmVhbV9vcHM9e307dGhpcy5yZGV2PXJkZXZ9O3ZhciByZWFkTW9kZT0yOTJ8NzM7dmFyIHdyaXRlTW9kZT0xNDY7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRlNOb2RlLnByb3RvdHlwZSx7cmVhZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZyZWFkTW9kZSk9PT1yZWFkTW9kZX0sc2V0OmZ1bmN0aW9uKHZhbCl7dmFsP3RoaXMubW9kZXw9cmVhZE1vZGU6dGhpcy5tb2RlJj1+cmVhZE1vZGV9fSx3cml0ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZ3cml0ZU1vZGUpPT09d3JpdGVNb2RlfSxzZXQ6ZnVuY3Rpb24odmFsKXt2YWw/dGhpcy5tb2RlfD13cml0ZU1vZGU6dGhpcy5tb2RlJj1+d3JpdGVNb2RlfX0saXNGb2xkZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBGUy5pc0Rpcih0aGlzLm1vZGUpfX0saXNEZXZpY2U6e2dldDpmdW5jdGlvbigpe3JldHVybiBGUy5pc0NocmRldih0aGlzLm1vZGUpfX19KTtGUy5GU05vZGU9RlNOb2RlO0ZTLnN0YXRpY0luaXQoKTtJbnRlcm5hbEVycm9yPU1vZHVsZVsiSW50ZXJuYWxFcnJvciJdPWV4dGVuZEVycm9yKEVycm9yLCJJbnRlcm5hbEVycm9yIik7ZW1iaW5kX2luaXRfY2hhckNvZGVzKCk7QmluZGluZ0Vycm9yPU1vZHVsZVsiQmluZGluZ0Vycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkJpbmRpbmdFcnJvciIpO2luaXRfQ2xhc3NIYW5kbGUoKTtpbml0X1JlZ2lzdGVyZWRQb2ludGVyKCk7aW5pdF9lbWJpbmQoKTtVbmJvdW5kVHlwZUVycm9yPU1vZHVsZVsiVW5ib3VuZFR5cGVFcnJvciJdPWV4dGVuZEVycm9yKEVycm9yLCJVbmJvdW5kVHlwZUVycm9yIik7aW5pdF9lbXZhbCgpO2Z1bmN0aW9uIGludEFycmF5RnJvbVN0cmluZyhzdHJpbmd5LGRvbnRBZGROdWxsLGxlbmd0aCl7dmFyIGxlbj1sZW5ndGg+MD9sZW5ndGg6bGVuZ3RoQnl0ZXNVVEY4KHN0cmluZ3kpKzE7dmFyIHU4YXJyYXk9bmV3IEFycmF5KGxlbik7dmFyIG51bUJ5dGVzV3JpdHRlbj1zdHJpbmdUb1VURjhBcnJheShzdHJpbmd5LHU4YXJyYXksMCx1OGFycmF5Lmxlbmd0aCk7aWYoZG9udEFkZE51bGwpdThhcnJheS5sZW5ndGg9bnVtQnl0ZXNXcml0dGVuO3JldHVybiB1OGFycmF5fXZhciBhc21MaWJyYXJ5QXJnPXsiJCI6X19fY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbiwiXyI6X19fY3hhX3Rocm93LCJKIjpfX19zeXNfZmNudGw2NCwiUyI6X19fc3lzX2lvY3RsLCJUIjpfX19zeXNfb3BlbiwiQSI6X19lbWJpbmRfZmluYWxpemVfdmFsdWVfb2JqZWN0LCJWIjpfX2VtYmluZF9yZWdpc3Rlcl9ib29sLCJEIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcywiQyI6X19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IsImEiOl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uLCJlIjpfX2VtYmluZF9yZWdpc3Rlcl9jb25zdGFudCwiVSI6X19lbWJpbmRfcmVnaXN0ZXJfZW12YWwsInMiOl9fZW1iaW5kX3JlZ2lzdGVyX2VudW0sImMiOl9fZW1iaW5kX3JlZ2lzdGVyX2VudW1fdmFsdWUsIksiOl9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0LCJtIjpfX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbiwibiI6X19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlciwiayI6X19lbWJpbmRfcmVnaXN0ZXJfbWVtb3J5X3ZpZXcsIkwiOl9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcsIkUiOl9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nLCJCIjpfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9vYmplY3QsImQiOl9fZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX29iamVjdF9maWVsZCwiVyI6X19lbWJpbmRfcmVnaXN0ZXJfdm9pZCwiciI6X19lbXZhbF9hcywidCI6X19lbXZhbF9jYWxsX3ZvaWRfbWV0aG9kLCJiIjpfX2VtdmFsX2RlY3JlZiwiRyI6X19lbXZhbF9nZXRfZ2xvYmFsLCJ1IjpfX2VtdmFsX2dldF9tZXRob2RfY2FsbGVyLCJ3IjpfX2VtdmFsX2dldF9tb2R1bGVfcHJvcGVydHksImYiOl9fZW12YWxfZ2V0X3Byb3BlcnR5LCJpIjpfX2VtdmFsX2luY3JlZiwidiI6X19lbXZhbF9uZXcsImciOl9fZW12YWxfbmV3X2NzdHJpbmcsInEiOl9fZW12YWxfcnVuX2Rlc3RydWN0b3JzLCJoIjpfYWJvcnQsIngiOl9lbXNjcmlwdGVuX2xvbmdqbXAsIk4iOl9lbXNjcmlwdGVuX21lbWNweV9iaWcsIk8iOl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLCJIIjpfZmRfY2xvc2UsIlIiOl9mZF9yZWFkLCJNIjpfZmRfc2VlaywiSSI6X2ZkX3dyaXRlLCJsIjpfZ2V0VGVtcFJldDAsInoiOl9nZXR0aW1lb2ZkYXksIlkiOmludm9rZV9paSwieSI6aW52b2tlX3ZpLCJYIjppbnZva2VfdmlpLCJaIjppbnZva2VfdmlpaSwibWVtb3J5Ijp3YXNtTWVtb3J5LCJRIjpfcHRocmVhZF9qb2luLCJwIjpfcm91bmRmLCJGIjpfc2F2ZVNldGptcCwiaiI6X3NldFRlbXBSZXQwLCJQIjpfc3lzY29uZiwidGFibGUiOndhc21UYWJsZSwibyI6X3Rlc3RTZXRqbXB9O3ZhciBhc209Y3JlYXRlV2FzbSgpO01vZHVsZVsiYXNtIl09YXNtO3ZhciBfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXT1mdW5jdGlvbigpe3JldHVybihfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXT1Nb2R1bGVbImFzbSJdWyJhYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZnJlZT1Nb2R1bGVbIl9mcmVlIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2ZyZWU9TW9kdWxlWyJfZnJlZSJdPU1vZHVsZVsiYXNtIl1bImJhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9tYWxsb2M9TW9kdWxlWyJfbWFsbG9jIl09ZnVuY3Rpb24oKXtyZXR1cm4oX21hbGxvYz1Nb2R1bGVbIl9tYWxsb2MiXT1Nb2R1bGVbImFzbSJdWyJjYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfcmVhbGxvYz1Nb2R1bGVbIl9yZWFsbG9jIl09ZnVuY3Rpb24oKXtyZXR1cm4oX3JlYWxsb2M9TW9kdWxlWyJfcmVhbGxvYyJdPU1vZHVsZVsiYXNtIl1bImRhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fX2dldFR5cGVOYW1lPU1vZHVsZVsiX19fZ2V0VHlwZU5hbWUiXT1mdW5jdGlvbigpe3JldHVybihfX19nZXRUeXBlTmFtZT1Nb2R1bGVbIl9fX2dldFR5cGVOYW1lIl09TW9kdWxlWyJhc20iXVsiZWEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZW1iaW5kX3JlZ2lzdGVyX25hdGl2ZV9hbmRfYnVpbHRpbl90eXBlcz1Nb2R1bGVbIl9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXMiXT1mdW5jdGlvbigpe3JldHVybihfX19lbWJpbmRfcmVnaXN0ZXJfbmF0aXZlX2FuZF9idWlsdGluX3R5cGVzPU1vZHVsZVsiX19fZW1iaW5kX3JlZ2lzdGVyX25hdGl2ZV9hbmRfYnVpbHRpbl90eXBlcyJdPU1vZHVsZVsiYXNtIl1bImZhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fX2Vycm5vX2xvY2F0aW9uPU1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXT1mdW5jdGlvbigpe3JldHVybihfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl09TW9kdWxlWyJhc20iXVsiZ2EiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX3NldFRocmV3PU1vZHVsZVsiX3NldFRocmV3Il09ZnVuY3Rpb24oKXtyZXR1cm4oX3NldFRocmV3PU1vZHVsZVsiX3NldFRocmV3Il09TW9kdWxlWyJhc20iXVsiaGEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF92aT1Nb2R1bGVbImR5bkNhbGxfdmkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX3ZpPU1vZHVsZVsiZHluQ2FsbF92aSJdPU1vZHVsZVsiYXNtIl1bImlhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfdmlpPU1vZHVsZVsiZHluQ2FsbF92aWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX3ZpaT1Nb2R1bGVbImR5bkNhbGxfdmlpIl09TW9kdWxlWyJhc20iXVsiamEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF92aWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF92aWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpIl09TW9kdWxlWyJhc20iXVsia2EiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paT1Nb2R1bGVbImR5bkNhbGxfaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpPU1vZHVsZVsiZHluQ2FsbF9paSJdPU1vZHVsZVsiYXNtIl1bImxhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrU2F2ZT1Nb2R1bGVbInN0YWNrU2F2ZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKHN0YWNrU2F2ZT1Nb2R1bGVbInN0YWNrU2F2ZSJdPU1vZHVsZVsiYXNtIl1bIm1hIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrUmVzdG9yZT1Nb2R1bGVbInN0YWNrUmVzdG9yZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKHN0YWNrUmVzdG9yZT1Nb2R1bGVbInN0YWNrUmVzdG9yZSJdPU1vZHVsZVsiYXNtIl1bIm5hIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfdj1Nb2R1bGVbImR5bkNhbGxfdiJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfdj1Nb2R1bGVbImR5bkNhbGxfdiJdPU1vZHVsZVsiYXNtIl1bIm9hIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaT1Nb2R1bGVbImR5bkNhbGxfaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfaT1Nb2R1bGVbImR5bkNhbGxfaSJdPU1vZHVsZVsiYXNtIl1bInBhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpPU1vZHVsZVsiZHluQ2FsbF9paWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaT1Nb2R1bGVbImR5bkNhbGxfaWlpIl09TW9kdWxlWyJhc20iXVsicWEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpIl09TW9kdWxlWyJhc20iXVsicmEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaSJdPU1vZHVsZVsiYXNtIl1bInNhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpIl09TW9kdWxlWyJhc20iXVsidGEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaSJdPU1vZHVsZVsiYXNtIl1bInVhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpIl09TW9kdWxlWyJhc20iXVsidmEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF92aWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX3ZpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaSJdPU1vZHVsZVsiYXNtIl1bIndhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaSJdPU1vZHVsZVsiYXNtIl1bInhhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpaWlpaWlpaWlpaWlpaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaWkiXT1Nb2R1bGVbImFzbSJdWyJ5YSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2lpaWlpaWlpaWlpaWlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpaWlpaWlpaWlpaWlpaWlpaSJdPU1vZHVsZVsiYXNtIl1bInphIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaSJdPU1vZHVsZVsiYXNtIl1bIkFhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfdmlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX3ZpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpIl09TW9kdWxlWyJhc20iXVsiQmEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWlpIl09TW9kdWxlWyJhc20iXVsiQ2EiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWlpaSJdPU1vZHVsZVsiYXNtIl1bIkRhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfdmlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfdmlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpaSJdPU1vZHVsZVsiYXNtIl1bIkVhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfdmlmPU1vZHVsZVsiZHluQ2FsbF92aWYiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX3ZpZj1Nb2R1bGVbImR5bkNhbGxfdmlmIl09TW9kdWxlWyJhc20iXVsiRmEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF92aWlmPU1vZHVsZVsiZHluQ2FsbF92aWlmIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF92aWlmPU1vZHVsZVsiZHluQ2FsbF92aWlmIl09TW9kdWxlWyJhc20iXVsiR2EiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9mZj1Nb2R1bGVbImR5bkNhbGxfZmYiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2ZmPU1vZHVsZVsiZHluQ2FsbF9mZiJdPU1vZHVsZVsiYXNtIl1bIkhhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfamlpaWk9TW9kdWxlWyJkeW5DYWxsX2ppaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9qaWlpaT1Nb2R1bGVbImR5bkNhbGxfamlpaWkiXT1Nb2R1bGVbImFzbSJdWyJJYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2lpaj1Nb2R1bGVbImR5bkNhbGxfaWlqIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWo9TW9kdWxlWyJkeW5DYWxsX2lpaiJdPU1vZHVsZVsiYXNtIl1bIkphIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfamk9TW9kdWxlWyJkeW5DYWxsX2ppIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9qaT1Nb2R1bGVbImR5bkNhbGxfamkiXT1Nb2R1bGVbImFzbSJdWyJLYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2ppamk9TW9kdWxlWyJkeW5DYWxsX2ppamkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2ppamk9TW9kdWxlWyJkeW5DYWxsX2ppamkiXT1Nb2R1bGVbImFzbSJdWyJMYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2lpZGlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpZGlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpZGlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpZGlpaWkiXT1Nb2R1bGVbImFzbSJdWyJNYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIGludm9rZV92aShpbmRleCxhMSl7dmFyIHNwPXN0YWNrU2F2ZSgpO3RyeXtkeW5DYWxsX3ZpKGluZGV4LGExKX1jYXRjaChlKXtzdGFja1Jlc3RvcmUoc3ApO2lmKGUhPT1lKzAmJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTtfc2V0VGhyZXcoMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWkoaW5kZXgsYTEsYTIsYTMpe3ZhciBzcD1zdGFja1NhdmUoKTt0cnl7ZHluQ2FsbF92aWlpKGluZGV4LGExLGEyLGEzKX1jYXRjaChlKXtzdGFja1Jlc3RvcmUoc3ApO2lmKGUhPT1lKzAmJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTtfc2V0VGhyZXcoMSwwKX19ZnVuY3Rpb24gaW52b2tlX2lpKGluZGV4LGExKXt2YXIgc3A9c3RhY2tTYXZlKCk7dHJ5e3JldHVybiBkeW5DYWxsX2lpKGluZGV4LGExKX1jYXRjaChlKXtzdGFja1Jlc3RvcmUoc3ApO2lmKGUhPT1lKzAmJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTtfc2V0VGhyZXcoMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaShpbmRleCxhMSxhMil7dmFyIHNwPXN0YWNrU2F2ZSgpO3RyeXtkeW5DYWxsX3ZpaShpbmRleCxhMSxhMil9Y2F0Y2goZSl7c3RhY2tSZXN0b3JlKHNwKTtpZihlIT09ZSswJiZlIT09ImxvbmdqbXAiKXRocm93IGU7X3NldFRocmV3KDEsMCl9fU1vZHVsZVsiYXNtIl09YXNtO3ZhciBjYWxsZWRSdW47ZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyI7dGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIrc3RhdHVzKyIpIjt0aGlzLnN0YXR1cz1zdGF0dXN9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uIHJ1bkNhbGxlcigpe2lmKCFjYWxsZWRSdW4pcnVuKCk7aWYoIWNhbGxlZFJ1bilkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxhcmd1bWVudHNfO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59cHJlUnVuKCk7aWYocnVuRGVwZW5kZW5jaWVzPjApcmV0dXJuO2Z1bmN0aW9uIGRvUnVuKCl7aWYoY2FsbGVkUnVuKXJldHVybjtjYWxsZWRSdW49dHJ1ZTtNb2R1bGVbImNhbGxlZFJ1biJdPXRydWU7aWYoQUJPUlQpcmV0dXJuO2luaXRSdW50aW1lKCk7cHJlTWFpbigpO3JlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTtpZihNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0pTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKCk7cG9zdFJ1bigpfWlmKE1vZHVsZVsic2V0U3RhdHVzIl0pe01vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe01vZHVsZVsic2V0U3RhdHVzIl0oIiIpfSwxKTtkb1J1bigpfSwxKX1lbHNle2RvUnVuKCl9fU1vZHVsZVsicnVuIl09cnVuO2lmKE1vZHVsZVsicHJlSW5pdCJdKXtpZih0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il09PSJmdW5jdGlvbiIpTW9kdWxlWyJwcmVJbml0Il09W01vZHVsZVsicHJlSW5pdCJdXTt3aGlsZShNb2R1bGVbInByZUluaXQiXS5sZW5ndGg+MCl7TW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKX19bm9FeGl0UnVudGltZT10cnVlO3J1bigpOwogCiAKICAgcmV0dXJuIEJBU0lTLnJlYWR5CkBAIC0xNCw4ICsxNCw5IEBACiApOwogfSkoKTsKIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpCi0gIG1vZHVsZS5leHBvcnRzID0gQkFTSVM7Ci1lbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pCi0gIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7IHJldHVybiBCQVNJUzsgfSk7Ci1lbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpCi0gIGV4cG9ydHNbIkJBU0lTIl0gPSBCQVNJUzsKKyAgICAgIG1vZHVsZS5leHBvcnRzID0gQkFTSVM7CisgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKQorICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHsgcmV0dXJuIEJBU0lTOyB9KTsKKyAgICBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpCisgICAgICBleHBvcnRzWyJCQVNJUyJdID0gQkFTSVM7CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViZ2wvZW5jb2Rlci9idWlsZC9iYXNpc19lbmNvZGVyLndhc20gYi93ZWJnbC9lbmNvZGVyL2J1aWxkL2Jhc2lzX2VuY29kZXIud2FzbQppbmRleCBiMDUzOWM1Li43Mjc5OWI2IDEwMDY0NAotLS0gYS93ZWJnbC9lbmNvZGVyL2J1aWxkL2Jhc2lzX2VuY29kZXIud2FzbQorKysgYi93ZWJnbC9lbmNvZGVyL2J1aWxkL2Jhc2lzX2VuY29kZXIud2FzbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS93ZWJnbC90cmFuc2NvZGVyL2Jhc2lzX3dyYXBwZXJzLmNwcCBiL3dlYmdsL3RyYW5zY29kZXIvYmFzaXNfd3JhcHBlcnMuY3BwCmluZGV4IGExYzY0MjguLjczOWYwOTIgMTAwNjQ0Ci0tLSBhL3dlYmdsL3RyYW5zY29kZXIvYmFzaXNfd3JhcHBlcnMuY3BwCisrKyBiL3dlYmdsL3RyYW5zY29kZXIvYmFzaXNfd3JhcHBlcnMuY3BwCkBAIC00MSw3ICs0MSw3IEBACiB1c2luZyBuYW1lc3BhY2UgYmFzaXN0OwogdXNpbmcgbmFtZXNwYWNlIGJhc2lzdTsKIAotc3RhdGljIGJhc2lzdDo6ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sqIGdfcEdsb2JhbF9jb2RlYm9vazsKK3N0YXRpYyBib29sIGdfYmFzaXNfaW5pdGlhbGl6ZWRfZmxhZzsKIAogdm9pZCBiYXNpc19pbml0KCkKIHsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAlwcmludGYoImJhc2lzX2luaXQoKVxuIik7CiAjZW5kaWYgICAKIAotCWlmIChnX3BHbG9iYWxfY29kZWJvb2spCisJaWYgKGdfYmFzaXNfaW5pdGlhbGl6ZWRfZmxhZykKIAkJcmV0dXJuOwogCiAjaWYgQkFTSVNVX1NVUFBPUlRfRU5DT0RJTkcKQEAgLTU4LDcgKzU4LDcgQEAKIAogCWJhc2lzdV90cmFuc2NvZGVyX2luaXQoKTsKIAotCWdfcEdsb2JhbF9jb2RlYm9vayA9IG5ldyBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rKGdfZ2xvYmFsX3NlbGVjdG9yX2NiX3NpemUsIGdfZ2xvYmFsX3NlbGVjdG9yX2NiKTsKKwlnX2Jhc2lzX2luaXRpYWxpemVkX2ZsYWcgPSB0cnVlOwogfQogCiBzdGF0aWMgdm9pZCBjb3B5X2Zyb21fanNidWZmZXIoY29uc3QgZW1zY3JpcHRlbjo6dmFsJiBzcmNCdWZmZXIsIGJhc2lzdTo6dmVjdG9yPHVpbnQ4X3Q+JiBkc3RWZWMpCkBAIC0xNzQsMTAgKzE3NCw5IEBACiAJCTogbV9maWxlKFsmXSgpIHsKIAkJc2l6ZV90IGJ5dGVMZW5ndGggPSBqc0J1ZmZlclsiYnl0ZUxlbmd0aCJdLmFzPHNpemVfdD4oKTsKIAkJcmV0dXJuIGJhc2lzdTo6dmVjdG9yPHVpbnQ4X3Q+KGJ5dGVMZW5ndGgpOwotCQkJfSgpKSwKLQkJbV90cmFuc2NvZGVyKGdfcEdsb2JhbF9jb2RlYm9vaykKKwkJCX0oKSkKIAl7Ci0JCWlmICghZ19wR2xvYmFsX2NvZGVib29rKQorCQlpZiAoIWdfYmFzaXNfaW5pdGlhbGl6ZWRfZmxhZykKIAkJewogI2lmIEJBU0lTVV9ERUJVR19QUklOVEYgICAKIAkJCXByaW50ZigiYmFzaXNfZmlsZTo6YmFzaXNfZmlsZTogTXVzdCBjYWxsIGJhc2lzX2luaXQoKSBmaXJzdCFcbiIpOwpAQCAtNTMyLDEwICs1MzEsOSBAQAogCQk6IG1fZmlsZShbJl0oKSB7CiAJCXNpemVfdCBieXRlTGVuZ3RoID0ganNCdWZmZXJbImJ5dGVMZW5ndGgiXS5hczxzaXplX3Q+KCk7CiAJCXJldHVybiBiYXNpc3U6OnZlY3Rvcjx1aW50OF90PihieXRlTGVuZ3RoKTsKLQkJCX0oKSksCi0JCW1fdHJhbnNjb2RlcihnX3BHbG9iYWxfY29kZWJvb2spCisJCQl9KCkpCiAJewotCQlpZiAoIWdfcEdsb2JhbF9jb2RlYm9vaykKKwkJaWYgKCFnX2Jhc2lzX2luaXRpYWxpemVkX2ZsYWcpCiAJCXsKICNpZiBCQVNJU1VfREVCVUdfUFJJTlRGICAgCiAJCQlwcmludGYoImJhc2lzX2ZpbGU6OmJhc2lzX2ZpbGU6IE11c3QgY2FsbCBiYXNpc19pbml0KCkgZmlyc3QhXG4iKTsKQEAgLTEwNTAsNyArMTA0OCw3IEBACiAJCiAJdWludDMyX3QgZW5jb2RlKGNvbnN0IGVtc2NyaXB0ZW46OnZhbCYgZHN0X2Jhc2lzX2ZpbGVfanNfdmFsKQogCXsKLQkJaWYgKCFnX3BHbG9iYWxfY29kZWJvb2spCisJCWlmICghZ19iYXNpc19pbml0aWFsaXplZF9mbGFnKQogCQl7CiAjaWYgQkFTSVNVX0RFQlVHX1BSSU5URiAgIAogCQkJcHJpbnRmKCJiYXNpc19lbmNvZGVyOjplbmNvZGU6IE11c3QgY2FsbCBiYXNpc19pbml0KCkgZmlyc3QhXG4iKTsKQEAgLTEwNTksOCArMTA1Nyw2IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCWJhc2lzdDo6ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2sgc2VsX2NvZGVib29rKGJhc2lzdDo6Z19nbG9iYWxfc2VsZWN0b3JfY2Jfc2l6ZSwgYmFzaXN0OjpnX2dsb2JhbF9zZWxlY3Rvcl9jYik7Ci0KIAkJLy8gV2UgZG9uJ3QgdXNlIHRocmVhZGluZyBmb3Igbm93LCBidXQgdGhlIGNvbXByZXNzb3IgbmVlZHMgYSBqb2IgcG9vbC4KIAkJam9iX3Bvb2wganBvb2woMSk7CiAKQEAgLTEwNzYsNyArMTA3Miw2IEBACiAKIAkJcGFyYW1zLm1fcmVhZF9zb3VyY2VfaW1hZ2VzID0gZmFsc2U7CiAJCXBhcmFtcy5tX3dyaXRlX291dHB1dF9iYXNpc19maWxlcyA9IGZhbHNlOwotCQlwYXJhbXMubV9wU2VsX2NvZGVib29rID0gJnNlbF9jb2RlYm9vazsKIAogCQliYXNpc19jb21wcmVzc29yIGNvbXA7CiAKQEAgLTExMzUsOCArMTEzMCw3IEBACiAJYmFzaXN1X3RyYW5zY29kZXJfc3RhdGUgbV9zdGF0ZTsKIAkKIHB1YmxpYzoKLQlsb3dsZXZlbF9ldGMxc19pbWFnZV90cmFuc2NvZGVyKCkgOiAKLQkJYmFzaXN1X2xvd2xldmVsX2V0YzFzX3RyYW5zY29kZXIoZ19wR2xvYmFsX2NvZGVib29rKQorCWxvd2xldmVsX2V0YzFzX2ltYWdlX3RyYW5zY29kZXIoKQogCXsKIAl9CiAJCkBAIC0xMTk1LDcgKzExODksNyBAQAogCQl1aW50MzJfdCBvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMsCiAJCXVpbnQzMl90IG91dHB1dF9yb3dzX2luX3BpeGVscykKIAl7Ci0JCWlmICghZ19wR2xvYmFsX2NvZGVib29rKQorCQlpZiAoIWdfYmFzaXNfaW5pdGlhbGl6ZWRfZmxhZykKIAkJewogI2lmIEJBU0lTVV9ERUJVR19QUklOVEYgICAKIAkJCXByaW50ZigidHJhbnNjb2RlX2V0YzFzX2ltYWdlOiBiYXNpc19pbml0KCkgbXVzdCBiZSBjYWxsZWQgZmlyc3RcbiIpOwpAQCAtMTI3Myw3ICsxMjY3LDcgQEAKIHsKIAl0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0IHRhcmdldF9mb3JtYXQgPSBzdGF0aWNfY2FzdDx0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0Pih0YXJnZXRfZm9ybWF0X2ludCk7CiAJCi0JaWYgKCFnX3BHbG9iYWxfY29kZWJvb2spCisJaWYgKCFnX2Jhc2lzX2luaXRpYWxpemVkX2ZsYWcpCiAJewogI2lmIEJBU0lTVV9ERUJVR19QUklOVEYgICAKIAkJcHJpbnRmKCJ0cmFuc2NvZGVfdWFzdGNfaW1hZ2U6IGJhc2lzX2luaXQoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdFxuIik7CmRpZmYgLS1naXQgYS93ZWJnbC90cmFuc2NvZGVyL2J1aWxkL2Jhc2lzX3RyYW5zY29kZXIuanMgYi93ZWJnbC90cmFuc2NvZGVyL2J1aWxkL2Jhc2lzX3RyYW5zY29kZXIuanMKaW5kZXggOWUyODVkZC4uYjQyZDk3NyAxMDA2NDQKLS0tIGEvd2ViZ2wvdHJhbnNjb2Rlci9idWlsZC9iYXNpc190cmFuc2NvZGVyLmpzCisrKyBiL3dlYmdsL3RyYW5zY29kZXIvYnVpbGQvYmFzaXNfdHJhbnNjb2Rlci5qcwpAQCAtNiw3ICs2LDcgQEAKIGZ1bmN0aW9uKEJBU0lTKSB7CiAgIEJBU0lTID0gQkFTSVMgfHwge307CiAKLXZhciBNb2R1bGU9dHlwZW9mIEJBU0lTIT09InVuZGVmaW5lZCI/QkFTSVM6e307dmFyIHJlYWR5UHJvbWlzZVJlc29sdmUscmVhZHlQcm9taXNlUmVqZWN0O01vZHVsZVsicmVhZHkiXT1uZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cmVhZHlQcm9taXNlUmVzb2x2ZT1yZXNvbHZlO3JlYWR5UHJvbWlzZVJlamVjdD1yZWplY3R9KTt2YXIgbW9kdWxlT3ZlcnJpZGVzPXt9O3ZhciBrZXk7Zm9yKGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIGFyZ3VtZW50c189W107dmFyIHRoaXNQcm9ncmFtPSIuL3RoaXMucHJvZ3JhbSI7dmFyIHF1aXRfPWZ1bmN0aW9uKHN0YXR1cyx0b1Rocm93KXt0aHJvdyB0b1Rocm93fTt2YXIgRU5WSVJPTk1FTlRfSVNfV0VCPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX05PREU9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX1NIRUxMPWZhbHNlO0VOVklST05NRU5UX0lTX1dFQj10eXBlb2Ygd2luZG93PT09Im9iamVjdCI7RU5WSVJPTk1FTlRfSVNfV09SS0VSPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT09ImZ1bmN0aW9uIjtFTlZJUk9OTUVOVF9JU19OT0RFPXR5cGVvZiBwcm9jZXNzPT09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT0ic3RyaW5nIjtFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjt2YXIgc2NyaXB0RGlyZWN0b3J5PSIiO2Z1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCl7aWYoTW9kdWxlWyJsb2NhdGVGaWxlIl0pe3JldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLHNjcmlwdERpcmVjdG9yeSl9cmV0dXJuIHNjcmlwdERpcmVjdG9yeStwYXRofXZhciByZWFkXyxyZWFkQXN5bmMscmVhZEJpbmFyeSxzZXRXaW5kb3dUaXRsZTt2YXIgbm9kZUZTO3ZhciBub2RlUGF0aDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1yZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpKyIvIn1lbHNle3NjcmlwdERpcmVjdG9yeT1fX2Rpcm5hbWUrIi8ifXJlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKCJmcyIpO2lmKCFub2RlUGF0aClub2RlUGF0aD1yZXF1aXJlKCJwYXRoIik7ZmlsZW5hbWU9bm9kZVBhdGhbIm5vcm1hbGl6ZSJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTWyJyZWFkRmlsZVN5bmMiXShmaWxlbmFtZSxiaW5hcnk/bnVsbDoidXRmOCIpfTtyZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZmlsZW5hbWUpe3ZhciByZXQ9cmVhZF8oZmlsZW5hbWUsdHJ1ZSk7aWYoIXJldC5idWZmZXIpe3JldD1uZXcgVWludDhBcnJheShyZXQpfWFzc2VydChyZXQuYnVmZmVyKTtyZXR1cm4gcmV0fTtpZihwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoPjEpe3RoaXNQcm9ncmFtPXByb2Nlc3NbImFyZ3YiXVsxXS5yZXBsYWNlKC9cXC9nLCIvIil9YXJndW1lbnRzXz1wcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7cHJvY2Vzc1sib24iXSgidW5jYXVnaHRFeGNlcHRpb24iLGZ1bmN0aW9uKGV4KXtpZighKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpe3Rocm93IGV4fX0pO3Byb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsYWJvcnQpO3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cHJvY2Vzc1siZXhpdCJdKHN0YXR1cyl9O01vZHVsZVsiaW5zcGVjdCJdPWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19TSEVMTCl7aWYodHlwZW9mIHJlYWQhPSJ1bmRlZmluZWQiKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGYpe3JldHVybiByZWFkKGYpfX1yZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7dmFyIGRhdGE7aWYodHlwZW9mIHJlYWRidWZmZXI9PT0iZnVuY3Rpb24iKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVhZGJ1ZmZlcihmKSl9ZGF0YT1yZWFkKGYsImJpbmFyeSIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PSJvYmplY3QiKTtyZXR1cm4gZGF0YX07aWYodHlwZW9mIHNjcmlwdEFyZ3MhPSJ1bmRlZmluZWQiKXthcmd1bWVudHNfPXNjcmlwdEFyZ3N9ZWxzZSBpZih0eXBlb2YgYXJndW1lbnRzIT0idW5kZWZpbmVkIil7YXJndW1lbnRzXz1hcmd1bWVudHN9aWYodHlwZW9mIHF1aXQ9PT0iZnVuY3Rpb24iKXtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3F1aXQoc3RhdHVzKX19aWYodHlwZW9mIHByaW50IT09InVuZGVmaW5lZCIpe2lmKHR5cGVvZiBjb25zb2xlPT09InVuZGVmaW5lZCIpY29uc29sZT17fTtjb25zb2xlLmxvZz1wcmludDtjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnIhPT0idW5kZWZpbmVkIj9wcmludEVycjpwcmludH19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9c2VsZi5sb2NhdGlvbi5ocmVmfWVsc2UgaWYodHlwZW9mIGRvY3VtZW50IT09InVuZGVmaW5lZCImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQpe3NjcmlwdERpcmVjdG9yeT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY31pZihfc2NyaXB0RGlyKXtzY3JpcHREaXJlY3Rvcnk9X3NjcmlwdERpcn1pZihzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9IiJ9e3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQodXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO3JldHVybiB4aHIucmVzcG9uc2VUZXh0fTtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeSh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24gcmVhZEFzeW5jKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oIkdFVCIsdXJsLHRydWUpO3hoci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIjt4aHIub25sb2FkPWZ1bmN0aW9uIHhocl9vbmxvYWQoKXtpZih4aHIuc3RhdHVzPT0yMDB8fHhoci5zdGF0dXM9PTAmJnhoci5yZXNwb25zZSl7b25sb2FkKHhoci5yZXNwb25zZSk7cmV0dXJufW9uZXJyb3IoKX07eGhyLm9uZXJyb3I9b25lcnJvcjt4aHIuc2VuZChudWxsKX19c2V0V2luZG93VGl0bGU9ZnVuY3Rpb24odGl0bGUpe2RvY3VtZW50LnRpdGxlPXRpdGxlfX1lbHNle312YXIgb3V0PU1vZHVsZVsicHJpbnQiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVsicHJpbnRFcnIiXXx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7Zm9yKGtleSBpbiBtb2R1bGVPdmVycmlkZXMpe2lmKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtNb2R1bGVba2V5XT1tb2R1bGVPdmVycmlkZXNba2V5XX19bW9kdWxlT3ZlcnJpZGVzPW51bGw7aWYoTW9kdWxlWyJhcmd1bWVudHMiXSlhcmd1bWVudHNfPU1vZHVsZVsiYXJndW1lbnRzIl07aWYoTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdKXRoaXNQcm9ncmFtPU1vZHVsZVsidGhpc1Byb2dyYW0iXTtpZihNb2R1bGVbInF1aXQiXSlxdWl0Xz1Nb2R1bGVbInF1aXQiXTt2YXIgdGVtcFJldDA9MDt2YXIgc2V0VGVtcFJldDA9ZnVuY3Rpb24odmFsdWUpe3RlbXBSZXQwPXZhbHVlfTt2YXIgd2FzbUJpbmFyeTtpZihNb2R1bGVbIndhc21CaW5hcnkiXSl3YXNtQmluYXJ5PU1vZHVsZVsid2FzbUJpbmFyeSJdO3ZhciBub0V4aXRSdW50aW1lO2lmKE1vZHVsZVsibm9FeGl0UnVudGltZSJdKW5vRXhpdFJ1bnRpbWU9TW9kdWxlWyJub0V4aXRSdW50aW1lIl07aWYodHlwZW9mIFdlYkFzc2VtYmx5IT09Im9iamVjdCIpe2Fib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIil9dmFyIHdhc21NZW1vcnk7dmFyIEFCT1JUPWZhbHNlO3ZhciBFWElUU1RBVFVTO2Z1bmN0aW9uIGFzc2VydChjb25kaXRpb24sdGV4dCl7aWYoIWNvbmRpdGlvbil7YWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIrdGV4dCl9fXZhciBVVEY4RGVjb2Rlcj10eXBlb2YgVGV4dERlY29kZXIhPT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp1bmRlZmluZWQ7ZnVuY3Rpb24gVVRGOEFycmF5VG9TdHJpbmcoaGVhcCxpZHgsbWF4Qnl0ZXNUb1JlYWQpe3ZhciBlbmRJZHg9aWR4K21heEJ5dGVzVG9SZWFkO3ZhciBlbmRQdHI9aWR4O3doaWxlKGhlYXBbZW5kUHRyXSYmIShlbmRQdHI+PWVuZElkeCkpKytlbmRQdHI7aWYoZW5kUHRyLWlkeD4xNiYmaGVhcC5zdWJhcnJheSYmVVRGOERlY29kZXIpe3JldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsZW5kUHRyKSl9ZWxzZXt2YXIgc3RyPSIiO3doaWxlKGlkeDxlbmRQdHIpe3ZhciB1MD1oZWFwW2lkeCsrXTtpZighKHUwJjEyOCkpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7Y29udGludWV9dmFyIHUxPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyMjQpPT0xOTIpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgodTAmMzEpPDw2fHUxKTtjb250aW51ZX12YXIgdTI9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjI0MCk9PTIyNCl7dTA9KHUwJjE1KTw8MTJ8dTE8PDZ8dTJ9ZWxzZXt1MD0odTAmNyk8PDE4fHUxPDwxMnx1Mjw8NnxoZWFwW2lkeCsrXSY2M31pZih1MDw2NTUzNil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKX1lbHNle3ZhciBjaD11MC02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfX19cmV0dXJuIHN0cn1mdW5jdGlvbiBVVEY4VG9TdHJpbmcocHRyLG1heEJ5dGVzVG9SZWFkKXtyZXR1cm4gcHRyP1VURjhBcnJheVRvU3RyaW5nKEhFQVBVOCxwdHIsbWF4Qnl0ZXNUb1JlYWQpOiIifWZ1bmN0aW9uIHN0cmluZ1RvVVRGOEFycmF5KHN0cixoZWFwLG91dElkeCxtYXhCeXRlc1RvV3JpdGUpe2lmKCEobWF4Qnl0ZXNUb1dyaXRlPjApKXJldHVybiAwO3ZhciBzdGFydElkeD1vdXRJZHg7dmFyIGVuZElkeD1vdXRJZHgrbWF4Qnl0ZXNUb1dyaXRlLTE7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXt2YXIgdTE9c3RyLmNoYXJDb2RlQXQoKytpKTt1PTY1NTM2KygodSYxMDIzKTw8MTApfHUxJjEwMjN9aWYodTw9MTI3KXtpZihvdXRJZHg+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT11fWVsc2UgaWYodTw9MjA0Nyl7aWYob3V0SWR4KzE+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0xOTJ8dT4+NjtoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY1NTM1KXtpZihvdXRJZHgrMj49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTIyNHx1Pj4xMjtoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNle2lmKG91dElkeCszPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjQwfHU+PjE4O2hlYXBbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M319aGVhcFtvdXRJZHhdPTA7cmV0dXJuIG91dElkeC1zdGFydElkeH1mdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe3JldHVybiBzdHJpbmdUb1VURjhBcnJheShzdHIsSEVBUFU4LG91dFB0cixtYXhCeXRlc1RvV3JpdGUpfWZ1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGOChzdHIpe3ZhciBsZW49MDtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpdT02NTUzNisoKHUmMTAyMyk8PDEwKXxzdHIuY2hhckNvZGVBdCgrK2kpJjEwMjM7aWYodTw9MTI3KSsrbGVuO2Vsc2UgaWYodTw9MjA0NylsZW4rPTI7ZWxzZSBpZih1PD02NTUzNSlsZW4rPTM7ZWxzZSBsZW4rPTR9cmV0dXJuIGxlbn12YXIgVVRGMTZEZWNvZGVyPXR5cGVvZiBUZXh0RGVjb2RlciE9PSJ1bmRlZmluZWQiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp1bmRlZmluZWQ7ZnVuY3Rpb24gVVRGMTZUb1N0cmluZyhwdHIsbWF4Qnl0ZXNUb1JlYWQpe3ZhciBlbmRQdHI9cHRyO3ZhciBpZHg9ZW5kUHRyPj4xO3ZhciBtYXhJZHg9aWR4K21heEJ5dGVzVG9SZWFkLzI7d2hpbGUoIShpZHg+PW1heElkeCkmJkhFQVBVMTZbaWR4XSkrK2lkeDtlbmRQdHI9aWR4PDwxO2lmKGVuZFB0ci1wdHI+MzImJlVURjE2RGVjb2Rlcil7cmV0dXJuIFVURjE2RGVjb2Rlci5kZWNvZGUoSEVBUFU4LnN1YmFycmF5KHB0cixlbmRQdHIpKX1lbHNle3ZhciBzdHI9IiI7Zm9yKHZhciBpPTA7IShpPj1tYXhCeXRlc1RvUmVhZC8yKTsrK2kpe3ZhciBjb2RlVW5pdD1IRUFQMTZbcHRyK2kqMj4+MV07aWYoY29kZVVuaXQ9PTApYnJlYWs7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVVbml0KX1yZXR1cm4gc3RyfX1mdW5jdGlvbiBzdHJpbmdUb1VURjE2KHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtpZihtYXhCeXRlc1RvV3JpdGU9PT11bmRlZmluZWQpe21heEJ5dGVzVG9Xcml0ZT0yMTQ3NDgzNjQ3fWlmKG1heEJ5dGVzVG9Xcml0ZTwyKXJldHVybiAwO21heEJ5dGVzVG9Xcml0ZS09Mjt2YXIgc3RhcnRQdHI9b3V0UHRyO3ZhciBudW1DaGFyc1RvV3JpdGU9bWF4Qnl0ZXNUb1dyaXRlPHN0ci5sZW5ndGgqMj9tYXhCeXRlc1RvV3JpdGUvMjpzdHIubGVuZ3RoO2Zvcih2YXIgaT0wO2k8bnVtQ2hhcnNUb1dyaXRlOysraSl7dmFyIGNvZGVVbml0PXN0ci5jaGFyQ29kZUF0KGkpO0hFQVAxNltvdXRQdHI+PjFdPWNvZGVVbml0O291dFB0cis9Mn1IRUFQMTZbb3V0UHRyPj4xXT0wO3JldHVybiBvdXRQdHItc3RhcnRQdHJ9ZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEYxNihzdHIpe3JldHVybiBzdHIubGVuZ3RoKjJ9ZnVuY3Rpb24gVVRGMzJUb1N0cmluZyhwdHIsbWF4Qnl0ZXNUb1JlYWQpe3ZhciBpPTA7dmFyIHN0cj0iIjt3aGlsZSghKGk+PW1heEJ5dGVzVG9SZWFkLzQpKXt2YXIgdXRmMzI9SEVBUDMyW3B0citpKjQ+PjJdO2lmKHV0ZjMyPT0wKWJyZWFrOysraTtpZih1dGYzMj49NjU1MzYpe3ZhciBjaD11dGYzMi02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfWVsc2V7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHV0ZjMyKX19cmV0dXJuIHN0cn1mdW5jdGlvbiBzdHJpbmdUb1VURjMyKHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtpZihtYXhCeXRlc1RvV3JpdGU9PT11bmRlZmluZWQpe21heEJ5dGVzVG9Xcml0ZT0yMTQ3NDgzNjQ3fWlmKG1heEJ5dGVzVG9Xcml0ZTw0KXJldHVybiAwO3ZhciBzdGFydFB0cj1vdXRQdHI7dmFyIGVuZFB0cj1zdGFydFB0cittYXhCeXRlc1RvV3JpdGUtNDtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgY29kZVVuaXQ9c3RyLmNoYXJDb2RlQXQoaSk7aWYoY29kZVVuaXQ+PTU1Mjk2JiZjb2RlVW5pdDw9NTczNDMpe3ZhciB0cmFpbFN1cnJvZ2F0ZT1zdHIuY2hhckNvZGVBdCgrK2kpO2NvZGVVbml0PTY1NTM2KygoY29kZVVuaXQmMTAyMyk8PDEwKXx0cmFpbFN1cnJvZ2F0ZSYxMDIzfUhFQVAzMltvdXRQdHI+PjJdPWNvZGVVbml0O291dFB0cis9NDtpZihvdXRQdHIrND5lbmRQdHIpYnJlYWt9SEVBUDMyW291dFB0cj4+Ml09MDtyZXR1cm4gb3V0UHRyLXN0YXJ0UHRyfWZ1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGMzIoc3RyKXt2YXIgbGVuPTA7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIGNvZGVVbml0PXN0ci5jaGFyQ29kZUF0KGkpO2lmKGNvZGVVbml0Pj01NTI5NiYmY29kZVVuaXQ8PTU3MzQzKSsraTtsZW4rPTR9cmV0dXJuIGxlbn1mdW5jdGlvbiBhbGlnblVwKHgsbXVsdGlwbGUpe2lmKHglbXVsdGlwbGU+MCl7eCs9bXVsdGlwbGUteCVtdWx0aXBsZX1yZXR1cm4geH12YXIgYnVmZmVyLEhFQVA4LEhFQVBVOCxIRUFQMTYsSEVBUFUxNixIRUFQMzIsSEVBUFUzMixIRUFQRjMyLEhFQVBGNjQ7ZnVuY3Rpb24gdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmKXtidWZmZXI9YnVmO01vZHVsZVsiSEVBUDgiXT1IRUFQOD1uZXcgSW50OEFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQMTYiXT1IRUFQMTY9bmV3IEludDE2QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVAzMiJdPUhFQVAzMj1uZXcgSW50MzJBcnJheShidWYpO01vZHVsZVsiSEVBUFU4Il09SEVBUFU4PW5ldyBVaW50OEFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQVTE2Il09SEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVBVMzIiXT1IRUFQVTMyPW5ldyBVaW50MzJBcnJheShidWYpO01vZHVsZVsiSEVBUEYzMiJdPUhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShidWYpO01vZHVsZVsiSEVBUEY2NCJdPUhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShidWYpfXZhciBJTklUSUFMX01FTU9SWT1Nb2R1bGVbIklOSVRJQUxfTUVNT1JZIl18fDE2Nzc3MjE2O3ZhciB3YXNtVGFibGU7dmFyIF9fQVRQUkVSVU5fXz1bXTt2YXIgX19BVElOSVRfXz1bXTt2YXIgX19BVE1BSU5fXz1bXTt2YXIgX19BVFBPU1RSVU5fXz1bXTt2YXIgcnVudGltZUluaXRpYWxpemVkPWZhbHNlO2Z1bmN0aW9uIHByZVJ1bigpe2lmKE1vZHVsZVsicHJlUnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlUnVuIl09W01vZHVsZVsicHJlUnVuIl1dO3doaWxlKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKXthZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihNb2R1bGVbInBvc3RSdW4iXSl7aWYodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicG9zdFJ1biJdPVtNb2R1bGVbInBvc3RSdW4iXV07d2hpbGUoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlWyJwb3N0UnVuIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pfWZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKXtfX0FUUFJFUlVOX18udW5zaGlmdChjYil9ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfXZhciBydW5EZXBlbmRlbmNpZXM9MDt2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pe01vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyl9fWZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcy0tO2lmKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKXtNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyIGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXT17fTtNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdPXt9O2Z1bmN0aW9uIGFib3J0KHdoYXQpe2lmKE1vZHVsZVsib25BYm9ydCJdKXtNb2R1bGVbIm9uQWJvcnQiXSh3aGF0KX13aGF0Kz0iIjtlcnIod2hhdCk7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7d2hhdD0iYWJvcnQoIit3aGF0KyIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7dmFyIGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTtyZWFkeVByb21pc2VSZWplY3QoZSk7dGhyb3cgZX1mdW5jdGlvbiBoYXNQcmVmaXgoc3RyLHByZWZpeCl7cmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aD9zdHIuc3RhcnRzV2l0aChwcmVmaXgpOnN0ci5pbmRleE9mKHByZWZpeCk9PT0wfXZhciBkYXRhVVJJUHJlZml4PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjtmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZGF0YVVSSVByZWZpeCl9dmFyIGZpbGVVUklQcmVmaXg9ImZpbGU6Ly8iO2Z1bmN0aW9uIGlzRmlsZVVSSShmaWxlbmFtZSl7cmV0dXJuIGhhc1ByZWZpeChmaWxlbmFtZSxmaWxlVVJJUHJlZml4KX12YXIgd2FzbUJpbmFyeUZpbGU9ImJhc2lzX3RyYW5zY29kZXIud2FzbSI7aWYoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpe3dhc21CaW5hcnlGaWxlPWxvY2F0ZUZpbGUod2FzbUJpbmFyeUZpbGUpfWZ1bmN0aW9uIGdldEJpbmFyeSgpe3RyeXtpZih3YXNtQmluYXJ5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSl9aWYocmVhZEJpbmFyeSl7cmV0dXJuIHJlYWRCaW5hcnkod2FzbUJpbmFyeUZpbGUpfWVsc2V7dGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifX1jYXRjaChlcnIpe2Fib3J0KGVycil9fWZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKXtpZighd2FzbUJpbmFyeSYmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKSYmdHlwZW9mIGZldGNoPT09ImZ1bmN0aW9uIiYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZVsib2siXSl7dGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIit3YXNtQmluYXJ5RmlsZSsiJyJ9cmV0dXJuIHJlc3BvbnNlWyJhcnJheUJ1ZmZlciJdKCl9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiBnZXRCaW5hcnkoKX0pfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGdldEJpbmFyeSl9ZnVuY3Rpb24gY3JlYXRlV2FzbSgpe3ZhciBpbmZvPXsiYSI6YXNtTGlicmFyeUFyZ307ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLG1vZHVsZSl7dmFyIGV4cG9ydHM9aW5zdGFuY2UuZXhwb3J0cztNb2R1bGVbImFzbSJdPWV4cG9ydHM7d2FzbU1lbW9yeT1Nb2R1bGVbImFzbSJdWyJLIl07dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpO3dhc21UYWJsZT1Nb2R1bGVbImFzbSJdWyJMIl07cmVtb3ZlUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpfWFkZFJ1bkRlcGVuZGVuY3koIndhc20taW5zdGFudGlhdGUiKTtmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCl7cmVjZWl2ZUluc3RhbmNlKG91dHB1dFsiaW5zdGFuY2UiXSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcil7cmV0dXJuIGdldEJpbmFyeVByb21pc2UoKS50aGVuKGZ1bmN0aW9uKGJpbmFyeSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSxpbmZvKX0pLnRoZW4ocmVjZWl2ZXIsZnVuY3Rpb24ocmVhc29uKXtlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrcmVhc29uKTthYm9ydChyZWFzb24pfSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpe2lmKCF3YXNtQmluYXJ5JiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PT0iZnVuY3Rpb24iJiYhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkmJnR5cGVvZiBmZXRjaD09PSJmdW5jdGlvbiIpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe3ZhciByZXN1bHQ9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsaW5mbyk7cmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsZnVuY3Rpb24ocmVhc29uKXtlcnIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK3JlYXNvbik7ZXJyKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpO3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfSl9KX1lbHNle3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfX1pZihNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKXt0cnl7dmFyIGV4cG9ydHM9TW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLHJlY2VpdmVJbnN0YW5jZSk7cmV0dXJuIGV4cG9ydHN9Y2F0Y2goZSl7ZXJyKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2UpO3JldHVybiBmYWxzZX19aW5zdGFudGlhdGVBc3luYygpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7cmV0dXJue319ZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKXt3aGlsZShjYWxsYmFja3MubGVuZ3RoPjApe3ZhciBjYWxsYmFjaz1jYWxsYmFja3Muc2hpZnQoKTtpZih0eXBlb2YgY2FsbGJhY2s9PSJmdW5jdGlvbiIpe2NhbGxiYWNrKE1vZHVsZSk7Y29udGludWV9dmFyIGZ1bmM9Y2FsbGJhY2suZnVuYztpZih0eXBlb2YgZnVuYz09PSJudW1iZXIiKXtpZihjYWxsYmFjay5hcmc9PT11bmRlZmluZWQpe3dhc21UYWJsZS5nZXQoZnVuYykoKX1lbHNle3dhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKX19ZWxzZXtmdW5jKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZD9udWxsOmNhbGxiYWNrLmFyZyl9fX12YXIgc3RydWN0UmVnaXN0cmF0aW9ucz17fTtmdW5jdGlvbiBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyl7d2hpbGUoZGVzdHJ1Y3RvcnMubGVuZ3RoKXt2YXIgcHRyPWRlc3RydWN0b3JzLnBvcCgpO3ZhciBkZWw9ZGVzdHJ1Y3RvcnMucG9wKCk7ZGVsKHB0cil9fWZ1bmN0aW9uIHNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShIRUFQVTMyW3BvaW50ZXI+PjJdKX12YXIgYXdhaXRpbmdEZXBlbmRlbmNpZXM9e307dmFyIHJlZ2lzdGVyZWRUeXBlcz17fTt2YXIgdHlwZURlcGVuZGVuY2llcz17fTt2YXIgY2hhcl8wPTQ4O3ZhciBjaGFyXzk9NTc7ZnVuY3Rpb24gbWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpe2lmKHVuZGVmaW5lZD09PW5hbWUpe3JldHVybiJfdW5rbm93biJ9bmFtZT1uYW1lLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywiJCIpO3ZhciBmPW5hbWUuY2hhckNvZGVBdCgwKTtpZihmPj1jaGFyXzAmJmY8PWNoYXJfOSl7cmV0dXJuIl8iK25hbWV9ZWxzZXtyZXR1cm4gbmFtZX19ZnVuY3Rpb24gY3JlYXRlTmFtZWRGdW5jdGlvbihuYW1lLGJvZHkpe25hbWU9bWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpO3JldHVybiBuZXcgRnVuY3Rpb24oImJvZHkiLCJyZXR1cm4gZnVuY3Rpb24gIituYW1lKyIoKSB7XG4iKycgICAgInVzZSBzdHJpY3QiOycrIiAgICByZXR1cm4gYm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuIisifTtcbiIpKGJvZHkpfWZ1bmN0aW9uIGV4dGVuZEVycm9yKGJhc2VFcnJvclR5cGUsZXJyb3JOYW1lKXt2YXIgZXJyb3JDbGFzcz1jcmVhdGVOYW1lZEZ1bmN0aW9uKGVycm9yTmFtZSxmdW5jdGlvbihtZXNzYWdlKXt0aGlzLm5hbWU9ZXJyb3JOYW1lO3RoaXMubWVzc2FnZT1tZXNzYWdlO3ZhciBzdGFjaz1uZXcgRXJyb3IobWVzc2FnZSkuc3RhY2s7aWYoc3RhY2shPT11bmRlZmluZWQpe3RoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpKyJcbiIrc3RhY2sucmVwbGFjZSgvXkVycm9yKDpbXlxuXSopP1xuLywiIil9fSk7ZXJyb3JDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JUeXBlLnByb3RvdHlwZSk7ZXJyb3JDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZXJyb3JDbGFzcztlcnJvckNsYXNzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2lmKHRoaXMubWVzc2FnZT09PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXMubmFtZX1lbHNle3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9fTtyZXR1cm4gZXJyb3JDbGFzc312YXIgSW50ZXJuYWxFcnJvcj11bmRlZmluZWQ7ZnVuY3Rpb24gdGhyb3dJbnRlcm5hbEVycm9yKG1lc3NhZ2Upe3Rocm93IG5ldyBJbnRlcm5hbEVycm9yKG1lc3NhZ2UpfWZ1bmN0aW9uIHdoZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKG15VHlwZXMsZGVwZW5kZW50VHlwZXMsZ2V0VHlwZUNvbnZlcnRlcnMpe215VHlwZXMuZm9yRWFjaChmdW5jdGlvbih0eXBlKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdPWRlcGVuZGVudFR5cGVzfSk7ZnVuY3Rpb24gb25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl7dmFyIG15VHlwZUNvbnZlcnRlcnM9Z2V0VHlwZUNvbnZlcnRlcnModHlwZUNvbnZlcnRlcnMpO2lmKG15VHlwZUNvbnZlcnRlcnMubGVuZ3RoIT09bXlUeXBlcy5sZW5ndGgpe3Rocm93SW50ZXJuYWxFcnJvcigiTWlzbWF0Y2hlZCB0eXBlIGNvbnZlcnRlciBjb3VudCIpfWZvcih2YXIgaT0wO2k8bXlUeXBlcy5sZW5ndGg7KytpKXtyZWdpc3RlclR5cGUobXlUeXBlc1tpXSxteVR5cGVDb252ZXJ0ZXJzW2ldKX19dmFyIHR5cGVDb252ZXJ0ZXJzPW5ldyBBcnJheShkZXBlbmRlbnRUeXBlcy5sZW5ndGgpO3ZhciB1bnJlZ2lzdGVyZWRUeXBlcz1bXTt2YXIgcmVnaXN0ZXJlZD0wO2RlcGVuZGVudFR5cGVzLmZvckVhY2goZnVuY3Rpb24oZHQsaSl7aWYocmVnaXN0ZXJlZFR5cGVzLmhhc093blByb3BlcnR5KGR0KSl7dHlwZUNvbnZlcnRlcnNbaV09cmVnaXN0ZXJlZFR5cGVzW2R0XX1lbHNle3VucmVnaXN0ZXJlZFR5cGVzLnB1c2goZHQpO2lmKCFhd2FpdGluZ0RlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShkdCkpe2F3YWl0aW5nRGVwZW5kZW5jaWVzW2R0XT1bXX1hd2FpdGluZ0RlcGVuZGVuY2llc1tkdF0ucHVzaChmdW5jdGlvbigpe3R5cGVDb252ZXJ0ZXJzW2ldPXJlZ2lzdGVyZWRUeXBlc1tkdF07KytyZWdpc3RlcmVkO2lmKHJlZ2lzdGVyZWQ9PT11bnJlZ2lzdGVyZWRUeXBlcy5sZW5ndGgpe29uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpfX0pfX0pO2lmKDA9PT11bnJlZ2lzdGVyZWRUeXBlcy5sZW5ndGgpe29uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpfX1mdW5jdGlvbiBfX2VtYmluZF9maW5hbGl6ZV92YWx1ZV9vYmplY3Qoc3RydWN0VHlwZSl7dmFyIHJlZz1zdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO2RlbGV0ZSBzdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO3ZhciByYXdDb25zdHJ1Y3Rvcj1yZWcucmF3Q29uc3RydWN0b3I7dmFyIHJhd0Rlc3RydWN0b3I9cmVnLnJhd0Rlc3RydWN0b3I7dmFyIGZpZWxkUmVjb3Jkcz1yZWcuZmllbGRzO3ZhciBmaWVsZFR5cGVzPWZpZWxkUmVjb3Jkcy5tYXAoZnVuY3Rpb24oZmllbGQpe3JldHVybiBmaWVsZC5nZXR0ZXJSZXR1cm5UeXBlfSkuY29uY2F0KGZpZWxkUmVjb3Jkcy5tYXAoZnVuY3Rpb24oZmllbGQpe3JldHVybiBmaWVsZC5zZXR0ZXJBcmd1bWVudFR5cGV9KSk7d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW3N0cnVjdFR5cGVdLGZpZWxkVHlwZXMsZnVuY3Rpb24oZmllbGRUeXBlcyl7dmFyIGZpZWxkcz17fTtmaWVsZFJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCxpKXt2YXIgZmllbGROYW1lPWZpZWxkLmZpZWxkTmFtZTt2YXIgZ2V0dGVyUmV0dXJuVHlwZT1maWVsZFR5cGVzW2ldO3ZhciBnZXR0ZXI9ZmllbGQuZ2V0dGVyO3ZhciBnZXR0ZXJDb250ZXh0PWZpZWxkLmdldHRlckNvbnRleHQ7dmFyIHNldHRlckFyZ3VtZW50VHlwZT1maWVsZFR5cGVzW2krZmllbGRSZWNvcmRzLmxlbmd0aF07dmFyIHNldHRlcj1maWVsZC5zZXR0ZXI7dmFyIHNldHRlckNvbnRleHQ9ZmllbGQuc2V0dGVyQ29udGV4dDtmaWVsZHNbZmllbGROYW1lXT17cmVhZDpmdW5jdGlvbihwdHIpe3JldHVybiBnZXR0ZXJSZXR1cm5UeXBlWyJmcm9tV2lyZVR5cGUiXShnZXR0ZXIoZ2V0dGVyQ29udGV4dCxwdHIpKX0sd3JpdGU6ZnVuY3Rpb24ocHRyLG8pe3ZhciBkZXN0cnVjdG9ycz1bXTtzZXR0ZXIoc2V0dGVyQ29udGV4dCxwdHIsc2V0dGVyQXJndW1lbnRUeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsbykpO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKX19fSk7cmV0dXJuW3tuYW1lOnJlZy5uYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHB0cil7dmFyIHJ2PXt9O2Zvcih2YXIgaSBpbiBmaWVsZHMpe3J2W2ldPWZpZWxkc1tpXS5yZWFkKHB0cil9cmF3RGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLG8pe2Zvcih2YXIgZmllbGROYW1lIGluIGZpZWxkcyl7aWYoIShmaWVsZE5hbWUgaW4gbykpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgZmllbGQ6ICAiJytmaWVsZE5hbWUrJyInKX19dmFyIHB0cj1yYXdDb25zdHJ1Y3RvcigpO2ZvcihmaWVsZE5hbWUgaW4gZmllbGRzKXtmaWVsZHNbZmllbGROYW1lXS53cml0ZShwdHIsb1tmaWVsZE5hbWVdKX1pZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2gocmF3RGVzdHJ1Y3RvcixwdHIpfXJldHVybiBwdHJ9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpyYXdEZXN0cnVjdG9yfV19KX1mdW5jdGlvbiBnZXRTaGlmdEZyb21TaXplKHNpemUpe3N3aXRjaChzaXplKXtjYXNlIDE6cmV0dXJuIDA7Y2FzZSAyOnJldHVybiAxO2Nhc2UgNDpyZXR1cm4gMjtjYXNlIDg6cmV0dXJuIDM7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIHR5cGUgc2l6ZTogIitzaXplKX19ZnVuY3Rpb24gZW1iaW5kX2luaXRfY2hhckNvZGVzKCl7dmFyIGNvZGVzPW5ldyBBcnJheSgyNTYpO2Zvcih2YXIgaT0wO2k8MjU2OysraSl7Y29kZXNbaV09U3RyaW5nLmZyb21DaGFyQ29kZShpKX1lbWJpbmRfY2hhckNvZGVzPWNvZGVzfXZhciBlbWJpbmRfY2hhckNvZGVzPXVuZGVmaW5lZDtmdW5jdGlvbiByZWFkTGF0aW4xU3RyaW5nKHB0cil7dmFyIHJldD0iIjt2YXIgYz1wdHI7d2hpbGUoSEVBUFU4W2NdKXtyZXQrPWVtYmluZF9jaGFyQ29kZXNbSEVBUFU4W2MrK11dfXJldHVybiByZXR9dmFyIEJpbmRpbmdFcnJvcj11bmRlZmluZWQ7ZnVuY3Rpb24gdGhyb3dCaW5kaW5nRXJyb3IobWVzc2FnZSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcihtZXNzYWdlKX1mdW5jdGlvbiByZWdpc3RlclR5cGUocmF3VHlwZSxyZWdpc3RlcmVkSW5zdGFuY2Usb3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTtpZighKCJhcmdQYWNrQWR2YW5jZSJpbiByZWdpc3RlcmVkSW5zdGFuY2UpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWdpc3RlclR5cGUgcmVnaXN0ZXJlZEluc3RhbmNlIHJlcXVpcmVzIGFyZ1BhY2tBZHZhbmNlIil9dmFyIG5hbWU9cmVnaXN0ZXJlZEluc3RhbmNlLm5hbWU7aWYoIXJhd1R5cGUpe3Rocm93QmluZGluZ0Vycm9yKCd0eXBlICInK25hbWUrJyIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcicpfWlmKHJlZ2lzdGVyZWRUeXBlcy5oYXNPd25Qcm9wZXJ0eShyYXdUeXBlKSl7aWYob3B0aW9ucy5pZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zKXtyZXR1cm59ZWxzZXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHR5cGUgJyIrbmFtZSsiJyB0d2ljZSIpfX1yZWdpc3RlcmVkVHlwZXNbcmF3VHlwZV09cmVnaXN0ZXJlZEluc3RhbmNlO2RlbGV0ZSB0eXBlRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2lmKGF3YWl0aW5nRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHJhd1R5cGUpKXt2YXIgY2FsbGJhY2tzPWF3YWl0aW5nRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2RlbGV0ZSBhd2FpdGluZ0RlcGVuZGVuY2llc1tyYXdUeXBlXTtjYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihjYil7Y2IoKX0pfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9ib29sKHJhd1R5cGUsbmFtZSxzaXplLHRydWVWYWx1ZSxmYWxzZVZhbHVlKXt2YXIgc2hpZnQ9Z2V0U2hpZnRGcm9tU2l6ZShzaXplKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbih3dCl7cmV0dXJuISF3dH0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLG8pe3JldHVybiBvP3RydWVWYWx1ZTpmYWxzZVZhbHVlfSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcDtpZihzaXplPT09MSl7aGVhcD1IRUFQOH1lbHNlIGlmKHNpemU9PT0yKXtoZWFwPUhFQVAxNn1lbHNlIGlmKHNpemU9PT00KXtoZWFwPUhFQVAzMn1lbHNle3Rocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gYm9vbGVhbiB0eXBlIHNpemU6ICIrbmFtZSl9cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+c2hpZnRdKX0sZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9pc0FsaWFzT2Yob3RoZXIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIENsYXNzSGFuZGxlKSl7cmV0dXJuIGZhbHNlfWlmKCEob3RoZXIgaW5zdGFuY2VvZiBDbGFzc0hhbmRsZSkpe3JldHVybiBmYWxzZX12YXIgbGVmdENsYXNzPXRoaXMuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIGxlZnQ9dGhpcy4kJC5wdHI7dmFyIHJpZ2h0Q2xhc3M9b3RoZXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHJpZ2h0PW90aGVyLiQkLnB0cjt3aGlsZShsZWZ0Q2xhc3MuYmFzZUNsYXNzKXtsZWZ0PWxlZnRDbGFzcy51cGNhc3QobGVmdCk7bGVmdENsYXNzPWxlZnRDbGFzcy5iYXNlQ2xhc3N9d2hpbGUocmlnaHRDbGFzcy5iYXNlQ2xhc3Mpe3JpZ2h0PXJpZ2h0Q2xhc3MudXBjYXN0KHJpZ2h0KTtyaWdodENsYXNzPXJpZ2h0Q2xhc3MuYmFzZUNsYXNzfXJldHVybiBsZWZ0Q2xhc3M9PT1yaWdodENsYXNzJiZsZWZ0PT09cmlnaHR9ZnVuY3Rpb24gc2hhbGxvd0NvcHlJbnRlcm5hbFBvaW50ZXIobyl7cmV0dXJue2NvdW50Om8uY291bnQsZGVsZXRlU2NoZWR1bGVkOm8uZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOm8ucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOm8ucHRyLHB0clR5cGU6by5wdHJUeXBlLHNtYXJ0UHRyOm8uc21hcnRQdHIsc21hcnRQdHJUeXBlOm8uc21hcnRQdHJUeXBlfX1mdW5jdGlvbiB0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQob2JqKXtmdW5jdGlvbiBnZXRJbnN0YW5jZVR5cGVOYW1lKGhhbmRsZSl7cmV0dXJuIGhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcy5uYW1lfXRocm93QmluZGluZ0Vycm9yKGdldEluc3RhbmNlVHlwZU5hbWUob2JqKSsiIGluc3RhbmNlIGFscmVhZHkgZGVsZXRlZCIpfXZhciBmaW5hbGl6YXRpb25Hcm91cD1mYWxzZTtmdW5jdGlvbiBkZXRhY2hGaW5hbGl6ZXIoaGFuZGxlKXt9ZnVuY3Rpb24gcnVuRGVzdHJ1Y3RvcigkJCl7aWYoJCQuc21hcnRQdHIpeyQkLnNtYXJ0UHRyVHlwZS5yYXdEZXN0cnVjdG9yKCQkLnNtYXJ0UHRyKX1lbHNleyQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoJCQucHRyKX19ZnVuY3Rpb24gcmVsZWFzZUNsYXNzSGFuZGxlKCQkKXskJC5jb3VudC52YWx1ZS09MTt2YXIgdG9EZWxldGU9MD09PSQkLmNvdW50LnZhbHVlO2lmKHRvRGVsZXRlKXtydW5EZXN0cnVjdG9yKCQkKX19ZnVuY3Rpb24gYXR0YWNoRmluYWxpemVyKGhhbmRsZSl7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgRmluYWxpemF0aW9uR3JvdXApe2F0dGFjaEZpbmFsaXplcj1mdW5jdGlvbihoYW5kbGUpe3JldHVybiBoYW5kbGV9O3JldHVybiBoYW5kbGV9ZmluYWxpemF0aW9uR3JvdXA9bmV3IEZpbmFsaXphdGlvbkdyb3VwKGZ1bmN0aW9uKGl0ZXIpe2Zvcih2YXIgcmVzdWx0PWl0ZXIubmV4dCgpOyFyZXN1bHQuZG9uZTtyZXN1bHQ9aXRlci5uZXh0KCkpe3ZhciAkJD1yZXN1bHQudmFsdWU7aWYoISQkLnB0cil7Y29uc29sZS53YXJuKCJvYmplY3QgYWxyZWFkeSBkZWxldGVkOiAiKyQkLnB0cil9ZWxzZXtyZWxlYXNlQ2xhc3NIYW5kbGUoJCQpfX19KTthdHRhY2hGaW5hbGl6ZXI9ZnVuY3Rpb24oaGFuZGxlKXtmaW5hbGl6YXRpb25Hcm91cC5yZWdpc3RlcihoYW5kbGUsaGFuZGxlLiQkLGhhbmRsZS4kJCk7cmV0dXJuIGhhbmRsZX07ZGV0YWNoRmluYWxpemVyPWZ1bmN0aW9uKGhhbmRsZSl7ZmluYWxpemF0aW9uR3JvdXAudW5yZWdpc3RlcihoYW5kbGUuJCQpfTtyZXR1cm4gYXR0YWNoRmluYWxpemVyKGhhbmRsZSl9ZnVuY3Rpb24gQ2xhc3NIYW5kbGVfY2xvbmUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aGlzLiQkLmNvdW50LnZhbHVlKz0xO3JldHVybiB0aGlzfWVsc2V7dmFyIGNsb25lPWF0dGFjaEZpbmFsaXplcihPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOnNoYWxsb3dDb3B5SW50ZXJuYWxQb2ludGVyKHRoaXMuJCQpfX0pKTtjbG9uZS4kJC5jb3VudC52YWx1ZSs9MTtjbG9uZS4kJC5kZWxldGVTY2hlZHVsZWQ9ZmFsc2U7cmV0dXJuIGNsb25lfX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9kZWxldGUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3Rocm93QmluZGluZ0Vycm9yKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIil9ZGV0YWNoRmluYWxpemVyKHRoaXMpO3JlbGVhc2VDbGFzc0hhbmRsZSh0aGlzLiQkKTtpZighdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSl7dGhpcy4kJC5zbWFydFB0cj11bmRlZmluZWQ7dGhpcy4kJC5wdHI9dW5kZWZpbmVkfX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9pc0RlbGV0ZWQoKXtyZXR1cm4hdGhpcy4kJC5wdHJ9dmFyIGRlbGF5RnVuY3Rpb249dW5kZWZpbmVkO3ZhciBkZWxldGlvblF1ZXVlPVtdO2Z1bmN0aW9uIGZsdXNoUGVuZGluZ0RlbGV0ZXMoKXt3aGlsZShkZWxldGlvblF1ZXVlLmxlbmd0aCl7dmFyIG9iaj1kZWxldGlvblF1ZXVlLnBvcCgpO29iai4kJC5kZWxldGVTY2hlZHVsZWQ9ZmFsc2U7b2JqWyJkZWxldGUiXSgpfX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9kZWxldGVMYXRlcigpe2lmKCF0aGlzLiQkLnB0cil7dGhyb3dJbnN0YW5jZUFscmVhZHlEZWxldGVkKHRoaXMpfWlmKHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSl7dGhyb3dCaW5kaW5nRXJyb3IoIk9iamVjdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgZGVsZXRpb24iKX1kZWxldGlvblF1ZXVlLnB1c2godGhpcyk7aWYoZGVsZXRpb25RdWV1ZS5sZW5ndGg9PT0xJiZkZWxheUZ1bmN0aW9uKXtkZWxheUZ1bmN0aW9uKGZsdXNoUGVuZGluZ0RlbGV0ZXMpfXRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkPXRydWU7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gaW5pdF9DbGFzc0hhbmRsZSgpe0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNBbGlhc09mIl09Q2xhc3NIYW5kbGVfaXNBbGlhc09mO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiY2xvbmUiXT1DbGFzc0hhbmRsZV9jbG9uZTtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImRlbGV0ZSJdPUNsYXNzSGFuZGxlX2RlbGV0ZTtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImlzRGVsZXRlZCJdPUNsYXNzSGFuZGxlX2lzRGVsZXRlZDtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImRlbGV0ZUxhdGVyIl09Q2xhc3NIYW5kbGVfZGVsZXRlTGF0ZXJ9ZnVuY3Rpb24gQ2xhc3NIYW5kbGUoKXt9dmFyIHJlZ2lzdGVyZWRQb2ludGVycz17fTtmdW5jdGlvbiBlbnN1cmVPdmVybG9hZFRhYmxlKHByb3RvLG1ldGhvZE5hbWUsaHVtYW5OYW1lKXtpZih1bmRlZmluZWQ9PT1wcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlKXt2YXIgcHJldkZ1bmM9cHJvdG9bbWV0aG9kTmFtZV07cHJvdG9bbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtpZighcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZS5oYXNPd25Qcm9wZXJ0eShhcmd1bWVudHMubGVuZ3RoKSl7dGhyb3dCaW5kaW5nRXJyb3IoIkZ1bmN0aW9uICciK2h1bWFuTmFtZSsiJyBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgKCIrYXJndW1lbnRzLmxlbmd0aCsiKSAtIGV4cGVjdHMgb25lIG9mICgiK3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGUrIikhIil9cmV0dXJuIHByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJndW1lbnRzLmxlbmd0aF0uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlPVtdO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbcHJldkZ1bmMuYXJnQ291bnRdPXByZXZGdW5jfX1mdW5jdGlvbiBleHBvc2VQdWJsaWNTeW1ib2wobmFtZSx2YWx1ZSxudW1Bcmd1bWVudHMpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7aWYodW5kZWZpbmVkPT09bnVtQXJndW1lbnRzfHx1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSYmdW5kZWZpbmVkIT09TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBwdWJsaWMgbmFtZSAnIituYW1lKyInIHR3aWNlIil9ZW5zdXJlT3ZlcmxvYWRUYWJsZShNb2R1bGUsbmFtZSxuYW1lKTtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkobnVtQXJndW1lbnRzKSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBvdmVybG9hZHMgb2YgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgKCIrbnVtQXJndW1lbnRzKyIpISIpfU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlW251bUFyZ3VtZW50c109dmFsdWV9ZWxzZXtNb2R1bGVbbmFtZV09dmFsdWU7aWYodW5kZWZpbmVkIT09bnVtQXJndW1lbnRzKXtNb2R1bGVbbmFtZV0ubnVtQXJndW1lbnRzPW51bUFyZ3VtZW50c319fWZ1bmN0aW9uIFJlZ2lzdGVyZWRDbGFzcyhuYW1lLGNvbnN0cnVjdG9yLGluc3RhbmNlUHJvdG90eXBlLHJhd0Rlc3RydWN0b3IsYmFzZUNsYXNzLGdldEFjdHVhbFR5cGUsdXBjYXN0LGRvd25jYXN0KXt0aGlzLm5hbWU9bmFtZTt0aGlzLmNvbnN0cnVjdG9yPWNvbnN0cnVjdG9yO3RoaXMuaW5zdGFuY2VQcm90b3R5cGU9aW5zdGFuY2VQcm90b3R5cGU7dGhpcy5yYXdEZXN0cnVjdG9yPXJhd0Rlc3RydWN0b3I7dGhpcy5iYXNlQ2xhc3M9YmFzZUNsYXNzO3RoaXMuZ2V0QWN0dWFsVHlwZT1nZXRBY3R1YWxUeXBlO3RoaXMudXBjYXN0PXVwY2FzdDt0aGlzLmRvd25jYXN0PWRvd25jYXN0O3RoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119ZnVuY3Rpb24gdXBjYXN0UG9pbnRlcihwdHIscHRyQ2xhc3MsZGVzaXJlZENsYXNzKXt3aGlsZShwdHJDbGFzcyE9PWRlc2lyZWRDbGFzcyl7aWYoIXB0ckNsYXNzLnVwY2FzdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkV4cGVjdGVkIG51bGwgb3IgaW5zdGFuY2Ugb2YgIitkZXNpcmVkQ2xhc3MubmFtZSsiLCBnb3QgYW4gaW5zdGFuY2Ugb2YgIitwdHJDbGFzcy5uYW1lKX1wdHI9cHRyQ2xhc3MudXBjYXN0KHB0cik7cHRyQ2xhc3M9cHRyQ2xhc3MuYmFzZUNsYXNzfXJldHVybiBwdHJ9ZnVuY3Rpb24gY29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGUoZGVzdHJ1Y3RvcnMsaGFuZGxlKXtpZihoYW5kbGU9PT1udWxsKXtpZih0aGlzLmlzUmVmZXJlbmNlKXt0aHJvd0JpbmRpbmdFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSl9cmV0dXJuIDB9aWYoIWhhbmRsZS4kJCl7dGhyb3dCaW5kaW5nRXJyb3IoJ0Nhbm5vdCBwYXNzICInK19lbWJpbmRfcmVwcihoYW5kbGUpKyciIGFzIGEgJyt0aGlzLm5hbWUpfWlmKCFoYW5kbGUuJCQucHRyKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBwdHJ9ZnVuY3Rpb24gZ2VuZXJpY1BvaW50ZXJUb1dpcmVUeXBlKGRlc3RydWN0b3JzLGhhbmRsZSl7dmFyIHB0cjtpZihoYW5kbGU9PT1udWxsKXtpZih0aGlzLmlzUmVmZXJlbmNlKXt0aHJvd0JpbmRpbmdFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cHRyPXRoaXMucmF3Q29uc3RydWN0b3IoKTtpZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHB0cil9cmV0dXJuIHB0cn1lbHNle3JldHVybiAwfX1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9aWYoIXRoaXMuaXNDb25zdCYmaGFuZGxlLiQkLnB0clR5cGUuaXNDb25zdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZT9oYW5kbGUuJCQuc21hcnRQdHJUeXBlLm5hbWU6aGFuZGxlLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9dmFyIGhhbmRsZUNsYXNzPWhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcztwdHI9dXBjYXN0UG9pbnRlcihoYW5kbGUuJCQucHRyLGhhbmRsZUNsYXNzLHRoaXMucmVnaXN0ZXJlZENsYXNzKTtpZih0aGlzLmlzU21hcnRQb2ludGVyKXtpZih1bmRlZmluZWQ9PT1oYW5kbGUuJCQuc21hcnRQdHIpe3Rocm93QmluZGluZ0Vycm9yKCJQYXNzaW5nIHJhdyBwb2ludGVyIHRvIHNtYXJ0IHBvaW50ZXIgaXMgaWxsZWdhbCIpfXN3aXRjaCh0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDppZihoYW5kbGUuJCQuc21hcnRQdHJUeXBlPT09dGhpcyl7cHRyPWhhbmRsZS4kJC5zbWFydFB0cn1lbHNle3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIrKGhhbmRsZS4kJC5zbWFydFB0clR5cGU/aGFuZGxlLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOmhhbmRsZS4kJC5wdHJUeXBlLm5hbWUpKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfWJyZWFrO2Nhc2UgMTpwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihoYW5kbGUuJCQuc21hcnRQdHJUeXBlPT09dGhpcyl7cHRyPWhhbmRsZS4kJC5zbWFydFB0cn1lbHNle3ZhciBjbG9uZWRIYW5kbGU9aGFuZGxlWyJjbG9uZSJdKCk7cHRyPXRoaXMucmF3U2hhcmUocHRyLF9fZW12YWxfcmVnaXN0ZXIoZnVuY3Rpb24oKXtjbG9uZWRIYW5kbGVbImRlbGV0ZSJdKCl9KSk7aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKHRoaXMucmF3RGVzdHJ1Y3RvcixwdHIpfX1icmVhaztkZWZhdWx0OnRocm93QmluZGluZ0Vycm9yKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX19cmV0dXJuIHB0cn1mdW5jdGlvbiBub25Db25zdE5vU21hcnRQdHJSYXdQb2ludGVyVG9XaXJlVHlwZShkZXN0cnVjdG9ycyxoYW5kbGUpe2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1yZXR1cm4gMH1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9aWYoaGFuZGxlLiQkLnB0clR5cGUuaXNDb25zdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIitoYW5kbGUuJCQucHRyVHlwZS5uYW1lKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBwdHJ9ZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXJfZ2V0UG9pbnRlZShwdHIpe2lmKHRoaXMucmF3R2V0UG9pbnRlZSl7cHRyPXRoaXMucmF3R2V0UG9pbnRlZShwdHIpfXJldHVybiBwdHJ9ZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXJfZGVzdHJ1Y3RvcihwdHIpe2lmKHRoaXMucmF3RGVzdHJ1Y3Rvcil7dGhpcy5yYXdEZXN0cnVjdG9yKHB0cil9fWZ1bmN0aW9uIFJlZ2lzdGVyZWRQb2ludGVyX2RlbGV0ZU9iamVjdChoYW5kbGUpe2lmKGhhbmRsZSE9PW51bGwpe2hhbmRsZVsiZGVsZXRlIl0oKX19ZnVuY3Rpb24gZG93bmNhc3RQb2ludGVyKHB0cixwdHJDbGFzcyxkZXNpcmVkQ2xhc3Mpe2lmKHB0ckNsYXNzPT09ZGVzaXJlZENsYXNzKXtyZXR1cm4gcHRyfWlmKHVuZGVmaW5lZD09PWRlc2lyZWRDbGFzcy5iYXNlQ2xhc3Mpe3JldHVybiBudWxsfXZhciBydj1kb3duY2FzdFBvaW50ZXIocHRyLHB0ckNsYXNzLGRlc2lyZWRDbGFzcy5iYXNlQ2xhc3MpO2lmKHJ2PT09bnVsbCl7cmV0dXJuIG51bGx9cmV0dXJuIGRlc2lyZWRDbGFzcy5kb3duY2FzdChydil9ZnVuY3Rpb24gZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudCgpe3JldHVybiBPYmplY3Qua2V5cyhyZWdpc3RlcmVkSW5zdGFuY2VzKS5sZW5ndGh9ZnVuY3Rpb24gZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcygpe3ZhciBydj1bXTtmb3IodmFyIGsgaW4gcmVnaXN0ZXJlZEluc3RhbmNlcyl7aWYocmVnaXN0ZXJlZEluc3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShrKSl7cnYucHVzaChyZWdpc3RlcmVkSW5zdGFuY2VzW2tdKX19cmV0dXJuIHJ2fWZ1bmN0aW9uIHNldERlbGF5RnVuY3Rpb24oZm4pe2RlbGF5RnVuY3Rpb249Zm47aWYoZGVsZXRpb25RdWV1ZS5sZW5ndGgmJmRlbGF5RnVuY3Rpb24pe2RlbGF5RnVuY3Rpb24oZmx1c2hQZW5kaW5nRGVsZXRlcyl9fWZ1bmN0aW9uIGluaXRfZW1iaW5kKCl7TW9kdWxlWyJnZXRJbmhlcml0ZWRJbnN0YW5jZUNvdW50Il09Z2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudDtNb2R1bGVbImdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXMiXT1nZXRMaXZlSW5oZXJpdGVkSW5zdGFuY2VzO01vZHVsZVsiZmx1c2hQZW5kaW5nRGVsZXRlcyJdPWZsdXNoUGVuZGluZ0RlbGV0ZXM7TW9kdWxlWyJzZXREZWxheUZ1bmN0aW9uIl09c2V0RGVsYXlGdW5jdGlvbn12YXIgcmVnaXN0ZXJlZEluc3RhbmNlcz17fTtmdW5jdGlvbiBnZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpe2lmKHB0cj09PXVuZGVmaW5lZCl7dGhyb3dCaW5kaW5nRXJyb3IoInB0ciBzaG91bGQgbm90IGJlIHVuZGVmaW5lZCIpfXdoaWxlKGNsYXNzXy5iYXNlQ2xhc3Mpe3B0cj1jbGFzc18udXBjYXN0KHB0cik7Y2xhc3NfPWNsYXNzXy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiBnZXRJbmhlcml0ZWRJbnN0YW5jZShjbGFzc18scHRyKXtwdHI9Z2V0QmFzZXN0UG9pbnRlcihjbGFzc18scHRyKTtyZXR1cm4gcmVnaXN0ZXJlZEluc3RhbmNlc1twdHJdfWZ1bmN0aW9uIG1ha2VDbGFzc0hhbmRsZShwcm90b3R5cGUscmVjb3JkKXtpZighcmVjb3JkLnB0clR5cGV8fCFyZWNvcmQucHRyKXt0aHJvd0ludGVybmFsRXJyb3IoIm1ha2VDbGFzc0hhbmRsZSByZXF1aXJlcyBwdHIgYW5kIHB0clR5cGUiKX12YXIgaGFzU21hcnRQdHJUeXBlPSEhcmVjb3JkLnNtYXJ0UHRyVHlwZTt2YXIgaGFzU21hcnRQdHI9ISFyZWNvcmQuc21hcnRQdHI7aWYoaGFzU21hcnRQdHJUeXBlIT09aGFzU21hcnRQdHIpe3Rocm93SW50ZXJuYWxFcnJvcigiQm90aCBzbWFydFB0clR5cGUgYW5kIHNtYXJ0UHRyIG11c3QgYmUgc3BlY2lmaWVkIil9cmVjb3JkLmNvdW50PXt2YWx1ZToxfTtyZXR1cm4gYXR0YWNoRmluYWxpemVyKE9iamVjdC5jcmVhdGUocHJvdG90eXBlLHskJDp7dmFsdWU6cmVjb3JkfX0pKX1mdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcl9mcm9tV2lyZVR5cGUocHRyKXt2YXIgcmF3UG9pbnRlcj10aGlzLmdldFBvaW50ZWUocHRyKTtpZighcmF3UG9pbnRlcil7dGhpcy5kZXN0cnVjdG9yKHB0cik7cmV0dXJuIG51bGx9dmFyIHJlZ2lzdGVyZWRJbnN0YW5jZT1nZXRJbmhlcml0ZWRJbnN0YW5jZSh0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyYXdQb2ludGVyKTtpZih1bmRlZmluZWQhPT1yZWdpc3RlcmVkSW5zdGFuY2Upe2lmKDA9PT1yZWdpc3RlcmVkSW5zdGFuY2UuJCQuY291bnQudmFsdWUpe3JlZ2lzdGVyZWRJbnN0YW5jZS4kJC5wdHI9cmF3UG9pbnRlcjtyZWdpc3RlcmVkSW5zdGFuY2UuJCQuc21hcnRQdHI9cHRyO3JldHVybiByZWdpc3RlcmVkSW5zdGFuY2VbImNsb25lIl0oKX1lbHNle3ZhciBydj1yZWdpc3RlcmVkSW5zdGFuY2VbImNsb25lIl0oKTt0aGlzLmRlc3RydWN0b3IocHRyKTtyZXR1cm4gcnZ9fWZ1bmN0aW9uIG1ha2VEZWZhdWx0SGFuZGxlKCl7aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0aGlzLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTp0aGlzLnBvaW50ZWVUeXBlLHB0cjpyYXdQb2ludGVyLHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOnB0cn0pfWVsc2V7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0aGlzLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTp0aGlzLHB0cjpwdHJ9KX19dmFyIGFjdHVhbFR5cGU9dGhpcy5yZWdpc3RlcmVkQ2xhc3MuZ2V0QWN0dWFsVHlwZShyYXdQb2ludGVyKTt2YXIgcmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQ9cmVnaXN0ZXJlZFBvaW50ZXJzW2FjdHVhbFR5cGVdO2lmKCFyZWdpc3RlcmVkUG9pbnRlclJlY29yZCl7cmV0dXJuIG1ha2VEZWZhdWx0SGFuZGxlLmNhbGwodGhpcyl9dmFyIHRvVHlwZTtpZih0aGlzLmlzQ29uc3Qpe3RvVHlwZT1yZWdpc3RlcmVkUG9pbnRlclJlY29yZC5jb25zdFBvaW50ZXJUeXBlfWVsc2V7dG9UeXBlPXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkLnBvaW50ZXJUeXBlfXZhciBkcD1kb3duY2FzdFBvaW50ZXIocmF3UG9pbnRlcix0aGlzLnJlZ2lzdGVyZWRDbGFzcyx0b1R5cGUucmVnaXN0ZXJlZENsYXNzKTtpZihkcD09PW51bGwpe3JldHVybiBtYWtlRGVmYXVsdEhhbmRsZS5jYWxsKHRoaXMpfWlmKHRoaXMuaXNTbWFydFBvaW50ZXIpe3JldHVybiBtYWtlQ2xhc3NIYW5kbGUodG9UeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTp0b1R5cGUscHRyOmRwLHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOnB0cn0pfWVsc2V7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0b1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRvVHlwZSxwdHI6ZHB9KX19ZnVuY3Rpb24gaW5pdF9SZWdpc3RlcmVkUG9pbnRlcigpe1JlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZS5nZXRQb2ludGVlPVJlZ2lzdGVyZWRQb2ludGVyX2dldFBvaW50ZWU7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlLmRlc3RydWN0b3I9UmVnaXN0ZXJlZFBvaW50ZXJfZGVzdHJ1Y3RvcjtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImFyZ1BhY2tBZHZhbmNlIl09ODtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl09c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXI7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJkZWxldGVPYmplY3QiXT1SZWdpc3RlcmVkUG9pbnRlcl9kZWxldGVPYmplY3Q7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJmcm9tV2lyZVR5cGUiXT1SZWdpc3RlcmVkUG9pbnRlcl9mcm9tV2lyZVR5cGV9ZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSxyZWdpc3RlcmVkQ2xhc3MsaXNSZWZlcmVuY2UsaXNDb25zdCxpc1NtYXJ0UG9pbnRlcixwb2ludGVlVHlwZSxzaGFyaW5nUG9saWN5LHJhd0dldFBvaW50ZWUscmF3Q29uc3RydWN0b3IscmF3U2hhcmUscmF3RGVzdHJ1Y3Rvcil7dGhpcy5uYW1lPW5hbWU7dGhpcy5yZWdpc3RlcmVkQ2xhc3M9cmVnaXN0ZXJlZENsYXNzO3RoaXMuaXNSZWZlcmVuY2U9aXNSZWZlcmVuY2U7dGhpcy5pc0NvbnN0PWlzQ29uc3Q7dGhpcy5pc1NtYXJ0UG9pbnRlcj1pc1NtYXJ0UG9pbnRlcjt0aGlzLnBvaW50ZWVUeXBlPXBvaW50ZWVUeXBlO3RoaXMuc2hhcmluZ1BvbGljeT1zaGFyaW5nUG9saWN5O3RoaXMucmF3R2V0UG9pbnRlZT1yYXdHZXRQb2ludGVlO3RoaXMucmF3Q29uc3RydWN0b3I9cmF3Q29uc3RydWN0b3I7dGhpcy5yYXdTaGFyZT1yYXdTaGFyZTt0aGlzLnJhd0Rlc3RydWN0b3I9cmF3RGVzdHJ1Y3RvcjtpZighaXNTbWFydFBvaW50ZXImJnJlZ2lzdGVyZWRDbGFzcy5iYXNlQ2xhc3M9PT11bmRlZmluZWQpe2lmKGlzQ29uc3Qpe3RoaXNbInRvV2lyZVR5cGUiXT1jb25zdE5vU21hcnRQdHJSYXdQb2ludGVyVG9XaXJlVHlwZTt0aGlzLmRlc3RydWN0b3JGdW5jdGlvbj1udWxsfWVsc2V7dGhpc1sidG9XaXJlVHlwZSJdPW5vbkNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlO3RoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGx9fWVsc2V7dGhpc1sidG9XaXJlVHlwZSJdPWdlbmVyaWNQb2ludGVyVG9XaXJlVHlwZX19ZnVuY3Rpb24gcmVwbGFjZVB1YmxpY1N5bWJvbChuYW1lLHZhbHVlLG51bUFyZ3VtZW50cyl7aWYoIU1vZHVsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7dGhyb3dJbnRlcm5hbEVycm9yKCJSZXBsYWNpbmcgbm9uZXhpc3RhbnQgcHVibGljIHN5bWJvbCIpfWlmKHVuZGVmaW5lZCE9PU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlJiZ1bmRlZmluZWQhPT1udW1Bcmd1bWVudHMpe01vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlW251bUFyZ3VtZW50c109dmFsdWV9ZWxzZXtNb2R1bGVbbmFtZV09dmFsdWU7TW9kdWxlW25hbWVdLmFyZ0NvdW50PW51bUFyZ3VtZW50c319ZnVuY3Rpb24gZHluQ2FsbExlZ2FjeShzaWcscHRyLGFyZ3Mpe2lmKGFyZ3MmJmFyZ3MubGVuZ3RoKXtyZXR1cm4gTW9kdWxlWyJkeW5DYWxsXyIrc2lnXS5hcHBseShudWxsLFtwdHJdLmNvbmNhdChhcmdzKSl9cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF8iK3NpZ10uY2FsbChudWxsLHB0cil9ZnVuY3Rpb24gZHluQ2FsbChzaWcscHRyLGFyZ3Mpe2lmKHNpZy5pbmRleE9mKCJqIikhPS0xKXtyZXR1cm4gZHluQ2FsbExlZ2FjeShzaWcscHRyLGFyZ3MpfXJldHVybiB3YXNtVGFibGUuZ2V0KHB0cikuYXBwbHkobnVsbCxhcmdzKX1mdW5jdGlvbiBnZXREeW5DYWxsZXIoc2lnLHB0cil7YXNzZXJ0KHNpZy5pbmRleE9mKCJqIik+PTAsImdldER5bkNhbGxlciBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCBpNjQgc2lncyIpO3ZhciBhcmdDYWNoZT1bXTtyZXR1cm4gZnVuY3Rpb24oKXthcmdDYWNoZS5sZW5ndGg9YXJndW1lbnRzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXthcmdDYWNoZVtpXT1hcmd1bWVudHNbaV19cmV0dXJuIGR5bkNhbGwoc2lnLHB0cixhcmdDYWNoZSl9fWZ1bmN0aW9uIGVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKHNpZ25hdHVyZSxyYXdGdW5jdGlvbil7c2lnbmF0dXJlPXJlYWRMYXRpbjFTdHJpbmcoc2lnbmF0dXJlKTtmdW5jdGlvbiBtYWtlRHluQ2FsbGVyKCl7aWYoc2lnbmF0dXJlLmluZGV4T2YoImoiKSE9LTEpe3JldHVybiBnZXREeW5DYWxsZXIoc2lnbmF0dXJlLHJhd0Z1bmN0aW9uKX1yZXR1cm4gd2FzbVRhYmxlLmdldChyYXdGdW5jdGlvbil9dmFyIGZwPW1ha2VEeW5DYWxsZXIoKTtpZih0eXBlb2YgZnAhPT0iZnVuY3Rpb24iKXt0aHJvd0JpbmRpbmdFcnJvcigidW5rbm93biBmdW5jdGlvbiBwb2ludGVyIHdpdGggc2lnbmF0dXJlICIrc2lnbmF0dXJlKyI6ICIrcmF3RnVuY3Rpb24pfXJldHVybiBmcH12YXIgVW5ib3VuZFR5cGVFcnJvcj11bmRlZmluZWQ7ZnVuY3Rpb24gZ2V0VHlwZU5hbWUodHlwZSl7dmFyIHB0cj1fX19nZXRUeXBlTmFtZSh0eXBlKTt2YXIgcnY9cmVhZExhdGluMVN0cmluZyhwdHIpO19mcmVlKHB0cik7cmV0dXJuIHJ2fWZ1bmN0aW9uIHRocm93VW5ib3VuZFR5cGVFcnJvcihtZXNzYWdlLHR5cGVzKXt2YXIgdW5ib3VuZFR5cGVzPVtdO3ZhciBzZWVuPXt9O2Z1bmN0aW9uIHZpc2l0KHR5cGUpe2lmKHNlZW5bdHlwZV0pe3JldHVybn1pZihyZWdpc3RlcmVkVHlwZXNbdHlwZV0pe3JldHVybn1pZih0eXBlRGVwZW5kZW5jaWVzW3R5cGVdKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdLmZvckVhY2godmlzaXQpO3JldHVybn11bmJvdW5kVHlwZXMucHVzaCh0eXBlKTtzZWVuW3R5cGVdPXRydWV9dHlwZXMuZm9yRWFjaCh2aXNpdCk7dGhyb3cgbmV3IFVuYm91bmRUeXBlRXJyb3IobWVzc2FnZSsiOiAiK3VuYm91bmRUeXBlcy5tYXAoZ2V0VHlwZU5hbWUpLmpvaW4oWyIsICJdKSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3MocmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlLGJhc2VDbGFzc1Jhd1R5cGUsZ2V0QWN0dWFsVHlwZVNpZ25hdHVyZSxnZXRBY3R1YWxUeXBlLHVwY2FzdFNpZ25hdHVyZSx1cGNhc3QsZG93bmNhc3RTaWduYXR1cmUsZG93bmNhc3QsbmFtZSxkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtnZXRBY3R1YWxUeXBlPWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGdldEFjdHVhbFR5cGVTaWduYXR1cmUsZ2V0QWN0dWFsVHlwZSk7aWYodXBjYXN0KXt1cGNhc3Q9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24odXBjYXN0U2lnbmF0dXJlLHVwY2FzdCl9aWYoZG93bmNhc3Qpe2Rvd25jYXN0PWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGRvd25jYXN0U2lnbmF0dXJlLGRvd25jYXN0KX1yYXdEZXN0cnVjdG9yPWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcik7dmFyIGxlZ2FsRnVuY3Rpb25OYW1lPW1ha2VMZWdhbEZ1bmN0aW9uTmFtZShuYW1lKTtleHBvc2VQdWJsaWNTeW1ib2wobGVnYWxGdW5jdGlvbk5hbWUsZnVuY3Rpb24oKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjb25zdHJ1Y3QgIituYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLFtiYXNlQ2xhc3NSYXdUeXBlXSl9KTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbcmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlXSxiYXNlQ2xhc3NSYXdUeXBlP1tiYXNlQ2xhc3NSYXdUeXBlXTpbXSxmdW5jdGlvbihiYXNlKXtiYXNlPWJhc2VbMF07dmFyIGJhc2VDbGFzczt2YXIgYmFzZVByb3RvdHlwZTtpZihiYXNlQ2xhc3NSYXdUeXBlKXtiYXNlQ2xhc3M9YmFzZS5yZWdpc3RlcmVkQ2xhc3M7YmFzZVByb3RvdHlwZT1iYXNlQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGV9ZWxzZXtiYXNlUHJvdG90eXBlPUNsYXNzSGFuZGxlLnByb3RvdHlwZX12YXIgY29uc3RydWN0b3I9Y3JlYXRlTmFtZWRGdW5jdGlvbihsZWdhbEZ1bmN0aW9uTmFtZSxmdW5jdGlvbigpe2lmKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSE9PWluc3RhbmNlUHJvdG90eXBlKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJVc2UgJ25ldycgdG8gY29uc3RydWN0ICIrbmFtZSl9aWYodW5kZWZpbmVkPT09cmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHkpe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IobmFtZSsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIil9dmFyIGJvZHk9cmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbYXJndW1lbnRzLmxlbmd0aF07aWYodW5kZWZpbmVkPT09Ym9keSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcigiVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgIituYW1lKyIgd2l0aCBpbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzICgiK2FyZ3VtZW50cy5sZW5ndGgrIikgLSBleHBlY3RlZCAoIitPYmplY3Qua2V5cyhyZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keSkudG9TdHJpbmcoKSsiKSBwYXJhbWV0ZXJzIGluc3RlYWQhIil9cmV0dXJuIGJvZHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSk7dmFyIGluc3RhbmNlUHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYmFzZVByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmNvbnN0cnVjdG9yfX0pO2NvbnN0cnVjdG9yLnByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt2YXIgcmVnaXN0ZXJlZENsYXNzPW5ldyBSZWdpc3RlcmVkQ2xhc3MobmFtZSxjb25zdHJ1Y3RvcixpbnN0YW5jZVByb3RvdHlwZSxyYXdEZXN0cnVjdG9yLGJhc2VDbGFzcyxnZXRBY3R1YWxUeXBlLHVwY2FzdCxkb3duY2FzdCk7dmFyIHJlZmVyZW5jZUNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSxyZWdpc3RlcmVkQ2xhc3MsdHJ1ZSxmYWxzZSxmYWxzZSk7dmFyIHBvaW50ZXJDb252ZXJ0ZXI9bmV3IFJlZ2lzdGVyZWRQb2ludGVyKG5hbWUrIioiLHJlZ2lzdGVyZWRDbGFzcyxmYWxzZSxmYWxzZSxmYWxzZSk7dmFyIGNvbnN0UG9pbnRlckNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSsiIGNvbnN0KiIscmVnaXN0ZXJlZENsYXNzLGZhbHNlLHRydWUsZmFsc2UpO3JlZ2lzdGVyZWRQb2ludGVyc1tyYXdUeXBlXT17cG9pbnRlclR5cGU6cG9pbnRlckNvbnZlcnRlcixjb25zdFBvaW50ZXJUeXBlOmNvbnN0UG9pbnRlckNvbnZlcnRlcn07cmVwbGFjZVB1YmxpY1N5bWJvbChsZWdhbEZ1bmN0aW9uTmFtZSxjb25zdHJ1Y3Rvcik7cmV0dXJuW3JlZmVyZW5jZUNvbnZlcnRlcixwb2ludGVyQ29udmVydGVyLGNvbnN0UG9pbnRlckNvbnZlcnRlcl19KX1mdW5jdGlvbiBoZWFwMzJWZWN0b3JUb0FycmF5KGNvdW50LGZpcnN0RWxlbWVudCl7dmFyIGFycmF5PVtdO2Zvcih2YXIgaT0wO2k8Y291bnQ7aSsrKXthcnJheS5wdXNoKEhFQVAzMlsoZmlyc3RFbGVtZW50Pj4yKStpXSl9cmV0dXJuIGFycmF5fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yKHJhd0NsYXNzVHlwZSxhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIsaW52b2tlclNpZ25hdHVyZSxpbnZva2VyLHJhd0NvbnN0cnVjdG9yKXthc3NlcnQoYXJnQ291bnQ+MCk7dmFyIHJhd0FyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTtpbnZva2VyPWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGludm9rZXJTaWduYXR1cmUsaW52b2tlcik7dmFyIGFyZ3M9W3Jhd0NvbnN0cnVjdG9yXTt2YXIgZGVzdHJ1Y3RvcnM9W107d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sW3Jhd0NsYXNzVHlwZV0sZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9ImNvbnN0cnVjdG9yICIrY2xhc3NUeXBlLm5hbWU7aWYodW5kZWZpbmVkPT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9W119aWYodW5kZWZpbmVkIT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgiKyhhcmdDb3VudC0xKSsiKSBmb3IgY2xhc3MgJyIrY2xhc3NUeXBlLm5hbWUrIichIE92ZXJsb2FkIHJlc29sdXRpb24gaXMgY3VycmVudGx5IG9ubHkgcGVyZm9ybWVkIHVzaW5nIHRoZSBwYXJhbWV0ZXIgY291bnQsIG5vdCBhY3R1YWwgdHlwZSBpbmZvISIpfWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmdDb3VudC0xXT1mdW5jdGlvbiB1bmJvdW5kVHlwZUhhbmRsZXIoKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjb25zdHJ1Y3QgIitjbGFzc1R5cGUubmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixyYXdBcmdUeXBlcyl9O3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLHJhd0FyZ1R5cGVzLGZ1bmN0aW9uKGFyZ1R5cGVzKXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbYXJnQ291bnQtMV09ZnVuY3Rpb24gY29uc3RydWN0b3JfYm9keSgpe2lmKGFyZ3VtZW50cy5sZW5ndGghPT1hcmdDb3VudC0xKXt0aHJvd0JpbmRpbmdFcnJvcihodW1hbk5hbWUrIiBjYWxsZWQgd2l0aCAiK2FyZ3VtZW50cy5sZW5ndGgrIiBhcmd1bWVudHMsIGV4cGVjdGVkICIrKGFyZ0NvdW50LTEpKX1kZXN0cnVjdG9ycy5sZW5ndGg9MDthcmdzLmxlbmd0aD1hcmdDb3VudDtmb3IodmFyIGk9MTtpPGFyZ0NvdW50OysraSl7YXJnc1tpXT1hcmdUeXBlc1tpXVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLGFyZ3VtZW50c1tpLTFdKX12YXIgcHRyPWludm9rZXIuYXBwbHkobnVsbCxhcmdzKTtydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7cmV0dXJuIGFyZ1R5cGVzWzBdWyJmcm9tV2lyZVR5cGUiXShwdHIpfTtyZXR1cm5bXX0pO3JldHVybltdfSl9ZnVuY3Rpb24gbmV3Xyhjb25zdHJ1Y3Rvcixhcmd1bWVudExpc3Qpe2lmKCEoY29uc3RydWN0b3IgaW5zdGFuY2VvZiBGdW5jdGlvbikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIm5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAiK3R5cGVvZiBjb25zdHJ1Y3RvcisiIHdoaWNoIGlzIG5vdCBhIGZ1bmN0aW9uIil9dmFyIGR1bW15PWNyZWF0ZU5hbWVkRnVuY3Rpb24oY29uc3RydWN0b3IubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7ZHVtbXkucHJvdG90eXBlPWNvbnN0cnVjdG9yLnByb3RvdHlwZTt2YXIgb2JqPW5ldyBkdW1teTt2YXIgcj1jb25zdHJ1Y3Rvci5hcHBseShvYmosYXJndW1lbnRMaXN0KTtyZXR1cm4gciBpbnN0YW5jZW9mIE9iamVjdD9yOm9ian1mdW5jdGlvbiBjcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLGNwcEludm9rZXJGdW5jLGNwcFRhcmdldEZ1bmMpe3ZhciBhcmdDb3VudD1hcmdUeXBlcy5sZW5ndGg7aWYoYXJnQ291bnQ8Mil7dGhyb3dCaW5kaW5nRXJyb3IoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpfXZhciBpc0NsYXNzTWV0aG9kRnVuYz1hcmdUeXBlc1sxXSE9PW51bGwmJmNsYXNzVHlwZSE9PW51bGw7dmFyIG5lZWRzRGVzdHJ1Y3RvclN0YWNrPWZhbHNlO2Zvcih2YXIgaT0xO2k8YXJnVHlwZXMubGVuZ3RoOysraSl7aWYoYXJnVHlwZXNbaV0hPT1udWxsJiZhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb249PT11bmRlZmluZWQpe25lZWRzRGVzdHJ1Y3RvclN0YWNrPXRydWU7YnJlYWt9fXZhciByZXR1cm5zPWFyZ1R5cGVzWzBdLm5hbWUhPT0idm9pZCI7dmFyIGFyZ3NMaXN0PSIiO3ZhciBhcmdzTGlzdFdpcmVkPSIiO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMjsrK2kpe2FyZ3NMaXN0Kz0oaSE9PTA/IiwgIjoiIikrImFyZyIraTthcmdzTGlzdFdpcmVkKz0oaSE9PTA/IiwgIjoiIikrImFyZyIraSsiV2lyZWQifXZhciBpbnZva2VyRm5Cb2R5PSJyZXR1cm4gZnVuY3Rpb24gIittYWtlTGVnYWxGdW5jdGlvbk5hbWUoaHVtYW5OYW1lKSsiKCIrYXJnc0xpc3QrIikge1xuIisiaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09ICIrKGFyZ0NvdW50LTIpKyIpIHtcbiIrInRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAiK2h1bWFuTmFtZSsiIGNhbGxlZCB3aXRoICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMsIGV4cGVjdGVkICIrKGFyZ0NvdW50LTIpKyIgYXJncyEnKTtcbiIrIn1cbiI7aWYobmVlZHNEZXN0cnVjdG9yU3RhY2spe2ludm9rZXJGbkJvZHkrPSJ2YXIgZGVzdHJ1Y3RvcnMgPSBbXTtcbiJ9dmFyIGR0b3JTdGFjaz1uZWVkc0Rlc3RydWN0b3JTdGFjaz8iZGVzdHJ1Y3RvcnMiOiJudWxsIjt2YXIgYXJnczE9WyJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTt2YXIgYXJnczI9W3Rocm93QmluZGluZ0Vycm9yLGNwcEludm9rZXJGdW5jLGNwcFRhcmdldEZ1bmMscnVuRGVzdHJ1Y3RvcnMsYXJnVHlwZXNbMF0sYXJnVHlwZXNbMV1dO2lmKGlzQ2xhc3NNZXRob2RGdW5jKXtpbnZva2VyRm5Cb2R5Kz0idmFyIHRoaXNXaXJlZCA9IGNsYXNzUGFyYW0udG9XaXJlVHlwZSgiK2R0b3JTdGFjaysiLCB0aGlzKTtcbiJ9Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0yOysraSl7aW52b2tlckZuQm9keSs9InZhciBhcmciK2krIldpcmVkID0gYXJnVHlwZSIraSsiLnRvV2lyZVR5cGUoIitkdG9yU3RhY2srIiwgYXJnIitpKyIpOyAvLyAiK2FyZ1R5cGVzW2krMl0ubmFtZSsiXG4iO2FyZ3MxLnB1c2goImFyZ1R5cGUiK2kpO2FyZ3MyLnB1c2goYXJnVHlwZXNbaSsyXSl9aWYoaXNDbGFzc01ldGhvZEZ1bmMpe2FyZ3NMaXN0V2lyZWQ9InRoaXNXaXJlZCIrKGFyZ3NMaXN0V2lyZWQubGVuZ3RoPjA/IiwgIjoiIikrYXJnc0xpc3RXaXJlZH1pbnZva2VyRm5Cb2R5Kz0ocmV0dXJucz8idmFyIHJ2ID0gIjoiIikrImludm9rZXIoZm4iKyhhcmdzTGlzdFdpcmVkLmxlbmd0aD4wPyIsICI6IiIpK2FyZ3NMaXN0V2lyZWQrIik7XG4iO2lmKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKXtpbnZva2VyRm5Cb2R5Kz0icnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO1xuIn1lbHNle2Zvcih2YXIgaT1pc0NsYXNzTWV0aG9kRnVuYz8xOjI7aTxhcmdUeXBlcy5sZW5ndGg7KytpKXt2YXIgcGFyYW1OYW1lPWk9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyhpLTIpKyJXaXJlZCI7aWYoYXJnVHlwZXNbaV0uZGVzdHJ1Y3RvckZ1bmN0aW9uIT09bnVsbCl7aW52b2tlckZuQm9keSs9cGFyYW1OYW1lKyJfZHRvcigiK3BhcmFtTmFtZSsiKTsgLy8gIithcmdUeXBlc1tpXS5uYW1lKyJcbiI7YXJnczEucHVzaChwYXJhbU5hbWUrIl9kdG9yIik7YXJnczIucHVzaChhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24pfX19aWYocmV0dXJucyl7aW52b2tlckZuQm9keSs9InZhciByZXQgPSByZXRUeXBlLmZyb21XaXJlVHlwZShydik7XG4iKyJyZXR1cm4gcmV0O1xuIn1lbHNle31pbnZva2VyRm5Cb2R5Kz0ifVxuIjthcmdzMS5wdXNoKGludm9rZXJGbkJvZHkpO3ZhciBpbnZva2VyRnVuY3Rpb249bmV3XyhGdW5jdGlvbixhcmdzMSkuYXBwbHkobnVsbCxhcmdzMik7cmV0dXJuIGludm9rZXJGdW5jdGlvbn1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbihyYXdDbGFzc1R5cGUsbWV0aG9kTmFtZSxhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIsaW52b2tlclNpZ25hdHVyZSxyYXdJbnZva2VyLGNvbnRleHQsaXNQdXJlVmlydHVhbCl7dmFyIHJhd0FyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTttZXRob2ROYW1lPXJlYWRMYXRpbjFTdHJpbmcobWV0aG9kTmFtZSk7cmF3SW52b2tlcj1lbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFtyYXdDbGFzc1R5cGVdLGZ1bmN0aW9uKGNsYXNzVHlwZSl7Y2xhc3NUeXBlPWNsYXNzVHlwZVswXTt2YXIgaHVtYW5OYW1lPWNsYXNzVHlwZS5uYW1lKyIuIittZXRob2ROYW1lO2lmKGlzUHVyZVZpcnR1YWwpe2NsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChtZXRob2ROYW1lKX1mdW5jdGlvbiB1bmJvdW5kVHlwZXNIYW5kbGVyKCl7dGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgY2FsbCAiK2h1bWFuTmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixyYXdBcmdUeXBlcyl9dmFyIHByb3RvPWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGU7dmFyIG1ldGhvZD1wcm90b1ttZXRob2ROYW1lXTtpZih1bmRlZmluZWQ9PT1tZXRob2R8fHVuZGVmaW5lZD09PW1ldGhvZC5vdmVybG9hZFRhYmxlJiZtZXRob2QuY2xhc3NOYW1lIT09Y2xhc3NUeXBlLm5hbWUmJm1ldGhvZC5hcmdDb3VudD09PWFyZ0NvdW50LTIpe3VuYm91bmRUeXBlc0hhbmRsZXIuYXJnQ291bnQ9YXJnQ291bnQtMjt1bmJvdW5kVHlwZXNIYW5kbGVyLmNsYXNzTmFtZT1jbGFzc1R5cGUubmFtZTtwcm90b1ttZXRob2ROYW1lXT11bmJvdW5kVHlwZXNIYW5kbGVyfWVsc2V7ZW5zdXJlT3ZlcmxvYWRUYWJsZShwcm90byxtZXRob2ROYW1lLGh1bWFuTmFtZSk7cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmdDb3VudC0yXT11bmJvdW5kVHlwZXNIYW5kbGVyfXdoZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLHJhd0FyZ1R5cGVzLGZ1bmN0aW9uKGFyZ1R5cGVzKXt2YXIgbWVtYmVyRnVuY3Rpb249Y3JhZnRJbnZva2VyRnVuY3Rpb24oaHVtYW5OYW1lLGFyZ1R5cGVzLGNsYXNzVHlwZSxyYXdJbnZva2VyLGNvbnRleHQpO2lmKHVuZGVmaW5lZD09PXByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGUpe21lbWJlckZ1bmN0aW9uLmFyZ0NvdW50PWFyZ0NvdW50LTI7cHJvdG9bbWV0aG9kTmFtZV09bWVtYmVyRnVuY3Rpb259ZWxzZXtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlW2FyZ0NvdW50LTJdPW1lbWJlckZ1bmN0aW9ufXJldHVybltdfSk7cmV0dXJuW119KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jb25zdGFudChuYW1lLHR5cGUsdmFsdWUpe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbdHlwZV0sZnVuY3Rpb24odHlwZSl7dHlwZT10eXBlWzBdO01vZHVsZVtuYW1lXT10eXBlWyJmcm9tV2lyZVR5cGUiXSh2YWx1ZSk7cmV0dXJuW119KX12YXIgZW12YWxfZnJlZV9saXN0PVtdO3ZhciBlbXZhbF9oYW5kbGVfYXJyYXk9W3t9LHt2YWx1ZTp1bmRlZmluZWR9LHt2YWx1ZTpudWxsfSx7dmFsdWU6dHJ1ZX0se3ZhbHVlOmZhbHNlfV07ZnVuY3Rpb24gX19lbXZhbF9kZWNyZWYoaGFuZGxlKXtpZihoYW5kbGU+NCYmMD09PS0tZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0ucmVmY291bnQpe2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdPXVuZGVmaW5lZDtlbXZhbF9mcmVlX2xpc3QucHVzaChoYW5kbGUpfX1mdW5jdGlvbiBjb3VudF9lbXZhbF9oYW5kbGVzKCl7dmFyIGNvdW50PTA7Zm9yKHZhciBpPTU7aTxlbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoOysraSl7aWYoZW12YWxfaGFuZGxlX2FycmF5W2ldIT09dW5kZWZpbmVkKXsrK2NvdW50fX1yZXR1cm4gY291bnR9ZnVuY3Rpb24gZ2V0X2ZpcnN0X2VtdmFsKCl7Zm9yKHZhciBpPTU7aTxlbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoOysraSl7aWYoZW12YWxfaGFuZGxlX2FycmF5W2ldIT09dW5kZWZpbmVkKXtyZXR1cm4gZW12YWxfaGFuZGxlX2FycmF5W2ldfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBpbml0X2VtdmFsKCl7TW9kdWxlWyJjb3VudF9lbXZhbF9oYW5kbGVzIl09Y291bnRfZW12YWxfaGFuZGxlcztNb2R1bGVbImdldF9maXJzdF9lbXZhbCJdPWdldF9maXJzdF9lbXZhbH1mdW5jdGlvbiBfX2VtdmFsX3JlZ2lzdGVyKHZhbHVlKXtzd2l0Y2godmFsdWUpe2Nhc2UgdW5kZWZpbmVkOntyZXR1cm4gMX1jYXNlIG51bGw6e3JldHVybiAyfWNhc2UgdHJ1ZTp7cmV0dXJuIDN9Y2FzZSBmYWxzZTp7cmV0dXJuIDR9ZGVmYXVsdDp7dmFyIGhhbmRsZT1lbXZhbF9mcmVlX2xpc3QubGVuZ3RoP2VtdmFsX2ZyZWVfbGlzdC5wb3AoKTplbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoO2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdPXtyZWZjb3VudDoxLHZhbHVlOnZhbHVlfTtyZXR1cm4gaGFuZGxlfX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbihoYW5kbGUpe3ZhciBydj1lbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS52YWx1ZTtfX2VtdmFsX2RlY3JlZihoYW5kbGUpO3JldHVybiBydn0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtyZXR1cm4gX19lbXZhbF9yZWdpc3Rlcih2YWx1ZSl9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gZW51bVJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQsc2lnbmVkKXtzd2l0Y2goc2hpZnQpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24ocG9pbnRlcil7dmFyIGhlYXA9c2lnbmVkP0hFQVA4OkhFQVBVODtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oaGVhcFtwb2ludGVyXSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24ocG9pbnRlcil7dmFyIGhlYXA9c2lnbmVkP0hFQVAxNjpIRUFQVTE2O3JldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShoZWFwW3BvaW50ZXI+PjFdKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDMyOkhFQVBVMzI7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+Ml0pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gaW50ZWdlciB0eXBlOiAiK25hbWUpfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtKHJhd1R5cGUsbmFtZSxzaXplLGlzU2lnbmVkKXt2YXIgc2hpZnQ9Z2V0U2hpZnRGcm9tU2l6ZShzaXplKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7ZnVuY3Rpb24gY3Rvcigpe31jdG9yLnZhbHVlcz17fTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLGNvbnN0cnVjdG9yOmN0b3IsImZyb21XaXJlVHlwZSI6ZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudmFsdWVzW2NdfSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsYyl7cmV0dXJuIGMudmFsdWV9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmVudW1SZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LGlzU2lnbmVkKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLGN0b3IpfWZ1bmN0aW9uIHJlcXVpcmVSZWdpc3RlcmVkVHlwZShyYXdUeXBlLGh1bWFuTmFtZSl7dmFyIGltcGw9cmVnaXN0ZXJlZFR5cGVzW3Jhd1R5cGVdO2lmKHVuZGVmaW5lZD09PWltcGwpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsiIGhhcyB1bmtub3duIHR5cGUgIitnZXRUeXBlTmFtZShyYXdUeXBlKSl9cmV0dXJuIGltcGx9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW51bV92YWx1ZShyYXdFbnVtVHlwZSxuYW1lLGVudW1WYWx1ZSl7dmFyIGVudW1UeXBlPXJlcXVpcmVSZWdpc3RlcmVkVHlwZShyYXdFbnVtVHlwZSwiZW51bSIpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTt2YXIgRW51bT1lbnVtVHlwZS5jb25zdHJ1Y3Rvcjt2YXIgVmFsdWU9T2JqZWN0LmNyZWF0ZShlbnVtVHlwZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUse3ZhbHVlOnt2YWx1ZTplbnVtVmFsdWV9LGNvbnN0cnVjdG9yOnt2YWx1ZTpjcmVhdGVOYW1lZEZ1bmN0aW9uKGVudW1UeXBlLm5hbWUrIl8iK25hbWUsZnVuY3Rpb24oKXt9KX19KTtFbnVtLnZhbHVlc1tlbnVtVmFsdWVdPVZhbHVlO0VudW1bbmFtZV09VmFsdWV9ZnVuY3Rpb24gX2VtYmluZF9yZXByKHYpe2lmKHY9PT1udWxsKXtyZXR1cm4ibnVsbCJ9dmFyIHQ9dHlwZW9mIHY7aWYodD09PSJvYmplY3QifHx0PT09ImFycmF5Inx8dD09PSJmdW5jdGlvbiIpe3JldHVybiB2LnRvU3RyaW5nKCl9ZWxzZXtyZXR1cm4iIit2fX1mdW5jdGlvbiBmbG9hdFJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQpe3N3aXRjaChzaGlmdCl7Y2FzZSAyOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oSEVBUEYzMltwb2ludGVyPj4yXSl9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24ocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBGNjRbcG9pbnRlcj4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZmxvYXQgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZmxvYXQocmF3VHlwZSxuYW1lLHNpemUpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWV9LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7aWYodHlwZW9mIHZhbHVlIT09Im51bWJlciImJnR5cGVvZiB2YWx1ZSE9PSJib29sZWFuIil7dGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrX2VtYmluZF9yZXByKHZhbHVlKSsnIiB0byAnK3RoaXMubmFtZSl9cmV0dXJuIHZhbHVlfSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpmbG9hdFJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZnVuY3Rpb24obmFtZSxhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIsc2lnbmF0dXJlLHJhd0ludm9rZXIsZm4pe3ZhciBhcmdUeXBlcz1oZWFwMzJWZWN0b3JUb0FycmF5KGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcik7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3Jhd0ludm9rZXI9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oc2lnbmF0dXJlLHJhd0ludm9rZXIpO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLGZ1bmN0aW9uKCl7dGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgY2FsbCAiK25hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsYXJnVHlwZXMpfSxhcmdDb3VudC0xKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxhcmdUeXBlcyxmdW5jdGlvbihhcmdUeXBlcyl7dmFyIGludm9rZXJBcmdzQXJyYXk9W2FyZ1R5cGVzWzBdLG51bGxdLmNvbmNhdChhcmdUeXBlcy5zbGljZSgxKSk7cmVwbGFjZVB1YmxpY1N5bWJvbChuYW1lLGNyYWZ0SW52b2tlckZ1bmN0aW9uKG5hbWUsaW52b2tlckFyZ3NBcnJheSxudWxsLHJhd0ludm9rZXIsZm4pLGFyZ0NvdW50LTEpO3JldHVybltdfSl9ZnVuY3Rpb24gaW50ZWdlclJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQsc2lnbmVkKXtzd2l0Y2goc2hpZnQpe2Nhc2UgMDpyZXR1cm4gc2lnbmVkP2Z1bmN0aW9uIHJlYWRTOEZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQOFtwb2ludGVyXX06ZnVuY3Rpb24gcmVhZFU4RnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIEhFQVBVOFtwb2ludGVyXX07Y2FzZSAxOnJldHVybiBzaWduZWQ/ZnVuY3Rpb24gcmVhZFMxNkZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQMTZbcG9pbnRlcj4+MV19OmZ1bmN0aW9uIHJlYWRVMTZGcm9tUG9pbnRlcihwb2ludGVyKXtyZXR1cm4gSEVBUFUxNltwb2ludGVyPj4xXX07Y2FzZSAyOnJldHVybiBzaWduZWQ/ZnVuY3Rpb24gcmVhZFMzMkZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQMzJbcG9pbnRlcj4+Ml19OmZ1bmN0aW9uIHJlYWRVMzJGcm9tUG9pbnRlcihwb2ludGVyKXtyZXR1cm4gSEVBUFUzMltwb2ludGVyPj4yXX07ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGludGVnZXIgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcihwcmltaXRpdmVUeXBlLG5hbWUsc2l6ZSxtaW5SYW5nZSxtYXhSYW5nZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO2lmKG1heFJhbmdlPT09LTEpe21heFJhbmdlPTQyOTQ5NjcyOTV9dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7dmFyIGZyb21XaXJlVHlwZT1mdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHZhbHVlfTtpZihtaW5SYW5nZT09PTApe3ZhciBiaXRzaGlmdD0zMi04KnNpemU7ZnJvbVdpcmVUeXBlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWU8PGJpdHNoaWZ0Pj4+Yml0c2hpZnR9fXZhciBpc1Vuc2lnbmVkVHlwZT1uYW1lLmluZGV4T2YoInVuc2lnbmVkIikhPS0xO3JlZ2lzdGVyVHlwZShwcmltaXRpdmVUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6ZnJvbVdpcmVUeXBlLCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7aWYodHlwZW9mIHZhbHVlIT09Im51bWJlciImJnR5cGVvZiB2YWx1ZSE9PSJib29sZWFuIil7dGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrX2VtYmluZF9yZXByKHZhbHVlKSsnIiB0byAnK3RoaXMubmFtZSl9aWYodmFsdWU8bWluUmFuZ2V8fHZhbHVlPm1heFJhbmdlKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXNzaW5nIGEgbnVtYmVyICInK19lbWJpbmRfcmVwcih2YWx1ZSkrJyIgZnJvbSBKUyBzaWRlIHRvIEMvQysrIHNpZGUgdG8gYW4gYXJndW1lbnQgb2YgdHlwZSAiJytuYW1lKyciLCB3aGljaCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBbJyttaW5SYW5nZSsiLCAiK21heFJhbmdlKyJdISIpfXJldHVybiBpc1Vuc2lnbmVkVHlwZT92YWx1ZT4+PjA6dmFsdWV8MH0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6aW50ZWdlclJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQsbWluUmFuZ2UhPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX21lbW9yeV92aWV3KHJhd1R5cGUsZGF0YVR5cGVJbmRleCxuYW1lKXt2YXIgdHlwZU1hcHBpbmc9W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XTt2YXIgVEE9dHlwZU1hcHBpbmdbZGF0YVR5cGVJbmRleF07ZnVuY3Rpb24gZGVjb2RlTWVtb3J5VmlldyhoYW5kbGUpe2hhbmRsZT1oYW5kbGU+PjI7dmFyIGhlYXA9SEVBUFUzMjt2YXIgc2l6ZT1oZWFwW2hhbmRsZV07dmFyIGRhdGE9aGVhcFtoYW5kbGUrMV07cmV0dXJuIG5ldyBUQShidWZmZXIsZGF0YSxzaXplKX1uYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpkZWNvZGVNZW1vcnlWaWV3LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmRlY29kZU1lbW9yeVZpZXd9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOnRydWV9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nKHJhd1R5cGUsbmFtZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3ZhciBzdGRTdHJpbmdJc1VURjg9bmFtZT09PSJzdGQ6OnN0cmluZyI7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbih2YWx1ZSl7dmFyIGxlbmd0aD1IRUFQVTMyW3ZhbHVlPj4yXTt2YXIgc3RyO2lmKHN0ZFN0cmluZ0lzVVRGOCl7dmFyIGRlY29kZVN0YXJ0UHRyPXZhbHVlKzQ7Zm9yKHZhciBpPTA7aTw9bGVuZ3RoOysraSl7dmFyIGN1cnJlbnRCeXRlUHRyPXZhbHVlKzQraTtpZihpPT1sZW5ndGh8fEhFQVBVOFtjdXJyZW50Qnl0ZVB0cl09PTApe3ZhciBtYXhSZWFkPWN1cnJlbnRCeXRlUHRyLWRlY29kZVN0YXJ0UHRyO3ZhciBzdHJpbmdTZWdtZW50PVVURjhUb1N0cmluZyhkZWNvZGVTdGFydFB0cixtYXhSZWFkKTtpZihzdHI9PT11bmRlZmluZWQpe3N0cj1zdHJpbmdTZWdtZW50fWVsc2V7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDApO3N0cis9c3RyaW5nU2VnbWVudH1kZWNvZGVTdGFydFB0cj1jdXJyZW50Qnl0ZVB0cisxfX19ZWxzZXt2YXIgYT1uZXcgQXJyYXkobGVuZ3RoKTtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe2FbaV09U3RyaW5nLmZyb21DaGFyQ29kZShIRUFQVThbdmFsdWUrNCtpXSl9c3RyPWEuam9pbigiIil9X2ZyZWUodmFsdWUpO3JldHVybiBzdHJ9LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7aWYodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7dmFsdWU9bmV3IFVpbnQ4QXJyYXkodmFsdWUpfXZhciBnZXRMZW5ndGg7dmFyIHZhbHVlSXNPZlR5cGVTdHJpbmc9dHlwZW9mIHZhbHVlPT09InN0cmluZyI7aWYoISh2YWx1ZUlzT2ZUeXBlU3RyaW5nfHx2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHZhbHVlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXl8fHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5KSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIG5vbi1zdHJpbmcgdG8gc3RkOjpzdHJpbmciKX1pZihzdGRTdHJpbmdJc1VURjgmJnZhbHVlSXNPZlR5cGVTdHJpbmcpe2dldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiBsZW5ndGhCeXRlc1VURjgodmFsdWUpfX1lbHNle2dldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB2YWx1ZS5sZW5ndGh9fXZhciBsZW5ndGg9Z2V0TGVuZ3RoKCk7dmFyIHB0cj1fbWFsbG9jKDQrbGVuZ3RoKzEpO0hFQVBVMzJbcHRyPj4yXT1sZW5ndGg7aWYoc3RkU3RyaW5nSXNVVEY4JiZ2YWx1ZUlzT2ZUeXBlU3RyaW5nKXtzdHJpbmdUb1VURjgodmFsdWUscHRyKzQsbGVuZ3RoKzEpfWVsc2V7aWYodmFsdWVJc09mVHlwZVN0cmluZyl7Zm9yKHZhciBpPTA7aTxsZW5ndGg7KytpKXt2YXIgY2hhckNvZGU9dmFsdWUuY2hhckNvZGVBdChpKTtpZihjaGFyQ29kZT4yNTUpe19mcmVlKHB0cik7dGhyb3dCaW5kaW5nRXJyb3IoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpfUhFQVBVOFtwdHIrNCtpXT1jaGFyQ29kZX19ZWxzZXtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe0hFQVBVOFtwdHIrNCtpXT12YWx1ZVtpXX19fWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpmdW5jdGlvbihwdHIpe19mcmVlKHB0cil9fSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcocmF3VHlwZSxjaGFyU2l6ZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7dmFyIGRlY29kZVN0cmluZyxlbmNvZGVTdHJpbmcsZ2V0SGVhcCxsZW5ndGhCeXRlc1VURixzaGlmdDtpZihjaGFyU2l6ZT09PTIpe2RlY29kZVN0cmluZz1VVEYxNlRvU3RyaW5nO2VuY29kZVN0cmluZz1zdHJpbmdUb1VURjE2O2xlbmd0aEJ5dGVzVVRGPWxlbmd0aEJ5dGVzVVRGMTY7Z2V0SGVhcD1mdW5jdGlvbigpe3JldHVybiBIRUFQVTE2fTtzaGlmdD0xfWVsc2UgaWYoY2hhclNpemU9PT00KXtkZWNvZGVTdHJpbmc9VVRGMzJUb1N0cmluZztlbmNvZGVTdHJpbmc9c3RyaW5nVG9VVEYzMjtsZW5ndGhCeXRlc1VURj1sZW5ndGhCeXRlc1VURjMyO2dldEhlYXA9ZnVuY3Rpb24oKXtyZXR1cm4gSEVBUFUzMn07c2hpZnQ9Mn1yZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHZhbHVlKXt2YXIgbGVuZ3RoPUhFQVBVMzJbdmFsdWU+PjJdO3ZhciBIRUFQPWdldEhlYXAoKTt2YXIgc3RyO3ZhciBkZWNvZGVTdGFydFB0cj12YWx1ZSs0O2Zvcih2YXIgaT0wO2k8PWxlbmd0aDsrK2kpe3ZhciBjdXJyZW50Qnl0ZVB0cj12YWx1ZSs0K2kqY2hhclNpemU7aWYoaT09bGVuZ3RofHxIRUFQW2N1cnJlbnRCeXRlUHRyPj5zaGlmdF09PTApe3ZhciBtYXhSZWFkQnl0ZXM9Y3VycmVudEJ5dGVQdHItZGVjb2RlU3RhcnRQdHI7dmFyIHN0cmluZ1NlZ21lbnQ9ZGVjb2RlU3RyaW5nKGRlY29kZVN0YXJ0UHRyLG1heFJlYWRCeXRlcyk7aWYoc3RyPT09dW5kZWZpbmVkKXtzdHI9c3RyaW5nU2VnbWVudH1lbHNle3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgwKTtzdHIrPXN0cmluZ1NlZ21lbnR9ZGVjb2RlU3RhcnRQdHI9Y3VycmVudEJ5dGVQdHIrY2hhclNpemV9fV9mcmVlKHZhbHVlKTtyZXR1cm4gc3RyfSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe2lmKCEodHlwZW9mIHZhbHVlPT09InN0cmluZyIpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgIituYW1lKX12YXIgbGVuZ3RoPWxlbmd0aEJ5dGVzVVRGKHZhbHVlKTt2YXIgcHRyPV9tYWxsb2MoNCtsZW5ndGgrY2hhclNpemUpO0hFQVBVMzJbcHRyPj4yXT1sZW5ndGg+PnNoaWZ0O2VuY29kZVN0cmluZyh2YWx1ZSxwdHIrNCxsZW5ndGgrY2hhclNpemUpO2lmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpmdW5jdGlvbihwdHIpe19mcmVlKHB0cil9fSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0KHJhd1R5cGUsbmFtZSxjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3RvcixkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe3N0cnVjdFJlZ2lzdHJhdGlvbnNbcmF3VHlwZV09e25hbWU6cmVhZExhdGluMVN0cmluZyhuYW1lKSxyYXdDb25zdHJ1Y3RvcjplbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3RvcikscmF3RGVzdHJ1Y3RvcjplbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpLGZpZWxkczpbXX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0X2ZpZWxkKHN0cnVjdFR5cGUsZmllbGROYW1lLGdldHRlclJldHVyblR5cGUsZ2V0dGVyU2lnbmF0dXJlLGdldHRlcixnZXR0ZXJDb250ZXh0LHNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXJTaWduYXR1cmUsc2V0dGVyLHNldHRlckNvbnRleHQpe3N0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV0uZmllbGRzLnB1c2goe2ZpZWxkTmFtZTpyZWFkTGF0aW4xU3RyaW5nKGZpZWxkTmFtZSksZ2V0dGVyUmV0dXJuVHlwZTpnZXR0ZXJSZXR1cm5UeXBlLGdldHRlcjplbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyKSxnZXR0ZXJDb250ZXh0OmdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlOnNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXI6ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oc2V0dGVyU2lnbmF0dXJlLHNldHRlciksc2V0dGVyQ29udGV4dDpzZXR0ZXJDb250ZXh0fSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdm9pZChyYXdUeXBlLG5hbWUpe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7aXNWb2lkOnRydWUsbmFtZTpuYW1lLCJhcmdQYWNrQWR2YW5jZSI6MCwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbigpe3JldHVybiB1bmRlZmluZWR9LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyxvKXtyZXR1cm4gdW5kZWZpbmVkfX0pfWZ1bmN0aW9uIHJlcXVpcmVIYW5kbGUoaGFuZGxlKXtpZighaGFuZGxlKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHVzZSBkZWxldGVkIHZhbC4gaGFuZGxlID0gIitoYW5kbGUpfXJldHVybiBlbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS52YWx1ZX1mdW5jdGlvbiBfX2VtdmFsX2FzKGhhbmRsZSxyZXR1cm5UeXBlLGRlc3RydWN0b3JzUmVmKXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO3JldHVyblR5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJldHVyblR5cGUsImVtdmFsOjphcyIpO3ZhciBkZXN0cnVjdG9ycz1bXTt2YXIgcmQ9X19lbXZhbF9yZWdpc3RlcihkZXN0cnVjdG9ycyk7SEVBUDMyW2Rlc3RydWN0b3JzUmVmPj4yXT1yZDtyZXR1cm4gcmV0dXJuVHlwZVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLGhhbmRsZSl9dmFyIGVtdmFsX3N5bWJvbHM9e307ZnVuY3Rpb24gZ2V0U3RyaW5nT3JTeW1ib2woYWRkcmVzcyl7dmFyIHN5bWJvbD1lbXZhbF9zeW1ib2xzW2FkZHJlc3NdO2lmKHN5bWJvbD09PXVuZGVmaW5lZCl7cmV0dXJuIHJlYWRMYXRpbjFTdHJpbmcoYWRkcmVzcyl9ZWxzZXtyZXR1cm4gc3ltYm9sfX12YXIgZW12YWxfbWV0aG9kQ2FsbGVycz1bXTtmdW5jdGlvbiBfX2VtdmFsX2NhbGxfdm9pZF9tZXRob2QoY2FsbGVyLGhhbmRsZSxtZXRob2ROYW1lLGFyZ3Mpe2NhbGxlcj1lbXZhbF9tZXRob2RDYWxsZXJzW2NhbGxlcl07aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTttZXRob2ROYW1lPWdldFN0cmluZ09yU3ltYm9sKG1ldGhvZE5hbWUpO2NhbGxlcihoYW5kbGUsbWV0aG9kTmFtZSxudWxsLGFyZ3MpfWZ1bmN0aW9uIGVtdmFsX2dldF9nbG9iYWwoKXtpZih0eXBlb2YgZ2xvYmFsVGhpcz09PSJvYmplY3QiKXtyZXR1cm4gZ2xvYmFsVGhpc31yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRnVuY3Rpb259KCkoInJldHVybiB0aGlzIikoKX1mdW5jdGlvbiBfX2VtdmFsX2dldF9nbG9iYWwobmFtZSl7aWYobmFtZT09PTApe3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGVtdmFsX2dldF9nbG9iYWwoKSl9ZWxzZXtuYW1lPWdldFN0cmluZ09yU3ltYm9sKG5hbWUpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGVtdmFsX2dldF9nbG9iYWwoKVtuYW1lXSl9fWZ1bmN0aW9uIF9fZW12YWxfYWRkTWV0aG9kQ2FsbGVyKGNhbGxlcil7dmFyIGlkPWVtdmFsX21ldGhvZENhbGxlcnMubGVuZ3RoO2VtdmFsX21ldGhvZENhbGxlcnMucHVzaChjYWxsZXIpO3JldHVybiBpZH1mdW5jdGlvbiBfX2VtdmFsX2xvb2t1cFR5cGVzKGFyZ0NvdW50LGFyZ1R5cGVzKXt2YXIgYT1uZXcgQXJyYXkoYXJnQ291bnQpO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXthW2ldPXJlcXVpcmVSZWdpc3RlcmVkVHlwZShIRUFQMzJbKGFyZ1R5cGVzPj4yKStpXSwicGFyYW1ldGVyICIraSl9cmV0dXJuIGF9ZnVuY3Rpb24gX19lbXZhbF9nZXRfbWV0aG9kX2NhbGxlcihhcmdDb3VudCxhcmdUeXBlcyl7dmFyIHR5cGVzPV9fZW12YWxfbG9va3VwVHlwZXMoYXJnQ291bnQsYXJnVHlwZXMpO3ZhciByZXRUeXBlPXR5cGVzWzBdO3ZhciBzaWduYXR1cmVOYW1lPXJldFR5cGUubmFtZSsiXyQiK3R5cGVzLnNsaWNlKDEpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5uYW1lfSkuam9pbigiXyIpKyIkIjt2YXIgcGFyYW1zPVsicmV0VHlwZSJdO3ZhciBhcmdzPVtyZXRUeXBlXTt2YXIgYXJnc0xpc3Q9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpO3BhcmFtcy5wdXNoKCJhcmdUeXBlIitpKTthcmdzLnB1c2godHlwZXNbMStpXSl9dmFyIGZ1bmN0aW9uTmFtZT1tYWtlTGVnYWxGdW5jdGlvbk5hbWUoIm1ldGhvZENhbGxlcl8iK3NpZ25hdHVyZU5hbWUpO3ZhciBmdW5jdGlvbkJvZHk9InJldHVybiBmdW5jdGlvbiAiK2Z1bmN0aW9uTmFtZSsiKGhhbmRsZSwgbmFtZSwgZGVzdHJ1Y3RvcnMsIGFyZ3MpIHtcbiI7dmFyIG9mZnNldD0wO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMTsrK2kpe2Z1bmN0aW9uQm9keSs9IiAgICB2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyIrKG9mZnNldD8iKyIrb2Zmc2V0OiIiKSsiKTtcbiI7b2Zmc2V0Kz10eXBlc1tpKzFdWyJhcmdQYWNrQWR2YW5jZSJdfWZ1bmN0aW9uQm9keSs9IiAgICB2YXIgcnYgPSBoYW5kbGVbbmFtZV0oIithcmdzTGlzdCsiKTtcbiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7aWYodHlwZXNbaSsxXVsiZGVsZXRlT2JqZWN0Il0pe2Z1bmN0aW9uQm9keSs9IiAgICBhcmdUeXBlIitpKyIuZGVsZXRlT2JqZWN0KGFyZyIraSsiKTtcbiJ9fWlmKCFyZXRUeXBlLmlzVm9pZCl7ZnVuY3Rpb25Cb2R5Kz0iICAgIHJldHVybiByZXRUeXBlLnRvV2lyZVR5cGUoZGVzdHJ1Y3RvcnMsIHJ2KTtcbiJ9ZnVuY3Rpb25Cb2R5Kz0ifTtcbiI7cGFyYW1zLnB1c2goZnVuY3Rpb25Cb2R5KTt2YXIgaW52b2tlckZ1bmN0aW9uPW5ld18oRnVuY3Rpb24scGFyYW1zKS5hcHBseShudWxsLGFyZ3MpO3JldHVybiBfX2VtdmFsX2FkZE1ldGhvZENhbGxlcihpbnZva2VyRnVuY3Rpb24pfWZ1bmN0aW9uIF9fZW12YWxfZ2V0X21vZHVsZV9wcm9wZXJ0eShuYW1lKXtuYW1lPWdldFN0cmluZ09yU3ltYm9sKG5hbWUpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKE1vZHVsZVtuYW1lXSl9ZnVuY3Rpb24gX19lbXZhbF9nZXRfcHJvcGVydHkoaGFuZGxlLGtleSl7aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTtrZXk9cmVxdWlyZUhhbmRsZShrZXkpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGhhbmRsZVtrZXldKX1mdW5jdGlvbiBfX2VtdmFsX2luY3JlZihoYW5kbGUpe2lmKGhhbmRsZT40KXtlbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS5yZWZjb3VudCs9MX19ZnVuY3Rpb24gY3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCl7dmFyIGFyZ3NMaXN0PSIiO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXthcmdzTGlzdCs9KGkhPT0wPyIsICI6IiIpKyJhcmciK2l9dmFyIGZ1bmN0aW9uQm9keT0icmV0dXJuIGZ1bmN0aW9uIGVtdmFsX2FsbG9jYXRvcl8iK2FyZ0NvdW50KyIoY29uc3RydWN0b3IsIGFyZ1R5cGVzLCBhcmdzKSB7XG4iO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXtmdW5jdGlvbkJvZHkrPSJ2YXIgYXJnVHlwZSIraSsiID0gcmVxdWlyZVJlZ2lzdGVyZWRUeXBlKE1vZHVsZVsnSEVBUDMyJ11bKGFyZ1R5cGVzID4+PiAyKSArICIraSsnXSwgInBhcmFtZXRlciAnK2krJyIpO1xuJysidmFyIGFyZyIraSsiID0gYXJnVHlwZSIraSsiLnJlYWRWYWx1ZUZyb21Qb2ludGVyKGFyZ3MpO1xuIisiYXJncyArPSBhcmdUeXBlIitpKyJbJ2FyZ1BhY2tBZHZhbmNlJ107XG4ifWZ1bmN0aW9uQm9keSs9InZhciBvYmogPSBuZXcgY29uc3RydWN0b3IoIithcmdzTGlzdCsiKTtcbiIrInJldHVybiBfX2VtdmFsX3JlZ2lzdGVyKG9iaik7XG4iKyJ9XG4iO3JldHVybiBuZXcgRnVuY3Rpb24oInJlcXVpcmVSZWdpc3RlcmVkVHlwZSIsIk1vZHVsZSIsIl9fZW12YWxfcmVnaXN0ZXIiLGZ1bmN0aW9uQm9keSkocmVxdWlyZVJlZ2lzdGVyZWRUeXBlLE1vZHVsZSxfX2VtdmFsX3JlZ2lzdGVyKX12YXIgZW12YWxfbmV3ZXJzPXt9O2Z1bmN0aW9uIF9fZW12YWxfbmV3KGhhbmRsZSxhcmdDb3VudCxhcmdUeXBlcyxhcmdzKXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO3ZhciBuZXdlcj1lbXZhbF9uZXdlcnNbYXJnQ291bnRdO2lmKCFuZXdlcil7bmV3ZXI9Y3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCk7ZW12YWxfbmV3ZXJzW2FyZ0NvdW50XT1uZXdlcn1yZXR1cm4gbmV3ZXIoaGFuZGxlLGFyZ1R5cGVzLGFyZ3MpfWZ1bmN0aW9uIF9fZW12YWxfbmV3X2NzdHJpbmcodil7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZ2V0U3RyaW5nT3JTeW1ib2wodikpfWZ1bmN0aW9uIF9fZW12YWxfcnVuX2Rlc3RydWN0b3JzKGhhbmRsZSl7dmFyIGRlc3RydWN0b3JzPWVtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKTtfX2VtdmFsX2RlY3JlZihoYW5kbGUpfWZ1bmN0aW9uIF9hYm9ydCgpe2Fib3J0KCl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0hFQVBVOC5jb3B5V2l0aGluKGRlc3Qsc3JjLHNyYytudW0pfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKXtyZXR1cm4gSEVBUFU4Lmxlbmd0aH1mdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpe3RyeXt3YXNtTWVtb3J5Lmdyb3coc2l6ZS1idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KTt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7cmV0dXJuIDF9Y2F0Y2goZSl7fX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKXtyZXF1ZXN0ZWRTaXplPXJlcXVlc3RlZFNpemU+Pj4wO3ZhciBvbGRTaXplPV9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTt2YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtpZihyZXF1ZXN0ZWRTaXplPm1heEhlYXBTaXplKXtyZXR1cm4gZmFsc2V9dmFyIG1pbkhlYXBTaXplPTE2Nzc3MjE2O2Zvcih2YXIgY3V0RG93bj0xO2N1dERvd248PTQ7Y3V0RG93bio9Mil7dmFyIG92ZXJHcm93bkhlYXBTaXplPW9sZFNpemUqKDErLjIvY3V0RG93bik7b3Zlckdyb3duSGVhcFNpemU9TWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUscmVxdWVzdGVkU2l6ZSsxMDA2NjMyOTYpO3ZhciBuZXdTaXplPU1hdGgubWluKG1heEhlYXBTaXplLGFsaWduVXAoTWF0aC5tYXgobWluSGVhcFNpemUscmVxdWVzdGVkU2l6ZSxvdmVyR3Jvd25IZWFwU2l6ZSksNjU1MzYpKTt2YXIgcmVwbGFjZW1lbnQ9ZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTtpZihyZXBsYWNlbWVudCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX12YXIgU1lTQ0FMTFM9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihzdHJlYW0sY3Vycil7dmFyIGJ1ZmZlcj1TWVNDQUxMUy5idWZmZXJzW3N0cmVhbV07aWYoY3Vycj09PTB8fGN1cnI9PT0xMCl7KHN0cmVhbT09PTE/b3V0OmVycikoVVRGOEFycmF5VG9TdHJpbmcoYnVmZmVyLDApKTtidWZmZXIubGVuZ3RoPTB9ZWxzZXtidWZmZXIucHVzaChjdXJyKX19LHZhcmFyZ3M6dW5kZWZpbmVkLGdldDpmdW5jdGlvbigpe1NZU0NBTExTLnZhcmFyZ3MrPTQ7dmFyIHJldD1IRUFQMzJbU1lTQ0FMTFMudmFyYXJncy00Pj4yXTtyZXR1cm4gcmV0fSxnZXRTdHI6ZnVuY3Rpb24ocHRyKXt2YXIgcmV0PVVURjhUb1N0cmluZyhwdHIpO3JldHVybiByZXR9LGdldDY0OmZ1bmN0aW9uKGxvdyxoaWdoKXtyZXR1cm4gbG93fX07ZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKXtyZXR1cm4gMH1mdW5jdGlvbiBfZmRfc2VlayhmZCxvZmZzZXRfbG93LG9mZnNldF9oaWdoLHdoZW5jZSxuZXdPZmZzZXQpe31mdW5jdGlvbiBfZmRfd3JpdGUoZmQsaW92LGlvdmNudCxwbnVtKXt2YXIgbnVtPTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXIgbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07Zm9yKHZhciBqPTA7ajxsZW47aisrKXtTWVNDQUxMUy5wcmludENoYXIoZmQsSEVBUFU4W3B0citqXSl9bnVtKz1sZW59SEVBUDMyW3BudW0+PjJdPW51bTtyZXR1cm4gMH1mdW5jdGlvbiBfc2V0VGVtcFJldDAoJGkpe3NldFRlbXBSZXQwKCRpfDApfUludGVybmFsRXJyb3I9TW9kdWxlWyJJbnRlcm5hbEVycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkludGVybmFsRXJyb3IiKTtlbWJpbmRfaW5pdF9jaGFyQ29kZXMoKTtCaW5kaW5nRXJyb3I9TW9kdWxlWyJCaW5kaW5nRXJyb3IiXT1leHRlbmRFcnJvcihFcnJvciwiQmluZGluZ0Vycm9yIik7aW5pdF9DbGFzc0hhbmRsZSgpO2luaXRfUmVnaXN0ZXJlZFBvaW50ZXIoKTtpbml0X2VtYmluZCgpO1VuYm91bmRUeXBlRXJyb3I9TW9kdWxlWyJVbmJvdW5kVHlwZUVycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIlVuYm91bmRUeXBlRXJyb3IiKTtpbml0X2VtdmFsKCk7X19BVElOSVRfXy5wdXNoKHtmdW5jOmZ1bmN0aW9uKCl7X19fd2FzbV9jYWxsX2N0b3JzKCl9fSk7dmFyIGFzbUxpYnJhcnlBcmc9eyJ0IjpfX2VtYmluZF9maW5hbGl6ZV92YWx1ZV9vYmplY3QsIkkiOl9fZW1iaW5kX3JlZ2lzdGVyX2Jvb2wsIngiOl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzLCJ3IjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19jb25zdHJ1Y3RvciwiZCI6X19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfZnVuY3Rpb24sImsiOl9fZW1iaW5kX3JlZ2lzdGVyX2NvbnN0YW50LCJIIjpfX2VtYmluZF9yZWdpc3Rlcl9lbXZhbCwibiI6X19lbWJpbmRfcmVnaXN0ZXJfZW51bSwiYSI6X19lbWJpbmRfcmVnaXN0ZXJfZW51bV92YWx1ZSwiQSI6X19lbWJpbmRfcmVnaXN0ZXJfZmxvYXQsImkiOl9fZW1iaW5kX3JlZ2lzdGVyX2Z1bmN0aW9uLCJqIjpfX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyLCJoIjpfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldywiQiI6X19lbWJpbmRfcmVnaXN0ZXJfc3RkX3N0cmluZywidiI6X19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcsInUiOl9fZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX29iamVjdCwiYyI6X19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0X2ZpZWxkLCJKIjpfX2VtYmluZF9yZWdpc3Rlcl92b2lkLCJtIjpfX2VtdmFsX2FzLCJzIjpfX2VtdmFsX2NhbGxfdm9pZF9tZXRob2QsImIiOl9fZW12YWxfZGVjcmVmLCJ5IjpfX2VtdmFsX2dldF9nbG9iYWwsInAiOl9fZW12YWxfZ2V0X21ldGhvZF9jYWxsZXIsInIiOl9fZW12YWxfZ2V0X21vZHVsZV9wcm9wZXJ0eSwiZSI6X19lbXZhbF9nZXRfcHJvcGVydHksImciOl9fZW12YWxfaW5jcmVmLCJxIjpfX2VtdmFsX25ldywiZiI6X19lbXZhbF9uZXdfY3N0cmluZywibCI6X19lbXZhbF9ydW5fZGVzdHJ1Y3RvcnMsIm8iOl9hYm9ydCwiRSI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywiRiI6X2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsIkciOl9mZF9jbG9zZSwiQyI6X2ZkX3NlZWssInoiOl9mZF93cml0ZSwiRCI6X3NldFRlbXBSZXQwfTt2YXIgYXNtPWNyZWF0ZVdhc20oKTt2YXIgX19fd2FzbV9jYWxsX2N0b3JzPU1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19fd2FzbV9jYWxsX2N0b3JzPU1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl09TW9kdWxlWyJhc20iXVsiTSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWFsbG9jPU1vZHVsZVsiX21hbGxvYyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9tYWxsb2M9TW9kdWxlWyJfbWFsbG9jIl09TW9kdWxlWyJhc20iXVsiTiJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZnJlZT1Nb2R1bGVbIl9mcmVlIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2ZyZWU9TW9kdWxlWyJfZnJlZSJdPU1vZHVsZVsiYXNtIl1bIk8iXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZ2V0VHlwZU5hbWU9TW9kdWxlWyJfX19nZXRUeXBlTmFtZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX2dldFR5cGVOYW1lPU1vZHVsZVsiX19fZ2V0VHlwZU5hbWUiXT1Nb2R1bGVbImFzbSJdWyJQIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXM9TW9kdWxlWyJfX19lbWJpbmRfcmVnaXN0ZXJfbmF0aXZlX2FuZF9idWlsdGluX3R5cGVzIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19fZW1iaW5kX3JlZ2lzdGVyX25hdGl2ZV9hbmRfYnVpbHRpbl90eXBlcz1Nb2R1bGVbIl9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXMiXT1Nb2R1bGVbImFzbSJdWyJRIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfamlqaT1Nb2R1bGVbImR5bkNhbGxfamlqaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfamlqaT1Nb2R1bGVbImR5bkNhbGxfamlqaSJdPU1vZHVsZVsiYXNtIl1bIlIiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgY2FsbGVkUnVuO2Z1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiO3RoaXMubWVzc2FnZT0iUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiK3N0YXR1cysiKSI7dGhpcy5zdGF0dXM9c3RhdHVzfWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1mdW5jdGlvbiBydW5DYWxsZXIoKXtpZighY2FsbGVkUnVuKXJ1bigpO2lmKCFjYWxsZWRSdW4pZGVwZW5kZW5jaWVzRnVsZmlsbGVkPXJ1bkNhbGxlcn07ZnVuY3Rpb24gcnVuKGFyZ3Mpe2FyZ3M9YXJnc3x8YXJndW1lbnRzXztpZihydW5EZXBlbmRlbmNpZXM+MCl7cmV0dXJufXByZVJ1bigpO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXJldHVybjtmdW5jdGlvbiBkb1J1bigpe2lmKGNhbGxlZFJ1bilyZXR1cm47Y2FsbGVkUnVuPXRydWU7TW9kdWxlWyJjYWxsZWRSdW4iXT10cnVlO2lmKEFCT1JUKXJldHVybjtpbml0UnVudGltZSgpO3ByZU1haW4oKTtyZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7aWYoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKU1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSgpO3Bvc3RSdW4oKX1pZihNb2R1bGVbInNldFN0YXR1cyJdKXtNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7c2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtNb2R1bGVbInNldFN0YXR1cyJdKCIiKX0sMSk7ZG9SdW4oKX0sMSl9ZWxzZXtkb1J1bigpfX1Nb2R1bGVbInJ1biJdPXJ1bjtpZihNb2R1bGVbInByZUluaXQiXSl7aWYodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlSW5pdCJdPVtNb2R1bGVbInByZUluaXQiXV07d2hpbGUoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoPjApe01vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCl9fW5vRXhpdFJ1bnRpbWU9dHJ1ZTtydW4oKTsKK3ZhciBNb2R1bGU9dHlwZW9mIEJBU0lTIT09InVuZGVmaW5lZCI/QkFTSVM6e307dmFyIHJlYWR5UHJvbWlzZVJlc29sdmUscmVhZHlQcm9taXNlUmVqZWN0O01vZHVsZVsicmVhZHkiXT1uZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cmVhZHlQcm9taXNlUmVzb2x2ZT1yZXNvbHZlO3JlYWR5UHJvbWlzZVJlamVjdD1yZWplY3R9KTt2YXIgbW9kdWxlT3ZlcnJpZGVzPXt9O3ZhciBrZXk7Zm9yKGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIGFyZ3VtZW50c189W107dmFyIHRoaXNQcm9ncmFtPSIuL3RoaXMucHJvZ3JhbSI7dmFyIHF1aXRfPWZ1bmN0aW9uKHN0YXR1cyx0b1Rocm93KXt0aHJvdyB0b1Rocm93fTt2YXIgRU5WSVJPTk1FTlRfSVNfV0VCPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX05PREU9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX1NIRUxMPWZhbHNlO0VOVklST05NRU5UX0lTX1dFQj10eXBlb2Ygd2luZG93PT09Im9iamVjdCI7RU5WSVJPTk1FTlRfSVNfV09SS0VSPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT09ImZ1bmN0aW9uIjtFTlZJUk9OTUVOVF9JU19OT0RFPXR5cGVvZiBwcm9jZXNzPT09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT0ic3RyaW5nIjtFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjt2YXIgc2NyaXB0RGlyZWN0b3J5PSIiO2Z1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCl7aWYoTW9kdWxlWyJsb2NhdGVGaWxlIl0pe3JldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLHNjcmlwdERpcmVjdG9yeSl9cmV0dXJuIHNjcmlwdERpcmVjdG9yeStwYXRofXZhciByZWFkXyxyZWFkQXN5bmMscmVhZEJpbmFyeSxzZXRXaW5kb3dUaXRsZTt2YXIgbm9kZUZTO3ZhciBub2RlUGF0aDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1yZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpKyIvIn1lbHNle3NjcmlwdERpcmVjdG9yeT1fX2Rpcm5hbWUrIi8ifXJlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKCJmcyIpO2lmKCFub2RlUGF0aClub2RlUGF0aD1yZXF1aXJlKCJwYXRoIik7ZmlsZW5hbWU9bm9kZVBhdGhbIm5vcm1hbGl6ZSJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTWyJyZWFkRmlsZVN5bmMiXShmaWxlbmFtZSxiaW5hcnk/bnVsbDoidXRmOCIpfTtyZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZmlsZW5hbWUpe3ZhciByZXQ9cmVhZF8oZmlsZW5hbWUsdHJ1ZSk7aWYoIXJldC5idWZmZXIpe3JldD1uZXcgVWludDhBcnJheShyZXQpfWFzc2VydChyZXQuYnVmZmVyKTtyZXR1cm4gcmV0fTtpZihwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoPjEpe3RoaXNQcm9ncmFtPXByb2Nlc3NbImFyZ3YiXVsxXS5yZXBsYWNlKC9cXC9nLCIvIil9YXJndW1lbnRzXz1wcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7cHJvY2Vzc1sib24iXSgidW5jYXVnaHRFeGNlcHRpb24iLGZ1bmN0aW9uKGV4KXtpZighKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpe3Rocm93IGV4fX0pO3Byb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsYWJvcnQpO3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cHJvY2Vzc1siZXhpdCJdKHN0YXR1cyl9O01vZHVsZVsiaW5zcGVjdCJdPWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19TSEVMTCl7aWYodHlwZW9mIHJlYWQhPSJ1bmRlZmluZWQiKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGYpe3JldHVybiByZWFkKGYpfX1yZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7dmFyIGRhdGE7aWYodHlwZW9mIHJlYWRidWZmZXI9PT0iZnVuY3Rpb24iKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVhZGJ1ZmZlcihmKSl9ZGF0YT1yZWFkKGYsImJpbmFyeSIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PSJvYmplY3QiKTtyZXR1cm4gZGF0YX07aWYodHlwZW9mIHNjcmlwdEFyZ3MhPSJ1bmRlZmluZWQiKXthcmd1bWVudHNfPXNjcmlwdEFyZ3N9ZWxzZSBpZih0eXBlb2YgYXJndW1lbnRzIT0idW5kZWZpbmVkIil7YXJndW1lbnRzXz1hcmd1bWVudHN9aWYodHlwZW9mIHF1aXQ9PT0iZnVuY3Rpb24iKXtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3F1aXQoc3RhdHVzKX19aWYodHlwZW9mIHByaW50IT09InVuZGVmaW5lZCIpe2lmKHR5cGVvZiBjb25zb2xlPT09InVuZGVmaW5lZCIpY29uc29sZT17fTtjb25zb2xlLmxvZz1wcmludDtjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnIhPT0idW5kZWZpbmVkIj9wcmludEVycjpwcmludH19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9c2VsZi5sb2NhdGlvbi5ocmVmfWVsc2UgaWYoZG9jdW1lbnQuY3VycmVudFNjcmlwdCl7c2NyaXB0RGlyZWN0b3J5PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjfWlmKF9zY3JpcHREaXIpe3NjcmlwdERpcmVjdG9yeT1fc2NyaXB0RGlyfWlmKHNjcmlwdERpcmVjdG9yeS5pbmRleE9mKCJibG9iOiIpIT09MCl7c2NyaXB0RGlyZWN0b3J5PXNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCxzY3JpcHREaXJlY3RvcnkubGFzdEluZGV4T2YoIi8iKSsxKX1lbHNle3NjcmlwdERpcmVjdG9yeT0iIn17cmVhZF89ZnVuY3Rpb24gc2hlbGxfcmVhZCh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KHVybCl7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oIkdFVCIsdXJsLGZhbHNlKTt4aHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciI7eGhyLnNlbmQobnVsbCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSl9fXJlYWRBc3luYz1mdW5jdGlvbiByZWFkQXN5bmModXJsLG9ubG9hZCxvbmVycm9yKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIix1cmwsdHJ1ZSk7eGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO3hoci5vbmxvYWQ9ZnVuY3Rpb24geGhyX29ubG9hZCgpe2lmKHhoci5zdGF0dXM9PTIwMHx8eGhyLnN0YXR1cz09MCYmeGhyLnJlc3BvbnNlKXtvbmxvYWQoeGhyLnJlc3BvbnNlKTtyZXR1cm59b25lcnJvcigpfTt4aHIub25lcnJvcj1vbmVycm9yO3hoci5zZW5kKG51bGwpfX1zZXRXaW5kb3dUaXRsZT1mdW5jdGlvbih0aXRsZSl7ZG9jdW1lbnQudGl0bGU9dGl0bGV9fWVsc2V7fXZhciBvdXQ9TW9kdWxlWyJwcmludCJdfHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO3ZhciBlcnI9TW9kdWxlWyJwcmludEVyciJdfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3Ioa2V5IGluIG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX1tb2R1bGVPdmVycmlkZXM9bnVsbDtpZihNb2R1bGVbImFyZ3VtZW50cyJdKWFyZ3VtZW50c189TW9kdWxlWyJhcmd1bWVudHMiXTtpZihNb2R1bGVbInRoaXNQcm9ncmFtIl0pdGhpc1Byb2dyYW09TW9kdWxlWyJ0aGlzUHJvZ3JhbSJdO2lmKE1vZHVsZVsicXVpdCJdKXF1aXRfPU1vZHVsZVsicXVpdCJdO3ZhciB0ZW1wUmV0MD0wO3ZhciBzZXRUZW1wUmV0MD1mdW5jdGlvbih2YWx1ZSl7dGVtcFJldDA9dmFsdWV9O3ZhciB3YXNtQmluYXJ5O2lmKE1vZHVsZVsid2FzbUJpbmFyeSJdKXdhc21CaW5hcnk9TW9kdWxlWyJ3YXNtQmluYXJ5Il07dmFyIG5vRXhpdFJ1bnRpbWU7aWYoTW9kdWxlWyJub0V4aXRSdW50aW1lIl0pbm9FeGl0UnVudGltZT1Nb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXTtpZih0eXBlb2YgV2ViQXNzZW1ibHkhPT0ib2JqZWN0Iil7ZXJyKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIil9dmFyIHdhc21NZW1vcnk7dmFyIHdhc21UYWJsZT1uZXcgV2ViQXNzZW1ibHkuVGFibGUoeyJpbml0aWFsIjoxNTcsIm1heGltdW0iOjE1NyswLCJlbGVtZW50IjoiYW55ZnVuYyJ9KTt2YXIgQUJPUlQ9ZmFsc2U7dmFyIEVYSVRTVEFUVVM9MDtmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiK3RleHQpfX12YXIgVVRGOERlY29kZXI9dHlwZW9mIFRleHREZWNvZGVyIT09InVuZGVmaW5lZCI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dW5kZWZpbmVkO2Z1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsaWR4LG1heEJ5dGVzVG9SZWFkKXt2YXIgZW5kSWR4PWlkeCttYXhCeXRlc1RvUmVhZDt2YXIgZW5kUHRyPWlkeDt3aGlsZShoZWFwW2VuZFB0cl0mJiEoZW5kUHRyPj1lbmRJZHgpKSsrZW5kUHRyO2lmKGVuZFB0ci1pZHg+MTYmJmhlYXAuc3ViYXJyYXkmJlVURjhEZWNvZGVyKXtyZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LGVuZFB0cikpfWVsc2V7dmFyIHN0cj0iIjt3aGlsZShpZHg8ZW5kUHRyKXt2YXIgdTA9aGVhcFtpZHgrK107aWYoISh1MCYxMjgpKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApO2NvbnRpbnVlfXZhciB1MT1oZWFwW2lkeCsrXSY2MztpZigodTAmMjI0KT09MTkyKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKHUwJjMxKTw8Nnx1MSk7Y29udGludWV9dmFyIHUyPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyNDApPT0yMjQpe3UwPSh1MCYxNSk8PDEyfHUxPDw2fHUyfWVsc2V7dTA9KHUwJjcpPDwxOHx1MTw8MTJ8dTI8PDZ8aGVhcFtpZHgrK10mNjN9aWYodTA8NjU1MzYpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCl9ZWxzZXt2YXIgY2g9dTAtNjU1MzY7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGNoPj4xMCw1NjMyMHxjaCYxMDIzKX19fXJldHVybiBzdHJ9ZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0cixtYXhCeXRlc1RvUmVhZCl7cmV0dXJuIHB0cj9VVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgscHRyLG1heEJ5dGVzVG9SZWFkKToiIn1mdW5jdGlvbiBzdHJpbmdUb1VURjhBcnJheShzdHIsaGVhcCxvdXRJZHgsbWF4Qnl0ZXNUb1dyaXRlKXtpZighKG1heEJ5dGVzVG9Xcml0ZT4wKSlyZXR1cm4gMDt2YXIgc3RhcnRJZHg9b3V0SWR4O3ZhciBlbmRJZHg9b3V0SWR4K21heEJ5dGVzVG9Xcml0ZS0xO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciB1PXN0ci5jaGFyQ29kZUF0KGkpO2lmKHU+PTU1Mjk2JiZ1PD01NzM0Myl7dmFyIHUxPXN0ci5jaGFyQ29kZUF0KCsraSk7dT02NTUzNisoKHUmMTAyMyk8PDEwKXx1MSYxMDIzfWlmKHU8PTEyNyl7aWYob3V0SWR4Pj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109dX1lbHNlIGlmKHU8PTIwNDcpe2lmKG91dElkeCsxPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MTkyfHU+PjY7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZSBpZih1PD02NTUzNSl7aWYob3V0SWR4KzI+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0yMjR8dT4+MTI7aGVhcFtvdXRJZHgrK109MTI4fHU+PjYmNjM7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZXtpZihvdXRJZHgrMz49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTI0MHx1Pj4xODtoZWFwW291dElkeCsrXT0xMjh8dT4+MTImNjM7aGVhcFtvdXRJZHgrK109MTI4fHU+PjYmNjM7aGVhcFtvdXRJZHgrK109MTI4fHUmNjN9fWhlYXBbb3V0SWR4XT0wO3JldHVybiBvdXRJZHgtc3RhcnRJZHh9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4KHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtyZXR1cm4gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLEhFQVBVOCxvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKX1mdW5jdGlvbiBsZW5ndGhCeXRlc1VURjgoc3RyKXt2YXIgbGVuPTA7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXU9NjU1MzYrKCh1JjEwMjMpPDwxMCl8c3RyLmNoYXJDb2RlQXQoKytpKSYxMDIzO2lmKHU8PTEyNykrK2xlbjtlbHNlIGlmKHU8PTIwNDcpbGVuKz0yO2Vsc2UgaWYodTw9NjU1MzUpbGVuKz0zO2Vsc2UgbGVuKz00fXJldHVybiBsZW59dmFyIFVURjE2RGVjb2Rlcj10eXBlb2YgVGV4dERlY29kZXIhPT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0Zi0xNmxlIik6dW5kZWZpbmVkO2Z1bmN0aW9uIFVURjE2VG9TdHJpbmcocHRyLG1heEJ5dGVzVG9SZWFkKXt2YXIgZW5kUHRyPXB0cjt2YXIgaWR4PWVuZFB0cj4+MTt2YXIgbWF4SWR4PWlkeCttYXhCeXRlc1RvUmVhZC8yO3doaWxlKCEoaWR4Pj1tYXhJZHgpJiZIRUFQVTE2W2lkeF0pKytpZHg7ZW5kUHRyPWlkeDw8MTtpZihlbmRQdHItcHRyPjMyJiZVVEYxNkRlY29kZXIpe3JldHVybiBVVEYxNkRlY29kZXIuZGVjb2RlKEhFQVBVOC5zdWJhcnJheShwdHIsZW5kUHRyKSl9ZWxzZXt2YXIgaT0wO3ZhciBzdHI9IiI7d2hpbGUoMSl7dmFyIGNvZGVVbml0PUhFQVAxNltwdHIraSoyPj4xXTtpZihjb2RlVW5pdD09MHx8aT09bWF4Qnl0ZXNUb1JlYWQvMilyZXR1cm4gc3RyOysraTtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVVuaXQpfX19ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNihzdHIsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl7aWYobWF4Qnl0ZXNUb1dyaXRlPT09dW5kZWZpbmVkKXttYXhCeXRlc1RvV3JpdGU9MjE0NzQ4MzY0N31pZihtYXhCeXRlc1RvV3JpdGU8MilyZXR1cm4gMDttYXhCeXRlc1RvV3JpdGUtPTI7dmFyIHN0YXJ0UHRyPW91dFB0cjt2YXIgbnVtQ2hhcnNUb1dyaXRlPW1heEJ5dGVzVG9Xcml0ZTxzdHIubGVuZ3RoKjI/bWF4Qnl0ZXNUb1dyaXRlLzI6c3RyLmxlbmd0aDtmb3IodmFyIGk9MDtpPG51bUNoYXJzVG9Xcml0ZTsrK2kpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpKTtIRUFQMTZbb3V0UHRyPj4xXT1jb2RlVW5pdDtvdXRQdHIrPTJ9SEVBUDE2W291dFB0cj4+MV09MDtyZXR1cm4gb3V0UHRyLXN0YXJ0UHRyfWZ1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGMTYoc3RyKXtyZXR1cm4gc3RyLmxlbmd0aCoyfWZ1bmN0aW9uIFVURjMyVG9TdHJpbmcocHRyLG1heEJ5dGVzVG9SZWFkKXt2YXIgaT0wO3ZhciBzdHI9IiI7d2hpbGUoIShpPj1tYXhCeXRlc1RvUmVhZC80KSl7dmFyIHV0ZjMyPUhFQVAzMltwdHIraSo0Pj4yXTtpZih1dGYzMj09MClicmVhazsrK2k7aWYodXRmMzI+PTY1NTM2KXt2YXIgY2g9dXRmMzItNjU1MzY7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGNoPj4xMCw1NjMyMHxjaCYxMDIzKX1lbHNle3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1dGYzMil9fXJldHVybiBzdHJ9ZnVuY3Rpb24gc3RyaW5nVG9VVEYzMihzdHIsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl7aWYobWF4Qnl0ZXNUb1dyaXRlPT09dW5kZWZpbmVkKXttYXhCeXRlc1RvV3JpdGU9MjE0NzQ4MzY0N31pZihtYXhCeXRlc1RvV3JpdGU8NClyZXR1cm4gMDt2YXIgc3RhcnRQdHI9b3V0UHRyO3ZhciBlbmRQdHI9c3RhcnRQdHIrbWF4Qnl0ZXNUb1dyaXRlLTQ7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIGNvZGVVbml0PXN0ci5jaGFyQ29kZUF0KGkpO2lmKGNvZGVVbml0Pj01NTI5NiYmY29kZVVuaXQ8PTU3MzQzKXt2YXIgdHJhaWxTdXJyb2dhdGU9c3RyLmNoYXJDb2RlQXQoKytpKTtjb2RlVW5pdD02NTUzNisoKGNvZGVVbml0JjEwMjMpPDwxMCl8dHJhaWxTdXJyb2dhdGUmMTAyM31IRUFQMzJbb3V0UHRyPj4yXT1jb2RlVW5pdDtvdXRQdHIrPTQ7aWYob3V0UHRyKzQ+ZW5kUHRyKWJyZWFrfUhFQVAzMltvdXRQdHI+PjJdPTA7cmV0dXJuIG91dFB0ci1zdGFydFB0cn1mdW5jdGlvbiBsZW5ndGhCeXRlc1VURjMyKHN0cil7dmFyIGxlbj0wO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpKTtpZihjb2RlVW5pdD49NTUyOTYmJmNvZGVVbml0PD01NzM0MykrK2k7bGVuKz00fXJldHVybiBsZW59dmFyIFdBU01fUEFHRV9TSVpFPTY1NTM2O2Z1bmN0aW9uIGFsaWduVXAoeCxtdWx0aXBsZSl7aWYoeCVtdWx0aXBsZT4wKXt4Kz1tdWx0aXBsZS14JW11bHRpcGxlfXJldHVybiB4fXZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlWyJIRUFQOCJdPUhFQVA4PW5ldyBJbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVAxNiJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUDMyIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQVTgiXT1IRUFQVTg9bmV3IFVpbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVBVMTYiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUFUzMiJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjMyIl09SEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjY0Il09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIERZTkFNSUNfQkFTRT01NTUyMDY0LERZTkFNSUNUT1BfUFRSPTMwOTAyNDt2YXIgSU5JVElBTF9JTklUSUFMX01FTU9SWT1Nb2R1bGVbIklOSVRJQUxfTUVNT1JZIl18fDE2Nzc3MjE2O2lmKE1vZHVsZVsid2FzbU1lbW9yeSJdKXt3YXNtTWVtb3J5PU1vZHVsZVsid2FzbU1lbW9yeSJdfWVsc2V7d2FzbU1lbW9yeT1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHsiaW5pdGlhbCI6SU5JVElBTF9JTklUSUFMX01FTU9SWS9XQVNNX1BBR0VfU0laRSwibWF4aW11bSI6MjE0NzQ4MzY0OC9XQVNNX1BBR0VfU0laRX0pfWlmKHdhc21NZW1vcnkpe2J1ZmZlcj13YXNtTWVtb3J5LmJ1ZmZlcn1JTklUSUFMX0lOSVRJQUxfTUVNT1JZPWJ1ZmZlci5ieXRlTGVuZ3RoO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZmZlcik7SEVBUDMyW0RZTkFNSUNUT1BfUFRSPj4yXT1EWU5BTUlDX0JBU0U7ZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKXt3aGlsZShjYWxsYmFja3MubGVuZ3RoPjApe3ZhciBjYWxsYmFjaz1jYWxsYmFja3Muc2hpZnQoKTtpZih0eXBlb2YgY2FsbGJhY2s9PSJmdW5jdGlvbiIpe2NhbGxiYWNrKE1vZHVsZSk7Y29udGludWV9dmFyIGZ1bmM9Y2FsbGJhY2suZnVuYztpZih0eXBlb2YgZnVuYz09PSJudW1iZXIiKXtpZihjYWxsYmFjay5hcmc9PT11bmRlZmluZWQpe01vZHVsZVsiZHluQ2FsbF92Il0oZnVuYyl9ZWxzZXtNb2R1bGVbImR5bkNhbGxfdmkiXShmdW5jLGNhbGxiYWNrLmFyZyl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19dmFyIF9fQVRQUkVSVU5fXz1bXTt2YXIgX19BVElOSVRfXz1bXTt2YXIgX19BVE1BSU5fXz1bXTt2YXIgX19BVFBPU1RSVU5fXz1bXTt2YXIgcnVudGltZUluaXRpYWxpemVkPWZhbHNlO2Z1bmN0aW9uIHByZVJ1bigpe2lmKE1vZHVsZVsicHJlUnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlUnVuIl09W01vZHVsZVsicHJlUnVuIl1dO3doaWxlKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKXthZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihNb2R1bGVbInBvc3RSdW4iXSl7aWYodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicG9zdFJ1biJdPVtNb2R1bGVbInBvc3RSdW4iXV07d2hpbGUoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlWyJwb3N0UnVuIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pfWZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKXtfX0FUUFJFUlVOX18udW5zaGlmdChjYil9ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfXZhciBNYXRoX2NlaWw9TWF0aC5jZWlsO3ZhciBNYXRoX2Zsb29yPU1hdGguZmxvb3I7dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMrKztpZihNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSl7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKX19ZnVuY3Rpb24gcmVtb3ZlUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzLS07aWYoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pe01vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyl9aWYocnVuRGVwZW5kZW5jaWVzPT0wKXtpZihydW5EZXBlbmRlbmN5V2F0Y2hlciE9PW51bGwpe2NsZWFySW50ZXJ2YWwocnVuRGVwZW5kZW5jeVdhdGNoZXIpO3J1bkRlcGVuZGVuY3lXYXRjaGVyPW51bGx9aWYoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKXt2YXIgY2FsbGJhY2s9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkO2RlcGVuZGVuY2llc0Z1bGZpbGxlZD1udWxsO2NhbGxiYWNrKCl9fX1Nb2R1bGVbInByZWxvYWRlZEltYWdlcyJdPXt9O01vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl09e307ZnVuY3Rpb24gYWJvcnQod2hhdCl7aWYoTW9kdWxlWyJvbkFib3J0Il0pe01vZHVsZVsib25BYm9ydCJdKHdoYXQpfXdoYXQrPSIiO291dCh3aGF0KTtlcnIod2hhdCk7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7d2hhdD0iYWJvcnQoIit3aGF0KyIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7dGhyb3cgbmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KX1mdW5jdGlvbiBoYXNQcmVmaXgoc3RyLHByZWZpeCl7cmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aD9zdHIuc3RhcnRzV2l0aChwcmVmaXgpOnN0ci5pbmRleE9mKHByZWZpeCk9PT0wfXZhciBkYXRhVVJJUHJlZml4PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjtmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZGF0YVVSSVByZWZpeCl9dmFyIGZpbGVVUklQcmVmaXg9ImZpbGU6Ly8iO2Z1bmN0aW9uIGlzRmlsZVVSSShmaWxlbmFtZSl7cmV0dXJuIGhhc1ByZWZpeChmaWxlbmFtZSxmaWxlVVJJUHJlZml4KX12YXIgd2FzbUJpbmFyeUZpbGU9ImJhc2lzX3RyYW5zY29kZXIud2FzbSI7aWYoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpe3dhc21CaW5hcnlGaWxlPWxvY2F0ZUZpbGUod2FzbUJpbmFyeUZpbGUpfWZ1bmN0aW9uIGdldEJpbmFyeSgpe3RyeXtpZih3YXNtQmluYXJ5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSl9aWYocmVhZEJpbmFyeSl7cmV0dXJuIHJlYWRCaW5hcnkod2FzbUJpbmFyeUZpbGUpfWVsc2V7dGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifX1jYXRjaChlcnIpe2Fib3J0KGVycil9fWZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKXtpZighd2FzbUJpbmFyeSYmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKSYmdHlwZW9mIGZldGNoPT09ImZ1bmN0aW9uIiYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZVsib2siXSl7dGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIit3YXNtQmluYXJ5RmlsZSsiJyJ9cmV0dXJuIHJlc3BvbnNlWyJhcnJheUJ1ZmZlciJdKCl9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiBnZXRCaW5hcnkoKX0pfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cmVzb2x2ZShnZXRCaW5hcnkoKSl9KX1mdW5jdGlvbiBjcmVhdGVXYXNtKCl7dmFyIGluZm89eyJhIjphc21MaWJyYXJ5QXJnfTtmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsbW9kdWxlKXt2YXIgZXhwb3J0cz1pbnN0YW5jZS5leHBvcnRzO01vZHVsZVsiYXNtIl09ZXhwb3J0cztyZW1vdmVSdW5EZXBlbmRlbmN5KCJ3YXNtLWluc3RhbnRpYXRlIil9YWRkUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpO2Z1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2Uob3V0cHV0KXtyZWNlaXZlSW5zdGFuY2Uob3V0cHV0WyJpbnN0YW5jZSJdKX1mdW5jdGlvbiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVyKXtyZXR1cm4gZ2V0QmluYXJ5UHJvbWlzZSgpLnRoZW4oZnVuY3Rpb24oYmluYXJ5KXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LGluZm8pfSkudGhlbihyZWNlaXZlcixmdW5jdGlvbihyZWFzb24pe2VycigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIityZWFzb24pO2Fib3J0KHJlYXNvbil9KX1mdW5jdGlvbiBpbnN0YW50aWF0ZUFzeW5jKCl7aWYoIXdhc21CaW5hcnkmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09PSJmdW5jdGlvbiImJiFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpJiYhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSYmdHlwZW9mIGZldGNoPT09ImZ1bmN0aW9uIil7ZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXt2YXIgcmVzdWx0PVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLGluZm8pO3JldHVybiByZXN1bHQudGhlbihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIityZWFzb24pO2VycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTtpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfSl9KX1lbHNle3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfX1pZihNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKXt0cnl7dmFyIGV4cG9ydHM9TW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLHJlY2VpdmVJbnN0YW5jZSk7cmV0dXJuIGV4cG9ydHN9Y2F0Y2goZSl7ZXJyKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2UpO3JldHVybiBmYWxzZX19aW5zdGFudGlhdGVBc3luYygpO3JldHVybnt9fV9fQVRJTklUX18ucHVzaCh7ZnVuYzpmdW5jdGlvbigpe19fX3dhc21fY2FsbF9jdG9ycygpfX0pO3ZhciBzdHJ1Y3RSZWdpc3RyYXRpb25zPXt9O2Z1bmN0aW9uIHJ1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKXt3aGlsZShkZXN0cnVjdG9ycy5sZW5ndGgpe3ZhciBwdHI9ZGVzdHJ1Y3RvcnMucG9wKCk7dmFyIGRlbD1kZXN0cnVjdG9ycy5wb3AoKTtkZWwocHRyKX19ZnVuY3Rpb24gc2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBVMzJbcG9pbnRlcj4+Ml0pfXZhciBhd2FpdGluZ0RlcGVuZGVuY2llcz17fTt2YXIgcmVnaXN0ZXJlZFR5cGVzPXt9O3ZhciB0eXBlRGVwZW5kZW5jaWVzPXt9O3ZhciBjaGFyXzA9NDg7dmFyIGNoYXJfOT01NztmdW5jdGlvbiBtYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSl7aWYodW5kZWZpbmVkPT09bmFtZSl7cmV0dXJuIl91bmtub3duIn1uYW1lPW5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCIkIik7dmFyIGY9bmFtZS5jaGFyQ29kZUF0KDApO2lmKGY+PWNoYXJfMCYmZjw9Y2hhcl85KXtyZXR1cm4iXyIrbmFtZX1lbHNle3JldHVybiBuYW1lfX1mdW5jdGlvbiBjcmVhdGVOYW1lZEZ1bmN0aW9uKG5hbWUsYm9keSl7bmFtZT1tYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSk7cmV0dXJuIG5ldyBGdW5jdGlvbigiYm9keSIsInJldHVybiBmdW5jdGlvbiAiK25hbWUrIigpIHtcbiIrJyAgICAidXNlIHN0cmljdCI7JysiICAgIHJldHVybiBib2R5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4iKyJ9O1xuIikoYm9keSl9ZnVuY3Rpb24gZXh0ZW5kRXJyb3IoYmFzZUVycm9yVHlwZSxlcnJvck5hbWUpe3ZhciBlcnJvckNsYXNzPWNyZWF0ZU5hbWVkRnVuY3Rpb24oZXJyb3JOYW1lLGZ1bmN0aW9uKG1lc3NhZ2Upe3RoaXMubmFtZT1lcnJvck5hbWU7dGhpcy5tZXNzYWdlPW1lc3NhZ2U7dmFyIHN0YWNrPW5ldyBFcnJvcihtZXNzYWdlKS5zdGFjaztpZihzdGFjayE9PXVuZGVmaW5lZCl7dGhpcy5zdGFjaz10aGlzLnRvU3RyaW5nKCkrIlxuIitzdGFjay5yZXBsYWNlKC9eRXJyb3IoOlteXG5dKik/XG4vLCIiKX19KTtlcnJvckNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGJhc2VFcnJvclR5cGUucHJvdG90eXBlKTtlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lcnJvckNsYXNzO2Vycm9yQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYodGhpcy5tZXNzYWdlPT09dW5kZWZpbmVkKXtyZXR1cm4gdGhpcy5uYW1lfWVsc2V7cmV0dXJuIHRoaXMubmFtZSsiOiAiK3RoaXMubWVzc2FnZX19O3JldHVybiBlcnJvckNsYXNzfXZhciBJbnRlcm5hbEVycm9yPXVuZGVmaW5lZDtmdW5jdGlvbiB0aHJvd0ludGVybmFsRXJyb3IobWVzc2FnZSl7dGhyb3cgbmV3IEludGVybmFsRXJyb3IobWVzc2FnZSl9ZnVuY3Rpb24gd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQobXlUeXBlcyxkZXBlbmRlbnRUeXBlcyxnZXRUeXBlQ29udmVydGVycyl7bXlUeXBlcy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpe3R5cGVEZXBlbmRlbmNpZXNbdHlwZV09ZGVwZW5kZW50VHlwZXN9KTtmdW5jdGlvbiBvbkNvbXBsZXRlKHR5cGVDb252ZXJ0ZXJzKXt2YXIgbXlUeXBlQ29udmVydGVycz1nZXRUeXBlQ29udmVydGVycyh0eXBlQ29udmVydGVycyk7aWYobXlUeXBlQ29udmVydGVycy5sZW5ndGghPT1teVR5cGVzLmxlbmd0aCl7dGhyb3dJbnRlcm5hbEVycm9yKCJNaXNtYXRjaGVkIHR5cGUgY29udmVydGVyIGNvdW50Iil9Zm9yKHZhciBpPTA7aTxteVR5cGVzLmxlbmd0aDsrK2kpe3JlZ2lzdGVyVHlwZShteVR5cGVzW2ldLG15VHlwZUNvbnZlcnRlcnNbaV0pfX12YXIgdHlwZUNvbnZlcnRlcnM9bmV3IEFycmF5KGRlcGVuZGVudFR5cGVzLmxlbmd0aCk7dmFyIHVucmVnaXN0ZXJlZFR5cGVzPVtdO3ZhciByZWdpc3RlcmVkPTA7ZGVwZW5kZW50VHlwZXMuZm9yRWFjaChmdW5jdGlvbihkdCxpKXtpZihyZWdpc3RlcmVkVHlwZXMuaGFzT3duUHJvcGVydHkoZHQpKXt0eXBlQ29udmVydGVyc1tpXT1yZWdpc3RlcmVkVHlwZXNbZHRdfWVsc2V7dW5yZWdpc3RlcmVkVHlwZXMucHVzaChkdCk7aWYoIWF3YWl0aW5nRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGR0KSl7YXdhaXRpbmdEZXBlbmRlbmNpZXNbZHRdPVtdfWF3YWl0aW5nRGVwZW5kZW5jaWVzW2R0XS5wdXNoKGZ1bmN0aW9uKCl7dHlwZUNvbnZlcnRlcnNbaV09cmVnaXN0ZXJlZFR5cGVzW2R0XTsrK3JlZ2lzdGVyZWQ7aWYocmVnaXN0ZXJlZD09PXVucmVnaXN0ZXJlZFR5cGVzLmxlbmd0aCl7b25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl9fSl9fSk7aWYoMD09PXVucmVnaXN0ZXJlZFR5cGVzLmxlbmd0aCl7b25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl9fWZ1bmN0aW9uIF9fZW1iaW5kX2ZpbmFsaXplX3ZhbHVlX29iamVjdChzdHJ1Y3RUeXBlKXt2YXIgcmVnPXN0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV07ZGVsZXRlIHN0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV07dmFyIHJhd0NvbnN0cnVjdG9yPXJlZy5yYXdDb25zdHJ1Y3Rvcjt2YXIgcmF3RGVzdHJ1Y3Rvcj1yZWcucmF3RGVzdHJ1Y3Rvcjt2YXIgZmllbGRSZWNvcmRzPXJlZy5maWVsZHM7dmFyIGZpZWxkVHlwZXM9ZmllbGRSZWNvcmRzLm1hcChmdW5jdGlvbihmaWVsZCl7cmV0dXJuIGZpZWxkLmdldHRlclJldHVyblR5cGV9KS5jb25jYXQoZmllbGRSZWNvcmRzLm1hcChmdW5jdGlvbihmaWVsZCl7cmV0dXJuIGZpZWxkLnNldHRlckFyZ3VtZW50VHlwZX0pKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbc3RydWN0VHlwZV0sZmllbGRUeXBlcyxmdW5jdGlvbihmaWVsZFR5cGVzKXt2YXIgZmllbGRzPXt9O2ZpZWxkUmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkLGkpe3ZhciBmaWVsZE5hbWU9ZmllbGQuZmllbGROYW1lO3ZhciBnZXR0ZXJSZXR1cm5UeXBlPWZpZWxkVHlwZXNbaV07dmFyIGdldHRlcj1maWVsZC5nZXR0ZXI7dmFyIGdldHRlckNvbnRleHQ9ZmllbGQuZ2V0dGVyQ29udGV4dDt2YXIgc2V0dGVyQXJndW1lbnRUeXBlPWZpZWxkVHlwZXNbaStmaWVsZFJlY29yZHMubGVuZ3RoXTt2YXIgc2V0dGVyPWZpZWxkLnNldHRlcjt2YXIgc2V0dGVyQ29udGV4dD1maWVsZC5zZXR0ZXJDb250ZXh0O2ZpZWxkc1tmaWVsZE5hbWVdPXtyZWFkOmZ1bmN0aW9uKHB0cil7cmV0dXJuIGdldHRlclJldHVyblR5cGVbImZyb21XaXJlVHlwZSJdKGdldHRlcihnZXR0ZXJDb250ZXh0LHB0cikpfSx3cml0ZTpmdW5jdGlvbihwdHIsbyl7dmFyIGRlc3RydWN0b3JzPVtdO3NldHRlcihzZXR0ZXJDb250ZXh0LHB0cixzZXR0ZXJBcmd1bWVudFR5cGVbInRvV2lyZVR5cGUiXShkZXN0cnVjdG9ycyxvKSk7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpfX19KTtyZXR1cm5be25hbWU6cmVnLm5hbWUsImZyb21XaXJlVHlwZSI6ZnVuY3Rpb24ocHRyKXt2YXIgcnY9e307Zm9yKHZhciBpIGluIGZpZWxkcyl7cnZbaV09ZmllbGRzW2ldLnJlYWQocHRyKX1yYXdEZXN0cnVjdG9yKHB0cik7cmV0dXJuIHJ2fSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7Zm9yKHZhciBmaWVsZE5hbWUgaW4gZmllbGRzKXtpZighKGZpZWxkTmFtZSBpbiBvKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBmaWVsZCIpfX12YXIgcHRyPXJhd0NvbnN0cnVjdG9yKCk7Zm9yKGZpZWxkTmFtZSBpbiBmaWVsZHMpe2ZpZWxkc1tmaWVsZE5hbWVdLndyaXRlKHB0cixvW2ZpZWxkTmFtZV0pfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChyYXdEZXN0cnVjdG9yLHB0cil9cmV0dXJuIHB0cn0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOnJhd0Rlc3RydWN0b3J9XX0pfWZ1bmN0aW9uIGdldFNoaWZ0RnJvbVNpemUoc2l6ZSl7c3dpdGNoKHNpemUpe2Nhc2UgMTpyZXR1cm4gMDtjYXNlIDI6cmV0dXJuIDE7Y2FzZSA0OnJldHVybiAyO2Nhc2UgODpyZXR1cm4gMztkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gdHlwZSBzaXplOiAiK3NpemUpfX1mdW5jdGlvbiBlbWJpbmRfaW5pdF9jaGFyQ29kZXMoKXt2YXIgY29kZXM9bmV3IEFycmF5KDI1Nik7Zm9yKHZhciBpPTA7aTwyNTY7KytpKXtjb2Rlc1tpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfWVtYmluZF9jaGFyQ29kZXM9Y29kZXN9dmFyIGVtYmluZF9jaGFyQ29kZXM9dW5kZWZpbmVkO2Z1bmN0aW9uIHJlYWRMYXRpbjFTdHJpbmcocHRyKXt2YXIgcmV0PSIiO3ZhciBjPXB0cjt3aGlsZShIRUFQVThbY10pe3JldCs9ZW1iaW5kX2NoYXJDb2Rlc1tIRUFQVThbYysrXV19cmV0dXJuIHJldH12YXIgQmluZGluZ0Vycm9yPXVuZGVmaW5lZDtmdW5jdGlvbiB0aHJvd0JpbmRpbmdFcnJvcihtZXNzYWdlKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKG1lc3NhZ2UpfWZ1bmN0aW9uIHJlZ2lzdGVyVHlwZShyYXdUeXBlLHJlZ2lzdGVyZWRJbnN0YW5jZSxvcHRpb25zKXtvcHRpb25zPW9wdGlvbnN8fHt9O2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHJlZ2lzdGVyZWRJbnN0YW5jZSkpe3Rocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKX12YXIgbmFtZT1yZWdpc3RlcmVkSW5zdGFuY2UubmFtZTtpZighcmF3VHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoJ3R5cGUgIicrbmFtZSsnIiBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHR5cGVpZCBwb2ludGVyJyl9aWYocmVnaXN0ZXJlZFR5cGVzLmhhc093blByb3BlcnR5KHJhd1R5cGUpKXtpZihvcHRpb25zLmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpe3JldHVybn1lbHNle3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcmVnaXN0ZXIgdHlwZSAnIituYW1lKyInIHR3aWNlIil9fXJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXT1yZWdpc3RlcmVkSW5zdGFuY2U7ZGVsZXRlIHR5cGVEZXBlbmRlbmNpZXNbcmF3VHlwZV07aWYoYXdhaXRpbmdEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocmF3VHlwZSkpe3ZhciBjYWxsYmFja3M9YXdhaXRpbmdEZXBlbmRlbmNpZXNbcmF3VHlwZV07ZGVsZXRlIGF3YWl0aW5nRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNiKXtjYigpfSl9fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Jvb2wocmF3VHlwZSxuYW1lLHNpemUsdHJ1ZVZhbHVlLGZhbHNlVmFsdWUpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHd0KXtyZXR1cm4hIXd0fSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7cmV0dXJuIG8/dHJ1ZVZhbHVlOmZhbHNlVmFsdWV9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmZ1bmN0aW9uKHBvaW50ZXIpe3ZhciBoZWFwO2lmKHNpemU9PT0xKXtoZWFwPUhFQVA4fWVsc2UgaWYoc2l6ZT09PTIpe2hlYXA9SEVBUDE2fWVsc2UgaWYoc2l6ZT09PTQpe2hlYXA9SEVBUDMyfWVsc2V7dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBib29sZWFuIHR5cGUgc2l6ZTogIituYW1lKX1yZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oaGVhcFtwb2ludGVyPj5zaGlmdF0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfWZ1bmN0aW9uIENsYXNzSGFuZGxlX2lzQWxpYXNPZihvdGhlcil7aWYoISh0aGlzIGluc3RhbmNlb2YgQ2xhc3NIYW5kbGUpKXtyZXR1cm4gZmFsc2V9aWYoIShvdGhlciBpbnN0YW5jZW9mIENsYXNzSGFuZGxlKSl7cmV0dXJuIGZhbHNlfXZhciBsZWZ0Q2xhc3M9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczt2YXIgbGVmdD10aGlzLiQkLnB0cjt2YXIgcmlnaHRDbGFzcz1vdGhlci4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczt2YXIgcmlnaHQ9b3RoZXIuJCQucHRyO3doaWxlKGxlZnRDbGFzcy5iYXNlQ2xhc3Mpe2xlZnQ9bGVmdENsYXNzLnVwY2FzdChsZWZ0KTtsZWZ0Q2xhc3M9bGVmdENsYXNzLmJhc2VDbGFzc313aGlsZShyaWdodENsYXNzLmJhc2VDbGFzcyl7cmlnaHQ9cmlnaHRDbGFzcy51cGNhc3QocmlnaHQpO3JpZ2h0Q2xhc3M9cmlnaHRDbGFzcy5iYXNlQ2xhc3N9cmV0dXJuIGxlZnRDbGFzcz09PXJpZ2h0Q2xhc3MmJmxlZnQ9PT1yaWdodH1mdW5jdGlvbiBzaGFsbG93Q29weUludGVybmFsUG9pbnRlcihvKXtyZXR1cm57Y291bnQ6by5jb3VudCxkZWxldGVTY2hlZHVsZWQ6by5kZWxldGVTY2hlZHVsZWQscHJlc2VydmVQb2ludGVyT25EZWxldGU6by5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSxwdHI6by5wdHIscHRyVHlwZTpvLnB0clR5cGUsc21hcnRQdHI6by5zbWFydFB0cixzbWFydFB0clR5cGU6by5zbWFydFB0clR5cGV9fWZ1bmN0aW9uIHRocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZChvYmope2Z1bmN0aW9uIGdldEluc3RhbmNlVHlwZU5hbWUoaGFuZGxlKXtyZXR1cm4gaGFuZGxlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLm5hbWV9dGhyb3dCaW5kaW5nRXJyb3IoZ2V0SW5zdGFuY2VUeXBlTmFtZShvYmopKyIgaW5zdGFuY2UgYWxyZWFkeSBkZWxldGVkIil9dmFyIGZpbmFsaXphdGlvbkdyb3VwPWZhbHNlO2Z1bmN0aW9uIGRldGFjaEZpbmFsaXplcihoYW5kbGUpe31mdW5jdGlvbiBydW5EZXN0cnVjdG9yKCQkKXtpZigkJC5zbWFydFB0cil7JCQuc21hcnRQdHJUeXBlLnJhd0Rlc3RydWN0b3IoJCQuc21hcnRQdHIpfWVsc2V7JCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MucmF3RGVzdHJ1Y3RvcigkJC5wdHIpfX1mdW5jdGlvbiByZWxlYXNlQ2xhc3NIYW5kbGUoJCQpeyQkLmNvdW50LnZhbHVlLT0xO3ZhciB0b0RlbGV0ZT0wPT09JCQuY291bnQudmFsdWU7aWYodG9EZWxldGUpe3J1bkRlc3RydWN0b3IoJCQpfX1mdW5jdGlvbiBhdHRhY2hGaW5hbGl6ZXIoaGFuZGxlKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBGaW5hbGl6YXRpb25Hcm91cCl7YXR0YWNoRmluYWxpemVyPWZ1bmN0aW9uKGhhbmRsZSl7cmV0dXJuIGhhbmRsZX07cmV0dXJuIGhhbmRsZX1maW5hbGl6YXRpb25Hcm91cD1uZXcgRmluYWxpemF0aW9uR3JvdXAoZnVuY3Rpb24oaXRlcil7Zm9yKHZhciByZXN1bHQ9aXRlci5uZXh0KCk7IXJlc3VsdC5kb25lO3Jlc3VsdD1pdGVyLm5leHQoKSl7dmFyICQkPXJlc3VsdC52YWx1ZTtpZighJCQucHRyKXtjb25zb2xlLndhcm4oIm9iamVjdCBhbHJlYWR5IGRlbGV0ZWQ6ICIrJCQucHRyKX1lbHNle3JlbGVhc2VDbGFzc0hhbmRsZSgkJCl9fX0pO2F0dGFjaEZpbmFsaXplcj1mdW5jdGlvbihoYW5kbGUpe2ZpbmFsaXphdGlvbkdyb3VwLnJlZ2lzdGVyKGhhbmRsZSxoYW5kbGUuJCQsaGFuZGxlLiQkKTtyZXR1cm4gaGFuZGxlfTtkZXRhY2hGaW5hbGl6ZXI9ZnVuY3Rpb24oaGFuZGxlKXtmaW5hbGl6YXRpb25Hcm91cC51bnJlZ2lzdGVyKGhhbmRsZS4kJCl9O3JldHVybiBhdHRhY2hGaW5hbGl6ZXIoaGFuZGxlKX1mdW5jdGlvbiBDbGFzc0hhbmRsZV9jbG9uZSgpe2lmKCF0aGlzLiQkLnB0cil7dGhyb3dJbnN0YW5jZUFscmVhZHlEZWxldGVkKHRoaXMpfWlmKHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3RoaXMuJCQuY291bnQudmFsdWUrPTE7cmV0dXJuIHRoaXN9ZWxzZXt2YXIgY2xvbmU9YXR0YWNoRmluYWxpemVyKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLHskJDp7dmFsdWU6c2hhbGxvd0NvcHlJbnRlcm5hbFBvaW50ZXIodGhpcy4kJCl9fSkpO2Nsb25lLiQkLmNvdW50LnZhbHVlKz0xO2Nsb25lLiQkLmRlbGV0ZVNjaGVkdWxlZD1mYWxzZTtyZXR1cm4gY2xvbmV9fWZ1bmN0aW9uIENsYXNzSGFuZGxlX2RlbGV0ZSgpe2lmKCF0aGlzLiQkLnB0cil7dGhyb3dJbnN0YW5jZUFscmVhZHlEZWxldGVkKHRoaXMpfWlmKHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSl7dGhyb3dCaW5kaW5nRXJyb3IoIk9iamVjdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgZGVsZXRpb24iKX1kZXRhY2hGaW5hbGl6ZXIodGhpcyk7cmVsZWFzZUNsYXNzSGFuZGxlKHRoaXMuJCQpO2lmKCF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aGlzLiQkLnNtYXJ0UHRyPXVuZGVmaW5lZDt0aGlzLiQkLnB0cj11bmRlZmluZWR9fWZ1bmN0aW9uIENsYXNzSGFuZGxlX2lzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn12YXIgZGVsYXlGdW5jdGlvbj11bmRlZmluZWQ7dmFyIGRlbGV0aW9uUXVldWU9W107ZnVuY3Rpb24gZmx1c2hQZW5kaW5nRGVsZXRlcygpe3doaWxlKGRlbGV0aW9uUXVldWUubGVuZ3RoKXt2YXIgb2JqPWRlbGV0aW9uUXVldWUucG9wKCk7b2JqLiQkLmRlbGV0ZVNjaGVkdWxlZD1mYWxzZTtvYmpbImRlbGV0ZSJdKCl9fWZ1bmN0aW9uIENsYXNzSGFuZGxlX2RlbGV0ZUxhdGVyKCl7aWYoIXRoaXMuJCQucHRyKXt0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQodGhpcyl9aWYodGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aHJvd0JpbmRpbmdFcnJvcigiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpfWRlbGV0aW9uUXVldWUucHVzaCh0aGlzKTtpZihkZWxldGlvblF1ZXVlLmxlbmd0aD09PTEmJmRlbGF5RnVuY3Rpb24pe2RlbGF5RnVuY3Rpb24oZmx1c2hQZW5kaW5nRGVsZXRlcyl9dGhpcy4kJC5kZWxldGVTY2hlZHVsZWQ9dHJ1ZTtyZXR1cm4gdGhpc31mdW5jdGlvbiBpbml0X0NsYXNzSGFuZGxlKCl7Q2xhc3NIYW5kbGUucHJvdG90eXBlWyJpc0FsaWFzT2YiXT1DbGFzc0hhbmRsZV9pc0FsaWFzT2Y7Q2xhc3NIYW5kbGUucHJvdG90eXBlWyJjbG9uZSJdPUNsYXNzSGFuZGxlX2Nsb25lO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiZGVsZXRlIl09Q2xhc3NIYW5kbGVfZGVsZXRlO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNEZWxldGVkIl09Q2xhc3NIYW5kbGVfaXNEZWxldGVkO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiZGVsZXRlTGF0ZXIiXT1DbGFzc0hhbmRsZV9kZWxldGVMYXRlcn1mdW5jdGlvbiBDbGFzc0hhbmRsZSgpe312YXIgcmVnaXN0ZXJlZFBvaW50ZXJzPXt9O2Z1bmN0aW9uIGVuc3VyZU92ZXJsb2FkVGFibGUocHJvdG8sbWV0aG9kTmFtZSxodW1hbk5hbWUpe2lmKHVuZGVmaW5lZD09PXByb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGUpe3ZhciBwcmV2RnVuYz1wcm90b1ttZXRob2ROYW1lXTtwcm90b1ttZXRob2ROYW1lXT1mdW5jdGlvbigpe2lmKCFwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGFyZ3VtZW50cy5sZW5ndGgpKXt0aHJvd0JpbmRpbmdFcnJvcigiRnVuY3Rpb24gJyIraHVtYW5OYW1lKyInIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIithcmd1bWVudHMubGVuZ3RoKyIpIC0gZXhwZWN0cyBvbmUgb2YgKCIrcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSsiKSEiKX1yZXR1cm4gcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmd1bWVudHMubGVuZ3RoXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGU9W107cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVtwcmV2RnVuYy5hcmdDb3VudF09cHJldkZ1bmN9fWZ1bmN0aW9uIGV4cG9zZVB1YmxpY1N5bWJvbChuYW1lLHZhbHVlLG51bUFyZ3VtZW50cyl7aWYoTW9kdWxlLmhhc093blByb3BlcnR5KG5hbWUpKXtpZih1bmRlZmluZWQ9PT1udW1Bcmd1bWVudHN8fHVuZGVmaW5lZCE9PU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlJiZ1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZVtudW1Bcmd1bWVudHNdKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICciK25hbWUrIicgdHdpY2UiKX1lbnN1cmVPdmVybG9hZFRhYmxlKE1vZHVsZSxuYW1lLG5hbWUpO2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShudW1Bcmd1bWVudHMpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIG11bHRpcGxlIG92ZXJsb2FkcyBvZiBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIitudW1Bcmd1bWVudHMrIikhIil9TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXT12YWx1ZX1lbHNle01vZHVsZVtuYW1lXT12YWx1ZTtpZih1bmRlZmluZWQhPT1udW1Bcmd1bWVudHMpe01vZHVsZVtuYW1lXS5udW1Bcmd1bWVudHM9bnVtQXJndW1lbnRzfX19ZnVuY3Rpb24gUmVnaXN0ZXJlZENsYXNzKG5hbWUsY29uc3RydWN0b3IsaW5zdGFuY2VQcm90b3R5cGUscmF3RGVzdHJ1Y3RvcixiYXNlQ2xhc3MsZ2V0QWN0dWFsVHlwZSx1cGNhc3QsZG93bmNhc3Qpe3RoaXMubmFtZT1uYW1lO3RoaXMuY29uc3RydWN0b3I9Y29uc3RydWN0b3I7dGhpcy5pbnN0YW5jZVByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt0aGlzLnJhd0Rlc3RydWN0b3I9cmF3RGVzdHJ1Y3Rvcjt0aGlzLmJhc2VDbGFzcz1iYXNlQ2xhc3M7dGhpcy5nZXRBY3R1YWxUeXBlPWdldEFjdHVhbFR5cGU7dGhpcy51cGNhc3Q9dXBjYXN0O3RoaXMuZG93bmNhc3Q9ZG93bmNhc3Q7dGhpcy5wdXJlVmlydHVhbEZ1bmN0aW9ucz1bXX1mdW5jdGlvbiB1cGNhc3RQb2ludGVyKHB0cixwdHJDbGFzcyxkZXNpcmVkQ2xhc3Mpe3doaWxlKHB0ckNsYXNzIT09ZGVzaXJlZENsYXNzKXtpZighcHRyQ2xhc3MudXBjYXN0KXt0aHJvd0JpbmRpbmdFcnJvcigiRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAiK2Rlc2lyZWRDbGFzcy5uYW1lKyIsIGdvdCBhbiBpbnN0YW5jZSBvZiAiK3B0ckNsYXNzLm5hbWUpfXB0cj1wdHJDbGFzcy51cGNhc3QocHRyKTtwdHJDbGFzcz1wdHJDbGFzcy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiBjb25zdE5vU21hcnRQdHJSYXdQb2ludGVyVG9XaXJlVHlwZShkZXN0cnVjdG9ycyxoYW5kbGUpe2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1yZXR1cm4gMH1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9dmFyIGhhbmRsZUNsYXNzPWhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczt2YXIgcHRyPXVwY2FzdFBvaW50ZXIoaGFuZGxlLiQkLnB0cixoYW5kbGVDbGFzcyx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIHB0cn1mdW5jdGlvbiBnZW5lcmljUG9pbnRlclRvV2lyZVR5cGUoZGVzdHJ1Y3RvcnMsaGFuZGxlKXt2YXIgcHRyO2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1pZih0aGlzLmlzU21hcnRQb2ludGVyKXtwdHI9dGhpcy5yYXdDb25zdHJ1Y3RvcigpO2lmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IscHRyKX1yZXR1cm4gcHRyfWVsc2V7cmV0dXJuIDB9fWlmKCFoYW5kbGUuJCQpe3Rocm93QmluZGluZ0Vycm9yKCdDYW5ub3QgcGFzcyAiJytfZW1iaW5kX3JlcHIoaGFuZGxlKSsnIiBhcyBhICcrdGhpcy5uYW1lKX1pZighaGFuZGxlLiQkLnB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIrdGhpcy5uYW1lKX1pZighdGhpcy5pc0NvbnN0JiZoYW5kbGUuJCQucHRyVHlwZS5pc0NvbnN0KXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAiKyhoYW5kbGUuJCQuc21hcnRQdHJUeXBlP2hhbmRsZS4kJC5zbWFydFB0clR5cGUubmFtZTpoYW5kbGUuJCQucHRyVHlwZS5uYW1lKSsiIHRvIHBhcmFtZXRlciB0eXBlICIrdGhpcy5uYW1lKX12YXIgaGFuZGxlQ2xhc3M9aGFuZGxlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3B0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO2lmKHRoaXMuaXNTbWFydFBvaW50ZXIpe2lmKHVuZGVmaW5lZD09PWhhbmRsZS4kJC5zbWFydFB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3NpbmcgcmF3IHBvaW50ZXIgdG8gc21hcnQgcG9pbnRlciBpcyBpbGxlZ2FsIil9c3dpdGNoKHRoaXMuc2hhcmluZ1BvbGljeSl7Y2FzZSAwOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZT9oYW5kbGUuJCQuc21hcnRQdHJUeXBlLm5hbWU6aGFuZGxlLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9YnJlYWs7Y2FzZSAxOnB0cj1oYW5kbGUuJCQuc21hcnRQdHI7YnJlYWs7Y2FzZSAyOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dmFyIGNsb25lZEhhbmRsZT1oYW5kbGVbImNsb25lIl0oKTtwdHI9dGhpcy5yYXdTaGFyZShwdHIsX19lbXZhbF9yZWdpc3RlcihmdW5jdGlvbigpe2Nsb25lZEhhbmRsZVsiZGVsZXRlIl0oKX0pKTtpZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHB0cil9fWJyZWFrO2RlZmF1bHQ6dGhyb3dCaW5kaW5nRXJyb3IoIlVuc3VwcG9ydGluZyBzaGFyaW5nIHBvbGljeSIpfX1yZXR1cm4gcHRyfWZ1bmN0aW9uIG5vbkNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlKGRlc3RydWN0b3JzLGhhbmRsZSl7aWYoaGFuZGxlPT09bnVsbCl7aWYodGhpcy5pc1JlZmVyZW5jZSl7dGhyb3dCaW5kaW5nRXJyb3IoIm51bGwgaXMgbm90IGEgdmFsaWQgIit0aGlzLm5hbWUpfXJldHVybiAwfWlmKCFoYW5kbGUuJCQpe3Rocm93QmluZGluZ0Vycm9yKCdDYW5ub3QgcGFzcyAiJytfZW1iaW5kX3JlcHIoaGFuZGxlKSsnIiBhcyBhICcrdGhpcy5uYW1lKX1pZighaGFuZGxlLiQkLnB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIrdGhpcy5uYW1lKX1pZihoYW5kbGUuJCQucHRyVHlwZS5pc0NvbnN0KXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAiK2hhbmRsZS4kJC5wdHJUeXBlLm5hbWUrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9dmFyIGhhbmRsZUNsYXNzPWhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzczt2YXIgcHRyPXVwY2FzdFBvaW50ZXIoaGFuZGxlLiQkLnB0cixoYW5kbGVDbGFzcyx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIHB0cn1mdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcl9nZXRQb2ludGVlKHB0cil7aWYodGhpcy5yYXdHZXRQb2ludGVlKXtwdHI9dGhpcy5yYXdHZXRQb2ludGVlKHB0cil9cmV0dXJuIHB0cn1mdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcl9kZXN0cnVjdG9yKHB0cil7aWYodGhpcy5yYXdEZXN0cnVjdG9yKXt0aGlzLnJhd0Rlc3RydWN0b3IocHRyKX19ZnVuY3Rpb24gUmVnaXN0ZXJlZFBvaW50ZXJfZGVsZXRlT2JqZWN0KGhhbmRsZSl7aWYoaGFuZGxlIT09bnVsbCl7aGFuZGxlWyJkZWxldGUiXSgpfX1mdW5jdGlvbiBkb3duY2FzdFBvaW50ZXIocHRyLHB0ckNsYXNzLGRlc2lyZWRDbGFzcyl7aWYocHRyQ2xhc3M9PT1kZXNpcmVkQ2xhc3Mpe3JldHVybiBwdHJ9aWYodW5kZWZpbmVkPT09ZGVzaXJlZENsYXNzLmJhc2VDbGFzcyl7cmV0dXJuIG51bGx9dmFyIHJ2PWRvd25jYXN0UG9pbnRlcihwdHIscHRyQ2xhc3MsZGVzaXJlZENsYXNzLmJhc2VDbGFzcyk7aWYocnY9PT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gZGVzaXJlZENsYXNzLmRvd25jYXN0KHJ2KX1mdW5jdGlvbiBnZXRJbmhlcml0ZWRJbnN0YW5jZUNvdW50KCl7cmV0dXJuIE9iamVjdC5rZXlzKHJlZ2lzdGVyZWRJbnN0YW5jZXMpLmxlbmd0aH1mdW5jdGlvbiBnZXRMaXZlSW5oZXJpdGVkSW5zdGFuY2VzKCl7dmFyIHJ2PVtdO2Zvcih2YXIgayBpbiByZWdpc3RlcmVkSW5zdGFuY2VzKXtpZihyZWdpc3RlcmVkSW5zdGFuY2VzLmhhc093blByb3BlcnR5KGspKXtydi5wdXNoKHJlZ2lzdGVyZWRJbnN0YW5jZXNba10pfX1yZXR1cm4gcnZ9ZnVuY3Rpb24gc2V0RGVsYXlGdW5jdGlvbihmbil7ZGVsYXlGdW5jdGlvbj1mbjtpZihkZWxldGlvblF1ZXVlLmxlbmd0aCYmZGVsYXlGdW5jdGlvbil7ZGVsYXlGdW5jdGlvbihmbHVzaFBlbmRpbmdEZWxldGVzKX19ZnVuY3Rpb24gaW5pdF9lbWJpbmQoKXtNb2R1bGVbImdldEluaGVyaXRlZEluc3RhbmNlQ291bnQiXT1nZXRJbmhlcml0ZWRJbnN0YW5jZUNvdW50O01vZHVsZVsiZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcyJdPWdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM7TW9kdWxlWyJmbHVzaFBlbmRpbmdEZWxldGVzIl09Zmx1c2hQZW5kaW5nRGVsZXRlcztNb2R1bGVbInNldERlbGF5RnVuY3Rpb24iXT1zZXREZWxheUZ1bmN0aW9ufXZhciByZWdpc3RlcmVkSW5zdGFuY2VzPXt9O2Z1bmN0aW9uIGdldEJhc2VzdFBvaW50ZXIoY2xhc3NfLHB0cil7aWYocHRyPT09dW5kZWZpbmVkKXt0aHJvd0JpbmRpbmdFcnJvcigicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIil9d2hpbGUoY2xhc3NfLmJhc2VDbGFzcyl7cHRyPWNsYXNzXy51cGNhc3QocHRyKTtjbGFzc189Y2xhc3NfLmJhc2VDbGFzc31yZXR1cm4gcHRyfWZ1bmN0aW9uIGdldEluaGVyaXRlZEluc3RhbmNlKGNsYXNzXyxwdHIpe3B0cj1nZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpO3JldHVybiByZWdpc3RlcmVkSW5zdGFuY2VzW3B0cl19ZnVuY3Rpb24gbWFrZUNsYXNzSGFuZGxlKHByb3RvdHlwZSxyZWNvcmQpe2lmKCFyZWNvcmQucHRyVHlwZXx8IXJlY29yZC5wdHIpe3Rocm93SW50ZXJuYWxFcnJvcigibWFrZUNsYXNzSGFuZGxlIHJlcXVpcmVzIHB0ciBhbmQgcHRyVHlwZSIpfXZhciBoYXNTbWFydFB0clR5cGU9ISFyZWNvcmQuc21hcnRQdHJUeXBlO3ZhciBoYXNTbWFydFB0cj0hIXJlY29yZC5zbWFydFB0cjtpZihoYXNTbWFydFB0clR5cGUhPT1oYXNTbWFydFB0cil7dGhyb3dJbnRlcm5hbEVycm9yKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKX1yZWNvcmQuY291bnQ9e3ZhbHVlOjF9O3JldHVybiBhdHRhY2hGaW5hbGl6ZXIoT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUseyQkOnt2YWx1ZTpyZWNvcmR9fSkpfWZ1bmN0aW9uIFJlZ2lzdGVyZWRQb2ludGVyX2Zyb21XaXJlVHlwZShwdHIpe3ZhciByYXdQb2ludGVyPXRoaXMuZ2V0UG9pbnRlZShwdHIpO2lmKCFyYXdQb2ludGVyKXt0aGlzLmRlc3RydWN0b3IocHRyKTtyZXR1cm4gbnVsbH12YXIgcmVnaXN0ZXJlZEluc3RhbmNlPWdldEluaGVyaXRlZEluc3RhbmNlKHRoaXMucmVnaXN0ZXJlZENsYXNzLHJhd1BvaW50ZXIpO2lmKHVuZGVmaW5lZCE9PXJlZ2lzdGVyZWRJbnN0YW5jZSl7aWYoMD09PXJlZ2lzdGVyZWRJbnN0YW5jZS4kJC5jb3VudC52YWx1ZSl7cmVnaXN0ZXJlZEluc3RhbmNlLiQkLnB0cj1yYXdQb2ludGVyO3JlZ2lzdGVyZWRJbnN0YW5jZS4kJC5zbWFydFB0cj1wdHI7cmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpfWVsc2V7dmFyIHJ2PXJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpO3RoaXMuZGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn19ZnVuY3Rpb24gbWFrZURlZmF1bHRIYW5kbGUoKXtpZih0aGlzLmlzU21hcnRQb2ludGVyKXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnJhd1BvaW50ZXIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOnB0cn0pfX12YXIgYWN0dWFsVHlwZT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHJhd1BvaW50ZXIpO3ZhciByZWdpc3RlcmVkUG9pbnRlclJlY29yZD1yZWdpc3RlcmVkUG9pbnRlcnNbYWN0dWFsVHlwZV07aWYoIXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkKXtyZXR1cm4gbWFrZURlZmF1bHRIYW5kbGUuY2FsbCh0aGlzKX12YXIgdG9UeXBlO2lmKHRoaXMuaXNDb25zdCl7dG9UeXBlPXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkLmNvbnN0UG9pbnRlclR5cGV9ZWxzZXt0b1R5cGU9cmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQucG9pbnRlclR5cGV9dmFyIGRwPWRvd25jYXN0UG9pbnRlcihyYXdQb2ludGVyLHRoaXMucmVnaXN0ZXJlZENsYXNzLHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MpO2lmKGRwPT09bnVsbCl7cmV0dXJuIG1ha2VEZWZhdWx0SGFuZGxlLmNhbGwodGhpcyl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0b1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRvVHlwZSxwdHI6ZHAsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6dG9UeXBlLHB0cjpkcH0pfX1mdW5jdGlvbiBpbml0X1JlZ2lzdGVyZWRQb2ludGVyKCl7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlLmdldFBvaW50ZWU9UmVnaXN0ZXJlZFBvaW50ZXJfZ2V0UG9pbnRlZTtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGUuZGVzdHJ1Y3Rvcj1SZWdpc3RlcmVkUG9pbnRlcl9kZXN0cnVjdG9yO1JlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZVsiYXJnUGFja0FkdmFuY2UiXT04O1JlZ2lzdGVyZWRQb2ludGVyLnByb3RvdHlwZVsicmVhZFZhbHVlRnJvbVBvaW50ZXIiXT1zaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcjtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImRlbGV0ZU9iamVjdCJdPVJlZ2lzdGVyZWRQb2ludGVyX2RlbGV0ZU9iamVjdDtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImZyb21XaXJlVHlwZSJdPVJlZ2lzdGVyZWRQb2ludGVyX2Zyb21XaXJlVHlwZX1mdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHJlZ2lzdGVyZWRDbGFzcyxpc1JlZmVyZW5jZSxpc0NvbnN0LGlzU21hcnRQb2ludGVyLHBvaW50ZWVUeXBlLHNoYXJpbmdQb2xpY3kscmF3R2V0UG9pbnRlZSxyYXdDb25zdHJ1Y3RvcixyYXdTaGFyZSxyYXdEZXN0cnVjdG9yKXt0aGlzLm5hbWU9bmFtZTt0aGlzLnJlZ2lzdGVyZWRDbGFzcz1yZWdpc3RlcmVkQ2xhc3M7dGhpcy5pc1JlZmVyZW5jZT1pc1JlZmVyZW5jZTt0aGlzLmlzQ29uc3Q9aXNDb25zdDt0aGlzLmlzU21hcnRQb2ludGVyPWlzU21hcnRQb2ludGVyO3RoaXMucG9pbnRlZVR5cGU9cG9pbnRlZVR5cGU7dGhpcy5zaGFyaW5nUG9saWN5PXNoYXJpbmdQb2xpY3k7dGhpcy5yYXdHZXRQb2ludGVlPXJhd0dldFBvaW50ZWU7dGhpcy5yYXdDb25zdHJ1Y3Rvcj1yYXdDb25zdHJ1Y3Rvcjt0aGlzLnJhd1NoYXJlPXJhd1NoYXJlO3RoaXMucmF3RGVzdHJ1Y3Rvcj1yYXdEZXN0cnVjdG9yO2lmKCFpc1NtYXJ0UG9pbnRlciYmcmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcz09PXVuZGVmaW5lZCl7aWYoaXNDb25zdCl7dGhpc1sidG9XaXJlVHlwZSJdPWNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlO3RoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGx9ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09bm9uQ29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGU7dGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbH19ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09Z2VuZXJpY1BvaW50ZXJUb1dpcmVUeXBlfX1mdW5jdGlvbiByZXBsYWNlUHVibGljU3ltYm9sKG5hbWUsdmFsdWUsbnVtQXJndW1lbnRzKXtpZighTW9kdWxlLmhhc093blByb3BlcnR5KG5hbWUpKXt0aHJvd0ludGVybmFsRXJyb3IoIlJlcGxhY2luZyBub25leGlzdGFudCBwdWJsaWMgc3ltYm9sIil9aWYodW5kZWZpbmVkIT09TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGUmJnVuZGVmaW5lZCE9PW51bUFyZ3VtZW50cyl7TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXT12YWx1ZX1lbHNle01vZHVsZVtuYW1lXT12YWx1ZTtNb2R1bGVbbmFtZV0uYXJnQ291bnQ9bnVtQXJndW1lbnRzfX1mdW5jdGlvbiBlbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihzaWduYXR1cmUscmF3RnVuY3Rpb24pe3NpZ25hdHVyZT1yZWFkTGF0aW4xU3RyaW5nKHNpZ25hdHVyZSk7ZnVuY3Rpb24gbWFrZUR5bkNhbGxlcihkeW5DYWxsKXt2YXIgYXJncz1bXTtmb3IodmFyIGk9MTtpPHNpZ25hdHVyZS5sZW5ndGg7KytpKXthcmdzLnB1c2goImEiK2kpfXZhciBuYW1lPSJkeW5DYWxsXyIrc2lnbmF0dXJlKyJfIityYXdGdW5jdGlvbjt2YXIgYm9keT0icmV0dXJuIGZ1bmN0aW9uICIrbmFtZSsiKCIrYXJncy5qb2luKCIsICIpKyIpIHtcbiI7Ym9keSs9IiAgICByZXR1cm4gZHluQ2FsbChyYXdGdW5jdGlvbiIrKGFyZ3MubGVuZ3RoPyIsICI6IiIpK2FyZ3Muam9pbigiLCAiKSsiKTtcbiI7Ym9keSs9In07XG4iO3JldHVybiBuZXcgRnVuY3Rpb24oImR5bkNhbGwiLCJyYXdGdW5jdGlvbiIsYm9keSkoZHluQ2FsbCxyYXdGdW5jdGlvbil9dmFyIGRjPU1vZHVsZVsiZHluQ2FsbF8iK3NpZ25hdHVyZV07dmFyIGZwPW1ha2VEeW5DYWxsZXIoZGMpO2lmKHR5cGVvZiBmcCE9PSJmdW5jdGlvbiIpe3Rocm93QmluZGluZ0Vycm9yKCJ1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgIitzaWduYXR1cmUrIjogIityYXdGdW5jdGlvbil9cmV0dXJuIGZwfXZhciBVbmJvdW5kVHlwZUVycm9yPXVuZGVmaW5lZDtmdW5jdGlvbiBnZXRUeXBlTmFtZSh0eXBlKXt2YXIgcHRyPV9fX2dldFR5cGVOYW1lKHR5cGUpO3ZhciBydj1yZWFkTGF0aW4xU3RyaW5nKHB0cik7X2ZyZWUocHRyKTtyZXR1cm4gcnZ9ZnVuY3Rpb24gdGhyb3dVbmJvdW5kVHlwZUVycm9yKG1lc3NhZ2UsdHlwZXMpe3ZhciB1bmJvdW5kVHlwZXM9W107dmFyIHNlZW49e307ZnVuY3Rpb24gdmlzaXQodHlwZSl7aWYoc2Vlblt0eXBlXSl7cmV0dXJufWlmKHJlZ2lzdGVyZWRUeXBlc1t0eXBlXSl7cmV0dXJufWlmKHR5cGVEZXBlbmRlbmNpZXNbdHlwZV0pe3R5cGVEZXBlbmRlbmNpZXNbdHlwZV0uZm9yRWFjaCh2aXNpdCk7cmV0dXJufXVuYm91bmRUeXBlcy5wdXNoKHR5cGUpO3NlZW5bdHlwZV09dHJ1ZX10eXBlcy5mb3JFYWNoKHZpc2l0KTt0aHJvdyBuZXcgVW5ib3VuZFR5cGVFcnJvcihtZXNzYWdlKyI6ICIrdW5ib3VuZFR5cGVzLm1hcChnZXRUeXBlTmFtZSkuam9pbihbIiwgIl0pKX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcyhyYXdUeXBlLHJhd1BvaW50ZXJUeXBlLHJhd0NvbnN0UG9pbnRlclR5cGUsYmFzZUNsYXNzUmF3VHlwZSxnZXRBY3R1YWxUeXBlU2lnbmF0dXJlLGdldEFjdHVhbFR5cGUsdXBjYXN0U2lnbmF0dXJlLHVwY2FzdCxkb3duY2FzdFNpZ25hdHVyZSxkb3duY2FzdCxuYW1lLGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcil7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO2dldEFjdHVhbFR5cGU9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oZ2V0QWN0dWFsVHlwZVNpZ25hdHVyZSxnZXRBY3R1YWxUeXBlKTtpZih1cGNhc3Qpe3VwY2FzdD1lbWJpbmRfX3JlcXVpcmVGdW5jdGlvbih1cGNhc3RTaWduYXR1cmUsdXBjYXN0KX1pZihkb3duY2FzdCl7ZG93bmNhc3Q9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oZG93bmNhc3RTaWduYXR1cmUsZG93bmNhc3QpfXJhd0Rlc3RydWN0b3I9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oZGVzdHJ1Y3RvclNpZ25hdHVyZSxyYXdEZXN0cnVjdG9yKTt2YXIgbGVnYWxGdW5jdGlvbk5hbWU9bWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpO2V4cG9zZVB1YmxpY1N5bWJvbChsZWdhbEZ1bmN0aW9uTmFtZSxmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiK25hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsW2Jhc2VDbGFzc1Jhd1R5cGVdKX0pO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtyYXdUeXBlLHJhd1BvaW50ZXJUeXBlLHJhd0NvbnN0UG9pbnRlclR5cGVdLGJhc2VDbGFzc1Jhd1R5cGU/W2Jhc2VDbGFzc1Jhd1R5cGVdOltdLGZ1bmN0aW9uKGJhc2Upe2Jhc2U9YmFzZVswXTt2YXIgYmFzZUNsYXNzO3ZhciBiYXNlUHJvdG90eXBlO2lmKGJhc2VDbGFzc1Jhd1R5cGUpe2Jhc2VDbGFzcz1iYXNlLnJlZ2lzdGVyZWRDbGFzcztiYXNlUHJvdG90eXBlPWJhc2VDbGFzcy5pbnN0YW5jZVByb3RvdHlwZX1lbHNle2Jhc2VQcm90b3R5cGU9Q2xhc3NIYW5kbGUucHJvdG90eXBlfXZhciBjb25zdHJ1Y3Rvcj1jcmVhdGVOYW1lZEZ1bmN0aW9uKGxlZ2FsRnVuY3Rpb25OYW1lLGZ1bmN0aW9uKCl7aWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpIT09aW5zdGFuY2VQcm90b3R5cGUpe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IoIlVzZSAnbmV3JyB0byBjb25zdHJ1Y3QgIituYW1lKX1pZih1bmRlZmluZWQ9PT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcihuYW1lKyIgaGFzIG5vIGFjY2Vzc2libGUgY29uc3RydWN0b3IiKX12YXIgYm9keT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmd1bWVudHMubGVuZ3RoXTtpZih1bmRlZmluZWQ9PT1ib2R5KXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJUcmllZCB0byBpbnZva2UgY3RvciBvZiAiK25hbWUrIiB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrYXJndW1lbnRzLmxlbmd0aCsiKSAtIGV4cGVjdGVkICgiK09iamVjdC5rZXlzKHJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KS50b1N0cmluZygpKyIpIHBhcmFtZXRlcnMgaW5zdGVhZCEiKX1yZXR1cm4gYm9keS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTt2YXIgaW5zdGFuY2VQcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiYXNlUHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6Y29uc3RydWN0b3J9fSk7Y29uc3RydWN0b3IucHJvdG90eXBlPWluc3RhbmNlUHJvdG90eXBlO3ZhciByZWdpc3RlcmVkQ2xhc3M9bmV3IFJlZ2lzdGVyZWRDbGFzcyhuYW1lLGNvbnN0cnVjdG9yLGluc3RhbmNlUHJvdG90eXBlLHJhd0Rlc3RydWN0b3IsYmFzZUNsYXNzLGdldEFjdHVhbFR5cGUsdXBjYXN0LGRvd25jYXN0KTt2YXIgcmVmZXJlbmNlQ29udmVydGVyPW5ldyBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHJlZ2lzdGVyZWRDbGFzcyx0cnVlLGZhbHNlLGZhbHNlKTt2YXIgcG9pbnRlckNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSsiKiIscmVnaXN0ZXJlZENsYXNzLGZhbHNlLGZhbHNlLGZhbHNlKTt2YXIgY29uc3RQb2ludGVyQ29udmVydGVyPW5ldyBSZWdpc3RlcmVkUG9pbnRlcihuYW1lKyIgY29uc3QqIixyZWdpc3RlcmVkQ2xhc3MsZmFsc2UsdHJ1ZSxmYWxzZSk7cmVnaXN0ZXJlZFBvaW50ZXJzW3Jhd1R5cGVdPXtwb2ludGVyVHlwZTpwb2ludGVyQ29udmVydGVyLGNvbnN0UG9pbnRlclR5cGU6Y29uc3RQb2ludGVyQ29udmVydGVyfTtyZXBsYWNlUHVibGljU3ltYm9sKGxlZ2FsRnVuY3Rpb25OYW1lLGNvbnN0cnVjdG9yKTtyZXR1cm5bcmVmZXJlbmNlQ29udmVydGVyLHBvaW50ZXJDb252ZXJ0ZXIsY29uc3RQb2ludGVyQ29udmVydGVyXX0pfWZ1bmN0aW9uIGhlYXAzMlZlY3RvclRvQXJyYXkoY291bnQsZmlyc3RFbGVtZW50KXt2YXIgYXJyYXk9W107Zm9yKHZhciBpPTA7aTxjb3VudDtpKyspe2FycmF5LnB1c2goSEVBUDMyWyhmaXJzdEVsZW1lbnQ+PjIpK2ldKX1yZXR1cm4gYXJyYXl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IocmF3Q2xhc3NUeXBlLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLGludm9rZXIscmF3Q29uc3RydWN0b3Ipe2Fzc2VydChhcmdDb3VudD4wKTt2YXIgcmF3QXJnVHlwZXM9aGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIpO2ludm9rZXI9ZW1iaW5kX19yZXF1aXJlRnVuY3Rpb24oaW52b2tlclNpZ25hdHVyZSxpbnZva2VyKTt2YXIgYXJncz1bcmF3Q29uc3RydWN0b3JdO3ZhciBkZXN0cnVjdG9ycz1bXTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbcmF3Q2xhc3NUeXBlXSxmdW5jdGlvbihjbGFzc1R5cGUpe2NsYXNzVHlwZT1jbGFzc1R5cGVbMF07dmFyIGh1bWFuTmFtZT0iY29uc3RydWN0b3IgIitjbGFzc1R5cGUubmFtZTtpZih1bmRlZmluZWQ9PT1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHkpe2NsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keT1bXX1pZih1bmRlZmluZWQhPT1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbYXJnQ291bnQtMV0pe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBjb25zdHJ1Y3RvcnMgd2l0aCBpZGVudGljYWwgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrKGFyZ0NvdW50LTEpKyIpIGZvciBjbGFzcyAnIitjbGFzc1R5cGUubmFtZSsiJyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hIil9Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdPWZ1bmN0aW9uIHVuYm91bmRUeXBlSGFuZGxlcigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiK2NsYXNzVHlwZS5uYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLHJhd0FyZ1R5cGVzKX07d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10scmF3QXJnVHlwZXMsZnVuY3Rpb24oYXJnVHlwZXMpe2NsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmdDb3VudC0xXT1mdW5jdGlvbiBjb25zdHJ1Y3Rvcl9ib2R5KCl7aWYoYXJndW1lbnRzLmxlbmd0aCE9PWFyZ0NvdW50LTEpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsiIGNhbGxlZCB3aXRoICIrYXJndW1lbnRzLmxlbmd0aCsiIGFyZ3VtZW50cywgZXhwZWN0ZWQgIisoYXJnQ291bnQtMSkpfWRlc3RydWN0b3JzLmxlbmd0aD0wO2FyZ3MubGVuZ3RoPWFyZ0NvdW50O2Zvcih2YXIgaT0xO2k8YXJnQ291bnQ7KytpKXthcmdzW2ldPWFyZ1R5cGVzW2ldWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsYXJndW1lbnRzW2ktMV0pfXZhciBwdHI9aW52b2tlci5hcHBseShudWxsLGFyZ3MpO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKTtyZXR1cm4gYXJnVHlwZXNbMF1bImZyb21XaXJlVHlwZSJdKHB0cil9O3JldHVybltdfSk7cmV0dXJuW119KX1mdW5jdGlvbiBuZXdfKGNvbnN0cnVjdG9yLGFyZ3VtZW50TGlzdCl7aWYoIShjb25zdHJ1Y3RvciBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigibmV3XyBjYWxsZWQgd2l0aCBjb25zdHJ1Y3RvciB0eXBlICIrdHlwZW9mIGNvbnN0cnVjdG9yKyIgd2hpY2ggaXMgbm90IGEgZnVuY3Rpb24iKX12YXIgZHVtbXk9Y3JlYXRlTmFtZWRGdW5jdGlvbihjb25zdHJ1Y3Rvci5uYW1lfHwidW5rbm93bkZ1bmN0aW9uTmFtZSIsZnVuY3Rpb24oKXt9KTtkdW1teS5wcm90b3R5cGU9Y29uc3RydWN0b3IucHJvdG90eXBlO3ZhciBvYmo9bmV3IGR1bW15O3ZhciByPWNvbnN0cnVjdG9yLmFwcGx5KG9iaixhcmd1bWVudExpc3QpO3JldHVybiByIGluc3RhbmNlb2YgT2JqZWN0P3I6b2JqfWZ1bmN0aW9uIGNyYWZ0SW52b2tlckZ1bmN0aW9uKGh1bWFuTmFtZSxhcmdUeXBlcyxjbGFzc1R5cGUsY3BwSW52b2tlckZ1bmMsY3BwVGFyZ2V0RnVuYyl7dmFyIGFyZ0NvdW50PWFyZ1R5cGVzLmxlbmd0aDtpZihhcmdDb3VudDwyKXt0aHJvd0JpbmRpbmdFcnJvcigiYXJnVHlwZXMgYXJyYXkgc2l6ZSBtaXNtYXRjaCEgTXVzdCBhdCBsZWFzdCBnZXQgcmV0dXJuIHZhbHVlIGFuZCAndGhpcycgdHlwZXMhIil9dmFyIGlzQ2xhc3NNZXRob2RGdW5jPWFyZ1R5cGVzWzFdIT09bnVsbCYmY2xhc3NUeXBlIT09bnVsbDt2YXIgbmVlZHNEZXN0cnVjdG9yU3RhY2s9ZmFsc2U7Zm9yKHZhciBpPTE7aTxhcmdUeXBlcy5sZW5ndGg7KytpKXtpZihhcmdUeXBlc1tpXSE9PW51bGwmJmFyZ1R5cGVzW2ldLmRlc3RydWN0b3JGdW5jdGlvbj09PXVuZGVmaW5lZCl7bmVlZHNEZXN0cnVjdG9yU3RhY2s9dHJ1ZTticmVha319dmFyIHJldHVybnM9YXJnVHlwZXNbMF0ubmFtZSE9PSJ2b2lkIjt2YXIgYXJnc0xpc3Q9IiI7dmFyIGFyZ3NMaXN0V2lyZWQ9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0yOysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpO2FyZ3NMaXN0V2lyZWQrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpKyJXaXJlZCJ9dmFyIGludm9rZXJGbkJvZHk9InJldHVybiBmdW5jdGlvbiAiK21ha2VMZWdhbEZ1bmN0aW9uTmFtZShodW1hbk5hbWUpKyIoIithcmdzTGlzdCsiKSB7XG4iKyJpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gIisoYXJnQ291bnQtMikrIikge1xuIisidGhyb3dCaW5kaW5nRXJyb3IoJ2Z1bmN0aW9uICIraHVtYW5OYW1lKyIgY2FsbGVkIHdpdGggJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cywgZXhwZWN0ZWQgIisoYXJnQ291bnQtMikrIiBhcmdzIScpO1xuIisifVxuIjtpZihuZWVkc0Rlc3RydWN0b3JTdGFjayl7aW52b2tlckZuQm9keSs9InZhciBkZXN0cnVjdG9ycyA9IFtdO1xuIn12YXIgZHRvclN0YWNrPW5lZWRzRGVzdHJ1Y3RvclN0YWNrPyJkZXN0cnVjdG9ycyI6Im51bGwiO3ZhciBhcmdzMT1bInRocm93QmluZGluZ0Vycm9yIiwiaW52b2tlciIsImZuIiwicnVuRGVzdHJ1Y3RvcnMiLCJyZXRUeXBlIiwiY2xhc3NQYXJhbSJdO3ZhciBhcmdzMj1bdGhyb3dCaW5kaW5nRXJyb3IsY3BwSW52b2tlckZ1bmMsY3BwVGFyZ2V0RnVuYyxydW5EZXN0cnVjdG9ycyxhcmdUeXBlc1swXSxhcmdUeXBlc1sxXV07aWYoaXNDbGFzc01ldGhvZEZ1bmMpe2ludm9rZXJGbkJvZHkrPSJ2YXIgdGhpc1dpcmVkID0gY2xhc3NQYXJhbS50b1dpcmVUeXBlKCIrZHRvclN0YWNrKyIsIHRoaXMpO1xuIn1mb3IodmFyIGk9MDtpPGFyZ0NvdW50LTI7KytpKXtpbnZva2VyRm5Cb2R5Kz0idmFyIGFyZyIraSsiV2lyZWQgPSBhcmdUeXBlIitpKyIudG9XaXJlVHlwZSgiK2R0b3JTdGFjaysiLCBhcmciK2krIik7IC8vICIrYXJnVHlwZXNbaSsyXS5uYW1lKyJcbiI7YXJnczEucHVzaCgiYXJnVHlwZSIraSk7YXJnczIucHVzaChhcmdUeXBlc1tpKzJdKX1pZihpc0NsYXNzTWV0aG9kRnVuYyl7YXJnc0xpc3RXaXJlZD0idGhpc1dpcmVkIisoYXJnc0xpc3RXaXJlZC5sZW5ndGg+MD8iLCAiOiIiKSthcmdzTGlzdFdpcmVkfWludm9rZXJGbkJvZHkrPShyZXR1cm5zPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGFyZ3NMaXN0V2lyZWQubGVuZ3RoPjA/IiwgIjoiIikrYXJnc0xpc3RXaXJlZCsiKTtcbiI7aWYobmVlZHNEZXN0cnVjdG9yU3RhY2spe2ludm9rZXJGbkJvZHkrPSJydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7XG4ifWVsc2V7Zm9yKHZhciBpPWlzQ2xhc3NNZXRob2RGdW5jPzE6MjtpPGFyZ1R5cGVzLmxlbmd0aDsrK2kpe3ZhciBwYXJhbU5hbWU9aT09PTE/InRoaXNXaXJlZCI6ImFyZyIrKGktMikrIldpcmVkIjtpZihhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsKXtpbnZva2VyRm5Cb2R5Kz1wYXJhbU5hbWUrIl9kdG9yKCIrcGFyYW1OYW1lKyIpOyAvLyAiK2FyZ1R5cGVzW2ldLm5hbWUrIlxuIjthcmdzMS5wdXNoKHBhcmFtTmFtZSsiX2R0b3IiKTthcmdzMi5wdXNoKGFyZ1R5cGVzW2ldLmRlc3RydWN0b3JGdW5jdGlvbil9fX1pZihyZXR1cm5zKXtpbnZva2VyRm5Cb2R5Kz0idmFyIHJldCA9IHJldFR5cGUuZnJvbVdpcmVUeXBlKHJ2KTtcbiIrInJldHVybiByZXQ7XG4ifWVsc2V7fWludm9rZXJGbkJvZHkrPSJ9XG4iO2FyZ3MxLnB1c2goaW52b2tlckZuQm9keSk7dmFyIGludm9rZXJGdW5jdGlvbj1uZXdfKEZ1bmN0aW9uLGFyZ3MxKS5hcHBseShudWxsLGFyZ3MyKTtyZXR1cm4gaW52b2tlckZ1bmN0aW9ufWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uKHJhd0NsYXNzVHlwZSxtZXRob2ROYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIsY29udGV4dCxpc1B1cmVWaXJ0dWFsKXt2YXIgcmF3QXJnVHlwZXM9aGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIpO21ldGhvZE5hbWU9cmVhZExhdGluMVN0cmluZyhtZXRob2ROYW1lKTtyYXdJbnZva2VyPWVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGludm9rZXJTaWduYXR1cmUscmF3SW52b2tlcik7d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sW3Jhd0NsYXNzVHlwZV0sZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9Y2xhc3NUeXBlLm5hbWUrIi4iK21ldGhvZE5hbWU7aWYoaXNQdXJlVmlydHVhbCl7Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5wdXJlVmlydHVhbEZ1bmN0aW9ucy5wdXNoKG1ldGhvZE5hbWUpfWZ1bmN0aW9uIHVuYm91bmRUeXBlc0hhbmRsZXIoKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjYWxsICIraHVtYW5OYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLHJhd0FyZ1R5cGVzKX12YXIgcHJvdG89Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZTt2YXIgbWV0aG9kPXByb3RvW21ldGhvZE5hbWVdO2lmKHVuZGVmaW5lZD09PW1ldGhvZHx8dW5kZWZpbmVkPT09bWV0aG9kLm92ZXJsb2FkVGFibGUmJm1ldGhvZC5jbGFzc05hbWUhPT1jbGFzc1R5cGUubmFtZSYmbWV0aG9kLmFyZ0NvdW50PT09YXJnQ291bnQtMil7dW5ib3VuZFR5cGVzSGFuZGxlci5hcmdDb3VudD1hcmdDb3VudC0yO3VuYm91bmRUeXBlc0hhbmRsZXIuY2xhc3NOYW1lPWNsYXNzVHlwZS5uYW1lO3Byb3RvW21ldGhvZE5hbWVdPXVuYm91bmRUeXBlc0hhbmRsZXJ9ZWxzZXtlbnN1cmVPdmVybG9hZFRhYmxlKHByb3RvLG1ldGhvZE5hbWUsaHVtYW5OYW1lKTtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlW2FyZ0NvdW50LTJdPXVuYm91bmRUeXBlc0hhbmRsZXJ9d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10scmF3QXJnVHlwZXMsZnVuY3Rpb24oYXJnVHlwZXMpe3ZhciBtZW1iZXJGdW5jdGlvbj1jcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLHJhd0ludm9rZXIsY29udGV4dCk7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7bWVtYmVyRnVuY3Rpb24uYXJnQ291bnQ9YXJnQ291bnQtMjtwcm90b1ttZXRob2ROYW1lXT1tZW1iZXJGdW5jdGlvbn1lbHNle3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMl09bWVtYmVyRnVuY3Rpb259cmV0dXJuW119KTtyZXR1cm5bXX0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NvbnN0YW50KG5hbWUsdHlwZSx2YWx1ZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFt0eXBlXSxmdW5jdGlvbih0eXBlKXt0eXBlPXR5cGVbMF07TW9kdWxlW25hbWVdPXR5cGVbImZyb21XaXJlVHlwZSJdKHZhbHVlKTtyZXR1cm5bXX0pfXZhciBlbXZhbF9mcmVlX2xpc3Q9W107dmFyIGVtdmFsX2hhbmRsZV9hcnJheT1be30se3ZhbHVlOnVuZGVmaW5lZH0se3ZhbHVlOm51bGx9LHt2YWx1ZTp0cnVlfSx7dmFsdWU6ZmFsc2V9XTtmdW5jdGlvbiBfX2VtdmFsX2RlY3JlZihoYW5kbGUpe2lmKGhhbmRsZT40JiYwPT09LS1lbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXS5yZWZjb3VudCl7ZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV09dW5kZWZpbmVkO2VtdmFsX2ZyZWVfbGlzdC5wdXNoKGhhbmRsZSl9fWZ1bmN0aW9uIGNvdW50X2VtdmFsX2hhbmRsZXMoKXt2YXIgY291bnQ9MDtmb3IodmFyIGk9NTtpPGVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7KytpKXtpZihlbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpeysrY291bnR9fXJldHVybiBjb3VudH1mdW5jdGlvbiBnZXRfZmlyc3RfZW12YWwoKXtmb3IodmFyIGk9NTtpPGVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7KytpKXtpZihlbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpe3JldHVybiBlbXZhbF9oYW5kbGVfYXJyYXlbaV19fXJldHVybiBudWxsfWZ1bmN0aW9uIGluaXRfZW12YWwoKXtNb2R1bGVbImNvdW50X2VtdmFsX2hhbmRsZXMiXT1jb3VudF9lbXZhbF9oYW5kbGVzO01vZHVsZVsiZ2V0X2ZpcnN0X2VtdmFsIl09Z2V0X2ZpcnN0X2VtdmFsfWZ1bmN0aW9uIF9fZW12YWxfcmVnaXN0ZXIodmFsdWUpe3N3aXRjaCh2YWx1ZSl7Y2FzZSB1bmRlZmluZWQ6e3JldHVybiAxfWNhc2UgbnVsbDp7cmV0dXJuIDJ9Y2FzZSB0cnVlOntyZXR1cm4gM31jYXNlIGZhbHNlOntyZXR1cm4gNH1kZWZhdWx0Ont2YXIgaGFuZGxlPWVtdmFsX2ZyZWVfbGlzdC5sZW5ndGg/ZW12YWxfZnJlZV9saXN0LnBvcCgpOmVtdmFsX2hhbmRsZV9hcnJheS5sZW5ndGg7ZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV09e3JlZmNvdW50OjEsdmFsdWU6dmFsdWV9O3JldHVybiBoYW5kbGV9fX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbXZhbChyYXdUeXBlLG5hbWUpe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKGhhbmRsZSl7dmFyIHJ2PWVtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlO19fZW12YWxfZGVjcmVmKGhhbmRsZSk7cmV0dXJuIHJ2fSwidG9XaXJlVHlwZSI6ZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKHZhbHVlKX0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBlbnVtUmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCxzaWduZWQpe3N3aXRjaChzaGlmdCl7Y2FzZSAwOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDg6SEVBUFU4O3JldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShoZWFwW3BvaW50ZXJdKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDE2OkhFQVBVMTY7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+MV0pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKHBvaW50ZXIpe3ZhciBoZWFwPXNpZ25lZD9IRUFQMzI6SEVBUFUzMjtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oaGVhcFtwb2ludGVyPj4yXSl9O2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBpbnRlZ2VyIHR5cGU6ICIrbmFtZSl9fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2VudW0ocmF3VHlwZSxuYW1lLHNpemUsaXNTaWduZWQpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtmdW5jdGlvbiBjdG9yKCl7fWN0b3IudmFsdWVzPXt9O3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsY29uc3RydWN0b3I6Y3RvciwiZnJvbVdpcmVUeXBlIjpmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci52YWx1ZXNbY119LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyxjKXtyZXR1cm4gYy52YWx1ZX0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6ZW51bVJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQsaXNTaWduZWQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSk7ZXhwb3NlUHVibGljU3ltYm9sKG5hbWUsY3Rvcil9ZnVuY3Rpb24gcmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJhd1R5cGUsaHVtYW5OYW1lKXt2YXIgaW1wbD1yZWdpc3RlcmVkVHlwZXNbcmF3VHlwZV07aWYodW5kZWZpbmVkPT09aW1wbCl7dGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lKyIgaGFzIHVua25vd24gdHlwZSAiK2dldFR5cGVOYW1lKHJhd1R5cGUpKX1yZXR1cm4gaW1wbH1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlKHJhd0VudW1UeXBlLG5hbWUsZW51bVZhbHVlKXt2YXIgZW51bVR5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJhd0VudW1UeXBlLCJlbnVtIik7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3ZhciBFbnVtPWVudW1UeXBlLmNvbnN0cnVjdG9yO3ZhciBWYWx1ZT1PYmplY3QuY3JlYXRlKGVudW1UeXBlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx7dmFsdWU6e3ZhbHVlOmVudW1WYWx1ZX0sY29uc3RydWN0b3I6e3ZhbHVlOmNyZWF0ZU5hbWVkRnVuY3Rpb24oZW51bVR5cGUubmFtZSsiXyIrbmFtZSxmdW5jdGlvbigpe30pfX0pO0VudW0udmFsdWVzW2VudW1WYWx1ZV09VmFsdWU7RW51bVtuYW1lXT1WYWx1ZX1mdW5jdGlvbiBfZW1iaW5kX3JlcHIodil7aWYodj09PW51bGwpe3JldHVybiJudWxsIn12YXIgdD10eXBlb2YgdjtpZih0PT09Im9iamVjdCJ8fHQ9PT0iYXJyYXkifHx0PT09ImZ1bmN0aW9uIil7cmV0dXJuIHYudG9TdHJpbmcoKX1lbHNle3JldHVybiIiK3Z9fWZ1bmN0aW9uIGZsb2F0UmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCl7c3dpdGNoKHNoaWZ0KXtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKHBvaW50ZXIpe3JldHVybiB0aGlzWyJmcm9tV2lyZVR5cGUiXShIRUFQRjMyW3BvaW50ZXI+PjJdKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihwb2ludGVyKXtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oSEVBUEY2NFtwb2ludGVyPj4zXSl9O2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBmbG9hdCB0eXBlOiAiK25hbWUpfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdChyYXdUeXBlLG5hbWUsc2l6ZSl7dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6ZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZX0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0ibnVtYmVyIiYmdHlwZW9mIHZhbHVlIT09ImJvb2xlYW4iKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIHRvICcrdGhpcy5uYW1lKX1yZXR1cm4gdmFsdWV9LCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmZsb2F0UmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCksZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbihuYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixzaWduYXR1cmUscmF3SW52b2tlcixmbil7dmFyIGFyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmF3SW52b2tlcj1lbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihzaWduYXR1cmUscmF3SW52b2tlcik7ZXhwb3NlUHVibGljU3ltYm9sKG5hbWUsZnVuY3Rpb24oKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjYWxsICIrbmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixhcmdUeXBlcyl9LGFyZ0NvdW50LTEpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLGFyZ1R5cGVzLGZ1bmN0aW9uKGFyZ1R5cGVzKXt2YXIgaW52b2tlckFyZ3NBcnJheT1bYXJnVHlwZXNbMF0sbnVsbF0uY29uY2F0KGFyZ1R5cGVzLnNsaWNlKDEpKTtyZXBsYWNlUHVibGljU3ltYm9sKG5hbWUsY3JhZnRJbnZva2VyRnVuY3Rpb24obmFtZSxpbnZva2VyQXJnc0FycmF5LG51bGwscmF3SW52b2tlcixmbiksYXJnQ291bnQtMSk7cmV0dXJuW119KX1mdW5jdGlvbiBpbnRlZ2VyUmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCxzaWduZWQpe3N3aXRjaChzaGlmdCl7Y2FzZSAwOnJldHVybiBzaWduZWQ/ZnVuY3Rpb24gcmVhZFM4RnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIEhFQVA4W3BvaW50ZXJdfTpmdW5jdGlvbiByZWFkVThGcm9tUG9pbnRlcihwb2ludGVyKXtyZXR1cm4gSEVBUFU4W3BvaW50ZXJdfTtjYXNlIDE6cmV0dXJuIHNpZ25lZD9mdW5jdGlvbiByZWFkUzE2RnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIEhFQVAxNltwb2ludGVyPj4xXX06ZnVuY3Rpb24gcmVhZFUxNkZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQVTE2W3BvaW50ZXI+PjFdfTtjYXNlIDI6cmV0dXJuIHNpZ25lZD9mdW5jdGlvbiByZWFkUzMyRnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIEhFQVAzMltwb2ludGVyPj4yXX06ZnVuY3Rpb24gcmVhZFUzMkZyb21Qb2ludGVyKHBvaW50ZXIpe3JldHVybiBIRUFQVTMyW3BvaW50ZXI+PjJdfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gaW50ZWdlciB0eXBlOiAiK25hbWUpfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9pbnRlZ2VyKHByaW1pdGl2ZVR5cGUsbmFtZSxzaXplLG1pblJhbmdlLG1heFJhbmdlKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7aWYobWF4UmFuZ2U9PT0tMSl7bWF4UmFuZ2U9NDI5NDk2NzI5NX12YXIgc2hpZnQ9Z2V0U2hpZnRGcm9tU2l6ZShzaXplKTt2YXIgZnJvbVdpcmVUeXBlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWV9O2lmKG1pblJhbmdlPT09MCl7dmFyIGJpdHNoaWZ0PTMyLTgqc2l6ZTtmcm9tV2lyZVR5cGU9ZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZTw8Yml0c2hpZnQ+Pj5iaXRzaGlmdH19dmFyIGlzVW5zaWduZWRUeXBlPW5hbWUuaW5kZXhPZigidW5zaWduZWQiKSE9LTE7cmVnaXN0ZXJUeXBlKHByaW1pdGl2ZVR5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjpmcm9tV2lyZVR5cGUsInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0ibnVtYmVyIiYmdHlwZW9mIHZhbHVlIT09ImJvb2xlYW4iKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIHRvICcrdGhpcy5uYW1lKX1pZih2YWx1ZTxtaW5SYW5nZXx8dmFsdWU+bWF4UmFuZ2Upe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1Bhc3NpbmcgYSBudW1iZXIgIicrX2VtYmluZF9yZXByKHZhbHVlKSsnIiBmcm9tIEpTIHNpZGUgdG8gQy9DKysgc2lkZSB0byBhbiBhcmd1bWVudCBvZiB0eXBlICInK25hbWUrJyIsIHdoaWNoIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIFsnK21pblJhbmdlKyIsICIrbWF4UmFuZ2UrIl0hIil9cmV0dXJuIGlzVW5zaWduZWRUeXBlP3ZhbHVlPj4+MDp2YWx1ZXwwfSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjppbnRlZ2VyUmVhZFZhbHVlRnJvbVBvaW50ZXIobmFtZSxzaGlmdCxtaW5SYW5nZSE9PTApLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfbWVtb3J5X3ZpZXcocmF3VHlwZSxkYXRhVHlwZUluZGV4LG5hbWUpe3ZhciB0eXBlTWFwcGluZz1bSW50OEFycmF5LFVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXldO3ZhciBUQT10eXBlTWFwcGluZ1tkYXRhVHlwZUluZGV4XTtmdW5jdGlvbiBkZWNvZGVNZW1vcnlWaWV3KGhhbmRsZSl7aGFuZGxlPWhhbmRsZT4+Mjt2YXIgaGVhcD1IRUFQVTMyO3ZhciBzaXplPWhlYXBbaGFuZGxlXTt2YXIgZGF0YT1oZWFwW2hhbmRsZSsxXTtyZXR1cm4gbmV3IFRBKGJ1ZmZlcixkYXRhLHNpemUpfW5hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmRlY29kZU1lbW9yeVZpZXcsImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6ZGVjb2RlTWVtb3J5Vmlld30se2lnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnM6dHJ1ZX0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7dmFyIHN0ZFN0cmluZ0lzVVRGOD1uYW1lPT09InN0ZDo6c3RyaW5nIjtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKHZhbHVlKXt2YXIgbGVuZ3RoPUhFQVBVMzJbdmFsdWU+PjJdO3ZhciBzdHI7aWYoc3RkU3RyaW5nSXNVVEY4KXt2YXIgZGVjb2RlU3RhcnRQdHI9dmFsdWUrNDtmb3IodmFyIGk9MDtpPD1sZW5ndGg7KytpKXt2YXIgY3VycmVudEJ5dGVQdHI9dmFsdWUrNCtpO2lmKEhFQVBVOFtjdXJyZW50Qnl0ZVB0cl09PTB8fGk9PWxlbmd0aCl7dmFyIG1heFJlYWQ9Y3VycmVudEJ5dGVQdHItZGVjb2RlU3RhcnRQdHI7dmFyIHN0cmluZ1NlZ21lbnQ9VVRGOFRvU3RyaW5nKGRlY29kZVN0YXJ0UHRyLG1heFJlYWQpO2lmKHN0cj09PXVuZGVmaW5lZCl7c3RyPXN0cmluZ1NlZ21lbnR9ZWxzZXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMCk7c3RyKz1zdHJpbmdTZWdtZW50fWRlY29kZVN0YXJ0UHRyPWN1cnJlbnRCeXRlUHRyKzF9fX1lbHNle3ZhciBhPW5ldyBBcnJheShsZW5ndGgpO2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7YVtpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKEhFQVBVOFt2YWx1ZSs0K2ldKX1zdHI9YS5qb2luKCIiKX1fZnJlZSh2YWx1ZSk7cmV0dXJuIHN0cn0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXt2YWx1ZT1uZXcgVWludDhBcnJheSh2YWx1ZSl9dmFyIGdldExlbmd0aDt2YXIgdmFsdWVJc09mVHlwZVN0cmluZz10eXBlb2YgdmFsdWU9PT0ic3RyaW5nIjtpZighKHZhbHVlSXNPZlR5cGVTdHJpbmd8fHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheXx8dmFsdWUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheXx8dmFsdWUgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBzdGQ6OnN0cmluZyIpfWlmKHN0ZFN0cmluZ0lzVVRGOCYmdmFsdWVJc09mVHlwZVN0cmluZyl7Z2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIGxlbmd0aEJ5dGVzVVRGOCh2YWx1ZSl9fWVsc2V7Z2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlLmxlbmd0aH19dmFyIGxlbmd0aD1nZXRMZW5ndGgoKTt2YXIgcHRyPV9tYWxsb2MoNCtsZW5ndGgrMSk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aDtpZihzdGRTdHJpbmdJc1VURjgmJnZhbHVlSXNPZlR5cGVTdHJpbmcpe3N0cmluZ1RvVVRGOCh2YWx1ZSxwdHIrNCxsZW5ndGgrMSl9ZWxzZXtpZih2YWx1ZUlzT2ZUeXBlU3RyaW5nKXtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe3ZhciBjaGFyQ29kZT12YWx1ZS5jaGFyQ29kZUF0KGkpO2lmKGNoYXJDb2RlPjI1NSl7X2ZyZWUocHRyKTt0aHJvd0JpbmRpbmdFcnJvcigiU3RyaW5nIGhhcyBVVEYtMTYgY29kZSB1bml0cyB0aGF0IGRvIG5vdCBmaXQgaW4gOCBiaXRzIil9SEVBUFU4W3B0cis0K2ldPWNoYXJDb2RlfX1lbHNle2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7SEVBUFU4W3B0cis0K2ldPXZhbHVlW2ldfX19aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKF9mcmVlLHB0cil9cmV0dXJuIHB0cn0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOmZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX19KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZyhyYXdUeXBlLGNoYXJTaXplLG5hbWUpe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTt2YXIgZGVjb2RlU3RyaW5nLGVuY29kZVN0cmluZyxnZXRIZWFwLGxlbmd0aEJ5dGVzVVRGLHNoaWZ0O2lmKGNoYXJTaXplPT09Mil7ZGVjb2RlU3RyaW5nPVVURjE2VG9TdHJpbmc7ZW5jb2RlU3RyaW5nPXN0cmluZ1RvVVRGMTY7bGVuZ3RoQnl0ZXNVVEY9bGVuZ3RoQnl0ZXNVVEYxNjtnZXRIZWFwPWZ1bmN0aW9uKCl7cmV0dXJuIEhFQVBVMTZ9O3NoaWZ0PTF9ZWxzZSBpZihjaGFyU2l6ZT09PTQpe2RlY29kZVN0cmluZz1VVEYzMlRvU3RyaW5nO2VuY29kZVN0cmluZz1zdHJpbmdUb1VURjMyO2xlbmd0aEJ5dGVzVVRGPWxlbmd0aEJ5dGVzVVRGMzI7Z2V0SGVhcD1mdW5jdGlvbigpe3JldHVybiBIRUFQVTMyfTtzaGlmdD0yfXJlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6ZnVuY3Rpb24odmFsdWUpe3ZhciBsZW5ndGg9SEVBUFUzMlt2YWx1ZT4+Ml07dmFyIEhFQVA9Z2V0SGVhcCgpO3ZhciBzdHI7dmFyIGRlY29kZVN0YXJ0UHRyPXZhbHVlKzQ7Zm9yKHZhciBpPTA7aTw9bGVuZ3RoOysraSl7dmFyIGN1cnJlbnRCeXRlUHRyPXZhbHVlKzQraSpjaGFyU2l6ZTtpZihIRUFQW2N1cnJlbnRCeXRlUHRyPj5zaGlmdF09PTB8fGk9PWxlbmd0aCl7dmFyIG1heFJlYWRCeXRlcz1jdXJyZW50Qnl0ZVB0ci1kZWNvZGVTdGFydFB0cjt2YXIgc3RyaW5nU2VnbWVudD1kZWNvZGVTdHJpbmcoZGVjb2RlU3RhcnRQdHIsbWF4UmVhZEJ5dGVzKTtpZihzdHI9PT11bmRlZmluZWQpe3N0cj1zdHJpbmdTZWdtZW50fWVsc2V7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDApO3N0cis9c3RyaW5nU2VnbWVudH1kZWNvZGVTdGFydFB0cj1jdXJyZW50Qnl0ZVB0citjaGFyU2l6ZX19X2ZyZWUodmFsdWUpO3JldHVybiBzdHJ9LCJ0b1dpcmVUeXBlIjpmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7aWYoISh0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIikpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIEMrKyBzdHJpbmcgdHlwZSAiK25hbWUpfXZhciBsZW5ndGg9bGVuZ3RoQnl0ZXNVVEYodmFsdWUpO3ZhciBwdHI9X21hbGxvYyg0K2xlbmd0aCtjaGFyU2l6ZSk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aD4+c2hpZnQ7ZW5jb2RlU3RyaW5nKHZhbHVlLHB0cis0LGxlbmd0aCtjaGFyU2l6ZSk7aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKF9mcmVlLHB0cil9cmV0dXJuIHB0cn0sImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOmZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX19KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9vYmplY3QocmF3VHlwZSxuYW1lLGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yLGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcil7c3RydWN0UmVnaXN0cmF0aW9uc1tyYXdUeXBlXT17bmFtZTpyZWFkTGF0aW4xU3RyaW5nKG5hbWUpLHJhd0NvbnN0cnVjdG9yOmVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yKSxyYXdEZXN0cnVjdG9yOmVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3RvciksZmllbGRzOltdfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9vYmplY3RfZmllbGQoc3RydWN0VHlwZSxmaWVsZE5hbWUsZ2V0dGVyUmV0dXJuVHlwZSxnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyLGdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlLHNldHRlclNpZ25hdHVyZSxzZXR0ZXIsc2V0dGVyQ29udGV4dCl7c3RydWN0UmVnaXN0cmF0aW9uc1tzdHJ1Y3RUeXBlXS5maWVsZHMucHVzaCh7ZmllbGROYW1lOnJlYWRMYXRpbjFTdHJpbmcoZmllbGROYW1lKSxnZXR0ZXJSZXR1cm5UeXBlOmdldHRlclJldHVyblR5cGUsZ2V0dGVyOmVtYmluZF9fcmVxdWlyZUZ1bmN0aW9uKGdldHRlclNpZ25hdHVyZSxnZXR0ZXIpLGdldHRlckNvbnRleHQ6Z2V0dGVyQ29udGV4dCxzZXR0ZXJBcmd1bWVudFR5cGU6c2V0dGVyQXJndW1lbnRUeXBlLHNldHRlcjplbWJpbmRfX3JlcXVpcmVGdW5jdGlvbihzZXR0ZXJTaWduYXR1cmUsc2V0dGVyKSxzZXR0ZXJDb250ZXh0OnNldHRlckNvbnRleHR9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92b2lkKHJhd1R5cGUsbmFtZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtpc1ZvaWQ6dHJ1ZSxuYW1lOm5hbWUsImFyZ1BhY2tBZHZhbmNlIjowLCJmcm9tV2lyZVR5cGUiOmZ1bmN0aW9uKCl7cmV0dXJuIHVuZGVmaW5lZH0sInRvV2lyZVR5cGUiOmZ1bmN0aW9uKGRlc3RydWN0b3JzLG8pe3JldHVybiB1bmRlZmluZWR9fSl9ZnVuY3Rpb24gcmVxdWlyZUhhbmRsZShoYW5kbGUpe2lmKCFoYW5kbGUpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgdXNlIGRlbGV0ZWQgdmFsLiBoYW5kbGUgPSAiK2hhbmRsZSl9cmV0dXJuIGVtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlfWZ1bmN0aW9uIF9fZW12YWxfYXMoaGFuZGxlLHJldHVyblR5cGUsZGVzdHJ1Y3RvcnNSZWYpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7cmV0dXJuVHlwZT1yZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmV0dXJuVHlwZSwiZW12YWw6OmFzIik7dmFyIGRlc3RydWN0b3JzPVtdO3ZhciByZD1fX2VtdmFsX3JlZ2lzdGVyKGRlc3RydWN0b3JzKTtIRUFQMzJbZGVzdHJ1Y3RvcnNSZWY+PjJdPXJkO3JldHVybiByZXR1cm5UeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsaGFuZGxlKX12YXIgZW12YWxfc3ltYm9scz17fTtmdW5jdGlvbiBnZXRTdHJpbmdPclN5bWJvbChhZGRyZXNzKXt2YXIgc3ltYm9sPWVtdmFsX3N5bWJvbHNbYWRkcmVzc107aWYoc3ltYm9sPT09dW5kZWZpbmVkKXtyZXR1cm4gcmVhZExhdGluMVN0cmluZyhhZGRyZXNzKX1lbHNle3JldHVybiBzeW1ib2x9fXZhciBlbXZhbF9tZXRob2RDYWxsZXJzPVtdO2Z1bmN0aW9uIF9fZW12YWxfY2FsbF92b2lkX21ldGhvZChjYWxsZXIsaGFuZGxlLG1ldGhvZE5hbWUsYXJncyl7Y2FsbGVyPWVtdmFsX21ldGhvZENhbGxlcnNbY2FsbGVyXTtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO21ldGhvZE5hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobWV0aG9kTmFtZSk7Y2FsbGVyKGhhbmRsZSxtZXRob2ROYW1lLG51bGwsYXJncyl9ZnVuY3Rpb24gZW12YWxfZ2V0X2dsb2JhbCgpe2lmKHR5cGVvZiBnbG9iYWxUaGlzPT09Im9iamVjdCIpe3JldHVybiBnbG9iYWxUaGlzfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBGdW5jdGlvbn0oKSgicmV0dXJuIHRoaXMiKSgpfWZ1bmN0aW9uIF9fZW12YWxfZ2V0X2dsb2JhbChuYW1lKXtpZihuYW1lPT09MCl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZW12YWxfZ2V0X2dsb2JhbCgpKX1lbHNle25hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobmFtZSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZW12YWxfZ2V0X2dsb2JhbCgpW25hbWVdKX19ZnVuY3Rpb24gX19lbXZhbF9hZGRNZXRob2RDYWxsZXIoY2FsbGVyKXt2YXIgaWQ9ZW12YWxfbWV0aG9kQ2FsbGVycy5sZW5ndGg7ZW12YWxfbWV0aG9kQ2FsbGVycy5wdXNoKGNhbGxlcik7cmV0dXJuIGlkfWZ1bmN0aW9uIF9fZW12YWxfbG9va3VwVHlwZXMoYXJnQ291bnQsYXJnVHlwZXMpe3ZhciBhPW5ldyBBcnJheShhcmdDb3VudCk7Zm9yKHZhciBpPTA7aTxhcmdDb3VudDsrK2kpe2FbaV09cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKEhFQVAzMlsoYXJnVHlwZXM+PjIpK2ldLCJwYXJhbWV0ZXIgIitpKX1yZXR1cm4gYX1mdW5jdGlvbiBfX2VtdmFsX2dldF9tZXRob2RfY2FsbGVyKGFyZ0NvdW50LGFyZ1R5cGVzKXt2YXIgdHlwZXM9X19lbXZhbF9sb29rdXBUeXBlcyhhcmdDb3VudCxhcmdUeXBlcyk7dmFyIHJldFR5cGU9dHlwZXNbMF07dmFyIHNpZ25hdHVyZU5hbWU9cmV0VHlwZS5uYW1lKyJfJCIrdHlwZXMuc2xpY2UoMSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWV9KS5qb2luKCJfIikrIiQiO3ZhciBwYXJhbXM9WyJyZXRUeXBlIl07dmFyIGFyZ3M9W3JldFR5cGVdO3ZhciBhcmdzTGlzdD0iIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50LTE7KytpKXthcmdzTGlzdCs9KGkhPT0wPyIsICI6IiIpKyJhcmciK2k7cGFyYW1zLnB1c2goImFyZ1R5cGUiK2kpO2FyZ3MucHVzaCh0eXBlc1sxK2ldKX12YXIgZnVuY3Rpb25OYW1lPW1ha2VMZWdhbEZ1bmN0aW9uTmFtZSgibWV0aG9kQ2FsbGVyXyIrc2lnbmF0dXJlTmFtZSk7dmFyIGZ1bmN0aW9uQm9keT0icmV0dXJuIGZ1bmN0aW9uICIrZnVuY3Rpb25OYW1lKyIoaGFuZGxlLCBuYW1lLCBkZXN0cnVjdG9ycywgYXJncykge1xuIjt2YXIgb2Zmc2V0PTA7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7ZnVuY3Rpb25Cb2R5Kz0iICAgIHZhciBhcmciK2krIiA9IGFyZ1R5cGUiK2krIi5yZWFkVmFsdWVGcm9tUG9pbnRlcihhcmdzIisob2Zmc2V0PyIrIitvZmZzZXQ6IiIpKyIpO1xuIjtvZmZzZXQrPXR5cGVzW2krMV1bImFyZ1BhY2tBZHZhbmNlIl19ZnVuY3Rpb25Cb2R5Kz0iICAgIHZhciBydiA9IGhhbmRsZVtuYW1lXSgiK2FyZ3NMaXN0KyIpO1xuIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50LTE7KytpKXtpZih0eXBlc1tpKzFdWyJkZWxldGVPYmplY3QiXSl7ZnVuY3Rpb25Cb2R5Kz0iICAgIGFyZ1R5cGUiK2krIi5kZWxldGVPYmplY3QoYXJnIitpKyIpO1xuIn19aWYoIXJldFR5cGUuaXNWb2lkKXtmdW5jdGlvbkJvZHkrPSIgICAgcmV0dXJuIHJldFR5cGUudG9XaXJlVHlwZShkZXN0cnVjdG9ycywgcnYpO1xuIn1mdW5jdGlvbkJvZHkrPSJ9O1xuIjtwYXJhbXMucHVzaChmdW5jdGlvbkJvZHkpO3ZhciBpbnZva2VyRnVuY3Rpb249bmV3XyhGdW5jdGlvbixwYXJhbXMpLmFwcGx5KG51bGwsYXJncyk7cmV0dXJuIF9fZW12YWxfYWRkTWV0aG9kQ2FsbGVyKGludm9rZXJGdW5jdGlvbil9ZnVuY3Rpb24gX19lbXZhbF9nZXRfbW9kdWxlX3Byb3BlcnR5KG5hbWUpe25hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobmFtZSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoTW9kdWxlW25hbWVdKX1mdW5jdGlvbiBfX2VtdmFsX2dldF9wcm9wZXJ0eShoYW5kbGUsa2V5KXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO2tleT1yZXF1aXJlSGFuZGxlKGtleSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoaGFuZGxlW2tleV0pfWZ1bmN0aW9uIF9fZW12YWxfaW5jcmVmKGhhbmRsZSl7aWYoaGFuZGxlPjQpe2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnJlZmNvdW50Kz0xfX1mdW5jdGlvbiBjcmFmdEVtdmFsQWxsb2NhdG9yKGFyZ0NvdW50KXt2YXIgYXJnc0xpc3Q9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudDsrK2kpe2FyZ3NMaXN0Kz0oaSE9PTA/IiwgIjoiIikrImFyZyIraX12YXIgZnVuY3Rpb25Cb2R5PSJyZXR1cm4gZnVuY3Rpb24gZW12YWxfYWxsb2NhdG9yXyIrYXJnQ291bnQrIihjb25zdHJ1Y3RvciwgYXJnVHlwZXMsIGFyZ3MpIHtcbiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudDsrK2kpe2Z1bmN0aW9uQm9keSs9InZhciBhcmdUeXBlIitpKyIgPSByZXF1aXJlUmVnaXN0ZXJlZFR5cGUoTW9kdWxlWydIRUFQMzInXVsoYXJnVHlwZXMgPj4+IDIpICsgIitpKyddLCAicGFyYW1ldGVyICcraSsnIik7XG4nKyJ2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG4iKyJhcmdzICs9IGFyZ1R5cGUiK2krIlsnYXJnUGFja0FkdmFuY2UnXTtcbiJ9ZnVuY3Rpb25Cb2R5Kz0idmFyIG9iaiA9IG5ldyBjb25zdHJ1Y3RvcigiK2FyZ3NMaXN0KyIpO1xuIisicmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIob2JqKTtcbiIrIn1cbiI7cmV0dXJuIG5ldyBGdW5jdGlvbigicmVxdWlyZVJlZ2lzdGVyZWRUeXBlIiwiTW9kdWxlIiwiX19lbXZhbF9yZWdpc3RlciIsZnVuY3Rpb25Cb2R5KShyZXF1aXJlUmVnaXN0ZXJlZFR5cGUsTW9kdWxlLF9fZW12YWxfcmVnaXN0ZXIpfXZhciBlbXZhbF9uZXdlcnM9e307ZnVuY3Rpb24gX19lbXZhbF9uZXcoaGFuZGxlLGFyZ0NvdW50LGFyZ1R5cGVzLGFyZ3Mpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7dmFyIG5ld2VyPWVtdmFsX25ld2Vyc1thcmdDb3VudF07aWYoIW5ld2VyKXtuZXdlcj1jcmFmdEVtdmFsQWxsb2NhdG9yKGFyZ0NvdW50KTtlbXZhbF9uZXdlcnNbYXJnQ291bnRdPW5ld2VyfXJldHVybiBuZXdlcihoYW5kbGUsYXJnVHlwZXMsYXJncyl9ZnVuY3Rpb24gX19lbXZhbF9uZXdfY3N0cmluZyh2KXtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihnZXRTdHJpbmdPclN5bWJvbCh2KSl9ZnVuY3Rpb24gX19lbXZhbF9ydW5fZGVzdHJ1Y3RvcnMoaGFuZGxlKXt2YXIgZGVzdHJ1Y3RvcnM9ZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0udmFsdWU7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO19fZW12YWxfZGVjcmVmKGhhbmRsZSl9ZnVuY3Rpb24gX2Fib3J0KCl7YWJvcnQoKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3Qsc3JjLG51bSl7SEVBUFU4LmNvcHlXaXRoaW4oZGVzdCxzcmMsc3JjK251bSl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpe3JldHVybiBIRUFQVTgubGVuZ3RofWZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSl7dHJ5e3dhc21NZW1vcnkuZ3JvdyhzaXplLWJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTtyZXR1cm4gMX1jYXRjaChlKXt9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpe3JlcXVlc3RlZFNpemU9cmVxdWVzdGVkU2l6ZT4+PjA7dmFyIG9sZFNpemU9X2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpO3ZhciBQQUdFX01VTFRJUExFPTY1NTM2O3ZhciBtYXhIZWFwU2l6ZT0yMTQ3NDgzNjQ4O2lmKHJlcXVlc3RlZFNpemU+bWF4SGVhcFNpemUpe3JldHVybiBmYWxzZX12YXIgbWluSGVhcFNpemU9MTY3NzcyMTY7Zm9yKHZhciBjdXREb3duPTE7Y3V0RG93bjw9NDtjdXREb3duKj0yKXt2YXIgb3Zlckdyb3duSGVhcFNpemU9b2xkU2l6ZSooMSsuMi9jdXREb3duKTtvdmVyR3Jvd25IZWFwU2l6ZT1NYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSxyZXF1ZXN0ZWRTaXplKzEwMDY2MzI5Nik7dmFyIG5ld1NpemU9TWF0aC5taW4obWF4SGVhcFNpemUsYWxpZ25VcChNYXRoLm1heChtaW5IZWFwU2l6ZSxyZXF1ZXN0ZWRTaXplLG92ZXJHcm93bkhlYXBTaXplKSxQQUdFX01VTFRJUExFKSk7dmFyIHJlcGxhY2VtZW50PWVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIobmV3U2l6ZSk7aWYocmVwbGFjZW1lbnQpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9dmFyIFBBVEg9e3NwbGl0UGF0aDpmdW5jdGlvbihmaWxlbmFtZSl7dmFyIHNwbGl0UGF0aFJlPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSl9LG5vcm1hbGl6ZUFycmF5OmZ1bmN0aW9uKHBhcnRzLGFsbG93QWJvdmVSb290KXt2YXIgdXA9MDtmb3IodmFyIGk9cGFydHMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBsYXN0PXBhcnRzW2ldO2lmKGxhc3Q9PT0iLiIpe3BhcnRzLnNwbGljZShpLDEpfWVsc2UgaWYobGFzdD09PSIuLiIpe3BhcnRzLnNwbGljZShpLDEpO3VwKyt9ZWxzZSBpZih1cCl7cGFydHMuc3BsaWNlKGksMSk7dXAtLX19aWYoYWxsb3dBYm92ZVJvb3Qpe2Zvcig7dXA7dXAtLSl7cGFydHMudW5zaGlmdCgiLi4iKX19cmV0dXJuIHBhcnRzfSxub3JtYWxpemU6ZnVuY3Rpb24ocGF0aCl7dmFyIGlzQWJzb2x1dGU9cGF0aC5jaGFyQXQoMCk9PT0iLyIsdHJhaWxpbmdTbGFzaD1wYXRoLnN1YnN0cigtMSk9PT0iLyI7cGF0aD1QQVRILm5vcm1hbGl6ZUFycmF5KHBhdGguc3BsaXQoIi8iKS5maWx0ZXIoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSksIWlzQWJzb2x1dGUpLmpvaW4oIi8iKTtpZighcGF0aCYmIWlzQWJzb2x1dGUpe3BhdGg9Ii4ifWlmKHBhdGgmJnRyYWlsaW5nU2xhc2gpe3BhdGgrPSIvIn1yZXR1cm4oaXNBYnNvbHV0ZT8iLyI6IiIpK3BhdGh9LGRpcm5hbWU6ZnVuY3Rpb24ocGF0aCl7dmFyIHJlc3VsdD1QQVRILnNwbGl0UGF0aChwYXRoKSxyb290PXJlc3VsdFswXSxkaXI9cmVzdWx0WzFdO2lmKCFyb290JiYhZGlyKXtyZXR1cm4iLiJ9aWYoZGlyKXtkaXI9ZGlyLnN1YnN0cigwLGRpci5sZW5ndGgtMSl9cmV0dXJuIHJvb3QrZGlyfSxiYXNlbmFtZTpmdW5jdGlvbihwYXRoKXtpZihwYXRoPT09Ii8iKXJldHVybiIvIjt2YXIgbGFzdFNsYXNoPXBhdGgubGFzdEluZGV4T2YoIi8iKTtpZihsYXN0U2xhc2g9PT0tMSlyZXR1cm4gcGF0aDtyZXR1cm4gcGF0aC5zdWJzdHIobGFzdFNsYXNoKzEpfSxleHRuYW1lOmZ1bmN0aW9uKHBhdGgpe3JldHVybiBQQVRILnNwbGl0UGF0aChwYXRoKVszXX0sam9pbjpmdW5jdGlvbigpe3ZhciBwYXRocz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIFBBVEgubm9ybWFsaXplKHBhdGhzLmpvaW4oIi8iKSl9LGpvaW4yOmZ1bmN0aW9uKGwscil7cmV0dXJuIFBBVEgubm9ybWFsaXplKGwrIi8iK3IpfX07dmFyIFNZU0NBTExTPXttYXBwaW5nczp7fSxidWZmZXJzOltudWxsLFtdLFtdXSxwcmludENoYXI6ZnVuY3Rpb24oc3RyZWFtLGN1cnIpe3ZhciBidWZmZXI9U1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dO2lmKGN1cnI9PT0wfHxjdXJyPT09MTApeyhzdHJlYW09PT0xP291dDplcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwwKSk7YnVmZmVyLmxlbmd0aD0wfWVsc2V7YnVmZmVyLnB1c2goY3Vycil9fSx2YXJhcmdzOnVuZGVmaW5lZCxnZXQ6ZnVuY3Rpb24oKXtTWVNDQUxMUy52YXJhcmdzKz00O3ZhciByZXQ9SEVBUDMyW1NZU0NBTExTLnZhcmFyZ3MtND4+Ml07cmV0dXJuIHJldH0sZ2V0U3RyOmZ1bmN0aW9uKHB0cil7dmFyIHJldD1VVEY4VG9TdHJpbmcocHRyKTtyZXR1cm4gcmV0fSxnZXQ2NDpmdW5jdGlvbihsb3csaGlnaCl7cmV0dXJuIGxvd319O2Z1bmN0aW9uIF9mZF9jbG9zZShmZCl7cmV0dXJuIDB9ZnVuY3Rpb24gX2ZkX3NlZWsoZmQsb2Zmc2V0X2xvdyxvZmZzZXRfaGlnaCx3aGVuY2UsbmV3T2Zmc2V0KXt9ZnVuY3Rpb24gX2ZkX3dyaXRlKGZkLGlvdixpb3ZjbnQscG51bSl7dmFyIG51bT0wO2Zvcih2YXIgaT0wO2k8aW92Y250O2krKyl7dmFyIHB0cj1IRUFQMzJbaW92K2kqOD4+Ml07dmFyIGxlbj1IRUFQMzJbaW92KyhpKjgrNCk+PjJdO2Zvcih2YXIgaj0wO2o8bGVuO2orKyl7U1lTQ0FMTFMucHJpbnRDaGFyKGZkLEhFQVBVOFtwdHIral0pfW51bSs9bGVufUhFQVAzMltwbnVtPj4yXT1udW07cmV0dXJuIDB9ZnVuY3Rpb24gX3JvdW5kZihkKXtkPStkO3JldHVybiBkPj0rMD8rTWF0aF9mbG9vcihkKyArLjUpOitNYXRoX2NlaWwoZC0rLjUpfWZ1bmN0aW9uIF9zZXRUZW1wUmV0MCgkaSl7c2V0VGVtcFJldDAoJGl8MCl9SW50ZXJuYWxFcnJvcj1Nb2R1bGVbIkludGVybmFsRXJyb3IiXT1leHRlbmRFcnJvcihFcnJvciwiSW50ZXJuYWxFcnJvciIpO2VtYmluZF9pbml0X2NoYXJDb2RlcygpO0JpbmRpbmdFcnJvcj1Nb2R1bGVbIkJpbmRpbmdFcnJvciJdPWV4dGVuZEVycm9yKEVycm9yLCJCaW5kaW5nRXJyb3IiKTtpbml0X0NsYXNzSGFuZGxlKCk7aW5pdF9SZWdpc3RlcmVkUG9pbnRlcigpO2luaXRfZW1iaW5kKCk7VW5ib3VuZFR5cGVFcnJvcj1Nb2R1bGVbIlVuYm91bmRUeXBlRXJyb3IiXT1leHRlbmRFcnJvcihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpO2luaXRfZW12YWwoKTt2YXIgYXNtTGlicmFyeUFyZz17InUiOl9fZW1iaW5kX2ZpbmFsaXplX3ZhbHVlX29iamVjdCwiSiI6X19lbWJpbmRfcmVnaXN0ZXJfYm9vbCwieSI6X19lbWJpbmRfcmVnaXN0ZXJfY2xhc3MsIngiOl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yLCJkIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbiwiayI6X19lbWJpbmRfcmVnaXN0ZXJfY29uc3RhbnQsIkkiOl9fZW1iaW5kX3JlZ2lzdGVyX2VtdmFsLCJuIjpfX2VtYmluZF9yZWdpc3Rlcl9lbnVtLCJhIjpfX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlLCJCIjpfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdCwiaSI6X19lbWJpbmRfcmVnaXN0ZXJfZnVuY3Rpb24sImoiOl9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIsImgiOl9fZW1iaW5kX3JlZ2lzdGVyX21lbW9yeV92aWV3LCJDIjpfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nLCJ3IjpfX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZywidiI6X19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0LCJjIjpfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9vYmplY3RfZmllbGQsIksiOl9fZW1iaW5kX3JlZ2lzdGVyX3ZvaWQsIm0iOl9fZW12YWxfYXMsInMiOl9fZW12YWxfY2FsbF92b2lkX21ldGhvZCwiYiI6X19lbXZhbF9kZWNyZWYsInoiOl9fZW12YWxfZ2V0X2dsb2JhbCwidCI6X19lbXZhbF9nZXRfbWV0aG9kX2NhbGxlciwiciI6X19lbXZhbF9nZXRfbW9kdWxlX3Byb3BlcnR5LCJlIjpfX2VtdmFsX2dldF9wcm9wZXJ0eSwiZyI6X19lbXZhbF9pbmNyZWYsInEiOl9fZW12YWxfbmV3LCJmIjpfX2VtdmFsX25ld19jc3RyaW5nLCJsIjpfX2VtdmFsX3J1bl9kZXN0cnVjdG9ycywicCI6X2Fib3J0LCJGIjpfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLCJHIjpfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCwiSCI6X2ZkX2Nsb3NlLCJEIjpfZmRfc2VlaywiQSI6X2ZkX3dyaXRlLCJtZW1vcnkiOndhc21NZW1vcnksIm8iOl9yb3VuZGYsIkUiOl9zZXRUZW1wUmV0MCwidGFibGUiOndhc21UYWJsZX07dmFyIGFzbT1jcmVhdGVXYXNtKCk7TW9kdWxlWyJhc20iXT1hc207dmFyIF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdPU1vZHVsZVsiYXNtIl1bIkwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX21hbGxvYz1Nb2R1bGVbIl9tYWxsb2MiXT1mdW5jdGlvbigpe3JldHVybihfbWFsbG9jPU1vZHVsZVsiX21hbGxvYyJdPU1vZHVsZVsiYXNtIl1bIk0iXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2ZyZWU9TW9kdWxlWyJfZnJlZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9mcmVlPU1vZHVsZVsiX2ZyZWUiXT1Nb2R1bGVbImFzbSJdWyJOIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fX2dldFR5cGVOYW1lPU1vZHVsZVsiX19fZ2V0VHlwZU5hbWUiXT1mdW5jdGlvbigpe3JldHVybihfX19nZXRUeXBlTmFtZT1Nb2R1bGVbIl9fX2dldFR5cGVOYW1lIl09TW9kdWxlWyJhc20iXVsiTyJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX19lbWJpbmRfcmVnaXN0ZXJfbmF0aXZlX2FuZF9idWlsdGluX3R5cGVzPU1vZHVsZVsiX19fZW1iaW5kX3JlZ2lzdGVyX25hdGl2ZV9hbmRfYnVpbHRpbl90eXBlcyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXM9TW9kdWxlWyJfX19lbWJpbmRfcmVnaXN0ZXJfbmF0aXZlX2FuZF9idWlsdGluX3R5cGVzIl09TW9kdWxlWyJhc20iXVsiUCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX3ZpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX3ZpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWkiXT1Nb2R1bGVbImFzbSJdWyJRIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfdmk9TW9kdWxlWyJkeW5DYWxsX3ZpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF92aT1Nb2R1bGVbImR5bkNhbGxfdmkiXT1Nb2R1bGVbImFzbSJdWyJSIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfdj1Nb2R1bGVbImR5bkNhbGxfdiJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfdj1Nb2R1bGVbImR5bkNhbGxfdiJdPU1vZHVsZVsiYXNtIl1bIlMiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9pPU1vZHVsZVsiZHluQ2FsbF9pIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9pPU1vZHVsZVsiZHluQ2FsbF9pIl09TW9kdWxlWyJhc20iXVsiVCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2lpaT1Nb2R1bGVbImR5bkNhbGxfaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWk9TW9kdWxlWyJkeW5DYWxsX2lpaSJdPU1vZHVsZVsiYXNtIl1bIlUiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paT1Nb2R1bGVbImR5bkNhbGxfaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpPU1vZHVsZVsiZHluQ2FsbF9paSJdPU1vZHVsZVsiYXNtIl1bIlYiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF92aWk9TW9kdWxlWyJkeW5DYWxsX3ZpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfdmlpPU1vZHVsZVsiZHluQ2FsbF92aWkiXT1Nb2R1bGVbImFzbSJdWyJXIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaSJdPU1vZHVsZVsiYXNtIl1bIlgiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaSJdPU1vZHVsZVsiYXNtIl1bIlkiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWkiXT1Nb2R1bGVbImFzbSJdWyJaIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWkiXT1Nb2R1bGVbImFzbSJdWyJfIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpIl09TW9kdWxlWyJhc20iXVsiJCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX3ZpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfdmlpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpIl09TW9kdWxlWyJhc20iXVsiYWEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpIl09TW9kdWxlWyJhc20iXVsiYmEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpaWlpaWlpaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpaSJdPU1vZHVsZVsiYXNtIl1bImNhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpaWlpaWlpaWlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaWlpaWlpaWlpaWlpaWlpaWlpIl09TW9kdWxlWyJhc20iXVsiZGEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWlpaWlpaWlpaWlpIl09TW9kdWxlWyJhc20iXVsiZWEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF92aWlpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfdmlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWkiXT1Nb2R1bGVbImFzbSJdWyJmYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2lpaWlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpaWlpaWkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2lpaWlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpaWlpaWkiXT1Nb2R1bGVbImFzbSJdWyJnYSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2lpaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfaWlpaWlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpaWlpaWlpIl09TW9kdWxlWyJhc20iXVsiaGEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF9qaWppPU1vZHVsZVsiZHluQ2FsbF9qaWppIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9qaWppPU1vZHVsZVsiZHluQ2FsbF9qaWppIl09TW9kdWxlWyJhc20iXVsiaWEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF92aWlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF92aWlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWlpIl09TW9kdWxlWyJhc20iXVsiamEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtNb2R1bGVbImFzbSJdPWFzbTt2YXIgY2FsbGVkUnVuO2Z1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiO3RoaXMubWVzc2FnZT0iUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiK3N0YXR1cysiKSI7dGhpcy5zdGF0dXM9c3RhdHVzfWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1mdW5jdGlvbiBydW5DYWxsZXIoKXtpZighY2FsbGVkUnVuKXJ1bigpO2lmKCFjYWxsZWRSdW4pZGVwZW5kZW5jaWVzRnVsZmlsbGVkPXJ1bkNhbGxlcn07ZnVuY3Rpb24gcnVuKGFyZ3Mpe2FyZ3M9YXJnc3x8YXJndW1lbnRzXztpZihydW5EZXBlbmRlbmNpZXM+MCl7cmV0dXJufXByZVJ1bigpO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXJldHVybjtmdW5jdGlvbiBkb1J1bigpe2lmKGNhbGxlZFJ1bilyZXR1cm47Y2FsbGVkUnVuPXRydWU7TW9kdWxlWyJjYWxsZWRSdW4iXT10cnVlO2lmKEFCT1JUKXJldHVybjtpbml0UnVudGltZSgpO3ByZU1haW4oKTtyZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7aWYoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKU1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSgpO3Bvc3RSdW4oKX1pZihNb2R1bGVbInNldFN0YXR1cyJdKXtNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7c2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtNb2R1bGVbInNldFN0YXR1cyJdKCIiKX0sMSk7ZG9SdW4oKX0sMSl9ZWxzZXtkb1J1bigpfX1Nb2R1bGVbInJ1biJdPXJ1bjtpZihNb2R1bGVbInByZUluaXQiXSl7aWYodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlSW5pdCJdPVtNb2R1bGVbInByZUluaXQiXV07d2hpbGUoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoPjApe01vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCl9fW5vRXhpdFJ1bnRpbWU9dHJ1ZTtydW4oKTsKIAogCiAgIHJldHVybiBCQVNJUy5yZWFkeQpAQCAtMTQsOCArMTQsOSBAQAogKTsKIH0pKCk7CiBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKQotICBtb2R1bGUuZXhwb3J0cyA9IEJBU0lTOwotZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKQotICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkgeyByZXR1cm4gQkFTSVM7IH0pOwotZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKQotICBleHBvcnRzWyJCQVNJUyJdID0gQkFTSVM7CisgICAgICBtb2R1bGUuZXhwb3J0cyA9IEJBU0lTOworICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkKKyAgICAgIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7IHJldHVybiBCQVNJUzsgfSk7CisgICAgZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKQorICAgICAgZXhwb3J0c1siQkFTSVMiXSA9IEJBU0lTOworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYmdsL3RyYW5zY29kZXIvYnVpbGQvYmFzaXNfdHJhbnNjb2Rlci53YXNtIGIvd2ViZ2wvdHJhbnNjb2Rlci9idWlsZC9iYXNpc190cmFuc2NvZGVyLndhc20KaW5kZXggNGI5YzM0My4uYmM3NDc3MCAxMDA2NDQKLS0tIGEvd2ViZ2wvdHJhbnNjb2Rlci9idWlsZC9iYXNpc190cmFuc2NvZGVyLndhc20KKysrIGIvd2ViZ2wvdHJhbnNjb2Rlci9idWlsZC9iYXNpc190cmFuc2NvZGVyLndhc20KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViZ2xfdmlkZW90ZXN0LzYuMS4wMS5iYXNpcyBiL3dlYmdsX3ZpZGVvdGVzdC82LjEuMDEuYmFzaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhMDZkYwotLS0gL2Rldi9udWxsCisrKyBiL3dlYmdsX3ZpZGVvdGVzdC82LjEuMDEuYmFzaXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViZ2xfdmlkZW90ZXN0L2Jhc2lzLmpzIGIvd2ViZ2xfdmlkZW90ZXN0L2Jhc2lzLmpzCmluZGV4IDczYWFmNTguLmY4OWVhOGUgMTAwNjQ0Ci0tLSBhL3dlYmdsX3ZpZGVvdGVzdC9iYXNpcy5qcworKysgYi93ZWJnbF92aWRlb3Rlc3QvYmFzaXMuanMKQEAgLTEgKzEgQEAKLXZhciBNb2R1bGU9dHlwZW9mIE1vZHVsZSE9PSJ1bmRlZmluZWQiP01vZHVsZTp7fTt2YXIgbW9kdWxlT3ZlcnJpZGVzPXt9O3ZhciBrZXk7Zm9yKGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIGFyZ3VtZW50c189W107dmFyIHRoaXNQcm9ncmFtPSIuL3RoaXMucHJvZ3JhbSI7dmFyIHF1aXRfPWZ1bmN0aW9uKHN0YXR1cyx0b1Rocm93KXt0aHJvdyB0b1Rocm93fTt2YXIgRU5WSVJPTk1FTlRfSVNfV0VCPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX05PREU9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX1NIRUxMPWZhbHNlO0VOVklST05NRU5UX0lTX1dFQj10eXBlb2Ygd2luZG93PT09Im9iamVjdCI7RU5WSVJPTk1FTlRfSVNfV09SS0VSPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT09ImZ1bmN0aW9uIjtFTlZJUk9OTUVOVF9JU19OT0RFPXR5cGVvZiBwcm9jZXNzPT09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT0ic3RyaW5nIjtFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjt2YXIgc2NyaXB0RGlyZWN0b3J5PSIiO2Z1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCl7aWYoTW9kdWxlWyJsb2NhdGVGaWxlIl0pe3JldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLHNjcmlwdERpcmVjdG9yeSl9cmV0dXJuIHNjcmlwdERpcmVjdG9yeStwYXRofXZhciByZWFkXyxyZWFkQXN5bmMscmVhZEJpbmFyeSxzZXRXaW5kb3dUaXRsZTt2YXIgbm9kZUZTO3ZhciBub2RlUGF0aDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1yZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpKyIvIn1lbHNle3NjcmlwdERpcmVjdG9yeT1fX2Rpcm5hbWUrIi8ifXJlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKCJmcyIpO2lmKCFub2RlUGF0aClub2RlUGF0aD1yZXF1aXJlKCJwYXRoIik7ZmlsZW5hbWU9bm9kZVBhdGhbIm5vcm1hbGl6ZSJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTWyJyZWFkRmlsZVN5bmMiXShmaWxlbmFtZSxiaW5hcnk/bnVsbDoidXRmOCIpfTtyZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZmlsZW5hbWUpe3ZhciByZXQ9cmVhZF8oZmlsZW5hbWUsdHJ1ZSk7aWYoIXJldC5idWZmZXIpe3JldD1uZXcgVWludDhBcnJheShyZXQpfWFzc2VydChyZXQuYnVmZmVyKTtyZXR1cm4gcmV0fTtpZihwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoPjEpe3RoaXNQcm9ncmFtPXByb2Nlc3NbImFyZ3YiXVsxXS5yZXBsYWNlKC9cXC9nLCIvIil9YXJndW1lbnRzXz1wcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7aWYodHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKXttb2R1bGVbImV4cG9ydHMiXT1Nb2R1bGV9cHJvY2Vzc1sib24iXSgidW5jYXVnaHRFeGNlcHRpb24iLGZ1bmN0aW9uKGV4KXtpZighKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpe3Rocm93IGV4fX0pO3Byb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsYWJvcnQpO3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cHJvY2Vzc1siZXhpdCJdKHN0YXR1cyl9O01vZHVsZVsiaW5zcGVjdCJdPWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19TSEVMTCl7aWYodHlwZW9mIHJlYWQhPSJ1bmRlZmluZWQiKXtyZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGYpe3JldHVybiByZWFkKGYpfX1yZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7dmFyIGRhdGE7aWYodHlwZW9mIHJlYWRidWZmZXI9PT0iZnVuY3Rpb24iKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVhZGJ1ZmZlcihmKSl9ZGF0YT1yZWFkKGYsImJpbmFyeSIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PSJvYmplY3QiKTtyZXR1cm4gZGF0YX07aWYodHlwZW9mIHNjcmlwdEFyZ3MhPSJ1bmRlZmluZWQiKXthcmd1bWVudHNfPXNjcmlwdEFyZ3N9ZWxzZSBpZih0eXBlb2YgYXJndW1lbnRzIT0idW5kZWZpbmVkIil7YXJndW1lbnRzXz1hcmd1bWVudHN9aWYodHlwZW9mIHF1aXQ9PT0iZnVuY3Rpb24iKXtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3F1aXQoc3RhdHVzKX19aWYodHlwZW9mIHByaW50IT09InVuZGVmaW5lZCIpe2lmKHR5cGVvZiBjb25zb2xlPT09InVuZGVmaW5lZCIpY29uc29sZT17fTtjb25zb2xlLmxvZz1wcmludDtjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnIhPT0idW5kZWZpbmVkIj9wcmludEVycjpwcmludH19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9c2VsZi5sb2NhdGlvbi5ocmVmfWVsc2UgaWYodHlwZW9mIGRvY3VtZW50IT09InVuZGVmaW5lZCImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQpe3NjcmlwdERpcmVjdG9yeT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY31pZihzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9IiJ9e3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQodXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO3JldHVybiB4aHIucmVzcG9uc2VUZXh0fTtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeSh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24gcmVhZEFzeW5jKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oIkdFVCIsdXJsLHRydWUpO3hoci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIjt4aHIub25sb2FkPWZ1bmN0aW9uIHhocl9vbmxvYWQoKXtpZih4aHIuc3RhdHVzPT0yMDB8fHhoci5zdGF0dXM9PTAmJnhoci5yZXNwb25zZSl7b25sb2FkKHhoci5yZXNwb25zZSk7cmV0dXJufW9uZXJyb3IoKX07eGhyLm9uZXJyb3I9b25lcnJvcjt4aHIuc2VuZChudWxsKX19c2V0V2luZG93VGl0bGU9ZnVuY3Rpb24odGl0bGUpe2RvY3VtZW50LnRpdGxlPXRpdGxlfX1lbHNle312YXIgb3V0PU1vZHVsZVsicHJpbnQiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVsicHJpbnRFcnIiXXx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7Zm9yKGtleSBpbiBtb2R1bGVPdmVycmlkZXMpe2lmKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtNb2R1bGVba2V5XT1tb2R1bGVPdmVycmlkZXNba2V5XX19bW9kdWxlT3ZlcnJpZGVzPW51bGw7aWYoTW9kdWxlWyJhcmd1bWVudHMiXSlhcmd1bWVudHNfPU1vZHVsZVsiYXJndW1lbnRzIl07aWYoTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdKXRoaXNQcm9ncmFtPU1vZHVsZVsidGhpc1Byb2dyYW0iXTtpZihNb2R1bGVbInF1aXQiXSlxdWl0Xz1Nb2R1bGVbInF1aXQiXTt2YXIgU1RBQ0tfQUxJR049MTY7ZnVuY3Rpb24gd2Fybk9uY2UodGV4dCl7aWYoIXdhcm5PbmNlLnNob3duKXdhcm5PbmNlLnNob3duPXt9O2lmKCF3YXJuT25jZS5zaG93blt0ZXh0XSl7d2Fybk9uY2Uuc2hvd25bdGV4dF09MTtlcnIodGV4dCl9fWZ1bmN0aW9uIGNvbnZlcnRKc0Z1bmN0aW9uVG9XYXNtKGZ1bmMsc2lnKXtpZih0eXBlb2YgV2ViQXNzZW1ibHkuRnVuY3Rpb249PT0iZnVuY3Rpb24iKXt2YXIgdHlwZU5hbWVzPXsiaSI6ImkzMiIsImoiOiJpNjQiLCJmIjoiZjMyIiwiZCI6ImY2NCJ9O3ZhciB0eXBlPXtwYXJhbWV0ZXJzOltdLHJlc3VsdHM6c2lnWzBdPT0idiI/W106W3R5cGVOYW1lc1tzaWdbMF1dXX07Zm9yKHZhciBpPTE7aTxzaWcubGVuZ3RoOysraSl7dHlwZS5wYXJhbWV0ZXJzLnB1c2godHlwZU5hbWVzW3NpZ1tpXV0pfXJldHVybiBuZXcgV2ViQXNzZW1ibHkuRnVuY3Rpb24odHlwZSxmdW5jKX12YXIgdHlwZVNlY3Rpb249WzEsMCwxLDk2XTt2YXIgc2lnUmV0PXNpZy5zbGljZSgwLDEpO3ZhciBzaWdQYXJhbT1zaWcuc2xpY2UoMSk7dmFyIHR5cGVDb2Rlcz17ImkiOjEyNywiaiI6MTI2LCJmIjoxMjUsImQiOjEyNH07dHlwZVNlY3Rpb24ucHVzaChzaWdQYXJhbS5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8c2lnUGFyYW0ubGVuZ3RoOysraSl7dHlwZVNlY3Rpb24ucHVzaCh0eXBlQ29kZXNbc2lnUGFyYW1baV1dKX1pZihzaWdSZXQ9PSJ2Iil7dHlwZVNlY3Rpb24ucHVzaCgwKX1lbHNle3R5cGVTZWN0aW9uPXR5cGVTZWN0aW9uLmNvbmNhdChbMSx0eXBlQ29kZXNbc2lnUmV0XV0pfXR5cGVTZWN0aW9uWzFdPXR5cGVTZWN0aW9uLmxlbmd0aC0yO3ZhciBieXRlcz1uZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDBdLmNvbmNhdCh0eXBlU2VjdGlvbixbMiw3LDEsMSwxMDEsMSwxMDIsMCwwLDcsNSwxLDEsMTAyLDAsMF0pKTt2YXIgbW9kdWxlPW5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoYnl0ZXMpO3ZhciBpbnN0YW5jZT1uZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobW9kdWxlLHsiZSI6eyJmIjpmdW5jfX0pO3ZhciB3cmFwcGVkRnVuYz1pbnN0YW5jZS5leHBvcnRzWyJmIl07cmV0dXJuIHdyYXBwZWRGdW5jfXZhciBmcmVlVGFibGVJbmRleGVzPVtdO3ZhciBmdW5jdGlvbnNJblRhYmxlTWFwO2Z1bmN0aW9uIGdldEVtcHR5VGFibGVTbG90KCl7aWYoZnJlZVRhYmxlSW5kZXhlcy5sZW5ndGgpe3JldHVybiBmcmVlVGFibGVJbmRleGVzLnBvcCgpfXRyeXt3YXNtVGFibGUuZ3JvdygxKX1jYXRjaChlcnIpe2lmKCEoZXJyIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpe3Rocm93IGVycn10aHJvdyJVbmFibGUgdG8gZ3JvdyB3YXNtIHRhYmxlLiBTZXQgQUxMT1dfVEFCTEVfR1JPV1RILiJ9cmV0dXJuIHdhc21UYWJsZS5sZW5ndGgtMX1mdW5jdGlvbiBhZGRGdW5jdGlvbldhc20oZnVuYyxzaWcpe2lmKCFmdW5jdGlvbnNJblRhYmxlTWFwKXtmdW5jdGlvbnNJblRhYmxlTWFwPW5ldyBXZWFrTWFwO2Zvcih2YXIgaT0wO2k8d2FzbVRhYmxlLmxlbmd0aDtpKyspe3ZhciBpdGVtPXdhc21UYWJsZS5nZXQoaSk7aWYoaXRlbSl7ZnVuY3Rpb25zSW5UYWJsZU1hcC5zZXQoaXRlbSxpKX19fWlmKGZ1bmN0aW9uc0luVGFibGVNYXAuaGFzKGZ1bmMpKXtyZXR1cm4gZnVuY3Rpb25zSW5UYWJsZU1hcC5nZXQoZnVuYyl9dmFyIHJldD1nZXRFbXB0eVRhYmxlU2xvdCgpO3RyeXt3YXNtVGFibGUuc2V0KHJldCxmdW5jKX1jYXRjaChlcnIpe2lmKCEoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yKSl7dGhyb3cgZXJyfXZhciB3cmFwcGVkPWNvbnZlcnRKc0Z1bmN0aW9uVG9XYXNtKGZ1bmMsc2lnKTt3YXNtVGFibGUuc2V0KHJldCx3cmFwcGVkKX1mdW5jdGlvbnNJblRhYmxlTWFwLnNldChmdW5jLHJldCk7cmV0dXJuIHJldH12YXIgdGVtcFJldDA9MDt2YXIgc2V0VGVtcFJldDA9ZnVuY3Rpb24odmFsdWUpe3RlbXBSZXQwPXZhbHVlfTt2YXIgd2FzbUJpbmFyeTtpZihNb2R1bGVbIndhc21CaW5hcnkiXSl3YXNtQmluYXJ5PU1vZHVsZVsid2FzbUJpbmFyeSJdO3ZhciBub0V4aXRSdW50aW1lO2lmKE1vZHVsZVsibm9FeGl0UnVudGltZSJdKW5vRXhpdFJ1bnRpbWU9TW9kdWxlWyJub0V4aXRSdW50aW1lIl07aWYodHlwZW9mIFdlYkFzc2VtYmx5IT09Im9iamVjdCIpe2Fib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIil9dmFyIHdhc21NZW1vcnk7dmFyIEFCT1JUPWZhbHNlO3ZhciBFWElUU1RBVFVTO2Z1bmN0aW9uIGFzc2VydChjb25kaXRpb24sdGV4dCl7aWYoIWNvbmRpdGlvbil7YWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIrdGV4dCl9fWZ1bmN0aW9uIGdldENGdW5jKGlkZW50KXt2YXIgZnVuYz1Nb2R1bGVbIl8iK2lkZW50XTthc3NlcnQoZnVuYywiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiAiK2lkZW50KyIsIG1ha2Ugc3VyZSBpdCBpcyBleHBvcnRlZCIpO3JldHVybiBmdW5jfWZ1bmN0aW9uIGNjYWxsKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyxvcHRzKXt2YXIgdG9DPXsic3RyaW5nIjpmdW5jdGlvbihzdHIpe3ZhciByZXQ9MDtpZihzdHIhPT1udWxsJiZzdHIhPT11bmRlZmluZWQmJnN0ciE9PTApe3ZhciBsZW49KHN0ci5sZW5ndGg8PDIpKzE7cmV0PXN0YWNrQWxsb2MobGVuKTtzdHJpbmdUb1VURjgoc3RyLHJldCxsZW4pfXJldHVybiByZXR9LCJhcnJheSI6ZnVuY3Rpb24oYXJyKXt2YXIgcmV0PXN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9fTtmdW5jdGlvbiBjb252ZXJ0UmV0dXJuVmFsdWUocmV0KXtpZihyZXR1cm5UeXBlPT09InN0cmluZyIpcmV0dXJuIFVURjhUb1N0cmluZyhyZXQpO2lmKHJldHVyblR5cGU9PT0iYm9vbGVhbiIpcmV0dXJuIEJvb2xlYW4ocmV0KTtyZXR1cm4gcmV0fXZhciBmdW5jPWdldENGdW5jKGlkZW50KTt2YXIgY0FyZ3M9W107dmFyIHN0YWNrPTA7aWYoYXJncyl7Zm9yKHZhciBpPTA7aTxhcmdzLmxlbmd0aDtpKyspe3ZhciBjb252ZXJ0ZXI9dG9DW2FyZ1R5cGVzW2ldXTtpZihjb252ZXJ0ZXIpe2lmKHN0YWNrPT09MClzdGFjaz1zdGFja1NhdmUoKTtjQXJnc1tpXT1jb252ZXJ0ZXIoYXJnc1tpXSl9ZWxzZXtjQXJnc1tpXT1hcmdzW2ldfX19dmFyIHJldD1mdW5jLmFwcGx5KG51bGwsY0FyZ3MpO3JldD1jb252ZXJ0UmV0dXJuVmFsdWUocmV0KTtpZihzdGFjayE9PTApc3RhY2tSZXN0b3JlKHN0YWNrKTtyZXR1cm4gcmV0fXZhciBBTExPQ19TVEFDSz0xO3ZhciBVVEY4RGVjb2Rlcj10eXBlb2YgVGV4dERlY29kZXIhPT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp1bmRlZmluZWQ7ZnVuY3Rpb24gVVRGOEFycmF5VG9TdHJpbmcoaGVhcCxpZHgsbWF4Qnl0ZXNUb1JlYWQpe3ZhciBlbmRJZHg9aWR4K21heEJ5dGVzVG9SZWFkO3ZhciBlbmRQdHI9aWR4O3doaWxlKGhlYXBbZW5kUHRyXSYmIShlbmRQdHI+PWVuZElkeCkpKytlbmRQdHI7aWYoZW5kUHRyLWlkeD4xNiYmaGVhcC5zdWJhcnJheSYmVVRGOERlY29kZXIpe3JldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsZW5kUHRyKSl9ZWxzZXt2YXIgc3RyPSIiO3doaWxlKGlkeDxlbmRQdHIpe3ZhciB1MD1oZWFwW2lkeCsrXTtpZighKHUwJjEyOCkpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7Y29udGludWV9dmFyIHUxPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyMjQpPT0xOTIpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgodTAmMzEpPDw2fHUxKTtjb250aW51ZX12YXIgdTI9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjI0MCk9PTIyNCl7dTA9KHUwJjE1KTw8MTJ8dTE8PDZ8dTJ9ZWxzZXt1MD0odTAmNyk8PDE4fHUxPDwxMnx1Mjw8NnxoZWFwW2lkeCsrXSY2M31pZih1MDw2NTUzNil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKX1lbHNle3ZhciBjaD11MC02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfX19cmV0dXJuIHN0cn1mdW5jdGlvbiBVVEY4VG9TdHJpbmcocHRyLG1heEJ5dGVzVG9SZWFkKXtyZXR1cm4gcHRyP1VURjhBcnJheVRvU3RyaW5nKEhFQVBVOCxwdHIsbWF4Qnl0ZXNUb1JlYWQpOiIifWZ1bmN0aW9uIHN0cmluZ1RvVVRGOEFycmF5KHN0cixoZWFwLG91dElkeCxtYXhCeXRlc1RvV3JpdGUpe2lmKCEobWF4Qnl0ZXNUb1dyaXRlPjApKXJldHVybiAwO3ZhciBzdGFydElkeD1vdXRJZHg7dmFyIGVuZElkeD1vdXRJZHgrbWF4Qnl0ZXNUb1dyaXRlLTE7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXt2YXIgdTE9c3RyLmNoYXJDb2RlQXQoKytpKTt1PTY1NTM2KygodSYxMDIzKTw8MTApfHUxJjEwMjN9aWYodTw9MTI3KXtpZihvdXRJZHg+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT11fWVsc2UgaWYodTw9MjA0Nyl7aWYob3V0SWR4KzE+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0xOTJ8dT4+NjtoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY1NTM1KXtpZihvdXRJZHgrMj49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTIyNHx1Pj4xMjtoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNle2lmKG91dElkeCszPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjQwfHU+PjE4O2hlYXBbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M319aGVhcFtvdXRJZHhdPTA7cmV0dXJuIG91dElkeC1zdGFydElkeH1mdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe3JldHVybiBzdHJpbmdUb1VURjhBcnJheShzdHIsSEVBUFU4LG91dFB0cixtYXhCeXRlc1RvV3JpdGUpfWZ1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGOChzdHIpe3ZhciBsZW49MDtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpdT02NTUzNisoKHUmMTAyMyk8PDEwKXxzdHIuY2hhckNvZGVBdCgrK2kpJjEwMjM7aWYodTw9MTI3KSsrbGVuO2Vsc2UgaWYodTw9MjA0NylsZW4rPTI7ZWxzZSBpZih1PD02NTUzNSlsZW4rPTM7ZWxzZSBsZW4rPTR9cmV0dXJuIGxlbn12YXIgVVRGMTZEZWNvZGVyPXR5cGVvZiBUZXh0RGVjb2RlciE9PSJ1bmRlZmluZWQiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp1bmRlZmluZWQ7ZnVuY3Rpb24gd3JpdGVBcnJheVRvTWVtb3J5KGFycmF5LGJ1ZmZlcil7SEVBUDguc2V0KGFycmF5LGJ1ZmZlcil9ZnVuY3Rpb24gd3JpdGVBc2NpaVRvTWVtb3J5KHN0cixidWZmZXIsZG9udEFkZE51bGwpe2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe0hFQVA4W2J1ZmZlcisrPj4wXT1zdHIuY2hhckNvZGVBdChpKX1pZighZG9udEFkZE51bGwpSEVBUDhbYnVmZmVyPj4wXT0wfXZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlWyJIRUFQOCJdPUhFQVA4PW5ldyBJbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVAxNiJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUDMyIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQVTgiXT1IRUFQVTg9bmV3IFVpbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVBVMTYiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUFUzMiJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjMyIl09SEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjY0Il09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIElOSVRJQUxfTUVNT1JZPU1vZHVsZVsiSU5JVElBTF9NRU1PUlkiXXx8NzQ5OTkzOTg0O3ZhciB3YXNtVGFibGU7dmFyIF9fQVRQUkVSVU5fXz1bXTt2YXIgX19BVElOSVRfXz1bXTt2YXIgX19BVE1BSU5fXz1bXTt2YXIgX19BVFBPU1RSVU5fXz1bXTt2YXIgcnVudGltZUluaXRpYWxpemVkPWZhbHNlO3ZhciBydW50aW1lRXhpdGVkPWZhbHNlO2Z1bmN0aW9uIHByZVJ1bigpe2lmKE1vZHVsZVsicHJlUnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlUnVuIl09W01vZHVsZVsicHJlUnVuIl1dO3doaWxlKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKXthZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIGV4aXRSdW50aW1lKCl7cnVudGltZUV4aXRlZD10cnVlfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihNb2R1bGVbInBvc3RSdW4iXSl7aWYodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicG9zdFJ1biJdPVtNb2R1bGVbInBvc3RSdW4iXV07d2hpbGUoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlWyJwb3N0UnVuIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pfWZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKXtfX0FUUFJFUlVOX18udW5zaGlmdChjYil9ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfXZhciBydW5EZXBlbmRlbmNpZXM9MDt2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pe01vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyl9fWZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcy0tO2lmKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKXtNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyIGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXT17fTtNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdPXt9O2Z1bmN0aW9uIGFib3J0KHdoYXQpe2lmKE1vZHVsZVsib25BYm9ydCJdKXtNb2R1bGVbIm9uQWJvcnQiXSh3aGF0KX13aGF0Kz0iIjtlcnIod2hhdCk7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7d2hhdD0iYWJvcnQoIit3aGF0KyIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7dmFyIGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTt0aHJvdyBlfWZ1bmN0aW9uIGhhc1ByZWZpeChzdHIscHJlZml4KXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoP3N0ci5zdGFydHNXaXRoKHByZWZpeCk6c3RyLmluZGV4T2YocHJlZml4KT09PTB9dmFyIGRhdGFVUklQcmVmaXg9ImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiO2Z1bmN0aW9uIGlzRGF0YVVSSShmaWxlbmFtZSl7cmV0dXJuIGhhc1ByZWZpeChmaWxlbmFtZSxkYXRhVVJJUHJlZml4KX12YXIgZmlsZVVSSVByZWZpeD0iZmlsZTovLyI7ZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGZpbGVVUklQcmVmaXgpfXZhciB3YXNtQmluYXJ5RmlsZT0iYmFzaXMud2FzbSI7aWYoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpe3dhc21CaW5hcnlGaWxlPWxvY2F0ZUZpbGUod2FzbUJpbmFyeUZpbGUpfWZ1bmN0aW9uIGdldEJpbmFyeSgpe3RyeXtpZih3YXNtQmluYXJ5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSl9aWYocmVhZEJpbmFyeSl7cmV0dXJuIHJlYWRCaW5hcnkod2FzbUJpbmFyeUZpbGUpfWVsc2V7dGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifX1jYXRjaChlcnIpe2Fib3J0KGVycil9fWZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKXtpZighd2FzbUJpbmFyeSYmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKSYmdHlwZW9mIGZldGNoPT09ImZ1bmN0aW9uIiYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZVsib2siXSl7dGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIit3YXNtQmluYXJ5RmlsZSsiJyJ9cmV0dXJuIHJlc3BvbnNlWyJhcnJheUJ1ZmZlciJdKCl9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiBnZXRCaW5hcnkoKX0pfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGdldEJpbmFyeSl9ZnVuY3Rpb24gY3JlYXRlV2FzbSgpe3ZhciBpbmZvPXsiZW52Ijphc21MaWJyYXJ5QXJnLCJ3YXNpX3NuYXBzaG90X3ByZXZpZXcxIjphc21MaWJyYXJ5QXJnfTtmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsbW9kdWxlKXt2YXIgZXhwb3J0cz1pbnN0YW5jZS5leHBvcnRzO01vZHVsZVsiYXNtIl09ZXhwb3J0czt3YXNtTWVtb3J5PU1vZHVsZVsiYXNtIl1bIm1lbW9yeSJdO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTt3YXNtVGFibGU9TW9kdWxlWyJhc20iXVsiX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZSJdO3JlbW92ZVJ1bkRlcGVuZGVuY3koIndhc20taW5zdGFudGlhdGUiKX1hZGRSdW5EZXBlbmRlbmN5KCJ3YXNtLWluc3RhbnRpYXRlIik7ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpe3JlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pfWZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpe3JldHVybiBnZXRCaW5hcnlQcm9taXNlKCkudGhlbihmdW5jdGlvbihiaW5hcnkpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksaW5mbyl9KS50aGVuKHJlY2VpdmVyLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiK3JlYXNvbik7YWJvcnQocmVhc29uKX0pfWZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoKXtpZighd2FzbUJpbmFyeSYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT09ImZ1bmN0aW9uIiYmIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkmJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpJiZ0eXBlb2YgZmV0Y2g9PT0iZnVuY3Rpb24iKXtyZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXt2YXIgcmVzdWx0PVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLGluZm8pO3JldHVybiByZXN1bHQudGhlbihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlLGZ1bmN0aW9uKHJlYXNvbil7ZXJyKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIityZWFzb24pO2VycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX0pfSl9ZWxzZXtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX19aWYoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSl7dHJ5e3ZhciBleHBvcnRzPU1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbyxyZWNlaXZlSW5zdGFuY2UpO3JldHVybiBleHBvcnRzfWNhdGNoKGUpe2VycigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKTtyZXR1cm4gZmFsc2V9fWluc3RhbnRpYXRlQXN5bmMoKTtyZXR1cm57fX12YXIgdGVtcERvdWJsZTt2YXIgdGVtcEk2NDtmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3Mpe3doaWxlKGNhbGxiYWNrcy5sZW5ndGg+MCl7dmFyIGNhbGxiYWNrPWNhbGxiYWNrcy5zaGlmdCgpO2lmKHR5cGVvZiBjYWxsYmFjaz09ImZ1bmN0aW9uIil7Y2FsbGJhY2soTW9kdWxlKTtjb250aW51ZX12YXIgZnVuYz1jYWxsYmFjay5mdW5jO2lmKHR5cGVvZiBmdW5jPT09Im51bWJlciIpe2lmKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZCl7d2FzbVRhYmxlLmdldChmdW5jKSgpfWVsc2V7d2FzbVRhYmxlLmdldChmdW5jKShjYWxsYmFjay5hcmcpfX1lbHNle2Z1bmMoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkP251bGw6Y2FsbGJhY2suYXJnKX19fWZ1bmN0aW9uIGRlbWFuZ2xlKGZ1bmMpe3JldHVybiBmdW5jfWZ1bmN0aW9uIGRlbWFuZ2xlQWxsKHRleHQpe3ZhciByZWdleD0vXGJfWltcd1xkX10rL2c7cmV0dXJuIHRleHQucmVwbGFjZShyZWdleCxmdW5jdGlvbih4KXt2YXIgeT1kZW1hbmdsZSh4KTtyZXR1cm4geD09PXk/eDp5KyIgWyIreCsiXSJ9KX1mdW5jdGlvbiBqc1N0YWNrVHJhY2UoKXt2YXIgZXJyb3I9bmV3IEVycm9yO2lmKCFlcnJvci5zdGFjayl7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChlKXtlcnJvcj1lfWlmKCFlcnJvci5zdGFjayl7cmV0dXJuIihubyBzdGFjayB0cmFjZSBhdmFpbGFibGUpIn19cmV0dXJuIGVycm9yLnN0YWNrLnRvU3RyaW5nKCl9ZnVuY3Rpb24gX19fYXNzZXJ0X2ZhaWwoY29uZGl0aW9uLGZpbGVuYW1lLGxpbmUsZnVuYyl7YWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIrVVRGOFRvU3RyaW5nKGNvbmRpdGlvbikrIiwgYXQ6ICIrW2ZpbGVuYW1lP1VURjhUb1N0cmluZyhmaWxlbmFtZSk6InVua25vd24gZmlsZW5hbWUiLGxpbmUsZnVuYz9VVEY4VG9TdHJpbmcoZnVuYyk6InVua25vd24gZnVuY3Rpb24iXSl9ZnVuY3Rpb24gX2Fib3J0KCl7YWJvcnQoKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3Qsc3JjLG51bSl7SEVBUFU4LmNvcHlXaXRoaW4oZGVzdCxzcmMsc3JjK251bSl9ZnVuY3Rpb24gYWJvcnRPbkNhbm5vdEdyb3dNZW1vcnkocmVxdWVzdGVkU2l6ZSl7YWJvcnQoIk9PTSIpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpe3JlcXVlc3RlZFNpemU9cmVxdWVzdGVkU2l6ZT4+PjA7YWJvcnRPbkNhbm5vdEdyb3dNZW1vcnkocmVxdWVzdGVkU2l6ZSl9dmFyIFNZU0NBTExTPXttYXBwaW5nczp7fSxidWZmZXJzOltudWxsLFtdLFtdXSxwcmludENoYXI6ZnVuY3Rpb24oc3RyZWFtLGN1cnIpe3ZhciBidWZmZXI9U1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dO2lmKGN1cnI9PT0wfHxjdXJyPT09MTApeyhzdHJlYW09PT0xP291dDplcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwwKSk7YnVmZmVyLmxlbmd0aD0wfWVsc2V7YnVmZmVyLnB1c2goY3Vycil9fSx2YXJhcmdzOnVuZGVmaW5lZCxnZXQ6ZnVuY3Rpb24oKXtTWVNDQUxMUy52YXJhcmdzKz00O3ZhciByZXQ9SEVBUDMyW1NZU0NBTExTLnZhcmFyZ3MtND4+Ml07cmV0dXJuIHJldH0sZ2V0U3RyOmZ1bmN0aW9uKHB0cil7dmFyIHJldD1VVEY4VG9TdHJpbmcocHRyKTtyZXR1cm4gcmV0fSxnZXQ2NDpmdW5jdGlvbihsb3csaGlnaCl7cmV0dXJuIGxvd319O2Z1bmN0aW9uIF9mZF9jbG9zZShmZCl7cmV0dXJuIDB9ZnVuY3Rpb24gX2ZkX3NlZWsoZmQsb2Zmc2V0X2xvdyxvZmZzZXRfaGlnaCx3aGVuY2UsbmV3T2Zmc2V0KXt9ZnVuY3Rpb24gX2ZkX3dyaXRlKGZkLGlvdixpb3ZjbnQscG51bSl7dmFyIG51bT0wO2Zvcih2YXIgaT0wO2k8aW92Y250O2krKyl7dmFyIHB0cj1IRUFQMzJbaW92K2kqOD4+Ml07dmFyIGxlbj1IRUFQMzJbaW92KyhpKjgrNCk+PjJdO2Zvcih2YXIgaj0wO2o8bGVuO2orKyl7U1lTQ0FMTFMucHJpbnRDaGFyKGZkLEhFQVBVOFtwdHIral0pfW51bSs9bGVufUhFQVAzMltwbnVtPj4yXT1udW07cmV0dXJuIDB9ZnVuY3Rpb24gX3NldFRlbXBSZXQwKCRpKXtzZXRUZW1wUmV0MCgkaXwwKX12YXIgQVNTRVJUSU9OUz1mYWxzZTtfX0FUSU5JVF9fLnB1c2goe2Z1bmM6ZnVuY3Rpb24oKXtfX193YXNtX2NhbGxfY3RvcnMoKX19KTt2YXIgYXNtTGlicmFyeUFyZz17Il9fYXNzZXJ0X2ZhaWwiOl9fX2Fzc2VydF9mYWlsLCJhYm9ydCI6X2Fib3J0LCJlbXNjcmlwdGVuX21lbWNweV9iaWciOl9lbXNjcmlwdGVuX21lbWNweV9iaWcsImVtc2NyaXB0ZW5fcmVzaXplX2hlYXAiOl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLCJmZF9jbG9zZSI6X2ZkX2Nsb3NlLCJmZF9zZWVrIjpfZmRfc2VlaywiZmRfd3JpdGUiOl9mZF93cml0ZSwic2V0VGVtcFJldDAiOl9zZXRUZW1wUmV0MH07dmFyIGFzbT1jcmVhdGVXYXNtKCk7dmFyIF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdPU1vZHVsZVsiYXNtIl1bIl9fd2FzbV9jYWxsX2N0b3JzIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9tYWxsb2M9TW9kdWxlWyJfbWFsbG9jIl09ZnVuY3Rpb24oKXtyZXR1cm4oX21hbGxvYz1Nb2R1bGVbIl9tYWxsb2MiXT1Nb2R1bGVbImFzbSJdWyJtYWxsb2MiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2ZyZWU9TW9kdWxlWyJfZnJlZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9mcmVlPU1vZHVsZVsiX2ZyZWUiXT1Nb2R1bGVbImFzbSJdWyJmcmVlIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc19pbml0PU1vZHVsZVsiX2Jhc2lzX2luaXQiXT1mdW5jdGlvbigpe3JldHVybihfYmFzaXNfaW5pdD1Nb2R1bGVbIl9iYXNpc19pbml0Il09TW9kdWxlWyJhc20iXVsiYmFzaXNfaW5pdCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfYmFzaXNfb3Blbj1Nb2R1bGVbIl9iYXNpc19vcGVuIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX29wZW49TW9kdWxlWyJfYmFzaXNfb3BlbiJdPU1vZHVsZVsiYXNtIl1bImJhc2lzX29wZW4iXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Jhc2lzX2Nsb3NlPU1vZHVsZVsiX2Jhc2lzX2Nsb3NlIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX2Nsb3NlPU1vZHVsZVsiX2Jhc2lzX2Nsb3NlIl09TW9kdWxlWyJhc20iXVsiYmFzaXNfY2xvc2UiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Jhc2lzX2dldF9oYXNfYWxwaGE9TW9kdWxlWyJfYmFzaXNfZ2V0X2hhc19hbHBoYSJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc19nZXRfaGFzX2FscGhhPU1vZHVsZVsiX2Jhc2lzX2dldF9oYXNfYWxwaGEiXT1Nb2R1bGVbImFzbSJdWyJiYXNpc19nZXRfaGFzX2FscGhhIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc19nZXRfbnVtX2ltYWdlcz1Nb2R1bGVbIl9iYXNpc19nZXRfbnVtX2ltYWdlcyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc19nZXRfbnVtX2ltYWdlcz1Nb2R1bGVbIl9iYXNpc19nZXRfbnVtX2ltYWdlcyJdPU1vZHVsZVsiYXNtIl1bImJhc2lzX2dldF9udW1faW1hZ2VzIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc19nZXRfbnVtX2xldmVscz1Nb2R1bGVbIl9iYXNpc19nZXRfbnVtX2xldmVscyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc19nZXRfbnVtX2xldmVscz1Nb2R1bGVbIl9iYXNpc19nZXRfbnVtX2xldmVscyJdPU1vZHVsZVsiYXNtIl1bImJhc2lzX2dldF9udW1fbGV2ZWxzIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc19nZXRfaW1hZ2Vfd2lkdGg9TW9kdWxlWyJfYmFzaXNfZ2V0X2ltYWdlX3dpZHRoIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX2dldF9pbWFnZV93aWR0aD1Nb2R1bGVbIl9iYXNpc19nZXRfaW1hZ2Vfd2lkdGgiXT1Nb2R1bGVbImFzbSJdWyJiYXNpc19nZXRfaW1hZ2Vfd2lkdGgiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Jhc2lzX2dldF9pbWFnZV9oZWlnaHQ9TW9kdWxlWyJfYmFzaXNfZ2V0X2ltYWdlX2hlaWdodCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc19nZXRfaW1hZ2VfaGVpZ2h0PU1vZHVsZVsiX2Jhc2lzX2dldF9pbWFnZV9oZWlnaHQiXT1Nb2R1bGVbImFzbSJdWyJiYXNpc19nZXRfaW1hZ2VfaGVpZ2h0Il0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc19nZXRfaW1hZ2VfdHJhbnNjb2RlZF9zaXplX2luX2J5dGVzPU1vZHVsZVsiX2Jhc2lzX2dldF9pbWFnZV90cmFuc2NvZGVkX3NpemVfaW5fYnl0ZXMiXT1mdW5jdGlvbigpe3JldHVybihfYmFzaXNfZ2V0X2ltYWdlX3RyYW5zY29kZWRfc2l6ZV9pbl9ieXRlcz1Nb2R1bGVbIl9iYXNpc19nZXRfaW1hZ2VfdHJhbnNjb2RlZF9zaXplX2luX2J5dGVzIl09TW9kdWxlWyJhc20iXVsiYmFzaXNfZ2V0X2ltYWdlX3RyYW5zY29kZWRfc2l6ZV9pbl9ieXRlcyJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfYmFzaXNfc3RhcnRfdHJhbnNjb2Rpbmc9TW9kdWxlWyJfYmFzaXNfc3RhcnRfdHJhbnNjb2RpbmciXT1mdW5jdGlvbigpe3JldHVybihfYmFzaXNfc3RhcnRfdHJhbnNjb2Rpbmc9TW9kdWxlWyJfYmFzaXNfc3RhcnRfdHJhbnNjb2RpbmciXT1Nb2R1bGVbImFzbSJdWyJiYXNpc19zdGFydF90cmFuc2NvZGluZyJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfYmFzaXNfdHJhbnNjb2RlX2ltYWdlPU1vZHVsZVsiX2Jhc2lzX3RyYW5zY29kZV9pbWFnZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc190cmFuc2NvZGVfaW1hZ2U9TW9kdWxlWyJfYmFzaXNfdHJhbnNjb2RlX2ltYWdlIl09TW9kdWxlWyJhc20iXVsiYmFzaXNfdHJhbnNjb2RlX2ltYWdlIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fX2Vycm5vX2xvY2F0aW9uPU1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXT1mdW5jdGlvbigpe3JldHVybihfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl09TW9kdWxlWyJhc20iXVsiX19lcnJub19sb2NhdGlvbiJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja1NhdmU9TW9kdWxlWyJzdGFja1NhdmUiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1NhdmU9TW9kdWxlWyJzdGFja1NhdmUiXT1Nb2R1bGVbImFzbSJdWyJzdGFja1NhdmUiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tSZXN0b3JlPU1vZHVsZVsic3RhY2tSZXN0b3JlIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tSZXN0b3JlPU1vZHVsZVsic3RhY2tSZXN0b3JlIl09TW9kdWxlWyJhc20iXVsic3RhY2tSZXN0b3JlIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrQWxsb2M9TW9kdWxlWyJzdGFja0FsbG9jIl09ZnVuY3Rpb24oKXtyZXR1cm4oc3RhY2tBbGxvYz1Nb2R1bGVbInN0YWNrQWxsb2MiXT1Nb2R1bGVbImFzbSJdWyJzdGFja0FsbG9jIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfamlqaT1Nb2R1bGVbImR5bkNhbGxfamlqaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfamlqaT1Nb2R1bGVbImR5bkNhbGxfamlqaSJdPU1vZHVsZVsiYXNtIl1bImR5bkNhbGxfamlqaSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBjYWxsZWRSdW47ZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyI7dGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIrc3RhdHVzKyIpIjt0aGlzLnN0YXR1cz1zdGF0dXN9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uIHJ1bkNhbGxlcigpe2lmKCFjYWxsZWRSdW4pcnVuKCk7aWYoIWNhbGxlZFJ1bilkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxhcmd1bWVudHNfO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59cHJlUnVuKCk7aWYocnVuRGVwZW5kZW5jaWVzPjApcmV0dXJuO2Z1bmN0aW9uIGRvUnVuKCl7aWYoY2FsbGVkUnVuKXJldHVybjtjYWxsZWRSdW49dHJ1ZTtNb2R1bGVbImNhbGxlZFJ1biJdPXRydWU7aWYoQUJPUlQpcmV0dXJuO2luaXRSdW50aW1lKCk7cHJlTWFpbigpO2lmKE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSlNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTtwb3N0UnVuKCl9aWYoTW9kdWxlWyJzZXRTdGF0dXMiXSl7TW9kdWxlWyJzZXRTdGF0dXMiXSgiUnVubmluZy4uLiIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TW9kdWxlWyJzZXRTdGF0dXMiXSgiIil9LDEpO2RvUnVuKCl9LDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlWyJydW4iXT1ydW47aWYoTW9kdWxlWyJwcmVJbml0Il0pe2lmKHR5cGVvZiBNb2R1bGVbInByZUluaXQiXT09ImZ1bmN0aW9uIilNb2R1bGVbInByZUluaXQiXT1bTW9kdWxlWyJwcmVJbml0Il1dO3doaWxlKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aD4wKXtNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpfX1ub0V4aXRSdW50aW1lPXRydWU7cnVuKCk7Cit2YXIgTW9kdWxlPXR5cGVvZiBNb2R1bGUhPT0idW5kZWZpbmVkIj9Nb2R1bGU6e307dmFyIG1vZHVsZU92ZXJyaWRlcz17fTt2YXIga2V5O2ZvcihrZXkgaW4gTW9kdWxlKXtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkoa2V5KSl7bW9kdWxlT3ZlcnJpZGVzW2tleV09TW9kdWxlW2tleV19fXZhciBhcmd1bWVudHNfPVtdO3ZhciB0aGlzUHJvZ3JhbT0iLi90aGlzLnByb2dyYW0iO3ZhciBxdWl0Xz1mdW5jdGlvbihzdGF0dXMsdG9UaHJvdyl7dGhyb3cgdG9UaHJvd307dmFyIEVOVklST05NRU5UX0lTX1dFQj1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19OT0RFPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD1mYWxzZTtFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PSJvYmplY3QiO0VOVklST05NRU5UX0lTX1dPUktFUj10eXBlb2YgaW1wb3J0U2NyaXB0cz09PSJmdW5jdGlvbiI7RU5WSVJPTk1FTlRfSVNfTk9ERT10eXBlb2YgcHJvY2Vzcz09PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlPT09InN0cmluZyI7RU5WSVJPTk1FTlRfSVNfU0hFTEw9IUVOVklST05NRU5UX0lTX1dFQiYmIUVOVklST05NRU5UX0lTX05PREUmJiFFTlZJUk9OTUVOVF9JU19XT1JLRVI7dmFyIHNjcmlwdERpcmVjdG9yeT0iIjtmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpe2lmKE1vZHVsZVsibG9jYXRlRmlsZSJdKXtyZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCxzY3JpcHREaXJlY3RvcnkpfXJldHVybiBzY3JpcHREaXJlY3RvcnkrcGF0aH12YXIgcmVhZF8scmVhZEFzeW5jLHJlYWRCaW5hcnksc2V0V2luZG93VGl0bGU7dmFyIG5vZGVGUzt2YXIgbm9kZVBhdGg7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtzY3JpcHREaXJlY3Rvcnk9cmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSsiLyJ9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9X19kaXJuYW1lKyIvIn1yZWFkXz1mdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLGJpbmFyeSl7aWYoIW5vZGVGUylub2RlRlM9cmVxdWlyZSgiZnMiKTtpZighbm9kZVBhdGgpbm9kZVBhdGg9cmVxdWlyZSgicGF0aCIpO2ZpbGVuYW1lPW5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7cmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsYmluYXJ5P251bGw6InV0ZjgiKX07cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXt2YXIgcmV0PXJlYWRfKGZpbGVuYW1lLHRydWUpO2lmKCFyZXQuYnVmZmVyKXtyZXQ9bmV3IFVpbnQ4QXJyYXkocmV0KX1hc3NlcnQocmV0LmJ1ZmZlcik7cmV0dXJuIHJldH07aWYocHJvY2Vzc1siYXJndiJdLmxlbmd0aD4xKXt0aGlzUHJvZ3JhbT1wcm9jZXNzWyJhcmd2Il1bMV0ucmVwbGFjZSgvXFwvZywiLyIpfWFyZ3VtZW50c189cHJvY2Vzc1siYXJndiJdLnNsaWNlKDIpO2lmKHR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIil7bW9kdWxlWyJleHBvcnRzIl09TW9kdWxlfXByb2Nlc3NbIm9uIl0oInVuY2F1Z2h0RXhjZXB0aW9uIixmdW5jdGlvbihleCl7aWYoIShleCBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpKXt0aHJvdyBleH19KTtwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLGFib3J0KTtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3Byb2Nlc3NbImV4aXQiXShzdGF0dXMpfTtNb2R1bGVbImluc3BlY3QiXT1mdW5jdGlvbigpe3JldHVybiJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XSJ9fWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKHR5cGVvZiByZWFkIT0idW5kZWZpbmVkIil7cmVhZF89ZnVuY3Rpb24gc2hlbGxfcmVhZChmKXtyZXR1cm4gcmVhZChmKX19cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGYpe3ZhciBkYXRhO2lmKHR5cGVvZiByZWFkYnVmZmVyPT09ImZ1bmN0aW9uIil7cmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpfWRhdGE9cmVhZChmLCJiaW5hcnkiKTthc3NlcnQodHlwZW9mIGRhdGE9PT0ib2JqZWN0Iik7cmV0dXJuIGRhdGF9O2lmKHR5cGVvZiBzY3JpcHRBcmdzIT0idW5kZWZpbmVkIil7YXJndW1lbnRzXz1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9InVuZGVmaW5lZCIpe2FyZ3VtZW50c189YXJndW1lbnRzfWlmKHR5cGVvZiBxdWl0PT09ImZ1bmN0aW9uIil7cXVpdF89ZnVuY3Rpb24oc3RhdHVzKXtxdWl0KHN0YXR1cyl9fWlmKHR5cGVvZiBwcmludCE9PSJ1bmRlZmluZWQiKXtpZih0eXBlb2YgY29uc29sZT09PSJ1bmRlZmluZWQiKWNvbnNvbGU9e307Y29uc29sZS5sb2c9cHJpbnQ7Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9dHlwZW9mIHByaW50RXJyIT09InVuZGVmaW5lZCI/cHJpbnRFcnI6cHJpbnR9fWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfV0VCfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpe2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7c2NyaXB0RGlyZWN0b3J5PXNlbGYubG9jYXRpb24uaHJlZn1lbHNlIGlmKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpe3NjcmlwdERpcmVjdG9yeT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY31pZihzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikrMSl9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9IiJ9e3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQodXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO3JldHVybiB4aHIucmVzcG9uc2VUZXh0fTtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3JlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeSh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24gcmVhZEFzeW5jKHVybCxvbmxvYWQsb25lcnJvcil7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oIkdFVCIsdXJsLHRydWUpO3hoci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIjt4aHIub25sb2FkPWZ1bmN0aW9uIHhocl9vbmxvYWQoKXtpZih4aHIuc3RhdHVzPT0yMDB8fHhoci5zdGF0dXM9PTAmJnhoci5yZXNwb25zZSl7b25sb2FkKHhoci5yZXNwb25zZSk7cmV0dXJufW9uZXJyb3IoKX07eGhyLm9uZXJyb3I9b25lcnJvcjt4aHIuc2VuZChudWxsKX19c2V0V2luZG93VGl0bGU9ZnVuY3Rpb24odGl0bGUpe2RvY3VtZW50LnRpdGxlPXRpdGxlfX1lbHNle312YXIgb3V0PU1vZHVsZVsicHJpbnQiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVsicHJpbnRFcnIiXXx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7Zm9yKGtleSBpbiBtb2R1bGVPdmVycmlkZXMpe2lmKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtNb2R1bGVba2V5XT1tb2R1bGVPdmVycmlkZXNba2V5XX19bW9kdWxlT3ZlcnJpZGVzPW51bGw7aWYoTW9kdWxlWyJhcmd1bWVudHMiXSlhcmd1bWVudHNfPU1vZHVsZVsiYXJndW1lbnRzIl07aWYoTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdKXRoaXNQcm9ncmFtPU1vZHVsZVsidGhpc1Byb2dyYW0iXTtpZihNb2R1bGVbInF1aXQiXSlxdWl0Xz1Nb2R1bGVbInF1aXQiXTt2YXIgU1RBQ0tfQUxJR049MTY7ZnVuY3Rpb24gZHluYW1pY0FsbG9jKHNpemUpe3ZhciByZXQ9SEVBUDMyW0RZTkFNSUNUT1BfUFRSPj4yXTt2YXIgZW5kPXJldCtzaXplKzE1Ji0xNjtIRUFQMzJbRFlOQU1JQ1RPUF9QVFI+PjJdPWVuZDtyZXR1cm4gcmV0fWZ1bmN0aW9uIGdldE5hdGl2ZVR5cGVTaXplKHR5cGUpe3N3aXRjaCh0eXBlKXtjYXNlImkxIjpjYXNlImk4IjpyZXR1cm4gMTtjYXNlImkxNiI6cmV0dXJuIDI7Y2FzZSJpMzIiOnJldHVybiA0O2Nhc2UiaTY0IjpyZXR1cm4gODtjYXNlImZsb2F0IjpyZXR1cm4gNDtjYXNlImRvdWJsZSI6cmV0dXJuIDg7ZGVmYXVsdDp7aWYodHlwZVt0eXBlLmxlbmd0aC0xXT09PSIqIil7cmV0dXJuIDR9ZWxzZSBpZih0eXBlWzBdPT09ImkiKXt2YXIgYml0cz1OdW1iZXIodHlwZS5zdWJzdHIoMSkpO2Fzc2VydChiaXRzJTg9PT0wLCJnZXROYXRpdmVUeXBlU2l6ZSBpbnZhbGlkIGJpdHMgIitiaXRzKyIsIHR5cGUgIit0eXBlKTtyZXR1cm4gYml0cy84fWVsc2V7cmV0dXJuIDB9fX19ZnVuY3Rpb24gd2Fybk9uY2UodGV4dCl7aWYoIXdhcm5PbmNlLnNob3duKXdhcm5PbmNlLnNob3duPXt9O2lmKCF3YXJuT25jZS5zaG93blt0ZXh0XSl7d2Fybk9uY2Uuc2hvd25bdGV4dF09MTtlcnIodGV4dCl9fWZ1bmN0aW9uIGNvbnZlcnRKc0Z1bmN0aW9uVG9XYXNtKGZ1bmMsc2lnKXtpZih0eXBlb2YgV2ViQXNzZW1ibHkuRnVuY3Rpb249PT0iZnVuY3Rpb24iKXt2YXIgdHlwZU5hbWVzPXsiaSI6ImkzMiIsImoiOiJpNjQiLCJmIjoiZjMyIiwiZCI6ImY2NCJ9O3ZhciB0eXBlPXtwYXJhbWV0ZXJzOltdLHJlc3VsdHM6c2lnWzBdPT0idiI/W106W3R5cGVOYW1lc1tzaWdbMF1dXX07Zm9yKHZhciBpPTE7aTxzaWcubGVuZ3RoOysraSl7dHlwZS5wYXJhbWV0ZXJzLnB1c2godHlwZU5hbWVzW3NpZ1tpXV0pfXJldHVybiBuZXcgV2ViQXNzZW1ibHkuRnVuY3Rpb24odHlwZSxmdW5jKX12YXIgdHlwZVNlY3Rpb249WzEsMCwxLDk2XTt2YXIgc2lnUmV0PXNpZy5zbGljZSgwLDEpO3ZhciBzaWdQYXJhbT1zaWcuc2xpY2UoMSk7dmFyIHR5cGVDb2Rlcz17ImkiOjEyNywiaiI6MTI2LCJmIjoxMjUsImQiOjEyNH07dHlwZVNlY3Rpb24ucHVzaChzaWdQYXJhbS5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8c2lnUGFyYW0ubGVuZ3RoOysraSl7dHlwZVNlY3Rpb24ucHVzaCh0eXBlQ29kZXNbc2lnUGFyYW1baV1dKX1pZihzaWdSZXQ9PSJ2Iil7dHlwZVNlY3Rpb24ucHVzaCgwKX1lbHNle3R5cGVTZWN0aW9uPXR5cGVTZWN0aW9uLmNvbmNhdChbMSx0eXBlQ29kZXNbc2lnUmV0XV0pfXR5cGVTZWN0aW9uWzFdPXR5cGVTZWN0aW9uLmxlbmd0aC0yO3ZhciBieXRlcz1uZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDBdLmNvbmNhdCh0eXBlU2VjdGlvbixbMiw3LDEsMSwxMDEsMSwxMDIsMCwwLDcsNSwxLDEsMTAyLDAsMF0pKTt2YXIgbW9kdWxlPW5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoYnl0ZXMpO3ZhciBpbnN0YW5jZT1uZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobW9kdWxlLHsiZSI6eyJmIjpmdW5jfX0pO3ZhciB3cmFwcGVkRnVuYz1pbnN0YW5jZS5leHBvcnRzWyJmIl07cmV0dXJuIHdyYXBwZWRGdW5jfXZhciBmcmVlVGFibGVJbmRleGVzPVtdO3ZhciBmdW5jdGlvbnNJblRhYmxlTWFwO2Z1bmN0aW9uIGFkZEZ1bmN0aW9uV2FzbShmdW5jLHNpZyl7dmFyIHRhYmxlPXdhc21UYWJsZTtpZighZnVuY3Rpb25zSW5UYWJsZU1hcCl7ZnVuY3Rpb25zSW5UYWJsZU1hcD1uZXcgV2Vha01hcDtmb3IodmFyIGk9MDtpPHRhYmxlLmxlbmd0aDtpKyspe3ZhciBpdGVtPXRhYmxlLmdldChpKTtpZihpdGVtKXtmdW5jdGlvbnNJblRhYmxlTWFwLnNldChpdGVtLGkpfX19aWYoZnVuY3Rpb25zSW5UYWJsZU1hcC5oYXMoZnVuYykpe3JldHVybiBmdW5jdGlvbnNJblRhYmxlTWFwLmdldChmdW5jKX12YXIgcmV0O2lmKGZyZWVUYWJsZUluZGV4ZXMubGVuZ3RoKXtyZXQ9ZnJlZVRhYmxlSW5kZXhlcy5wb3AoKX1lbHNle3JldD10YWJsZS5sZW5ndGg7dHJ5e3RhYmxlLmdyb3coMSl9Y2F0Y2goZXJyKXtpZighKGVyciBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpKXt0aHJvdyBlcnJ9dGhyb3ciVW5hYmxlIHRvIGdyb3cgd2FzbSB0YWJsZS4gU2V0IEFMTE9XX1RBQkxFX0dST1dUSC4ifX10cnl7dGFibGUuc2V0KHJldCxmdW5jKX1jYXRjaChlcnIpe2lmKCEoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yKSl7dGhyb3cgZXJyfXZhciB3cmFwcGVkPWNvbnZlcnRKc0Z1bmN0aW9uVG9XYXNtKGZ1bmMsc2lnKTt0YWJsZS5zZXQocmV0LHdyYXBwZWQpfWZ1bmN0aW9uc0luVGFibGVNYXAuc2V0KGZ1bmMscmV0KTtyZXR1cm4gcmV0fWZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uV2FzbShpbmRleCl7ZnVuY3Rpb25zSW5UYWJsZU1hcC5kZWxldGUod2FzbVRhYmxlLmdldChpbmRleCkpO2ZyZWVUYWJsZUluZGV4ZXMucHVzaChpbmRleCl9dmFyIGZ1bmNXcmFwcGVycz17fTtmdW5jdGlvbiBkeW5DYWxsKHNpZyxwdHIsYXJncyl7aWYoYXJncyYmYXJncy5sZW5ndGgpe3JldHVybiBNb2R1bGVbImR5bkNhbGxfIitzaWddLmFwcGx5KG51bGwsW3B0cl0uY29uY2F0KGFyZ3MpKX1lbHNle3JldHVybiBNb2R1bGVbImR5bkNhbGxfIitzaWddLmNhbGwobnVsbCxwdHIpfX12YXIgdGVtcFJldDA9MDt2YXIgc2V0VGVtcFJldDA9ZnVuY3Rpb24odmFsdWUpe3RlbXBSZXQwPXZhbHVlfTt2YXIgd2FzbUJpbmFyeTtpZihNb2R1bGVbIndhc21CaW5hcnkiXSl3YXNtQmluYXJ5PU1vZHVsZVsid2FzbUJpbmFyeSJdO3ZhciBub0V4aXRSdW50aW1lO2lmKE1vZHVsZVsibm9FeGl0UnVudGltZSJdKW5vRXhpdFJ1bnRpbWU9TW9kdWxlWyJub0V4aXRSdW50aW1lIl07aWYodHlwZW9mIFdlYkFzc2VtYmx5IT09Im9iamVjdCIpe2Vycigibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpfWZ1bmN0aW9uIHNldFZhbHVlKHB0cix2YWx1ZSx0eXBlLG5vU2FmZSl7dHlwZT10eXBlfHwiaTgiO2lmKHR5cGUuY2hhckF0KHR5cGUubGVuZ3RoLTEpPT09IioiKXR5cGU9ImkzMiI7c3dpdGNoKHR5cGUpe2Nhc2UiaTEiOkhFQVA4W3B0cj4+MF09dmFsdWU7YnJlYWs7Y2FzZSJpOCI6SEVBUDhbcHRyPj4wXT12YWx1ZTticmVhaztjYXNlImkxNiI6SEVBUDE2W3B0cj4+MV09dmFsdWU7YnJlYWs7Y2FzZSJpMzIiOkhFQVAzMltwdHI+PjJdPXZhbHVlO2JyZWFrO2Nhc2UiaTY0Ijp0ZW1wSTY0PVt2YWx1ZT4+PjAsKHRlbXBEb3VibGU9dmFsdWUsK01hdGhfYWJzKHRlbXBEb3VibGUpPj0xP3RlbXBEb3VibGU+MD8oTWF0aF9taW4oK01hdGhfZmxvb3IodGVtcERvdWJsZS80Mjk0OTY3Mjk2KSw0Mjk0OTY3Mjk1KXwwKT4+PjA6fn4rTWF0aF9jZWlsKCh0ZW1wRG91YmxlLSsofn50ZW1wRG91YmxlPj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sSEVBUDMyW3B0cj4+Ml09dGVtcEk2NFswXSxIRUFQMzJbcHRyKzQ+PjJdPXRlbXBJNjRbMV07YnJlYWs7Y2FzZSJmbG9hdCI6SEVBUEYzMltwdHI+PjJdPXZhbHVlO2JyZWFrO2Nhc2UiZG91YmxlIjpIRUFQRjY0W3B0cj4+M109dmFsdWU7YnJlYWs7ZGVmYXVsdDphYm9ydCgiaW52YWxpZCB0eXBlIGZvciBzZXRWYWx1ZTogIit0eXBlKX19dmFyIHdhc21NZW1vcnk7dmFyIHdhc21UYWJsZT1uZXcgV2ViQXNzZW1ibHkuVGFibGUoeyJpbml0aWFsIjo3LCJtYXhpbXVtIjo3KzAsImVsZW1lbnQiOiJhbnlmdW5jIn0pO3ZhciBBQk9SVD1mYWxzZTt2YXIgRVhJVFNUQVRVUz0wO2Z1bmN0aW9uIGFzc2VydChjb25kaXRpb24sdGV4dCl7aWYoIWNvbmRpdGlvbil7YWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIrdGV4dCl9fWZ1bmN0aW9uIGdldENGdW5jKGlkZW50KXt2YXIgZnVuYz1Nb2R1bGVbIl8iK2lkZW50XTthc3NlcnQoZnVuYywiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiAiK2lkZW50KyIsIG1ha2Ugc3VyZSBpdCBpcyBleHBvcnRlZCIpO3JldHVybiBmdW5jfWZ1bmN0aW9uIGNjYWxsKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyxvcHRzKXt2YXIgdG9DPXsic3RyaW5nIjpmdW5jdGlvbihzdHIpe3ZhciByZXQ9MDtpZihzdHIhPT1udWxsJiZzdHIhPT11bmRlZmluZWQmJnN0ciE9PTApe3ZhciBsZW49KHN0ci5sZW5ndGg8PDIpKzE7cmV0PXN0YWNrQWxsb2MobGVuKTtzdHJpbmdUb1VURjgoc3RyLHJldCxsZW4pfXJldHVybiByZXR9LCJhcnJheSI6ZnVuY3Rpb24oYXJyKXt2YXIgcmV0PXN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9fTtmdW5jdGlvbiBjb252ZXJ0UmV0dXJuVmFsdWUocmV0KXtpZihyZXR1cm5UeXBlPT09InN0cmluZyIpcmV0dXJuIFVURjhUb1N0cmluZyhyZXQpO2lmKHJldHVyblR5cGU9PT0iYm9vbGVhbiIpcmV0dXJuIEJvb2xlYW4ocmV0KTtyZXR1cm4gcmV0fXZhciBmdW5jPWdldENGdW5jKGlkZW50KTt2YXIgY0FyZ3M9W107dmFyIHN0YWNrPTA7aWYoYXJncyl7Zm9yKHZhciBpPTA7aTxhcmdzLmxlbmd0aDtpKyspe3ZhciBjb252ZXJ0ZXI9dG9DW2FyZ1R5cGVzW2ldXTtpZihjb252ZXJ0ZXIpe2lmKHN0YWNrPT09MClzdGFjaz1zdGFja1NhdmUoKTtjQXJnc1tpXT1jb252ZXJ0ZXIoYXJnc1tpXSl9ZWxzZXtjQXJnc1tpXT1hcmdzW2ldfX19dmFyIHJldD1mdW5jLmFwcGx5KG51bGwsY0FyZ3MpO3JldD1jb252ZXJ0UmV0dXJuVmFsdWUocmV0KTtpZihzdGFjayE9PTApc3RhY2tSZXN0b3JlKHN0YWNrKTtyZXR1cm4gcmV0fXZhciBBTExPQ19OT05FPTM7dmFyIFVURjhEZWNvZGVyPXR5cGVvZiBUZXh0RGVjb2RlciE9PSJ1bmRlZmluZWQiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnVuZGVmaW5lZDtmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLGlkeCxtYXhCeXRlc1RvUmVhZCl7dmFyIGVuZElkeD1pZHgrbWF4Qnl0ZXNUb1JlYWQ7dmFyIGVuZFB0cj1pZHg7d2hpbGUoaGVhcFtlbmRQdHJdJiYhKGVuZFB0cj49ZW5kSWR4KSkrK2VuZFB0cjtpZihlbmRQdHItaWR4PjE2JiZoZWFwLnN1YmFycmF5JiZVVEY4RGVjb2Rlcil7cmV0dXJuIFVURjhEZWNvZGVyLmRlY29kZShoZWFwLnN1YmFycmF5KGlkeCxlbmRQdHIpKX1lbHNle3ZhciBzdHI9IiI7d2hpbGUoaWR4PGVuZFB0cil7dmFyIHUwPWhlYXBbaWR4KytdO2lmKCEodTAmMTI4KSl7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTtjb250aW51ZX12YXIgdTE9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjIyNCk9PTE5Mil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCh1MCYzMSk8PDZ8dTEpO2NvbnRpbnVlfXZhciB1Mj1oZWFwW2lkeCsrXSY2MztpZigodTAmMjQwKT09MjI0KXt1MD0odTAmMTUpPDwxMnx1MTw8Nnx1Mn1lbHNle3UwPSh1MCY3KTw8MTh8dTE8PDEyfHUyPDw2fGhlYXBbaWR4KytdJjYzfWlmKHUwPDY1NTM2KXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApfWVsc2V7dmFyIGNoPXUwLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9fX1yZXR1cm4gc3RyfWZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsbWF4Qnl0ZXNUb1JlYWQpe3JldHVybiBwdHI/VVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LHB0cixtYXhCeXRlc1RvUmVhZCk6IiJ9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLGhlYXAsb3V0SWR4LG1heEJ5dGVzVG9Xcml0ZSl7aWYoIShtYXhCeXRlc1RvV3JpdGU+MCkpcmV0dXJuIDA7dmFyIHN0YXJ0SWR4PW91dElkeDt2YXIgZW5kSWR4PW91dElkeCttYXhCeXRlc1RvV3JpdGUtMTtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpe3ZhciB1MT1zdHIuY2hhckNvZGVBdCgrK2kpO3U9NjU1MzYrKCh1JjEwMjMpPDwxMCl8dTEmMTAyM31pZih1PD0xMjcpe2lmKG91dElkeD49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPXV9ZWxzZSBpZih1PD0yMDQ3KXtpZihvdXRJZHgrMT49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTE5Mnx1Pj42O2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2UgaWYodTw9NjU1MzUpe2lmKG91dElkeCsyPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjI0fHU+PjEyO2hlYXBbb3V0SWR4KytdPTEyOHx1Pj42JjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2V7aWYob3V0SWR4KzM+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0yNDB8dT4+MTg7aGVhcFtvdXRJZHgrK109MTI4fHU+PjEyJjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1Pj42JjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfX1oZWFwW291dElkeF09MDtyZXR1cm4gb3V0SWR4LXN0YXJ0SWR4fWZ1bmN0aW9uIHN0cmluZ1RvVVRGOChzdHIsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl7cmV0dXJuIHN0cmluZ1RvVVRGOEFycmF5KHN0cixIRUFQVTgsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl9ZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEY4KHN0cil7dmFyIGxlbj0wO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciB1PXN0ci5jaGFyQ29kZUF0KGkpO2lmKHU+PTU1Mjk2JiZ1PD01NzM0Myl1PTY1NTM2KygodSYxMDIzKTw8MTApfHN0ci5jaGFyQ29kZUF0KCsraSkmMTAyMztpZih1PD0xMjcpKytsZW47ZWxzZSBpZih1PD0yMDQ3KWxlbis9MjtlbHNlIGlmKHU8PTY1NTM1KWxlbis9MztlbHNlIGxlbis9NH1yZXR1cm4gbGVufXZhciBVVEYxNkRlY29kZXI9dHlwZW9mIFRleHREZWNvZGVyIT09InVuZGVmaW5lZCI/bmV3IFRleHREZWNvZGVyKCJ1dGYtMTZsZSIpOnVuZGVmaW5lZDtmdW5jdGlvbiB3cml0ZUFycmF5VG9NZW1vcnkoYXJyYXksYnVmZmVyKXtIRUFQOC5zZXQoYXJyYXksYnVmZmVyKX1mdW5jdGlvbiB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyLGJ1ZmZlcixkb250QWRkTnVsbCl7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7SEVBUDhbYnVmZmVyKys+PjBdPXN0ci5jaGFyQ29kZUF0KGkpfWlmKCFkb250QWRkTnVsbClIRUFQOFtidWZmZXI+PjBdPTB9dmFyIFdBU01fUEFHRV9TSVpFPTY1NTM2O3ZhciBidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvbiB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyhidWYpe2J1ZmZlcj1idWY7TW9kdWxlWyJIRUFQOCJdPUhFQVA4PW5ldyBJbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVAxNiJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUDMyIl09SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQVTgiXT1IRUFQVTg9bmV3IFVpbnQ4QXJyYXkoYnVmKTtNb2R1bGVbIkhFQVBVMTYiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVsiSEVBUFUzMiJdPUhFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjMyIl09SEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGJ1Zik7TW9kdWxlWyJIRUFQRjY0Il09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIFNUQUNLX0JBU0U9NTczODc2OCxEWU5BTUlDX0JBU0U9NTczODc2OCxEWU5BTUlDVE9QX1BUUj00OTU3Mjg7dmFyIElOSVRJQUxfSU5JVElBTF9NRU1PUlk9TW9kdWxlWyJJTklUSUFMX01FTU9SWSJdfHw3NDk5OTM5ODQ7aWYoTW9kdWxlWyJ3YXNtTWVtb3J5Il0pe3dhc21NZW1vcnk9TW9kdWxlWyJ3YXNtTWVtb3J5Il19ZWxzZXt3YXNtTWVtb3J5PW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoeyJpbml0aWFsIjpJTklUSUFMX0lOSVRJQUxfTUVNT1JZL1dBU01fUEFHRV9TSVpFLCJtYXhpbXVtIjpJTklUSUFMX0lOSVRJQUxfTUVNT1JZL1dBU01fUEFHRV9TSVpFfSl9aWYod2FzbU1lbW9yeSl7YnVmZmVyPXdhc21NZW1vcnkuYnVmZmVyfUlOSVRJQUxfSU5JVElBTF9NRU1PUlk9YnVmZmVyLmJ5dGVMZW5ndGg7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmZmVyKTtIRUFQMzJbRFlOQU1JQ1RPUF9QVFI+PjJdPURZTkFNSUNfQkFTRTtmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3Mpe3doaWxlKGNhbGxiYWNrcy5sZW5ndGg+MCl7dmFyIGNhbGxiYWNrPWNhbGxiYWNrcy5zaGlmdCgpO2lmKHR5cGVvZiBjYWxsYmFjaz09ImZ1bmN0aW9uIil7Y2FsbGJhY2soTW9kdWxlKTtjb250aW51ZX12YXIgZnVuYz1jYWxsYmFjay5mdW5jO2lmKHR5cGVvZiBmdW5jPT09Im51bWJlciIpe2lmKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZCl7TW9kdWxlWyJkeW5DYWxsX3YiXShmdW5jKX1lbHNle01vZHVsZVsiZHluQ2FsbF92aSJdKGZ1bmMsY2FsbGJhY2suYXJnKX19ZWxzZXtmdW5jKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZD9udWxsOmNhbGxiYWNrLmFyZyl9fX12YXIgX19BVFBSRVJVTl9fPVtdO3ZhciBfX0FUSU5JVF9fPVtdO3ZhciBfX0FUTUFJTl9fPVtdO3ZhciBfX0FUUE9TVFJVTl9fPVtdO3ZhciBydW50aW1lSW5pdGlhbGl6ZWQ9ZmFsc2U7dmFyIHJ1bnRpbWVFeGl0ZWQ9ZmFsc2U7ZnVuY3Rpb24gcHJlUnVuKCl7aWYoTW9kdWxlWyJwcmVSdW4iXSl7aWYodHlwZW9mIE1vZHVsZVsicHJlUnVuIl09PSJmdW5jdGlvbiIpTW9kdWxlWyJwcmVSdW4iXT1bTW9kdWxlWyJwcmVSdW4iXV07d2hpbGUoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpe2FkZE9uUHJlUnVuKE1vZHVsZVsicHJlUnVuIl0uc2hpZnQoKSl9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQUkVSVU5fXyl9ZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKXtydW50aW1lSW5pdGlhbGl6ZWQ9dHJ1ZTtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKX1mdW5jdGlvbiBwcmVNYWluKCl7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyl9ZnVuY3Rpb24gZXhpdFJ1bnRpbWUoKXtydW50aW1lRXhpdGVkPXRydWV9ZnVuY3Rpb24gcG9zdFJ1bigpe2lmKE1vZHVsZVsicG9zdFJ1biJdKXtpZih0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl09PSJmdW5jdGlvbiIpTW9kdWxlWyJwb3N0UnVuIl09W01vZHVsZVsicG9zdFJ1biJdXTt3aGlsZShNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpe2FkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyl9ZnVuY3Rpb24gYWRkT25QcmVSdW4oY2Ipe19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKX1mdW5jdGlvbiBhZGRPblBvc3RSdW4oY2Ipe19fQVRQT1NUUlVOX18udW5zaGlmdChjYil9dmFyIE1hdGhfYWJzPU1hdGguYWJzO3ZhciBNYXRoX2NlaWw9TWF0aC5jZWlsO3ZhciBNYXRoX2Zsb29yPU1hdGguZmxvb3I7dmFyIE1hdGhfbWluPU1hdGgubWluO3ZhciBydW5EZXBlbmRlbmNpZXM9MDt2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pe01vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyl9fWZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcy0tO2lmKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKXtNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyIGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXT17fTtNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdPXt9O2Z1bmN0aW9uIGFib3J0KHdoYXQpe2lmKE1vZHVsZVsib25BYm9ydCJdKXtNb2R1bGVbIm9uQWJvcnQiXSh3aGF0KX13aGF0Kz0iIjtvdXQod2hhdCk7ZXJyKHdoYXQpO0FCT1JUPXRydWU7RVhJVFNUQVRVUz0xO3doYXQ9ImFib3J0KCIrd2hhdCsiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iO3Rocm93IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCl9ZnVuY3Rpb24gaGFzUHJlZml4KHN0cixwcmVmaXgpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGg/c3RyLnN0YXJ0c1dpdGgocHJlZml4KTpzdHIuaW5kZXhPZihwcmVmaXgpPT09MH12YXIgZGF0YVVSSVByZWZpeD0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGRhdGFVUklQcmVmaXgpfXZhciBmaWxlVVJJUHJlZml4PSJmaWxlOi8vIjtmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZmlsZVVSSVByZWZpeCl9dmFyIHdhc21CaW5hcnlGaWxlPSJiYXNpcy53YXNtIjtpZighaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSl7d2FzbUJpbmFyeUZpbGU9bG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSl9ZnVuY3Rpb24gZ2V0QmluYXJ5KCl7dHJ5e2lmKHdhc21CaW5hcnkpe3JldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KX1pZihyZWFkQmluYXJ5KXtyZXR1cm4gcmVhZEJpbmFyeSh3YXNtQmluYXJ5RmlsZSl9ZWxzZXt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9fWNhdGNoKGVycil7YWJvcnQoZXJyKX19ZnVuY3Rpb24gZ2V0QmluYXJ5UHJvbWlzZSgpe2lmKCF3YXNtQmluYXJ5JiYoRU5WSVJPTk1FTlRfSVNfV0VCfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpJiZ0eXBlb2YgZmV0Y2g9PT0iZnVuY3Rpb24iJiYhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSl7cmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7aWYoIXJlc3BvbnNlWyJvayJdKXt0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK3dhc21CaW5hcnlGaWxlKyInIn1yZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGdldEJpbmFyeSgpfSl9cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZXNvbHZlKGdldEJpbmFyeSgpKX0pfWZ1bmN0aW9uIGNyZWF0ZVdhc20oKXt2YXIgaW5mbz17ImVudiI6YXNtTGlicmFyeUFyZywid2FzaV9zbmFwc2hvdF9wcmV2aWV3MSI6YXNtTGlicmFyeUFyZ307ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLG1vZHVsZSl7dmFyIGV4cG9ydHM9aW5zdGFuY2UuZXhwb3J0cztNb2R1bGVbImFzbSJdPWV4cG9ydHM7cmVtb3ZlUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpfWFkZFJ1bkRlcGVuZGVuY3koIndhc20taW5zdGFudGlhdGUiKTtmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCl7cmVjZWl2ZUluc3RhbmNlKG91dHB1dFsiaW5zdGFuY2UiXSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcil7cmV0dXJuIGdldEJpbmFyeVByb21pc2UoKS50aGVuKGZ1bmN0aW9uKGJpbmFyeSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSxpbmZvKX0pLnRoZW4ocmVjZWl2ZXIsZnVuY3Rpb24ocmVhc29uKXtlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrcmVhc29uKTthYm9ydChyZWFzb24pfSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpe2lmKCF3YXNtQmluYXJ5JiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PT0iZnVuY3Rpb24iJiYhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkmJnR5cGVvZiBmZXRjaD09PSJmdW5jdGlvbiIpe2ZldGNoKHdhc21CaW5hcnlGaWxlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7dmFyIHJlc3VsdD1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSxpbmZvKTtyZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSxmdW5jdGlvbihyZWFzb24pe2Vycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrcmVhc29uKTtlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7aW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX0pfSl9ZWxzZXtyZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKX19aWYoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSl7dHJ5e3ZhciBleHBvcnRzPU1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbyxyZWNlaXZlSW5zdGFuY2UpO3JldHVybiBleHBvcnRzfWNhdGNoKGUpe2VycigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKTtyZXR1cm4gZmFsc2V9fWluc3RhbnRpYXRlQXN5bmMoKTtyZXR1cm57fX12YXIgdGVtcERvdWJsZTt2YXIgdGVtcEk2NDtfX0FUSU5JVF9fLnB1c2goe2Z1bmM6ZnVuY3Rpb24oKXtfX193YXNtX2NhbGxfY3RvcnMoKX19KTtmdW5jdGlvbiBkZW1hbmdsZShmdW5jKXtyZXR1cm4gZnVuY31mdW5jdGlvbiBkZW1hbmdsZUFsbCh0ZXh0KXt2YXIgcmVnZXg9L1xiX1pbXHdcZF9dKy9nO3JldHVybiB0ZXh0LnJlcGxhY2UocmVnZXgsZnVuY3Rpb24oeCl7dmFyIHk9ZGVtYW5nbGUoeCk7cmV0dXJuIHg9PT15P3g6eSsiIFsiK3grIl0ifSl9ZnVuY3Rpb24ganNTdGFja1RyYWNlKCl7dmFyIGVycj1uZXcgRXJyb3I7aWYoIWVyci5zdGFjayl7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChlKXtlcnI9ZX1pZighZXJyLnN0YWNrKXtyZXR1cm4iKG5vIHN0YWNrIHRyYWNlIGF2YWlsYWJsZSkifX1yZXR1cm4gZXJyLnN0YWNrLnRvU3RyaW5nKCl9ZnVuY3Rpb24gX19fYXNzZXJ0X2ZhaWwoY29uZGl0aW9uLGZpbGVuYW1lLGxpbmUsZnVuYyl7YWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIrVVRGOFRvU3RyaW5nKGNvbmRpdGlvbikrIiwgYXQ6ICIrW2ZpbGVuYW1lP1VURjhUb1N0cmluZyhmaWxlbmFtZSk6InVua25vd24gZmlsZW5hbWUiLGxpbmUsZnVuYz9VVEY4VG9TdHJpbmcoZnVuYyk6InVua25vd24gZnVuY3Rpb24iXSl9ZnVuY3Rpb24gX2Fib3J0KCl7YWJvcnQoKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfc2Jya19wdHIoKXtyZXR1cm4gNDk1NzI4fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCxzcmMsbnVtKXtIRUFQVTguY29weVdpdGhpbihkZXN0LHNyYyxzcmMrbnVtKX1mdW5jdGlvbiBhYm9ydE9uQ2Fubm90R3Jvd01lbW9yeShyZXF1ZXN0ZWRTaXplKXthYm9ydCgiT09NIil9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAocmVxdWVzdGVkU2l6ZSl7cmVxdWVzdGVkU2l6ZT1yZXF1ZXN0ZWRTaXplPj4+MDthYm9ydE9uQ2Fubm90R3Jvd01lbW9yeShyZXF1ZXN0ZWRTaXplKX12YXIgUEFUSD17c3BsaXRQYXRoOmZ1bmN0aW9uKGZpbGVuYW1lKXt2YXIgc3BsaXRQYXRoUmU9L14oXC8/fCkoW1xzXFNdKj8pKCg/OlwuezEsMn18W15cL10rP3wpKFwuW14uXC9dKnwpKSg/OltcL10qKSQvO3JldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKX0sbm9ybWFsaXplQXJyYXk6ZnVuY3Rpb24ocGFydHMsYWxsb3dBYm92ZVJvb3Qpe3ZhciB1cD0wO2Zvcih2YXIgaT1wYXJ0cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGxhc3Q9cGFydHNbaV07aWYobGFzdD09PSIuIil7cGFydHMuc3BsaWNlKGksMSl9ZWxzZSBpZihsYXN0PT09Ii4uIil7cGFydHMuc3BsaWNlKGksMSk7dXArK31lbHNlIGlmKHVwKXtwYXJ0cy5zcGxpY2UoaSwxKTt1cC0tfX1pZihhbGxvd0Fib3ZlUm9vdCl7Zm9yKDt1cDt1cC0tKXtwYXJ0cy51bnNoaWZ0KCIuLiIpfX1yZXR1cm4gcGFydHN9LG5vcm1hbGl6ZTpmdW5jdGlvbihwYXRoKXt2YXIgaXNBYnNvbHV0ZT1wYXRoLmNoYXJBdCgwKT09PSIvIix0cmFpbGluZ1NsYXNoPXBhdGguc3Vic3RyKC0xKT09PSIvIjtwYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgiLyIpLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSwhaXNBYnNvbHV0ZSkuam9pbigiLyIpO2lmKCFwYXRoJiYhaXNBYnNvbHV0ZSl7cGF0aD0iLiJ9aWYocGF0aCYmdHJhaWxpbmdTbGFzaCl7cGF0aCs9Ii8ifXJldHVybihpc0Fic29sdXRlPyIvIjoiIikrcGF0aH0sZGlybmFtZTpmdW5jdGlvbihwYXRoKXt2YXIgcmVzdWx0PVBBVEguc3BsaXRQYXRoKHBhdGgpLHJvb3Q9cmVzdWx0WzBdLGRpcj1yZXN1bHRbMV07aWYoIXJvb3QmJiFkaXIpe3JldHVybiIuIn1pZihkaXIpe2Rpcj1kaXIuc3Vic3RyKDAsZGlyLmxlbmd0aC0xKX1yZXR1cm4gcm9vdCtkaXJ9LGJhc2VuYW1lOmZ1bmN0aW9uKHBhdGgpe2lmKHBhdGg9PT0iLyIpcmV0dXJuIi8iO3ZhciBsYXN0U2xhc2g9cGF0aC5sYXN0SW5kZXhPZigiLyIpO2lmKGxhc3RTbGFzaD09PS0xKXJldHVybiBwYXRoO3JldHVybiBwYXRoLnN1YnN0cihsYXN0U2xhc2grMSl9LGV4dG5hbWU6ZnVuY3Rpb24ocGF0aCl7cmV0dXJuIFBBVEguc3BsaXRQYXRoKHBhdGgpWzNdfSxqb2luOmZ1bmN0aW9uKCl7dmFyIHBhdGhzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aHMuam9pbigiLyIpKX0sam9pbjI6ZnVuY3Rpb24obCxyKXtyZXR1cm4gUEFUSC5ub3JtYWxpemUobCsiLyIrcil9fTt2YXIgU1lTQ0FMTFM9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihzdHJlYW0sY3Vycil7dmFyIGJ1ZmZlcj1TWVNDQUxMUy5idWZmZXJzW3N0cmVhbV07aWYoY3Vycj09PTB8fGN1cnI9PT0xMCl7KHN0cmVhbT09PTE/b3V0OmVycikoVVRGOEFycmF5VG9TdHJpbmcoYnVmZmVyLDApKTtidWZmZXIubGVuZ3RoPTB9ZWxzZXtidWZmZXIucHVzaChjdXJyKX19LHZhcmFyZ3M6dW5kZWZpbmVkLGdldDpmdW5jdGlvbigpe1NZU0NBTExTLnZhcmFyZ3MrPTQ7dmFyIHJldD1IRUFQMzJbU1lTQ0FMTFMudmFyYXJncy00Pj4yXTtyZXR1cm4gcmV0fSxnZXRTdHI6ZnVuY3Rpb24ocHRyKXt2YXIgcmV0PVVURjhUb1N0cmluZyhwdHIpO3JldHVybiByZXR9LGdldDY0OmZ1bmN0aW9uKGxvdyxoaWdoKXtyZXR1cm4gbG93fX07ZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKXtyZXR1cm4gMH1mdW5jdGlvbiBfZmRfc2VlayhmZCxvZmZzZXRfbG93LG9mZnNldF9oaWdoLHdoZW5jZSxuZXdPZmZzZXQpe31mdW5jdGlvbiBfZmRfd3JpdGUoZmQsaW92LGlvdmNudCxwbnVtKXt2YXIgbnVtPTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXIgbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07Zm9yKHZhciBqPTA7ajxsZW47aisrKXtTWVNDQUxMUy5wcmludENoYXIoZmQsSEVBUFU4W3B0citqXSl9bnVtKz1sZW59SEVBUDMyW3BudW0+PjJdPW51bTtyZXR1cm4gMH1mdW5jdGlvbiBfcm91bmRmKGQpe2Q9K2Q7cmV0dXJuIGQ+PSswPytNYXRoX2Zsb29yKGQrICsuNSk6K01hdGhfY2VpbChkLSsuNSl9ZnVuY3Rpb24gX3NldFRlbXBSZXQwKCRpKXtzZXRUZW1wUmV0MCgkaXwwKX12YXIgQVNTRVJUSU9OUz1mYWxzZTt2YXIgYXNtTGlicmFyeUFyZz17Il9fYXNzZXJ0X2ZhaWwiOl9fX2Fzc2VydF9mYWlsLCJhYm9ydCI6X2Fib3J0LCJlbXNjcmlwdGVuX2dldF9zYnJrX3B0ciI6X2Vtc2NyaXB0ZW5fZ2V0X3NicmtfcHRyLCJlbXNjcmlwdGVuX21lbWNweV9iaWciOl9lbXNjcmlwdGVuX21lbWNweV9iaWcsImVtc2NyaXB0ZW5fcmVzaXplX2hlYXAiOl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLCJmZF9jbG9zZSI6X2ZkX2Nsb3NlLCJmZF9zZWVrIjpfZmRfc2VlaywiZmRfd3JpdGUiOl9mZF93cml0ZSwibWVtb3J5Ijp3YXNtTWVtb3J5LCJyb3VuZGYiOl9yb3VuZGYsInNldFRlbXBSZXQwIjpfc2V0VGVtcFJldDAsInRhYmxlIjp3YXNtVGFibGV9O3ZhciBhc209Y3JlYXRlV2FzbSgpO01vZHVsZVsiYXNtIl09YXNtO3ZhciBfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXT1mdW5jdGlvbigpe3JldHVybihfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXT1Nb2R1bGVbImFzbSJdWyJfX3dhc21fY2FsbF9jdG9ycyJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfbWFsbG9jPU1vZHVsZVsiX21hbGxvYyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9tYWxsb2M9TW9kdWxlWyJfbWFsbG9jIl09TW9kdWxlWyJhc20iXVsibWFsbG9jIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9mcmVlPU1vZHVsZVsiX2ZyZWUiXT1mdW5jdGlvbigpe3JldHVybihfZnJlZT1Nb2R1bGVbIl9mcmVlIl09TW9kdWxlWyJhc20iXVsiZnJlZSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfYmFzaXNfc2V0X2RlYnVnX2ZsYWdzPU1vZHVsZVsiX2Jhc2lzX3NldF9kZWJ1Z19mbGFncyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc19zZXRfZGVidWdfZmxhZ3M9TW9kdWxlWyJfYmFzaXNfc2V0X2RlYnVnX2ZsYWdzIl09TW9kdWxlWyJhc20iXVsiYmFzaXNfc2V0X2RlYnVnX2ZsYWdzIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc19nZXRfZGVidWdfZmxhZ3M9TW9kdWxlWyJfYmFzaXNfZ2V0X2RlYnVnX2ZsYWdzIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX2dldF9kZWJ1Z19mbGFncz1Nb2R1bGVbIl9iYXNpc19nZXRfZGVidWdfZmxhZ3MiXT1Nb2R1bGVbImFzbSJdWyJiYXNpc19nZXRfZGVidWdfZmxhZ3MiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Jhc2lzX2luaXQ9TW9kdWxlWyJfYmFzaXNfaW5pdCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc19pbml0PU1vZHVsZVsiX2Jhc2lzX2luaXQiXT1Nb2R1bGVbImFzbSJdWyJiYXNpc19pbml0Il0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc19vcGVuPU1vZHVsZVsiX2Jhc2lzX29wZW4iXT1mdW5jdGlvbigpe3JldHVybihfYmFzaXNfb3Blbj1Nb2R1bGVbIl9iYXNpc19vcGVuIl09TW9kdWxlWyJhc20iXVsiYmFzaXNfb3BlbiJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfYmFzaXNfY2xvc2U9TW9kdWxlWyJfYmFzaXNfY2xvc2UiXT1mdW5jdGlvbigpe3JldHVybihfYmFzaXNfY2xvc2U9TW9kdWxlWyJfYmFzaXNfY2xvc2UiXT1Nb2R1bGVbImFzbSJdWyJiYXNpc19jbG9zZSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfYmFzaXNfZ2V0X2hhc19hbHBoYT1Nb2R1bGVbIl9iYXNpc19nZXRfaGFzX2FscGhhIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX2dldF9oYXNfYWxwaGE9TW9kdWxlWyJfYmFzaXNfZ2V0X2hhc19hbHBoYSJdPU1vZHVsZVsiYXNtIl1bImJhc2lzX2dldF9oYXNfYWxwaGEiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Jhc2lzX2dldF9udW1faW1hZ2VzPU1vZHVsZVsiX2Jhc2lzX2dldF9udW1faW1hZ2VzIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX2dldF9udW1faW1hZ2VzPU1vZHVsZVsiX2Jhc2lzX2dldF9udW1faW1hZ2VzIl09TW9kdWxlWyJhc20iXVsiYmFzaXNfZ2V0X251bV9pbWFnZXMiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Jhc2lzX2dldF9udW1fbGV2ZWxzPU1vZHVsZVsiX2Jhc2lzX2dldF9udW1fbGV2ZWxzIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX2dldF9udW1fbGV2ZWxzPU1vZHVsZVsiX2Jhc2lzX2dldF9udW1fbGV2ZWxzIl09TW9kdWxlWyJhc20iXVsiYmFzaXNfZ2V0X251bV9sZXZlbHMiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Jhc2lzX2dldF9pbWFnZV93aWR0aD1Nb2R1bGVbIl9iYXNpc19nZXRfaW1hZ2Vfd2lkdGgiXT1mdW5jdGlvbigpe3JldHVybihfYmFzaXNfZ2V0X2ltYWdlX3dpZHRoPU1vZHVsZVsiX2Jhc2lzX2dldF9pbWFnZV93aWR0aCJdPU1vZHVsZVsiYXNtIl1bImJhc2lzX2dldF9pbWFnZV93aWR0aCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfYmFzaXNfZ2V0X2ltYWdlX2hlaWdodD1Nb2R1bGVbIl9iYXNpc19nZXRfaW1hZ2VfaGVpZ2h0Il09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX2dldF9pbWFnZV9oZWlnaHQ9TW9kdWxlWyJfYmFzaXNfZ2V0X2ltYWdlX2hlaWdodCJdPU1vZHVsZVsiYXNtIl1bImJhc2lzX2dldF9pbWFnZV9oZWlnaHQiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Jhc2lzX2dldF9pbWFnZV90cmFuc2NvZGVkX3NpemVfaW5fYnl0ZXM9TW9kdWxlWyJfYmFzaXNfZ2V0X2ltYWdlX3RyYW5zY29kZWRfc2l6ZV9pbl9ieXRlcyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc19nZXRfaW1hZ2VfdHJhbnNjb2RlZF9zaXplX2luX2J5dGVzPU1vZHVsZVsiX2Jhc2lzX2dldF9pbWFnZV90cmFuc2NvZGVkX3NpemVfaW5fYnl0ZXMiXT1Nb2R1bGVbImFzbSJdWyJiYXNpc19nZXRfaW1hZ2VfdHJhbnNjb2RlZF9zaXplX2luX2J5dGVzIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc19zdGFydF90cmFuc2NvZGluZz1Nb2R1bGVbIl9iYXNpc19zdGFydF90cmFuc2NvZGluZyJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9iYXNpc19zdGFydF90cmFuc2NvZGluZz1Nb2R1bGVbIl9iYXNpc19zdGFydF90cmFuc2NvZGluZyJdPU1vZHVsZVsiYXNtIl1bImJhc2lzX3N0YXJ0X3RyYW5zY29kaW5nIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9iYXNpc190cmFuc2NvZGVfaW1hZ2U9TW9kdWxlWyJfYmFzaXNfdHJhbnNjb2RlX2ltYWdlIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Jhc2lzX3RyYW5zY29kZV9pbWFnZT1Nb2R1bGVbIl9iYXNpc190cmFuc2NvZGVfaW1hZ2UiXT1Nb2R1bGVbImFzbSJdWyJiYXNpc190cmFuc2NvZGVfaW1hZ2UiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19fZXJybm9fbG9jYXRpb249TW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX2Vycm5vX2xvY2F0aW9uPU1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXT1Nb2R1bGVbImFzbSJdWyJfX2Vycm5vX2xvY2F0aW9uIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrU2F2ZT1Nb2R1bGVbInN0YWNrU2F2ZSJdPWZ1bmN0aW9uKCl7cmV0dXJuKHN0YWNrU2F2ZT1Nb2R1bGVbInN0YWNrU2F2ZSJdPU1vZHVsZVsiYXNtIl1bInN0YWNrU2F2ZSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja0FsbG9jPU1vZHVsZVsic3RhY2tBbGxvYyJdPWZ1bmN0aW9uKCl7cmV0dXJuKHN0YWNrQWxsb2M9TW9kdWxlWyJzdGFja0FsbG9jIl09TW9kdWxlWyJhc20iXVsic3RhY2tBbGxvYyJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja1Jlc3RvcmU9TW9kdWxlWyJzdGFja1Jlc3RvcmUiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1Jlc3RvcmU9TW9kdWxlWyJzdGFja1Jlc3RvcmUiXT1Nb2R1bGVbImFzbSJdWyJzdGFja1Jlc3RvcmUiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19ncm93V2FzbU1lbW9yeT1Nb2R1bGVbIl9fZ3Jvd1dhc21NZW1vcnkiXT1mdW5jdGlvbigpe3JldHVybihfX2dyb3dXYXNtTWVtb3J5PU1vZHVsZVsiX19ncm93V2FzbU1lbW9yeSJdPU1vZHVsZVsiYXNtIl1bIl9fZ3Jvd1dhc21NZW1vcnkiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHluQ2FsbF92aWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF92aWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpIl09TW9kdWxlWyJhc20iXVsiZHluQ2FsbF92aWlpIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWk9TW9kdWxlWyJkeW5DYWxsX2lpIl09ZnVuY3Rpb24oKXtyZXR1cm4oZHluQ2FsbF9paT1Nb2R1bGVbImR5bkNhbGxfaWkiXT1Nb2R1bGVbImFzbSJdWyJkeW5DYWxsX2lpIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGR5bkNhbGxfaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaSJdPWZ1bmN0aW9uKCl7cmV0dXJuKGR5bkNhbGxfaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaSJdPU1vZHVsZVsiYXNtIl1bImR5bkNhbGxfaWlpaSJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBkeW5DYWxsX2ppamk9TW9kdWxlWyJkeW5DYWxsX2ppamkiXT1mdW5jdGlvbigpe3JldHVybihkeW5DYWxsX2ppamk9TW9kdWxlWyJkeW5DYWxsX2ppamkiXT1Nb2R1bGVbImFzbSJdWyJkeW5DYWxsX2ppamkiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtNb2R1bGVbImFzbSJdPWFzbTt2YXIgY2FsbGVkUnVuO2Z1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiO3RoaXMubWVzc2FnZT0iUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiK3N0YXR1cysiKSI7dGhpcy5zdGF0dXM9c3RhdHVzfWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1mdW5jdGlvbiBydW5DYWxsZXIoKXtpZighY2FsbGVkUnVuKXJ1bigpO2lmKCFjYWxsZWRSdW4pZGVwZW5kZW5jaWVzRnVsZmlsbGVkPXJ1bkNhbGxlcn07ZnVuY3Rpb24gcnVuKGFyZ3Mpe2FyZ3M9YXJnc3x8YXJndW1lbnRzXztpZihydW5EZXBlbmRlbmNpZXM+MCl7cmV0dXJufXByZVJ1bigpO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXJldHVybjtmdW5jdGlvbiBkb1J1bigpe2lmKGNhbGxlZFJ1bilyZXR1cm47Y2FsbGVkUnVuPXRydWU7TW9kdWxlWyJjYWxsZWRSdW4iXT10cnVlO2lmKEFCT1JUKXJldHVybjtpbml0UnVudGltZSgpO3ByZU1haW4oKTtpZihNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0pTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKCk7cG9zdFJ1bigpfWlmKE1vZHVsZVsic2V0U3RhdHVzIl0pe01vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe01vZHVsZVsic2V0U3RhdHVzIl0oIiIpfSwxKTtkb1J1bigpfSwxKX1lbHNle2RvUnVuKCl9fU1vZHVsZVsicnVuIl09cnVuO2lmKE1vZHVsZVsicHJlSW5pdCJdKXtpZih0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il09PSJmdW5jdGlvbiIpTW9kdWxlWyJwcmVJbml0Il09W01vZHVsZVsicHJlSW5pdCJdXTt3aGlsZShNb2R1bGVbInByZUluaXQiXS5sZW5ndGg+MCl7TW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKX19bm9FeGl0UnVudGltZT10cnVlO3J1bigpOwpkaWZmIC0tZ2l0IGEvd2ViZ2xfdmlkZW90ZXN0L2Jhc2lzLndhc20gYi93ZWJnbF92aWRlb3Rlc3QvYmFzaXMud2FzbQppbmRleCA5MWEzZjIxLi42MTY3NjFiIDEwMDY0NAotLS0gYS93ZWJnbF92aWRlb3Rlc3QvYmFzaXMud2FzbQorKysgYi93ZWJnbF92aWRlb3Rlc3QvYmFzaXMud2FzbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS93ZWJnbF92aWRlb3Rlc3QvYmFzaXNfd3JhcHBlcnMuY3BwIGIvd2ViZ2xfdmlkZW90ZXN0L2Jhc2lzX3dyYXBwZXJzLmNwcAppbmRleCBmZDZkY2NhLi5hNzU4ZmUzIDEwMDY0NAotLS0gYS93ZWJnbF92aWRlb3Rlc3QvYmFzaXNfd3JhcHBlcnMuY3BwCisrKyBiL3dlYmdsX3ZpZGVvdGVzdC9iYXNpc193cmFwcGVycy5jcHAKQEAgLTMsOCArMyw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBiYXNpc3Q7CiAKLXN0YXRpYyBiYXNpc3Q6OmV0YzFfZ2xvYmFsX3NlbGVjdG9yX2NvZGVib29rICpnX3BHbG9iYWxfY29kZWJvb2s7Ci0KIHR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CiAKIGV4dGVybiAiQyIgCkBAIC0zOCw5ICszNiw2IEBACiB2b2lkIGJhc2lzX2luaXQoKQogewogCWJhc2lzdV90cmFuc2NvZGVyX2luaXQoKTsKLQkKLQlpZiAoIWdfcEdsb2JhbF9jb2RlYm9vaykKLQkJZ19wR2xvYmFsX2NvZGVib29rID0gbmV3IGJhc2lzdDo6ZXRjMV9nbG9iYWxfc2VsZWN0b3JfY29kZWJvb2soZ19nbG9iYWxfc2VsZWN0b3JfY2Jfc2l6ZSwgZ19nbG9iYWxfc2VsZWN0b3JfY2IpOwogfQogCiAjZGVmaW5lIE1BR0lDIDB4REVBREJFRTEKQEAgLTUzLDcgKzQ4LDcgQEAKIAl1aW50IG1fZmlsZV9zaXplOwogCiAJYmFzaXNfZmlsZSgpIDogCi0JCW1fdHJhbnNjb2RlcihnX3BHbG9iYWxfY29kZWJvb2spCisJCW1fdHJhbnNjb2RlcigpCiAJewogCX0KIH07CmRpZmYgLS1naXQgYS93ZWJnbF92aWRlb3Rlc3QvYnVpbGQuc2ggYi93ZWJnbF92aWRlb3Rlc3QvYnVpbGQuc2gKaW5kZXggYzYxNGQ2Yy4uOTFlNzZkNiAxMDA2NDQKLS0tIGEvd2ViZ2xfdmlkZW90ZXN0L2J1aWxkLnNoCisrKyBiL3dlYmdsX3ZpZGVvdGVzdC9idWlsZC5zaApAQCAtMSwzICsxLDMgQEAKICMgcmcgLSBJIGhhdmVuJ3QgdGVzdGVkIHRoaXMgc2hlbGwgc2NyaXB0IHlldCAoSSB1c2UgYnVpbGQuYmF0IG9uIFdpbmRvd3MpCi1lbWNjIC1zIEVYUE9SVEVEX0ZVTkNUSU9OUz0iWydhbGxvY2F0ZScsICdfbWFsbG9jJywgJ19mcmVlJywgJ19iYXNpc19pbml0JywnX2Jhc2lzX29wZW4nLCdfYmFzaXNfY2xvc2UnLCdfYmFzaXNfZ2V0X2hhc19hbHBoYScsJ19iYXNpc19nZXRfbnVtX2ltYWdlcycsJ19iYXNpc19nZXRfbnVtX2xldmVscycsJ19iYXNpc19nZXRfaW1hZ2Vfd2lkdGgnLCdfYmFzaXNfZ2V0X2ltYWdlX2hlaWdodCcsJ19iYXNpc19nZXRfaW1hZ2VfdHJhbnNjb2RlZF9zaXplX2luX2J5dGVzJywnX2Jhc2lzX3RyYW5zY29kZV9pbWFnZScsJ19iYXNpc19zdGFydF90cmFuc2NvZGluZyddIiAtcyBUT1RBTF9NRU1PUlk9NzQ5OTkzOTg0IC1PMiAtcyBBU1NFUlRJT05TPTAgLUkgLi4vdHJhbnNjb2RlciAtbyBiYXNpcy5qcyAuLi90cmFuc2NvZGVyL2Jhc2lzdV90cmFuc2NvZGVyLmNwcCBiYXNpc193cmFwcGVycy5jcHAgLUQgQkFTSVNEX1NVUFBPUlRfS1RYMj0wCitlbWNjIC1zIEVYUE9SVEVEX0ZVTkNUSU9OUz0iWydhbGxvY2F0ZScsICdfbWFsbG9jJywgJ19mcmVlJywgJ19iYXNpc19pbml0JywnX2Jhc2lzX29wZW4nLCdfYmFzaXNfY2xvc2UnLCdfYmFzaXNfZ2V0X2hhc19hbHBoYScsJ19iYXNpc19nZXRfbnVtX2ltYWdlcycsJ19iYXNpc19nZXRfbnVtX2xldmVscycsJ19iYXNpc19nZXRfaW1hZ2Vfd2lkdGgnLCdfYmFzaXNfZ2V0X2ltYWdlX2hlaWdodCcsJ19iYXNpc19nZXRfaW1hZ2VfdHJhbnNjb2RlZF9zaXplX2luX2J5dGVzJywnX2Jhc2lzX3RyYW5zY29kZV9pbWFnZScsJ19iYXNpc19zdGFydF90cmFuc2NvZGluZycsJ19iYXNpc19nZXRfZGVidWdfZmxhZ3MnLCdfYmFzaXNfc2V0X2RlYnVnX2ZsYWdzJ10iIC1zIFRPVEFMX01FTU9SWT03NDk5OTM5ODQgLU8yIC1zIEFTU0VSVElPTlM9MCAtSSAuLi90cmFuc2NvZGVyIC1vIGJhc2lzLmpzIC4uL3RyYW5zY29kZXIvYmFzaXN1X3RyYW5zY29kZXIuY3BwIGJhc2lzX3dyYXBwZXJzLmNwcCAtRCBCQVNJU0RfU1VQUE9SVF9LVFgyPTAgLUQgQkFTSVNEX0VOQUJMRV9ERUJVR19GTEFHUz0xCiAjIGNobW9kIC1SIGErclggLgpkaWZmIC0tZ2l0IGEvd2ViZ2xfdmlkZW90ZXN0L2luZGV4Lmh0bWwgYi93ZWJnbF92aWRlb3Rlc3QvaW5kZXguaHRtbAppbmRleCBhMzAyYTRhLi40OTYyMDE4IDEwMDY0NAotLS0gYS93ZWJnbF92aWRlb3Rlc3QvaW5kZXguaHRtbAorKysgYi93ZWJnbF92aWRlb3Rlc3QvaW5kZXguaHRtbApAQCAtNTA4LDcgKzUwOCw3IEBACiAgIDxicj4KICAgPGJyPgogICAgICAgLmJhc2lzIGZpbGU6Ci0gICAgICA8aW5wdXQgaWQ9ImZpbGUiIHR5cGU9InRleHQiIHNpemU9MzAgdmFsdWU9ImtvZGltMTguYmFzaXMiPjwvaW5wdXQ+CisgICAgICA8aW5wdXQgaWQ9ImZpbGUiIHR5cGU9InRleHQiIHNpemU9MzAgdmFsdWU9IjYuMS4wMS5iYXNpcyI+PC9pbnB1dD4KICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJSdW4hIiBvbmNsaWNrPSJydW4oKSI+PC9pbnB1dD4KICAgPGJyPgogICA8YnI+CmRpZmYgLS1naXQgYS93ZWJnbF92aWRlb3Rlc3Qva29kaW0xOC5iYXNpcyBiL3dlYmdsX3ZpZGVvdGVzdC9rb2RpbTE4LmJhc2lzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzY2MGRhLi4wMDAwMDAwCi0tLSBhL3dlYmdsX3ZpZGVvdGVzdC9rb2RpbTE4LmJhc2lzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgo=